v0.413 tracks livelast build: current milestone

Learn a language by
mapping it
to the one you already use.

Guided learning tracks for experienced developers. Each track translates familiar mental models into the shapes, tradeoffs, and habits of a new language — no beginner-level detours.

~/langfor/pick-trackclick chips to refine
$langfor--from JavaScript/Node--to TypeScript
from · what you know4 options
to · what's next4 matches
C#/.NETGoJavaScript/NodePythonRustTypeScript
/javascript-node-to-typescript · Turn familiar JavaScript runtime code into safer, better-specified systems.
source chips set what you already knowtarget chips stay scoped to valid matchesopen track jumps straight to the suggested path

02track matrix

Every supported pair, at a glance. Hover a row and column to inspect what is live, then jump straight into the matching transition.

from ↓to →
Go
Rust
Python
JavaScript
TypeScript
C#
Python
JavaScript
·
Go
·
·
·
Rust
·
·
·
/python-to-rust · Learn ownership, enums, and compiler-guided design.

Hand-picked starting points if you want a strong next step without browsing the full catalog first.

04inside a lesson

Each lesson starts from a source-language instinct, then shows the target-language pattern that usually replaces it. Side by side. Same example, two minds.

python-to-go / 04 · syntax / error handling

From try/excepterr != nil

Once the pattern clicks, Go error handling feels less like ceremony and more like a habit that keeps surprising control flow out of the codebase.

Python

def render_dashboard(user_id):
    try:
        profile = load_profile(user_id)
        stats = load_stats(user_id)
    except ProfileError as exc:
        logger.warning("profile unavailable: %s", exc)
        return None
    return build_dashboard(profile, stats)

Go

func renderDashboard(userID int) (*Dashboard, error) {
    profile, err := loadProfile(userID)
    if err != nil {
        log.Printf("profile unavailable: %v", err)
        return nil, err
    }

    stats, err := loadStats(userID)
    if err != nil {
        return nil, err
    }

    dashboard := buildDashboard(profile, stats)
    return &dashboard, nil
}