Product version: 0.2.1 · Last roadmap sync: 2026-07-17.
Verified: STATUS.md · Stdlib: STDLIB.md · Security: SECURITY.md · Release: RELEASE.md.
Book: The Mako Book · Identity: IDENTITY.md · Pain map: PAIN_POINTS.md.
| Version | Theme | Status |
|---|---|---|
| 0.1.9 | Generics & iterators | Shipped |
| 0.1.10 | Deepen generics + speed | Shipped |
| 0.2.0 | Stdlib written in Mako | Shipped |
| 0.2.1 | Safety & correctness | Shipped |
| 0.2.2 | Tooling | Planned |
| 0.3.0 | Cross-platform | Planned |
| 0.4.0 | Performance ceiling | Planned |
| 1.0 | Stability | Planned |
Resolved the two blockers that prevented the stdlib rewrite.
| Feature | Status | Description |
|---|---|---|
| Multi-statement lambda bodies | Done | Lambdas support let, assignments, if/else, while, nested loops. Blocks emitted as full C function bodies. |
mut self on methods |
Done | fn m(mut self) passes receiver by pointer. Mutations persist in caller. Enables real iterators. |
| Generic enum variant disambiguation | Done | Multiple instantiations of same generic enum no longer collide on variant names. Qualified lookup by return type context. |
| Tuple channel codegen | Done | chan[(int,int,int,int,int)] send/recv works. Required by leba 0.6+. |
chan_len / chan_cap for all channel types |
Done | Works on int, float, string, struct, enum, tuple channels. |
| Speed: wyhash | Done | Map key hashing 4-8x faster. |
| Speed: stack f-strings | Done | 256B stack buffer, zero malloc for short strings. |
| Speed: constant folding | Done | 1 + 2 folded at compile time. |
| Speed: zero-copy strings | Done | Comparisons, match arms, print, str_eq, str_has_prefix use mako_str_view. |
| Speed: select condvar | Done | Channel select wakes on send, not 2ms polling. |
| Speed: emit_line | Done | Codegen hot paths use format_args! — no per-line heap allocation. |
Tests: multi_stmt_lambda_test, mut_self_test, generic_enum_multi_test, v0110_adversarial_test.
return inside multi-statement lambda bodies triggers a type error (type checker uses enclosing function's return type). Workaround: use let mut out = ...; return out pattern.The foundation for everything that follows.
| Feature | Status | Description |
|---|---|---|
| Generic structs | Done | struct Pair[T] { a: T, b: T } — monomorphized; multi-param; nested; in generic fns |
| Generic enums | Done | enum MyBox[T] { Val(T), Nothing } — monomorphized; match works |
| Interface bounds | Done | fn f[T: Describable](x: T) — structural method-set check; compile error on violation |
| Iterator protocol | Seed | Types with next() -> Option[T] recognized as iterables; by-value self limits mutation |
| Mutable closures | Seed | Heap-cell infrastructure built; needs multi-statement lambda bodies |
Tests: generic_struct_test, generic_enum_test, generic_bounds_test,
generic_adversarial_test, iterator_test, mutable_closure_test,
examples/bad/generic_bound_fail.mko.
Leba (v0.7.0) is an independently maintained Mako application and systems-programming showcase. Its deployment and production claims belong to the Leba repository; this roadmap does not use it as evidence that every Mako program or the Mako toolchain is production-ready. It exercises channels, TLS, HTTP proxying, structured concurrency, and the networking stdlib. Recent work:
The standard library moves from C runtime wrappers to real Mako code. The stdlib must be idiomatic Mako and serve as example code for the community.
| Feature | Description |
|---|---|
| io.Reader / io.Writer | Composable I/O interfaces — bufio, compression, TLS all work through them |
| Generic collections | List[T], Set[T], Queue[T], PriorityQueue[T] written in Mako |
| encoding/json | Struct-aware marshal/unmarshal using reflect — written in Mako, not C |
| net/http middleware | Handler chains, request context, streaming bodies |
| context cancellation | Deadline propagation, cancel trees, timeout scoping |
| database/sql pool | Connection pooling, prepared statements, transactions |
Close the gap between what Mako promises and what it verifies.
| Feature | Description |
|---|---|
| Ownership verification | Static use-after-move analysis — compiler error, not runtime crash |
| Lifetime tracking | Prevent dangling pointers from sub-slices and borrowed views |
| Compile-time race safety | Safe Mako rejects unsynchronized mutable closure captures and unknown function environments across every kick; fan mappers are capture-free; nested field/index writes are checked |
| Match exhaustiveness | Compiler error when match arms do not cover all enum variants |
| Match guards | Ok(n) if n > 0 => ... — boolean conditions on match arms |
| Nested destructuring | Some(Point { x, y }) => ... — destructure through multiple layers |
Developer-experience hardening.
| Feature | Description |
|---|---|
| LSP: find-all-references | Across files, respecting imports |
| LSP: rename refactoring | Safe symbol rename across the project |
| LSP: signature help | Parameter hints as you type function calls |
| LSP: inlay hints | Show inferred types inline |
| Debugger | Source-level breakpoints in .mko files, step through Mako lines, inspect variables |
| Package registry | mako publish / mako install from a central registry |
| Dependency solver | Version conflict resolution with integrity hashes |
Every target tested in CI, not just scripts.
| Feature | Description |
|---|---|
| Windows | All tests pass in CI, native threading (not pthread shims), IOCP networking, MSI installer |
| WASM | Browser target with DOM bindings, no POSIX deps, WASI Preview 2 component model |
| ARM / RISC-V | Tested in CI via QEMU or real hardware, cross-compilation from x86 works |
Move beyond what the C backend can give.
| Feature | Description |
|---|---|
| IR layer | Intermediate representation between AST and C — enables language-aware optimizations |
| Dead code elimination | Import-aware reachability — only emit code that is actually used |
| Escape analysis | Stack-allocate values that do not escape their scope |
| Interface devirtualization | Inline interface calls when the concrete type is known |
| Closure inlining | Inline small closures at call sites |
| LLVM backend | Optional direct LLVM IR emission for targets where clang is slow or unavailable |
| Feature | Description |
|---|---|
| Syntax frozen | No breaking changes to the language |
| Stdlib API stable | Semver guarantees on all public symbols |
| Self-hosting compiler | The Mako compiler written in Mako |
| Formal memory model | Documented guarantees for concurrent access |
| Ecosystem | Package registry with community packages, IDE plugins, CI templates |
| Area | Status |
|---|---|
const fn f(s: string) -> string |
Done seed — shout/greet/pick |
| Int const fn with string locals | Done seed — len_greet |
| Full CTFE (heap, mutate, index, loops on strings) | Still product residual |
| Area | Status |
|---|---|
const S = "…" / + concat |
Done seed |
str_len / len / == / != / str_eq |
Done seed → int fold |
| Full CTFE strings (mutate, index, heap) | Still product residual |
| Area | Status |
|---|---|
Const bare break / continue |
Done seed — while / for / C-for · TestConstFnBreakContinue |
C-for continue runs post |
Done (Go/C semantics) |
| Labeled break/continue in const | Not yet (runtime labels still work) |
| Area | Status |
|---|---|
Const for i in n / for i in range n |
Done seed — count 0..n-1 · TestConstFnFor |
Const C-style for init; cond; post |
Done seed — let/assign init + post |
| Domain CTFE product | Still open (strings, heap, collection range) |
| Area | Status |
|---|---|
Const match (int / \| / _ / bind) |
Done seed — const_fn_test |
Const while + assign (≤100k iters) |
Done seed — sum_to / pow2 fold |
| Domain CTFE product | Still open (strings, heap, unlimited loops) |
| Area | Status |
|---|---|
| Actor message payload seed | Done — receive Inc(delta) packs tag+int · actor_pack / msg_tag / msg_payload |
| Existing no-payload actors | Unchanged surface (Counter_Inc() packs payload 0) |
| Area | Status |
|---|---|
| Go-like method sets | Done — on T / T_m implements I without on T : I · iface_implicit_test |
| Dual-form checklist | ~94% — remaining open item is intentional *T/&x (won't) |
| Area | Status |
|---|---|
| Package-per-directory model | Done — multi-file merge · pack name check · path dep + pull |
| Unbuffered rendezvous channels | Done — chan_new(0) handoff · chan_rendezvous_test |
| Area | Status |
|---|---|
| Error chain peel + tag helpers | Done seed — error_unwrap / root / as_tag / has_tag · error_chain_test · std/errors |
fallthrough switch dual |
Done seed — fallthrough_test |
| IDENTITY errors track | 100% — richer than stringly defaults |
| Area | Status |
|---|---|
| Demand-driven map/bag monomorphs (O(used), not N² grid) | Done — large packs stay usable |
| Nested bag / Option / Result / tuple map values | Done — suite coverage |
| P1 — Runtime trust | Done seed — timeouts, crew errors, detach, actors |
| P2 — Stdlib / security product polish | Done |
→ path_file_size |
Done |
→ PEM helpers (pem_* + crypto.x509) |
Done |
→ mTLS + cert lab (tls_make_self_signed / tls_make_csr / tls_server_reload) |
Done |
→ SCRAM-PLUS adoption (scram_tls_unique_cbind / scram_plus_client_final_bare) |
Done |
| → Docs: crypto core only (no high-level SASL state machine) | Done |
→ Observability: metrics_export_prom, trace_export_json |
Done (seed depth) |
| P2 — Observability depth | Done seed |
→ OTLP/HTTP JSON (trace_export_otlp_json / metrics_export_otlp_json) |
Done |
| → Profile snapshot + RSS/CPU + lock_wait counters | Done |
→ stack_trace / crash_report_install |
Done |
| → PGO/LTO env workflow | Done |
| Tests | security_product_test · observability_depth_test |
.mko; crew / actors / arenas / Result / Optionmako version / test / check / build / rundocs/book/)Work below is not MVP. Order is product leverage, not strict dependency.
Highest remaining risk for production backends.
timeout_portable_test crew.first_err / err_count / wait (crew_error_prop_test) detach f() + detached_join_all() (detach_test) self.x (actor_test)Metrics/prom + span-lite JSON are in; depth seeds landed (2026-07-14).
trace_export_otlp_json / metrics_export_otlp_json (OTLP/HTTP JSON; not protobuf) profile_snapshot_json, process_rss_bytes, lock_wait counters stack_trace() (symbolized via backtrace_symbols) debug_break / tasks_inspect_json / task_done / task_id (locals/breakpoints residual) crash_report_install · ~~PGO/LTO workflow~~ Done seed — MAKO_PGO_* / MAKO_NO_LTO / howto ~~Installer UX polish~~ Done seed — manifest (Unix+Windows) · doctor schema/fields · DOCTOR_STRICT matrix
~~Windows winget / Linux deb·rpm seeds~~ Done seed — packaging/winget/ · scripts/package-deb.sh · package-rpm.sh (MSI/notarize residual)
Formula/mako.rb (core publish is external) scripts/validate-matrix.sh Telecom/realtime — SIP proxy library built-in (mako_sip.h / std/sip); RTP/SRTP helpers; SIPREC/WebRTC out of scope
~~Storage product seeds~~ Done seed — page/WAL/hindex/store + btree save/load + SST + pcache + MVCC GC (storage_depth_test)
gfx_* / audio_mix / physics_step_* snap_* / rollback_* gemm2x2 / RoPE / kv_cache_* / f16 bits (host); Metal/CUDA residual Already on tip (do not re-open as “missing language features”):
| Feature | Surface | Tests / docs |
|---|---|---|
| Loops | for i, v in range s · for k, v in range m · C-style for |
for_forms_test · ERGONOMICS.md |
| Formatting | fmt_sprintf* / fmt_sprint* / fmt_errorf |
fmt_print_test |
| String/int dispatch | match "…" { … } · switch / case |
ergonomics_test · switch_test |
| Multi-field worker I/O | chan[Struct] + deep-POD kick args |
chan_struct_test · SPEED.md |
| Struct update (spread) | S { field: v, ..base } / S { ...base, field: v } |
struct_update_test |
| Enum on kick-POD / channels | POD enum fields; chan[Enum] |
struct_update_test |
| First-class fn values | fn apply(f: fn(int)->int, …) · named + lambda |
lang_ergonomics_test · first_class_fn_test |
| Capturing closures (POD + string + struct + ShareInt) | value / clone / shared mut handle | capturing_closure_test · struct_capture_test · share_capture_test |
Kick fn values across crew |
kick(apply(f, x)) with bare/capturing MakoFn |
kick_fn_test |
f"…{x}" + format specs |
+ # - 0 · xXob · float fe · width |
fstring_fmt_test |
| Struct field defaults | field: int = 0 on struct |
lang_ergonomics_test |
| Tuple channels | chan[(int, string)] |
lang_ergonomics_test |
Still open (true residuals):
ShareInt / share handles for shared mut) · deeper NLL %n, dynamic *, locale) — use fmt_sprintf* debug_set_int / debug_locals_json / debug_bp) Result / Option / ? edges beyond current suite \p{…} seeds landed) General-purpose backend and infrastructure first; telecom is one domain track, not the language identity.
| # | Focus | State |
|---|---|---|
| 1 | Backend app surface | Done |
| 2 | API protocols & networking | Done |
| 3 | Data / SQL / serialization | Done |
| 4 | CLI / devtools | Done (depth residual in install) |
| 5 | Cloud / K8s / sidecars | Partial — helpers + containers; operator patterns open |
| 6 | Runtime trust | Partial — see P1 |
| 7 | Observability / debugging | Partial (~78%) — see P2 (OTLP/profile seeds Done) |
| 8 | Domain tracks | Partial (~70%) — security polish Done; stacks open |
| 9 | Deployment / WASM | Strong seeds; matrix polish open |
Checklist for 100% of the product intention, not the MVP/STATUS bar.
Percentages are weighted; update when a task flips.
Overall intention completion: ~96% / 100%
Mako identity (preferred syntax): ~100% — IDENTITY.md.
| Track | Weight | Current |
|---|---|---|
| 1. Language identity and core type system | 10% | 100% |
| 2. Memory safety and allocation control | 10% | 88% |
| 3. Concurrency and runtime trust | 10% | 88% |
| 4. Backend app surface | 12% | 100% |
| 5. API protocols and networking | 10% | 100% |
| 6. Data, SQL, and serialization | 10% | 100% |
| 7. Toolchain, packages, and IDE | 10% | 100% |
| 8. Observability and debugging | 8% | 86% |
| 9. Installer, distribution, and portability | 10% | 88% |
| 10. Domain tracks and advanced systems | 10% | 95% |
Result, Option, enums, match.fn id[T](x: T) -> T; dual []/<> for built-ins).pack / pull (dual package / import).(int, int) + let a, b = f().export; opt-in visibility = "explicit".chan_open[T] / make(chan[T], n).if init; cond { } · go f() → kick · compound assign · Go for/switch forms.fallthrough switch dual seed (fallthrough_test).error_unwrap / root / as_tag / has_tag · std/errors · Result[T, Enum].#[stable] / #[deprecated]).Option.arena, hold, share seed, CFG/NLL checks.unsafe blocks.[profile.release] bounds_checks = "on" setting remains accepted.str_slice_eq / str_slice_index / str_at_eq / str_byte_at).gc_* API.crew, kick, join, channels, cancel seed, fan.actor / receive syntax with owned state (seed: fields + self).receive Inc(delta) · packed tag+payload mailbox).detach + detached_join_all).--race). Leak scopes Done.HttpRequest parse/accessors.check / build / run / fmt / test · package manifest/lock seed.mako doc.metrics_export_prom).trace_export_json).trace_export_otlp_json / metrics_export_otlp_json).profile_snapshot_json — RSS/CPU/alloc/sched/lock).stack_trace).crash_report_install).MAKO_PGO_GEN / MAKO_PGO_USE / MAKO_NO_LTO · howto).debug_break / hits · tasks_inspect_json · task_done / task_id / task_joined.fn_drop / fn_has_env (+ generated drop_env for string fields).fn_drop on scope exit; kick moves env into the task (no double-free).debug_set_int / debug_locals_json / debug_bp).debug_set_loc / debug_file / debug_line / debug_frame_json).debug_snapshot_json.trace_export_otlp_pb) + HTTP exporter (otlp_http_export / otlp_export_traces_*).profile_sample_* · SIGPROF + cooperative · profile_samples_json).dap_initialize_response / dap_stopped_event / dap_request_command) · lldb still primary for DWARF.dap_handle_request · mako dap --request …).mako dap --stdio · scopes/variables/step seeds).profile_samples_pprof_text / profile_sample_thread_count).profile_http_route / profile_pprof_http_body for /debug/pprof/*).mako profile-serve --port N --max-requests K).mako doctor · update/uninstall.install-manifest.json seed).install.ps1 writes the same manifest schema.package-deb.sh · package-rpm.sh · packaging/winget/ · Formula/mako.rb · validate-matrix.sh.scripts/package-msi-notes.md · package-macos-notarize-notes.md).packaging/windows/mako.wxs · package-msi-seed.sh).package-notarize-seed.sh) · notes remain for real Apple credentials.publish-homebrew-tap-seed.sh · publish-winget-seed.sh).scripts/cross-target-seed.sh · FreeBSD/RISC-V triples · CI workflow).path_file_size.std/sip): parse/build, Via/RR/rport, Digest HA1, framing; RTP/SRTP helpers; SIPREC/WebRTC out of scope.sip_header_view / sip_method_eq / sip_header_eq / sip_view_*).gfx_*, audio_mix, physics_step_*).snap_*, rollback_*).lsm_compact) · store_recover_wal crash replay · hot_reload_* mtime watch.lsm_compact_down / lsm_sst_levels / lsm_level_len).pbtree_* — nodes in MakoPage).bloom_* · btree_range / sst_range + range_* · pman_* disk page manager.gfx_poll / gfx_backend_name).gfx_window_fill / set_pixel / get_pixel / pixels).gpu_metal_ok / cuda_ok / vulkan_ok).snap_diff / snap_apply_delta · netcode_lag_comp_tick / netcode_interp.plugin_open / call / close) · ffi_abi_name.std/plugin + info/error/slots/close_all · plugin_package_test).plugin_product_test).std/unicode · unicode_full_test).collections_*_test).time_full_test).syscall_full_test).yaml_toml_test).cbor_msgpack_test).avro_graphql_tz_test).chan_len / chan_cap on any chan[T] (struct/tuple/string rings).hot_reload_unwatch / hot_reload_watch_count).predict_new / input / reconcile / state / tick).hot_reload_plugin_watch / poll / call / close).simd_dot_i64_4 / simd_sum_i64_4 — autovec-friendly).file_mtime_ns / hot_reload_watch / hot_reload_changed).note_swap / swap_count / stamp / status_json).if / comparisons / if-expr fold (const_fn_test).for i in n / range n / C-style; max 100k).+, str_len, equality → int).shout / greet / mixed int).