home-lang/home
publicClone
Push over the same URL. A password will not work: create a token under access tokens and use it in place of one.
- _submodules
- .config
- .github
- .vscode
- bench
- build-support
- docs
- examples
- packages
- scripts
- src
- storage
- tests
- tools
- .dockerignore 66 B
- .gitattributes 51 B
- .gitignore 2.9 KB
- .gitmodules 147 B
- AGENTS.md 1.6 KB
- build.zig 120.0 KB
- bunfig.toml 19 B
- bunpress.config.ts 15.2 KB
- CHANGELOG.md 3.9 KB
- CLAUDE.md 2.7 KB
- cloud.config.ts 5.0 KB
- couch.toml 2.2 KB
- install.sh 7.8 KB
- LICENSE 1.1 KB
- package.json 1.9 KB
- pantry.json 1.6 KB
- pantry.lock 325 B
- README.md 40.0 KB
- tsconfig.json 776 B

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 | bashThe 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 buildingSource 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
.homefiles 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.
comptimeruns real Home during compilation. (comptime) - Errors as values.
Resulttypes 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()
}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 timeMore: 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 realmhome-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.
| Platform | Workloads with the lowest Home mean | Strongest Home mean lead | Narrowest Home mean lead |
|---|---|---|---|
| Apple M3 Pro, macOS ARM64 | 20 / 20 | startup: 11.87× faster | type_predicates_large: 1.60× faster |
| Debian Bookworm, Linux ARM64 | 20 / 20 | startup: 21.67× faster | checkjs_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 confirmation | TypeScript 6.0.3 | Native TypeScript 7.0.2 | Home | Home lead |
|---|---|---|---|---|
checkjs_jsdoc | 270.0 ± 54.1 ms | 69.2 ± 3.7 ms | 39.0 ± 1.4 ms | 1.77× |
type_predicates_large | 1257.2 ± 104.6 ms | 421.8 ± 20.1 ms | 288.0 ± 15.3 ms | 1.46× |
The latest benchmark-harness correction is reported separately from compiler timings:
| Harness audit | Result | Timing claim |
|---|---|---|
| Normal diagnostic exits (#728) | 63 simulated admission decisions across three workloads; crashes rejected even with matching diagnostics | Untimed; historical results not revalidated |
The latest untimed correctness gate is reported separately from performance:
| Admission audit | TypeScript 6.0.3 | Native TypeScript 7.0.2 | Home |
|---|---|---|---|
| Export-list owner and barrel diagnostics | 128/128 | 128/128 | 128/128 |
| Typed cross-file global ownership | 60/60 | 60/60 | 60/60 |
| Bound-global visibility | 56/56 | 56/56 | 56/56 |
| Imported graph type ownership | 240/240 | 240/240 | 240/240 |
| Imported owner contracts | 20/20 | 20/20 | 20/20 |
| Nominal class origins | 52/52 | 52/52 | 52/52 |
| CommonJS type transfer | 66/66 | 66/66 | 66/66 |
| CommonJS discovery | 44/44 | 44/44 | 44/44 |
| Schema-3 workload admission | 20/20 | 20/20 | 20/20 |
| Returned imported callable controls | 2/2 positive; TS2339 + TS2322 | 2/2 positive; TS2339 + TS2322 | 2/2 positive; TS2339 + TS2322 |
| Polymorphic mapped receiver controls | TS2339 + TS2322 | TS2339 + TS2322 | TS2339 + 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 audit | Exact parent | #619 candidate | Change |
|---|---|---|---|
| Diagnostics | 1,088 | 976 | 112 removed; 0 added |
| Mean wall time, two runs | 9.925 s | 5.740 s | 42.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 audit | Exact parent | #624 candidate | Change |
|---|---|---|---|
| Diagnostics | 976 | 833 | 143 removed; 0 added |
| Removed diagnostic codes | — | 127× TS7006; 16× TS7019 | toward 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 audit | Exact parent | #627 candidate | Change |
|---|---|---|---|
| Diagnostics | 833 | 710 | 123 removed; 0 added |
| TS7006 | 241 | 118 | 123 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 audit | Frozen post-#627 parent | #633 candidate | Change |
|---|---|---|---|
| Diagnostics | 710 | 604 | 106 removed (14.9%); 0 added |
| Removed diagnostic codes | — | 67× TS2430; 21× TS2345; 18× TS7006 | toward 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 audit | Post-#633 main | #634 candidate | Change |
|---|---|---|---|
| Diagnostics | 604 | 604 | 0 added; 0 removed |
| Focused same-file oracle | 2 valid uses rejected | all valid uses accepted | three 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 audit | Post-#634 main | #639 candidate | Change |
|---|---|---|---|
| Diagnostics | 604 | 600 | 4 TS2345 removed; 0 added |
| Focused recursive-default oracle | 2 invalid controls accepted | both rejected | valid 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 audit | Post-#639 main | #645 candidate | Change |
|---|---|---|---|
Pinned ignoreConfig / skipLibCheck oracle | exit 139 | all 6 cases match | source path preserved; true/false honored |
| Zod 4.5.2 diagnostics | 600 | 600 | 0 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 audit | Frozen parent | #486 candidate | TypeScript 6.0.3 / native 7.0.2 |
|---|---|---|---|
Nearby tsconfig.json, no --ignoreConfig | exit 0 | TS5112, exit 1 | TS5112, exit 1 |
Escape hatch / no nearby config / normal -p | 3/3 pass | 3/3 pass | 3/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 audit | Pre-change main | #534 / #654 main | Change |
|---|---|---|---|
| Diagnostics | 602 | 523 | 79 removed (13.1%) |
| Unique path/line/column/code identities | 597 | 518 | 79 removed; 0 added |
| Checker / Program suites | — | 4,353/4,353; 187/187 | pass |
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 audit | Post-#654 main | #656 main | Change |
|---|---|---|---|
| Diagnostics | 523 | 489 | 34 TS2339 removed (6.5%) |
| Unique path/line/column/code identities | 518 | 484 | 34 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 audit | Post-#656 main | #657 main | Change |
|---|---|---|---|
| Diagnostics / unique identities | 489 / 484 | 489 / 484 | 0 added; 0 removed |
| Focused cyclic callable oracle | Home rejects valid check with TS2339 | Home, TS 6, and TS 7: 0 | exact parameter and string | Promise<string> return retained |
| Appended invalid control | — | 3× TS2322 + 1× TS2339 in all three | invalid 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 audit | Post-#657 main | #658 main | Change |
|---|---|---|---|
| Diagnostics | 489 | 448 | 41 TS2344 removed (8.4%); 0 added |
| Unique path/line/column/code identities | 484 | 443 | 41 removed; 0 added |
| TS2344 | 43 | 2 | 41 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 audit | Post-#658 main | #659 main | Change |
|---|---|---|---|
| Diagnostics | 448 | 446 | 2 TS2344 removed; 0 added |
| Unique path/line/column/code identities | 443 | 441 | 2 removed; 0 added |
| TS2344 | 2 | 0 | all 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 audit | Post-#659 main | #660 main | Change |
|---|---|---|---|
| Diagnostics | 446 | 440 | 6 removed; 0 added |
| Unique path/line/column/code identities | 441 | 435 | 6 removed; 0 added |
| Unique identities versus immutable baseline | 597 | 435 | 162 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 audit | Post-#660 main | #661 main | Change |
|---|---|---|---|
| Diagnostics | 440 | 436 | 4 TS2304 removed; 0 added |
| Unique path/line/column/code identities | 435 | 431 | 4 removed; 0 added |
| Unique identities versus immutable baseline | 597 | 431 | 166 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 audit | Post-#661 main | #662 / #663 / #664 main | Change |
|---|---|---|---|
| Diagnostics | 436 | 430 | 6 removed; 0 added |
| Unique path/line/column/code identities | 431 | 425 | 6 removed; 0 added |
| Unique identities versus immutable baseline | 597 | 425 | 172 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 audit | Post-#664 main | #665 main | Change |
|---|---|---|---|
| Diagnostics | 430 | 400 | 30 TS7006 removed; 0 added |
| Unique path/line/column/code identities | 425 | 395 | 30 removed; 0 added |
| Unique identities versus immutable baseline | 597 | 395 | 202 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 audit | Post-#665 main | #666 main | Change |
|---|---|---|---|
| Diagnostics | 400 | 400 | unchanged; 0 added |
| Unique path/line/column/code identities | 395 | 395 | unchanged; 0 added |
| Unique identities versus immutable baseline | 597 | 395 | 202 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 main | Change |
|---|---|---|---|
| Diagnostics | 400 | 400 | unchanged; 0 added |
| Unique path/line/column/code identities | 395 | 395 | unchanged; 0 added |
| Unique identities versus immutable baseline | 597 | 395 | 202 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 main | Change |
|---|---|---|---|
| Diagnostics | 400 | 400 | unchanged; 0 added |
| Unique path/line/column/code identities | 395 | 395 | unchanged; 0 added |
| Unique identities versus immutable baseline | 597 | 395 | 202 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 main | Change |
|---|---|---|---|
| Diagnostics | 400 | 400 | unchanged; 0 added |
| Unique path/line/column/code identities | 395 | 395 | unchanged; 0 added |
| Focused three-engine oracle | Home rejects valid handler context | exact 2× TS2322 + 2× TS2339 parity | no TS7006/TS2345 |
| Unique identities versus immutable baseline | 597 | 395 | 202 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 main | Change |
|---|---|---|---|
| Diagnostics | 400 | 394 | 6 TS2339 removed; 0 added |
| Unique path/line/column/code identities | 395 | 389 | 6 removed; 0 added |
| Focused three-module oracle | 2 false TS7006 | exact 2× TS2322 + 2× TS2339 parity | no TS7006/TS2345 |
| Unique identities versus immutable baseline | 597 | 389 | 208 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 main | Change |
|---|---|---|---|
| Diagnostics | 394 | 374 | 20 TS7006 removed; 0 added |
| Unique path/line/column/code identities | 389 | 369 | 20 removed; 0 added |
| Focused opaque-sibling oracle | 2 false TS7006 | exact 2× TS2322 + 2× TS2339 parity | no TS7006/TS2345 |
| Unique identities versus immutable baseline | 597 | 369 | 228 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 main | Change |
|---|---|---|---|
| Focused three-engine oracle | false TS2339 + TS7006 | exact 1× TS2322 parity | fixed |
| Zod diagnostics | 374 | 374 | unchanged; 0 added |
| Zod unique identities | 369 | 369 | unchanged; 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 main | Change |
|---|---|---|---|
| Diagnostics | 374 | 350 | 24 removed (6.4%); 0 added |
| Unique path/line/column/code identities | 369 | 345 | 24 removed; 0 added |
| Focused three-engine oracle | false TS7006 / TS2339 | exact 1× TS2322 parity | no 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 main | Change |
|---|---|---|---|
| Diagnostics | 350 | 348 | 2 TS7006 removed (0.6%); 0 added |
| Unique path/line/column/code identities | 345 | 343 | 2 removed; 0 added |
| Focused three-engine oracle | valid | valid + exact 1× TS2322 control | no 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 audit | TypeScript 6.0.3 | Native TypeScript 7.0.2 | Home |
|---|---|---|---|
| Exact strict oracle | TS2322 + TS2339 | TS2322 + TS2339 | TS2322 + TS2339 |
| False TS7006 | 0 | 0 | 0 |
Zod 4.5.2 core diagnostics versus origin/main | — | — | 150 → 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 probe | Primary fair A/B | Secondary scale | Decision |
|---|---|---|---|
| Token-count HIR reservation | 2,048 predicates: 1.019× faster, confirmation CIs positive | 32,768 predicates: 1.007× wall, 1.006× CPU, paired CIs positive | Accepted in ed8bf949b |
| Default-export merge bucket records | 2,048 predicates: 1.028× faster, confirmation CIs positive | 32,768 predicates: 1.024× CPU, 9/10 wins | Accepted in 1a7ac8a7a |
| Exact diagnostic-reconciliation marker gate | 2,048 predicates: 1.026× faster, paired CIs positive | 32,768 predicates: 1.024× faster, 10/10 paired wins | Accepted in 587c64343 |
| JSDoc import-type scan pruning | 128 CheckJS families: 1.015× faster, confirmation paired CIs positive | 4,096 families: 1.215× faster, 10/10 paired wins | Accepted in 532373ee1 |
| Source-marker root-gap fast-forward | 2,048 predicates: 1.014× faster, paired CIs positive | 65,536 predicates: 1.014× faster, paired CIs positive | Accepted in 7ca9946c8 |
| Dependency-free declaration schemas | 2,048 predicates: 1.046× faster, 30/30 paired wins | Full checkpoint: 20/20 lower means, 600/600 paired wins | Accepted in e0f2fb6d7 |
| Program import-resolution cache | 128 owners: 1.21× faster, 30/30 paired wins | 2,048 owners: 2.22× faster, 20/20 paired wins | Accepted in 49641900e |
| Complementary value-declaration indexes | 128 interface families: 1.058× faster, 30/30 paired wins | 2,048 families: 1.253× faster, 10/10 paired wins | Accepted in 8d1d198b2 |
| Import-free export-assignment gate | 128 interface families: 1.038× faster, confirmation CIs positive | 2,048 families: 1.160× faster, 10/10 paired wins | Accepted in b3dcb63c5 |
| Global-namespace negative index | 128 interface families: 0.996× wall, 4/10 wins | Wall and CPU paired CIs cross zero; no scale run admitted | Rejected and reverted |
| Qualified-annotation root namespace index | 128 interface families: 1.082× lower wall mean, 6/10 wins | Wall and CPU paired CIs cross zero; no scale run admitted | Rejected and reverted |
| Namespace-value miss index | 128 interface families: 1.038× faster, confirmation CIs positive | 2,048 families: 1.206× faster, 10/10 paired wins | Accepted in 4ba46f4d6 |
| Enum-free visible-namespace index | 128 interface families: 1.032× faster, confirmation CIs positive | 2,048 families: 1.131× faster, 10/10 paired wins; +0.435 MiB RSS | Accepted in 65a6037e6 |
| Unique interface-heritage index | 128 interface families: 0.995× wall, 4/10 wins | Wall and CPU paired CIs cross zero; no scale timing admitted | Rejected and reverted |
| Merged-interface scan indexes | Broad index: 1.015× wall; refined chain: 0.999× wall | Both designs' wall and CPU paired CIs cross zero | Rejected and reverted |
| Namespace merge-order indexes | Ordinal index: 1.013× wall; existing-index reuse: 0.989× wall | Both designs' wall and CPU paired CIs cross zero | Rejected and reverted |
declarationName forced inline | Clean screen: 1.010× wall, 6/10 wins | Wall and CPU paired CIs cross zero; binary +16,544 bytes | Rejected and reverted |
| Import-free virtual-import gate | 128 interface families: 1.033× faster, confirmation CIs positive | 2,048 families: 1.058× faster, 10/10 paired wins | Accepted in 83c44368c |
| Prototype-assignment marker gate | 128 interface families: 0.996× wall, 5/10 wins | Wall and CPU paired CIs cross zero; no scale timing admitted | Rejected and reverted |
| Import-free module-namespace gate | 128 interface families: 0.998× wall, 5/10 wins | Wall and CPU paired CIs cross zero; no confirmation or scale timing admitted | Rejected and reverted |
| Type-alias heritage fallback gate | 128 interface families: 1.019× lower wall mean, 6/10 wins | Loaded screen and replacement CIs cross zero; no scale timing admitted | Rejected and reverted |
| Contextual cache descendant index | 128 interfaces: 1.051× wall, confirmation CIs positive | 2,048 interfaces: 1.152× wall, 10/10 paired wins | Accepted in 21e6155d4 |
| Free-type traversal generation marks | Byte screen: 1.023× wall, 10/10 wins | Confirmation: 1.004× wall, but paired wall and CPU CIs cross zero | Rejected and reverted |
| Free-type-parameter root memo | 2,048 predicates: 0.993× wall, 4/10 wins | Candidate slower and RSS higher in 10/10 pairs; no confirmation admitted | Rejected and reverted |
| Primitive type-name dispatch | 2,048 predicates: 1.022× wall, confirmation CIs positive | 32,768 predicates: 1.003× wall mean, but paired wall and CPU CIs cross zero | Rejected and reverted |
| Stable pool-index inference | 2,048 predicates: 1.010× wall, 10/10 screen wins | Confirmation: 1.015× wall mean, but paired wall and CPU CIs cross zero | Rejected and reverted |
| Broad checker-directive marker gates | 2,048 predicates: 0.998× wall, 4/10 wins | Paired wall and CPU CIs cross zero; scale run not admitted | Rejected and reverted |
| Checker directive marker indexing | 2,048 predicates, 60 final pairs: 1.013× wall, 1.012× CPU, paired CIs positive | 32,768 predicates: 1.020× wall mean, but paired wall CI crosses zero | Rejected and reverted |
| Larger string-interner hint | 32,768 families: 0.985× CPU; candidate slower | 0.958× wall; paired CIs cross zero | Rejected and reverted |
| Parser JSDoc-presence reuse | 2,048 predicates: 1.008× lower wall mean; paired CIs cross zero | 32,768 predicates: both retained sets inconclusive under external load | Rejected and reverted |
| Parser virtual-section fact reuse | 2,048 predicates: 1.007× lower wall mean; paired CI crosses zero | 32,768 predicates: 1.003× lower CPU mean, 4/10 wins | Rejected and reverted |
| Reconciliation-sentinel root-set pruning | 2,048 predicates: 1.003× confirmation; paired CIs cross zero | 32,768 predicates: candidate slower, 5/10 wins | Rejected and reverted |
| Union flatten-buffer elision | 2,048 predicates: 1.006× wall, 6/10 wins | Paired wall and CPU CIs cross zero; scale run not admitted | Rejected and reverted |
| Prepared parser source-fact bundle | 2,048 predicates: 1.006× CPU, 5/10 wins | Paired wall and CPU CIs cross zero; scale run not admitted | Rejected and reverted |
| Type-alias merge inline-first targets | 2,048 predicates: 1.009× wall, 6/10 wins | Paired CIs cross zero; scale run not admitted | Rejected and reverted |
| Duplicate-class threshold flag | 2,048 predicates: 1.009× slower wall, 4/10 wins | Paired wall and CPU CIs cross zero; scale run not admitted | Rejected and reverted |
| Duplicate-class second-pass gate | 2,048 predicates: 1.007× wall, 5/10 wins | Paired wall and CPU CIs cross zero; scale run not admitted | Rejected and reverted |
| Local-boundary NodeId keys | 2,048 predicates: 1.001× wall, 6/10 wins | Paired wall and CPU CIs cross zero; scale run not admitted | Rejected and reverted |
| Namespace declaration-pass gate | 2,048 predicates: 1.002× wall, 6/10 wins | Clean-rerun wall and CPU CIs cross zero; scale run not admitted | Rejected and reverted |
| Recovered-parameter identity reuse | 2,048 predicates: 1.004× confirmation; paired CIs cross zero | 65,536 predicates: 1.002× CPU, 8/10 wins; paired CI crosses zero | Rejected and reverted |
| One-pass special-identifier classification | 2,048 families: 1.010× CPU, 6/10 wins | Paired CIs cross zero; scale run not admitted | Rejected and reverted |
| Declaration-map pre-sizing | 2,048 families: 1.028× CPU screen, 8/10 wins | Confirmation: 1.008× CPU, paired CI crosses zero | Rejected and reverted |
| Identifier declaration-slot reuse | 2,048 families: 0.995× CPU, 5/10 wins | 32,768-family 2026-09-12 retest: 1.103× lower mean, 15/20 wins, but paired 95% CI crosses zero | Rejected and reverted |
| Parser identifier escape-flag reuse | 2,048 families: 0.985× CPU, 5/10 wins | 0.975× wall; candidate slower | Rejected and reverted |
| Exact pruned prefix trie | 32,768 families: 1.008×; paired CI crosses zero | 65,536 families: 1.011×; paired CI crosses zero | Rejected and reverted |
| Parser-local exact-name cache | 32,768 families: 0.999×; paired CI crosses zero | Not run after failed gate | Rejected and reverted |
| Declaration-space marker gates | 32,768 families: 0.977×; candidate slower | Not run after failed gate | Rejected and reverted |
| Visible-annotation hot cache | 32,768 families: 0.996×; candidate slower | Not run after failed gate | Rejected and reverted |
Project status
Conservative on purpose: anything not exercised by an example or a test stays "maturing" even when the underlying code is largely there.
| Area | Status | Detail |
|---|---|---|
| Lexer, parser, type inference | Usable today | Capability matrix |
| TypeScript conformance (coarse + byte-exact) | 5,907 / 5,907 — 100% | TypeScript parity |
| TypeScript diagnostic codes emitted | 1,620 / 2,079; 0 reachable targets left | Diagnostic reachability |
| Language server methods routed | 76 / ~80 | Parity status |
| Native codegen | Maturing — single-entrypoint LLVM builds work | Parity status |
| Bun runtime port | 552 / 1,193 files integrated | Bun parity |
node:* modules JS-callable | 24 / 47 (partial surfaces) | Node.js parity |
| Compiler test suite | ~8,415 tests | Parity 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/fibonacciCommon commands:
| Command | What it does |
|---|---|
./pantry/.bin/zig build | Build the compiler |
./pantry/.bin/zig build test | Run the unit-test suite |
./pantry/.bin/zig build examples | Run the native example executables |
./pantry/.bin/zig build run -- examples/fibonacci.home | Build, then run a file |
scripts/check-examples.sh | home check every .home example |
scripts/measure-parity.sh --diff | Fail 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 libraryMonorepo structure and architecture go deeper.
Contributing
Contributions welcome — see CONTRIBUTING.md. Release notes live in CHANGELOG.md.
License
MIT — see LICENSE.