ReviewOS

home-lang/home

public
Clone

Push over the same URL. A password will not work: create a token under access tokens and use it in place of one.

main
· 166 branches · 8849 commits

Mirrored from home-lang/home · synced 53 minutes ago

README.md

Social Card of this repo

A modern programming language for systems, apps, and games —
the speed of Zig, the safety of Rust, the joy of TypeScript.

Website · Documentation · Getting started · Parity status · Changelog


Home compiles to native binaries with no garbage collector and no runtime to ship alongside them. The same toolchain also type-checks and builds the TypeScript you already have: home-tsc reads your tsconfig.json and emits tsc-compatible diagnostics, and home run executes TypeScript and JavaScript on Home's own JavaScriptCore realm.

Status: under active development. The lexer, parser, type inference, TypeScript front end, and tree-walking interpreter are usable today; native codegen, tooling, and the Bun-compatible runtime are still maturing. Project status has the short version and Parity status has every number with the harness that produces it.

Install

curl -fsSL https://raw.githubusercontent.com/home-lang/home/main/install.sh | bash

The installer detects your platform, downloads a release tarball from GitHub Releases, verifies its checksum, and installs the home binary to ~/.home/bin. macOS (Intel + Apple Silicon), Linux (x64 + arm64), and Windows (x64 + arm64, via Git Bash / WSL) are supported.

Environment variables: HOME_VERSION pins a release tag (default latest), HOME_INSTALL_DIR overrides the install location (default ~/.home), and HOME_BIN_DIR overrides where the binary is placed.

Quick start

// hello.home
fn main() {
  print("Hello, Home!")
}
home build hello.home    # native executable, nothing to install beside it
./hello                  # Hello, Home!

home run hello.home      # or run it directly
home check hello.home    # type-check without building

Source files use the .home extension, or .hm for short. The getting started guide walks through a first project.

Why Home

  • Native binaries, no collector. Ownership and borrowing settle lifetimes at compile time — no pauses, no runtime shipped beside the binary. (memory model)
  • One toolchain for two languages. The same compiler builds .home files and type-checks TypeScript, so a mixed codebase needs one tool instead of two. (how it works)
  • Exhaustive pattern matching. A missing branch is a compile error, not a runtime surprise. (pattern matching)
  • Compile time is just code. comptime runs real Home during compilation. (comptime)
  • Errors as values. Result types with ? propagation, plus null-safety operators (?., ?:, ??, ?[]). (error handling)
  • Batteries in the stdlib. HTTP, database, JSON, async, threading and FFI. (standard library)

Language tour

A condensed pass over the syntax. Each section links to the full page in the language guide.

Variables and control flow

let name = "Alice"           // immutable by default
let mut counter = 0          // mutable
let age: int = 25            // explicit type
const PI = 3.14159           // compile-time constant

if (counter > 5) {
  print("big")
} else {
  print("small")
}

for (item in items) { print(item) }
for (i in 0..10) { print(i) }
for (index, item in items) { print("{index}: {item}") }

while (counter < 10) { counter = counter + 1 }

Strings interpolate with {}, ranges come with .len(), .step(), .contains() and .to_array(), and arithmetic includes ** (power) and ~/ (truncating integer division). Full reference: variables and control flow.

Functions

fn add(a: int, b: int): int {
  return a + b
}

fn greet(name: string = "World") {   // default parameters
  print("Hello, {name}!")
}

fn fetch_data(): async Result<Data> {
  let response = await http.get("/api/data")
  return response.json()
}

More: functions, async.

Structs, enums and pattern matching

struct User {
  id: i64
  name: string
}

enum Color {
  Red,
  Green,
  Custom(r: int, g: int, b: int)
}

let user = User { id: 1, name: "Alice" }

match color {
  Color.Red => print("red"),
  Color.Green => print("green"),
  Color.Custom(r, g, b) => print("rgb({r}, {g}, {b})")
}

if and match are expressions, so they return values:

let status = if (code == 200) { "ok" } else { "error" }

let label = match x {
  1 => "one",
  2 => "two",
  _ => "other"
}

More: structs and enums, pattern matching, traits.

Null safety and errors

let name = user?.name ?: "Anonymous"   // elvis
let city = user?.address?.city         // safe navigation
let first = items?[0]                  // safe indexing

fn read_file(path: string): Result<string, Error> {
  let file = fs.open(path)?            // ? propagates errors
  return Ok(file.read_all())
}

match read_file("config.home") {
  Ok(content) => process(content),
  Err(e) => print("Failed: {e}")
}

More: type system, error handling.

Generics and comptime

struct Stack<T> {
  items: []T

  fn push(self, item: T) { self.items.append(item) }
  fn pop(self): Option<T> { return self.items.pop() }
}

comptime fn factorial(n: int): int {
  if (n <= 1) { return 1 }
  return n * factorial(n - 1)
}

const FACT_10 = factorial(10)   // computed at compile time

More: generics, comptime, macros, FFI.

A server, end to end

import http { Server, Response }

fn main() {
  let server = Server.bind(":3000")

  server.get("/users/:id", fn(req): Response {
    let id = req.param("id")
    return Response.json({ id: id })
  })

  server.listen()
}

More: standard library, web services.

TypeScript and JavaScript

Home ships a drop-in tsc / tsgo-compatible TypeScript front end, built as its own set of Zig packages (ts_lexer, ts_parser, binder, ts_checker, ts_emit, ts_program, ts_resolver, ts_lsp, …). It runs the upstream TypeScript conformance corpus and compares byte-for-byte against baselines generated by the reference compiler.

cd my-typescript-app
home-tsc --noEmit        # same diagnostics, same codes, same exit status
home-tsc --watch         # incremental recompiles on change
home-lsp                 # TypeScript language server for your editor
home run server.ts       # run it on Home's own JavaScriptCore realm

home-tsc and home-lsp build alongside the compiler into zig-out/bin/; home lsp --stdio is the separate language server for .home sources. Details: TypeScript compiler, editor and CLI tooling, TypeScript migration.

TypeScript frontend benchmark snapshot

The reproducible frontend suite compares JavaScript TypeScript 6.0.3, native TypeScript 7.0.2 (tsgo), and Home on the same strict, no-emit projects. The current admitted snapshots use 30 fresh processes after three warmups and keep every successful finite sample without filtering.

PlatformWorkloads with the lowest Home meanStrongest Home mean leadNarrowest Home mean lead
Apple M3 Pro, macOS ARM6420 / 20startup: 11.87× fastertype_predicates_large: 1.60× faster
Debian Bookworm, Linux ARM6420 / 20startup: 21.67× fastercheckjs_jsdoc: 1.02× faster

The latest current-source focused confirmation uses the same 30-run admission and timing rules; it supplements rather than replaces the complete table above:

Focused Apple ARM64 confirmationTypeScript 6.0.3Native TypeScript 7.0.2HomeHome lead
checkjs_jsdoc270.0 ± 54.1 ms69.2 ± 3.7 ms39.0 ± 1.4 ms1.77×
type_predicates_large1257.2 ± 104.6 ms421.8 ± 20.1 ms288.0 ± 15.3 ms1.46×

The latest benchmark-harness correction is reported separately from compiler timings:

Harness auditResultTiming claim
Normal diagnostic exits (#728)63 simulated admission decisions across three workloads; crashes rejected even with matching diagnosticsUntimed; historical results not revalidated

The latest untimed correctness gate is reported separately from performance:

Admission auditTypeScript 6.0.3Native TypeScript 7.0.2Home
Export-list owner and barrel diagnostics128/128128/128128/128
Typed cross-file global ownership60/6060/6060/60
Bound-global visibility56/5656/5656/56
Imported graph type ownership240/240240/240240/240
Imported owner contracts20/2020/2020/20
Nominal class origins52/5252/5252/52
CommonJS type transfer66/6666/6666/66
CommonJS discovery44/4444/4444/44
Schema-3 workload admission20/2020/2020/20
Returned imported callable controls2/2 positive; TS2339 + TS23222/2 positive; TS2339 + TS23222/2 positive; TS2339 + TS2322
Polymorphic mapped receiver controlsTS2339 + TS2322TS2339 + TS2322TS2339 + TS2322

The same-parent ReleaseFast audit on the pinned 106-file Zod 4.5.2 graph is reported separately from the admitted synthetic suite:

Zod 4.5.2 mapped-receiver auditExact parent#619 candidateChange
Diagnostics1,088976112 removed; 0 added
Mean wall time, two runs9.925 s5.740 s42.2% lower

The next exact-parent audit isolates mapped prototype parameter tuples and contextual receiver returns on that same frozen graph:

Zod 4.5.2 mapped prototype tuple auditExact parent#624 candidateChange
Diagnostics976833143 removed; 0 added
Removed diagnostic codes127× TS7006; 16× TS7019toward the zero-diagnostic oracle

The next audit restores callback context for nested member assignments inside generic constructor initializers without publishing approximate imported types:

Zod 4.5.2 generic member callback auditExact parent#627 candidateChange
Diagnostics833710123 removed; 0 added
TS7006241118123 removed (51.0%)

The dependent-default audit then instantiates later defaults with earlier effective arguments and retains only declaration-backed constraint proofs:

Zod 4.5.2 dependent generic-default auditFrozen post-#627 parent#633 candidateChange
Diagnostics710604106 removed (14.9%); 0 added
Removed diagnostic codes67× TS2430; 21× TS2345; 18× TS7006toward the zero-diagnostic oracle

The next correctness audit preserves symbolic indexed-access defaults until earlier effective arguments are available. The production graph stays exactly stable while the focused TypeScript oracle gap closes:

Zod 4.5.2 symbolic indexed-default auditPost-#633 main#634 candidateChange
Diagnostics6046040 added; 0 removed
Focused same-file oracle2 valid uses rejectedall valid uses acceptedthree invalid controls retained

The recursive fixed-point audit then distinguishes declaration-owned defaults from genuinely free outer parameters and applies the same proof across Program boundaries:

Zod 4.5.2 recursive-default auditPost-#634 main#639 candidateChange
Diagnostics6046004 TS2345 removed; 0 added
Focused recursive-default oracle2 invalid controls acceptedboth rejectedvalid and readonly controls retained

The explicit-file CLI gate then verifies that TypeScript boolean options keep the following source path positional and that skipLibCheck changes only declaration-file semantic reporting:

Explicit-file CLI boolean auditPost-#639 main#645 candidateChange
Pinned ignoreConfig / skipLibCheck oracleexit 139all 6 cases matchsource path preserved; true/false honored
Zod 4.5.2 diagnostics6006000 added; 0 removed

The complementary config-discovery check is source-matched against both pinned TypeScript controls and keeps explicit-file mode unambiguous:

Positional-file config auditFrozen parent#486 candidateTypeScript 6.0.3 / native 7.0.2
Nearby tsconfig.json, no --ignoreConfigexit 0TS5112, exit 1TS5112, exit 1
Escape hatch / no nearby config / normal -p3/3 pass3/3 pass3/3 pass

The next owner/projection and narrowing audit uses the unchanged pinned graph and compares complete diagnostic identities rather than only aggregate counts:

Zod 4.5.2 inherited-member and flow auditPre-change main#534 / #654 mainChange
Diagnostics60252379 removed (13.1%)
Unique path/line/column/code identities59751879 removed; 0 added
Checker / Program suites4,353/4,353; 187/187pass

The exact member-only projection then crosses an unsupported owner schema through a non-generic local child without weakening whole-schema admission:

Zod 4.5.2 unsupported-owner projection auditPost-#654 main#656 mainChange
Diagnostics52348934 TS2339 removed (6.5%)
Unique path/line/column/code identities51848434 removed; 0 added

The parameterized-callable audit then transfers exact Promise<T> and PromiseLike<T> identities through the same inherited-member path without admitting unsupported whole declarations:

Zod 4.5.2 parameterized-callable auditPost-#656 main#657 mainChange
Diagnostics / unique identities489 / 484489 / 4840 added; 0 removed
Focused cyclic callable oracleHome rejects valid check with TS2339Home, TS 6, and TS 7: 0exact parameter and string | Promise<string> return retained
Appended invalid control3× TS2322 + 1× TS2339 in all threeinvalid behavior preserved

The dependent-constraint audit then resolves later generic bounds using the effective earlier type arguments before validating literal keys:

Zod 4.5.2 dependent-constraint auditPost-#657 main#658 mainChange
Diagnostics48944841 TS2344 removed (8.4%); 0 added
Unique path/line/column/code identities48444341 removed; 0 added
TS234443241 removed (95.3%)

The conditional indexed-alias audit then propagates an outer schema constraint through both local and imported output<T> aliases without weakening the unconstrained Record key check:

Zod 4.5.2 conditional indexed-alias auditPost-#658 main#659 mainChange
Diagnostics4484462 TS2344 removed; 0 added
Unique path/line/column/code identities4434412 removed; 0 added
TS234420all remaining TS2344 removed

The Map-entry tuple audit then preserves [K, V] positions through array spreads and destructured filter / map callbacks, including leading binding elisions:

Zod 4.5.2 Map-entry tuple auditPost-#659 main#660 mainChange
Diagnostics4464406 removed; 0 added
Unique path/line/column/code identities4414356 removed; 0 added
Unique identities versus immutable baseline597435162 removed; 0 added

The nested default-lib alias audit then aligns parsed generic arguments with ordinary annotation resolution while retaining TS2304 for genuinely missing types:

Zod 4.5.2 nested default-lib alias auditPost-#660 main#661 mainChange
Diagnostics4404364 TS2304 removed; 0 added
Unique path/line/column/code identities4354314 removed; 0 added
Unique identities versus immutable baseline597431166 removed; 0 added

The collection and generic-relation audit then resolves the default-lib map and set families, follows transitive generic constraints during argument checking, and evaluates conditional object-spread branches without weakening the corresponding negative cases:

Zod 4.5.2 collection and generic-relation auditPost-#661 main#662 / #663 / #664 mainChange
Diagnostics4364306 removed; 0 added
Unique path/line/column/code identities4314256 removed; 0 added
Unique identities versus immutable baseline597425172 removed; 0 added

The imported-class method audit then projects independently transferable method signatures without admitting an unsupported sibling class graph:

Zod 4.5.2 imported-class method auditPost-#664 main#665 mainChange
Diagnostics43040030 TS7006 removed; 0 added
Unique path/line/column/code identities42539530 removed; 0 added
Unique identities versus immutable baseline597395202 removed; 0 added

The mapped-handler audit then retains each mapped key parameter as explicit type identity, allowing imported object-literal callback members to specialize nested templates by their concrete property key:

Zod 4.5.2 mapped contextual-member auditPost-#665 main#666 mainChange
Diagnostics400400unchanged; 0 added
Unique path/line/column/code identities395395unchanged; 0 added
Unique identities versus immutable baseline597395202 removed overall; 0 added

The imported-overload audit then transfers ordered bodyless call signatures across Program ownership and contextually selects an object-literal overload only when arity plus declared property ownership leave one candidate:

Zod 4.5.2 imported-overload object audit#666 main#667 mainChange
Diagnostics400400unchanged; 0 added
Unique path/line/column/code identities395395unchanged; 0 added
Unique identities versus immutable baseline597395202 removed overall; 0 added

The imported-Extract audit then carries standard distributive extraction through conditional mapped-handler aliases without admitting other utility graphs as approximate whole types:

Zod 4.5.2 imported-Extract handler audit#667 main#668 mainChange
Diagnostics400400unchanged; 0 added
Unique path/line/column/code identities395395unchanged; 0 added
Unique identities versus immutable baseline597395202 removed overall; 0 added

The indexed-domain audit then resolves source-owned indexed-access aliases before mapped-key specialization, preserving exact union coverage and rejecting missing or partially covered properties without widening:

Zod 4.5.2 indexed mapped-key audit#668 main#669 mainChange
Diagnostics400400unchanged; 0 added
Unique path/line/column/code identities395395unchanged; 0 added
Focused three-engine oracleHome rejects valid handler contextexact 2× TS2322 + 2× TS2339 parityno TS7006/TS2345
Unique identities versus immutable baseline597395202 removed overall; 0 added

The qualified-declaration audit then admits namespace-qualified references only when their complete Program schema graph is lossless, retaining strict projection and opaque-leaf guards:

Zod 4.5.2 qualified declaration audit#669 main#670 mainChange
Diagnostics4003946 TS2339 removed; 0 added
Unique path/line/column/code identities3953896 removed; 0 added
Focused three-module oracle2 false TS7006exact 2× TS2322 + 2× TS2339 parityno TS7006/TS2345
Unique identities versus immutable baseline597389208 removed overall; 0 added

The contextual-path audit then projects only the members required by an Extract target when an otherwise useful declaration has opaque siblings:

Zod 4.5.2 contextual-path audit#670 main#671 mainChange
Diagnostics39437420 TS7006 removed; 0 added
Unique path/line/column/code identities38936920 removed; 0 added
Focused opaque-sibling oracle2 false TS7006exact 2× TS2322 + 2× TS2339 parityno TS7006/TS2345
Unique identities versus immutable baseline597369228 removed overall; 0 added

The truthy-property audit then removes impossible never branches through the normal flow partitioner, while its unchanged Zod A/B rejects the initial locale attribution:

Truthy property branch audit#671 main#672 mainChange
Focused three-engine oraclefalse TS2339 + TS7006exact 1× TS2322 parityfixed
Zod diagnostics374374unchanged; 0 added
Zod unique identities369369unchanged; 0 added

The imported homomorphic-union audit then preserves callback context through Pick/Exclude/partial/intersection pipelines and exact nested indexed constraints without admitting opaque imported graphs wholesale:

Zod 4.5.2 homomorphic-union callback audit#672 main#673 mainChange
Diagnostics37435024 removed (6.4%); 0 added
Unique path/line/column/code identities36934524 removed; 0 added
Focused three-engine oraclefalse TS7006 / TS2339exact 1× TS2322 parityno TS7006/TS2339/TS2344

The imported Promise-union audit then admits losslessly serialized parameterized built-ins, narrows the false branch of terminating Promise guards, and validates actual multi-statement return unions:

Zod 4.5.2 imported Promise-union audit#673 main#687 mainChange
Diagnostics3503482 TS7006 removed (0.6%); 0 added
Unique path/line/column/code identities3453432 removed; 0 added
Focused three-engine oraclevalidvalid + exact 1× TS2322 controlno TS7006/TS2339

Positive instanceof branches that replace their guarded value now join the assigned true path with the excluded false path at fallthrough:

Positive instanceof assignment auditTypeScript 6.0.3Native TypeScript 7.0.2Home
Exact strict oracleTS2322 + TS2339TS2322 + TS2339TS2322 + TS2339
False TS7006000
Zod 4.5.2 core diagnostics versus origin/main150 → 150; 0 added/removed

TypeScript 6.0.3 reports zero diagnostics on this graph. Home still reports 348, so Zod remains outside the cross-compiler timing table until Home also reaches zero diagnostics.

The latest optimization admissions preserve that contextual snapshot while recording both accepted and rejected probes:

Optimization probePrimary fair A/BSecondary scaleDecision
Token-count HIR reservation2,048 predicates: 1.019× faster, confirmation CIs positive32,768 predicates: 1.007× wall, 1.006× CPU, paired CIs positiveAccepted in ed8bf949b
Default-export merge bucket records2,048 predicates: 1.028× faster, confirmation CIs positive32,768 predicates: 1.024× CPU, 9/10 winsAccepted in 1a7ac8a7a
Exact diagnostic-reconciliation marker gate2,048 predicates: 1.026× faster, paired CIs positive32,768 predicates: 1.024× faster, 10/10 paired winsAccepted in 587c64343
JSDoc import-type scan pruning128 CheckJS families: 1.015× faster, confirmation paired CIs positive4,096 families: 1.215× faster, 10/10 paired winsAccepted in 532373ee1
Source-marker root-gap fast-forward2,048 predicates: 1.014× faster, paired CIs positive65,536 predicates: 1.014× faster, paired CIs positiveAccepted in 7ca9946c8
Dependency-free declaration schemas2,048 predicates: 1.046× faster, 30/30 paired winsFull checkpoint: 20/20 lower means, 600/600 paired winsAccepted in e0f2fb6d7
Program import-resolution cache128 owners: 1.21× faster, 30/30 paired wins2,048 owners: 2.22× faster, 20/20 paired winsAccepted in 49641900e
Complementary value-declaration indexes128 interface families: 1.058× faster, 30/30 paired wins2,048 families: 1.253× faster, 10/10 paired winsAccepted in 8d1d198b2
Import-free export-assignment gate128 interface families: 1.038× faster, confirmation CIs positive2,048 families: 1.160× faster, 10/10 paired winsAccepted in b3dcb63c5
Global-namespace negative index128 interface families: 0.996× wall, 4/10 winsWall and CPU paired CIs cross zero; no scale run admittedRejected and reverted
Qualified-annotation root namespace index128 interface families: 1.082× lower wall mean, 6/10 winsWall and CPU paired CIs cross zero; no scale run admittedRejected and reverted
Namespace-value miss index128 interface families: 1.038× faster, confirmation CIs positive2,048 families: 1.206× faster, 10/10 paired winsAccepted in 4ba46f4d6
Enum-free visible-namespace index128 interface families: 1.032× faster, confirmation CIs positive2,048 families: 1.131× faster, 10/10 paired wins; +0.435 MiB RSSAccepted in 65a6037e6
Unique interface-heritage index128 interface families: 0.995× wall, 4/10 winsWall and CPU paired CIs cross zero; no scale timing admittedRejected and reverted
Merged-interface scan indexesBroad index: 1.015× wall; refined chain: 0.999× wallBoth designs' wall and CPU paired CIs cross zeroRejected and reverted
Namespace merge-order indexesOrdinal index: 1.013× wall; existing-index reuse: 0.989× wallBoth designs' wall and CPU paired CIs cross zeroRejected and reverted
declarationName forced inlineClean screen: 1.010× wall, 6/10 winsWall and CPU paired CIs cross zero; binary +16,544 bytesRejected and reverted
Import-free virtual-import gate128 interface families: 1.033× faster, confirmation CIs positive2,048 families: 1.058× faster, 10/10 paired winsAccepted in 83c44368c
Prototype-assignment marker gate128 interface families: 0.996× wall, 5/10 winsWall and CPU paired CIs cross zero; no scale timing admittedRejected and reverted
Import-free module-namespace gate128 interface families: 0.998× wall, 5/10 winsWall and CPU paired CIs cross zero; no confirmation or scale timing admittedRejected and reverted
Type-alias heritage fallback gate128 interface families: 1.019× lower wall mean, 6/10 winsLoaded screen and replacement CIs cross zero; no scale timing admittedRejected and reverted
Contextual cache descendant index128 interfaces: 1.051× wall, confirmation CIs positive2,048 interfaces: 1.152× wall, 10/10 paired winsAccepted in 21e6155d4
Free-type traversal generation marksByte screen: 1.023× wall, 10/10 winsConfirmation: 1.004× wall, but paired wall and CPU CIs cross zeroRejected and reverted
Free-type-parameter root memo2,048 predicates: 0.993× wall, 4/10 winsCandidate slower and RSS higher in 10/10 pairs; no confirmation admittedRejected and reverted
Primitive type-name dispatch2,048 predicates: 1.022× wall, confirmation CIs positive32,768 predicates: 1.003× wall mean, but paired wall and CPU CIs cross zeroRejected and reverted
Stable pool-index inference2,048 predicates: 1.010× wall, 10/10 screen winsConfirmation: 1.015× wall mean, but paired wall and CPU CIs cross zeroRejected and reverted
Broad checker-directive marker gates2,048 predicates: 0.998× wall, 4/10 winsPaired wall and CPU CIs cross zero; scale run not admittedRejected and reverted
Checker directive marker indexing2,048 predicates, 60 final pairs: 1.013× wall, 1.012× CPU, paired CIs positive32,768 predicates: 1.020× wall mean, but paired wall CI crosses zeroRejected and reverted
Larger string-interner hint32,768 families: 0.985× CPU; candidate slower0.958× wall; paired CIs cross zeroRejected and reverted
Parser JSDoc-presence reuse2,048 predicates: 1.008× lower wall mean; paired CIs cross zero32,768 predicates: both retained sets inconclusive under external loadRejected and reverted
Parser virtual-section fact reuse2,048 predicates: 1.007× lower wall mean; paired CI crosses zero32,768 predicates: 1.003× lower CPU mean, 4/10 winsRejected and reverted
Reconciliation-sentinel root-set pruning2,048 predicates: 1.003× confirmation; paired CIs cross zero32,768 predicates: candidate slower, 5/10 winsRejected and reverted
Union flatten-buffer elision2,048 predicates: 1.006× wall, 6/10 winsPaired wall and CPU CIs cross zero; scale run not admittedRejected and reverted
Prepared parser source-fact bundle2,048 predicates: 1.006× CPU, 5/10 winsPaired wall and CPU CIs cross zero; scale run not admittedRejected and reverted
Type-alias merge inline-first targets2,048 predicates: 1.009× wall, 6/10 winsPaired CIs cross zero; scale run not admittedRejected and reverted
Duplicate-class threshold flag2,048 predicates: 1.009× slower wall, 4/10 winsPaired wall and CPU CIs cross zero; scale run not admittedRejected and reverted
Duplicate-class second-pass gate2,048 predicates: 1.007× wall, 5/10 winsPaired wall and CPU CIs cross zero; scale run not admittedRejected and reverted
Local-boundary NodeId keys2,048 predicates: 1.001× wall, 6/10 winsPaired wall and CPU CIs cross zero; scale run not admittedRejected and reverted
Namespace declaration-pass gate2,048 predicates: 1.002× wall, 6/10 winsClean-rerun wall and CPU CIs cross zero; scale run not admittedRejected and reverted
Recovered-parameter identity reuse2,048 predicates: 1.004× confirmation; paired CIs cross zero65,536 predicates: 1.002× CPU, 8/10 wins; paired CI crosses zeroRejected and reverted
One-pass special-identifier classification2,048 families: 1.010× CPU, 6/10 winsPaired CIs cross zero; scale run not admittedRejected and reverted
Declaration-map pre-sizing2,048 families: 1.028× CPU screen, 8/10 winsConfirmation: 1.008× CPU, paired CI crosses zeroRejected and reverted
Identifier declaration-slot reuse2,048 families: 0.995× CPU, 5/10 wins32,768-family 2026-09-12 retest: 1.103× lower mean, 15/20 wins, but paired 95% CI crosses zeroRejected and reverted
Parser identifier escape-flag reuse2,048 families: 0.985× CPU, 5/10 wins0.975× wall; candidate slowerRejected and reverted
Exact pruned prefix trie32,768 families: 1.008×; paired CI crosses zero65,536 families: 1.011×; paired CI crosses zeroRejected and reverted
Parser-local exact-name cache32,768 families: 0.999×; paired CI crosses zeroNot run after failed gateRejected and reverted
Declaration-space marker gates32,768 families: 0.977×; candidate slowerNot run after failed gateRejected and reverted
Visible-annotation hot cache32,768 families: 0.996×; candidate slowerNot run after failed gateRejected and reverted

See the complete results, rejected-probe evidence, raw-result identifiers, fairness rules, and reproduction steps.

Project status

Conservative on purpose: anything not exercised by an example or a test stays "maturing" even when the underlying code is largely there.

AreaStatusDetail
Lexer, parser, type inferenceUsable todayCapability matrix
TypeScript conformance (coarse + byte-exact)5,907 / 5,907 — 100%TypeScript parity
TypeScript diagnostic codes emitted1,620 / 2,079; 0 reachable targets leftDiagnostic reachability
Language server methods routed76 / ~80Parity status
Native codegenMaturing — single-entrypoint LLVM builds workParity status
Bun runtime port552 / 1,193 files integratedBun parity
node:* modules JS-callable24 / 47 (partial surfaces)Node.js parity
Compiler test suite~8,415 testsParity status

Every figure is a file-count, row-count or byte-for-byte measurement against an external baseline, refreshed with scripts/measure-parity.sh. The full breakdown — headline numbers, per-phase runtime port, LSP method list, frontend performance snapshots — lives in Parity status.

Build from source

Requires the Pantry-pinned Zig 0.17 dev toolchain; nothing is installed globally.

git clone https://github.com/home-lang/home.git
cd home
pantry install              # installs the pinned Zig 0.17 dev toolchain
./pantry/.bin/zig build     # ./pantry/.bin/zig is a stable symlink to it

./zig-out/bin/home build examples/fibonacci.home
./examples/fibonacci

Common commands:

CommandWhat it does
./pantry/.bin/zig buildBuild the compiler
./pantry/.bin/zig build testRun the unit-test suite
./pantry/.bin/zig build examplesRun the native example executables
./pantry/.bin/zig build run -- examples/fibonacci.homeBuild, then run a file
scripts/check-examples.shhome check every .home example
scripts/measure-parity.sh --diffFail if the published parity numbers drifted

Repository layout

home/
├── src/main.zig      # CLI entry point
├── packages/         # 130+ Zig packages, each with its own tests
│   ├── lexer/  parser/  ast/  types/  codegen/  interpreter/
│   ├── ts_lexer/  ts_parser/  ts_checker/  ts_emit/  ts_program/
│   ├── ts_lsp/  ts_lsp_server/  ts_conformance/  ts_resolver/
│   ├── hir/  binder/  diagnostics/  compat/  runtime/
│   └── ...           # http, database, async, ffi, graphics, …
├── docs/             # Documentation site (home-lang.org)
├── examples/         # Example programs
├── tests/            # Integration tests
└── stdlib/           # Standard library

Monorepo structure and architecture go deeper.

Contributing

Contributions welcome — see CONTRIBUTING.md. Release notes live in CHANGELOG.md.

License

MIT — see LICENSE.