Getting Started
OverviewLanguage GuideFull Reference
Book
Table of ContentsIntroductionPrefaceGetting StartedLanguage TourOwnershipErrorsConcurrencyStdlibNetworkingDataPackagesSpeed & SafetyCross-PlatformToolingCookbookAppendix
Reference
Standard LibraryKeywordsPerformanceSecurityBuilt-in FunctionsStatusDebuggingABI
How-To
Getting StartedHTTP APIsErrorsPackagesConcurrencyMemoryWASITestingRelease Builds
Project
RoadmapVisionChangelogContributing

Roadmap

Mako roadmap

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.


What is next

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

v0.1.10 — Deepen generics + speed — shipped

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.

Known limitations


v0.1.9 — Generics & Iterators — shipped

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.

Ecosystem: Leba load balancer

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:


v0.2.0 — Stdlib in Mako

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

v0.2.1 — Safety & Correctness

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

v0.2.2 — Tooling

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

v0.3.0 — Cross-Platform

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

v0.4.0 — Performance Ceiling

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

v1.0 — Stability

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

What shipped recently

0.1.8 — Speed & memory safety


Just closed (2026-07-15) — const fn strings

Area Status
const fn f(s: string) -> string Done seed — shout/greet/pick
Int const fn with string locals Done seedlen_greet
Full CTFE (heap, mutate, index, loops on strings) Still product residual

Just closed (2026-07-15) — const string seed

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

Just closed (2026-07-15) — const-fn break/continue

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)

Just closed (2026-07-15) — const-fn for

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)

Just closed (2026-07-15) — const-fn depth

Area Status
Const match (int / \| / _ / bind) Done seedconst_fn_test
Const while + assign (≤100k iters) Done seedsum_to / pow2 fold
Domain CTFE product Still open (strings, heap, unlimited loops)

Just closed (2026-07-15) — actor int payload

Area Status
Actor message payload seed Donereceive Inc(delta) packs tag+int · actor_pack / msg_tag / msg_payload
Existing no-payload actors Unchanged surface (Counter_Inc() packs payload 0)

Just closed (2026-07-15) — implicit interfaces

Area Status
Go-like method sets Doneon 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)

Just closed (2026-07-15) — package-per-dir · rendezvous

Area Status
Package-per-directory model Done — multi-file merge · pack name check · path dep + pull
Unbuffered rendezvous channels Donechan_new(0) handoff · chan_rendezvous_test

Just closed (2026-07-15) — seeds & syntax

Area Status
Error chain peel + tag helpers Done seederror_unwrap / root / as_tag / has_tag · error_chain_test · std/errors
fallthrough switch dual Done seedfallthrough_test
IDENTITY errors track 100% — richer than stringly defaults

Just closed (2026-07-14)

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

Landed (foundation — do not re-open)


Next (ordered queue)

Work below is not MVP. Order is product leverage, not strict dependency.

P1 — Runtime trust (concurrency)

Highest remaining risk for production backends.

  1. ~~Portable timeouts and deadlines~~ Done seedtimeout_portable_test
  2. ~~Structured child error propagation~~ Done seedcrew.first_err / err_count / wait (crew_error_prop_test)
  3. ~~Detached-task lifecycle~~ Done seeddetach f() + detached_join_all() (detach_test)
  4. ~~Actor / receive + owned state~~ Done seed — fields + self.x (actor_test)

P2 — Observability depth

Metrics/prom + span-lite JSON are in; depth seeds landed (2026-07-14).

  1. ~~Full OpenTelemetry export (OTLP wire)~~ Done seedtrace_export_otlp_json / metrics_export_otlp_json (OTLP/HTTP JSON; not protobuf)
  2. ~~CPU / memory / allocation / scheduler / lock-contention profiling~~ Done seedprofile_snapshot_json, process_rss_bytes, lock_wait counters
  3. ~~Stack traces with source locations~~ Done seedstack_trace() (symbolized via backtrace_symbols)
  4. ~~Debugger depth~~ Done seeddebug_break / tasks_inspect_json / task_done / task_id (locals/breakpoints residual)
  5. ~~Crash reports~~ Done seedcrash_report_install · ~~PGO/LTO workflow~~ Done seedMAKO_PGO_* / MAKO_NO_LTO / howto

P3 — Install, distribution, portability

  1. ~~Installer UX polish~~ Done seed — manifest (Unix+Windows) · doctor schema/fields · DOCTOR_STRICT matrix

  2. ~~Windows winget / Linux deb·rpm seeds~~ Done seedpackaging/winget/ · scripts/package-deb.sh · package-rpm.sh (MSI/notarize residual)

  3. ~~Homebrew formula~~ Done seedFormula/mako.rb (core publish is external)
  4. ~~Multi-OS matrix validation seed~~ Done seedscripts/validate-matrix.sh
  5. ARM / x86-64 / RISC-V target validation — listed in matrix script; CI residual

P4 — Domain & advanced systems

  1. Telecom/realtime — SIP proxy library built-in (mako_sip.h / std/sip); RTP/SRTP helpers; SIPREC/WebRTC out of scope

  2. ~~Storage product seeds~~ Done seed — page/WAL/hindex/store + btree save/load + SST + pcache + MVCC GC (storage_depth_test)

  3. ~~Graphics/audio/physics soft seeds~~ Done seedgfx_* / audio_mix / physics_step_*
  4. ~~Multiplayer snapshot + rollback ring~~ Done seedsnap_* / rollback_*
  5. ~~GPU AI depth seeds~~ Done seedgemm2x2 / RoPE / kv_cache_* / f16 bits (host); Metal/CUDA residual
  6. Interop beyond C · hot reload · safe comptime domain extensions — open

Language ergonomics — production backends

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):

  1. Stack mut-ref captures (use ShareInt / share handles for shared mut) · deeper NLL
  2. Remaining printf exotics (%n, dynamic *, locale) — use fmt_sprintf*
  3. Full debugger DWARF/locals UI (seed: debug_set_int / debug_locals_json / debug_bp)

Language / stdlib residuals (lower priority)


Product focus (contract)

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

General-purpose intention tracker

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%

1. Language identity and core type system — 10%

2. Memory safety and allocation control — 10%

3. Concurrency and runtime trust — 10%

4. Backend app surface — 12%

5. API protocols and networking — 10%

6. Data, SQL, and serialization — 10%

7. Toolchain, packages, and IDE — 10%

8. Observability and debugging — 8%

9. Installer, distribution, and portability — 10%

10. Domain tracks and advanced systems — 10%


Later (VISION — not scheduled)

External (user / ecosystem)

  1. Publish Homebrew / homebrew-core
  2. Community package registry population
  3. Production case studies (backend, infra, domain stacks built in Mako)

How to use this file

  1. STATUS.md is the adversarial Done bar for MVP claims.
  2. This file orders product intention residuals after MVP.
  3. When a checkbox flips, update the track % and overall ~% in the same edit.
  4. Prefer small, suite-backed landings over roadmap thrash.
Edit this page on GitHub Report an issue