Skip to content

Roadmap ​

Nothing is released yet; 2.0.0-alpha.1 is in preparation, and what it adds is in the changelog.

The charter is PLAN.md; this page summarizes its phases. Each phase lands fixtures first, keeps every gate green, and records its outcome in the definition-of-done manifest (tests/dod-manifest.ts). Status as of 2026-09-23.

PhaseWhatStatus
0Gates: value-model probes as fixtures, structural-subtyping fuzzerdone
1Modules: named, default, namespace imports, re-exports, TS-source packages, CommonJS rejectionsdone (node:process as a module still open)
2Runtime ported from C to Milo; C residue under 100 linesdone
3Shaped objects, whole-program field ordering, inline cachesdone
4Value words, mixed unions, narrowingdone
5Mutable captures in heap cells, erased genericsdone
6Own garbage collector in Milo (conservative roots, precise heap, inline bump allocation); libgc droppeddone
70.1 "TS CLI tools": argv, fs, validated JSON.parse, async, chad doctordone (2.0.0-alpha.1 in preparation)

Planned, not scheduled to a phase ​

These are rejected today with a specific code, so programs that need them fail at compile time instead of misbehaving:

  • Prebuilt compiler binaries, and --fallback=milojs.
  • Classes that extend Error or other built-in classes, and .stack on errors.
  • .then() on promises, and new Promise with an executor that is not written inline.
  • Regular expressions (CS1213) and Date instances (CS1215).
  • Destructured parameters with defaults (CS1217), let x; without an initializer (CS1218), getters, setters and access modifiers.
  • toPrecision and toExponential (CS1221).
  • Generics instantiated with arrays, maps or functions (CS1242), and monomorphization as a flag-gated optimization.
  • Optional chains longer than one ?., and Map/Set keyed by a union.
  • Garbage collector: evacuation, returning memory to the OS, a generational nursery.
  • Unicode: strings are UTF-8 and exact for ASCII; operations that depend on UTF-16 code units are gated (CS1216) until that decision is made.

Never ​

Permanent non-goals: a JavaScript engine in the binary (eval, prototype mutation, adding or deleting properties, Proxy), custom type inference or a custom parser, self-hosting, npm compatibility as a goal (a package works if and only if its TypeScript source is in the subset), and CommonJS.

History ​

Branch v1 holds v1, a self-hosting compiler that resolved types during code generation and could not be stabilized. A second attempt went fully dynamic and lost scope. This is the third, built around two rules: TypeScript's own checker decides every type, and Node decides what every program must print. The post-mortems are in the plan.

Follow progress and file issues on GitHub.

Next: Quickstart, and try it on your own code.