This roadmap describes where NURL is today and where it is going. It is forward-looking and deliberately concise — the full, reverse-chronological record of what shipped when lives in CHANGELOG.md. Anything marked done here has a regression test in compiler/tests/ and is covered by the bootstrap fixed point.
_Last reviewed: 2026-06-22 · Current release: 0.9.10 · Language: **Grammar v2.2** (spec/grammar.ebnf)._
NURL is a small systems language with a regular prefix-arity grammar, a self-hosted compiler written in NURL, and an LLVM backend. The compiler bootstraps to a byte-identical fixed point on its own source (stage1 ≡ stage2). The only build dependency is clang / LLVM 14+.
What is solid today:
|) and product types (structs),
generics over structs and functions (incl. generics over option/result types), pattern matching with match guards, or-patterns, and N-ary payloads, trait bounds on type parameters ([A: Ord]), **compile-time constant folding** (const_eval_int), a full numeric type set (i = i64 and u = byte/u8, plus sized i8/i16/i32, u16/u32/u64, f = f64 and f32), tail-call optimization, and variadic FFI (the printf family callable directly). The grammar decision for prefix-arity (no grouping delimiter) is formally locked.
scope exit — no GC, no hidden boxing. A **static borrow checker, on by default** (--no-borrowck to disable, --strict-borrowck to tighten), catches use-after-move, alias double-free, escaping closure captures, interprocedural/return escape, loop-carried double-frees, and iterator invalidation as hard errors without changing generated code.
async/await colouring** — ordinary code runs unchanged under the scheduler — plus threads/mutex/cond, typed channels, and Go-style ?? channel select.
spanning collections, hashing, serialization, a full HTTP/1.1+2 + WebSocket stack, database clients, distributed systems (p2p overlay, CRDTs), MCP, and the Anthropic Claude API.
wasm32-wasi, and static Linux ARM64 / RISC-V64 (musl). See docs/PLATFORMS.md.
nurlc (compiler), nurlfmt (canonical formatter), nurl-lsp
(language server), nurlpkg (package manager + test/bench runner), nurldoc (API-doc generator), tools/repl, DWARF debug info (--g), a VS Code extension, and nurlapi — a compiler-as-a-service container that powers the public playground and MCP endpoint.
The path to 1.0 is hardening, documentation precision, and external validation rather than new language surface — see Toward 1.0 below.
A high-level map of what exists. Dates and per-feature detail are in CHANGELOG.md.
compiler/nurlc.nu) with a deterministic, byte-identical
bootstrap; stage-0 links the committed nurlc_lastgood.ll snapshot (no Python in the toolchain).
spec/). v2.x added:
visibility (pub) enforcement across functions, types, consts, and enum variants; trait bounds; match guards + or-patterns; const folding; channel select; and locked the prefix-arity grouping decision.
conversions. Sized integer/float types with signedness tracking; explicit # casts with correct sext/zext/trunc/fpext/fptrunc.
(Channel[A], Vec[Thread]), and generics over ?T / !T E.
Drop for boxed enum/struct payloads,
% Drop user destructors, move/borrow analysis (incl. interprocedural and loop-carried escape detection). Model and known gaps: docs/MEMORY.md.
identifiers, call-arity mismatches, unbalanced braces / stray top-level tokens, and visibility violations are hard errors with source locations — nothing malformed reaches the backend silently.
nurlc --g) with ptype/print over structs.
Organised as core/ (language essentials), std/ (general-purpose), and ext/ (external-format / network / service bindings). All pure NURL except a small C runtime (stdlib/runtime.c) for the bootstrap surface and a few platform-specific shims.
string, vec, option, result, errors, char, slice,
pair, box, cell, mem, io, symtab, posix.
hashmap, set, deque, heap,
ordmap, btree, lru, bitset, iter, sort, cmp, bytes, bufio, fmt, int, float, bigint (arbitrary-precision integers), decimal (exact fixed-point).
async, thread, channel, arc, rc,
arena, signal, panic/recover, process, unixsock (local IPC), log (text + JSON), time (incl. timezone/DST, HTTP/RFC 2822 dates), args (CLI parser), term (POSIX termios, ANSI).
hash (SHA-1/256/512, MD5, HMAC),
hash_blake3, encode (hex, base64, base32), random (OS CSPRNG), rng (seedable, deterministic xoshiro256**).
fs (incl. streaming + readlink), path (typed),
net (TCP/TLS), udp, dns, dos.
json, toml, csv, msgpack, cbor, xml, yaml,
serde, regex.
auth, JWT bearer-auth, cookies, forms, multipart, router, middleware, access log + Prometheus metrics, DoS caps, graceful shutdown, per-request timeouts, panic recovery), HTTP client (with cookie jar), TLS (SNI + ALPN + mTLS + live cert reload), HTTP/2 (RFC 9113 + HPACK, server and client), WebSocket (RFC 6455, **server and client, with permessage-deflate** compression — RFC 7692), reverse proxy with binary-safe streaming. The stack has had a dedicated security-hardening pass (path-traversal, SSRF, request-smuggling, HTTP/2 CONTINUATION-flood + stream-accounting, and clean cross-thread listener shutdown) with regression tests.
sqlite (production-hardened), postgres (binary
protocol, async, LISTEN/NOTIFY, COPY), mqtt 5.0 client, smtp (mail submission).
mcp (+ client, http, session, stdio,
registry) and anthropic (Claude Messages API incl. streaming SSE + tool-use deltas).
semver, manifest, lockfile, resolver,
registry_index, pkg_fetch, pkg_publish (the nurlpkg backend).
compress (zlib/zstd/gzip), zip (archives), tar, uuid (v4/v7),
credentials, env.
NAT traversal, DERP relay, SWIM membership, state-based CRDTs (PN-Counter, LWW-Register, OR-Set), gossip replicator, consistent-hash ring, distributed computation (Crown).
wasm32-wasi (WASI SDK), including the compiler itself runningin the browser playground.
C906) validated on-device.
nurlfmt canonical formatter (idempotent, IR-preserving), nurl-lsp
(completion, references, unused-symbol lint), nurlpkg package manager, DWARF debugging, VS Code extension, and the nurlapi compiler-as-a-service container (playground + cross-compile endpoints + public MCP server).
examples/ including a Game Boy emulator
(with sound), a C64 demo, ESP32 / Milk-V embedded targets, and a Push-To-Talk distributed voice app (pttvoice/).
The remaining work to declare a stable 1.0 is mostly precision and proof, not new language features.
checker rejects vs. tolerates, with no implied Rust-equivalence (docs/MEMORY.md, docs/LIMITATIONS.md).
interprocedural escape analysis and *T raw-pointer flows are on the roadmap or out of scope by design; the checker is currently incomplete there by design. (Resolved: interprocedural escape and return-escape implemented.)
arm-local fall-through bindings, allocations inside a recover scope). (Resolved: leaks fixed.)
These convert a hypothesis into measured results.
characters) for NURL vs Python/Rust/JS across 8 matched programs (bench/TOKEN_EFFICIENCY.md). *Result: the raw token-count claim did not survive measurement — on today's tokenisers NURL is ~1.7× Python's tokens (median), losing to out-of-distribution glyph fragmentation. The claim was retired; the defensible arguments are grammar regularity and first-pass compile success.*
correctness, NURL vs Python/Rust, across four models (Sonnet 4.6 / Opus 4.8 / Haiku 4.5 / mercury-2 diffusion), primed with NURL's one-page reference since the training corpus contains zero NURL (bench/genacc/, results in bench/genacc/RESULTS.md). *Result: from a single page a model reaches the Python/Rust ballpark on several tasks but not parity; failures are out-of-distribution habits (imports, then grouping-parens, then mutability) that targeted primer cues fix in turn.*
project copy — "an agent can drive the toolchain over MCP" is a tooling win, not evidence the language is better for LLMs.
maintainer and publish a short governance note (license stays MIT OR Apache-2.0).
Not blocking 1.0; ordered roughly by likely value.
no_std-styleembedded profile. The RISC-V / ARM64 static cross-compiles already prove the shape; these extend it.
stdlib/runtime.c into
bootstrap-internal helpers vs. stdlib FFI shims. The PURIFY effort already moved most platform code into pure-NURL & \c`` FFI; the file-level split itself remains.
Ideas under consideration, no committed timeline.
suggestions, leaning on the regular grammar and local error semantics.
the simple IR, but are not on the near-term path.
Deliberate exclusions, to set expectations:
model; rc/arc are opt-in library types.
async/await function colouring. Concurrency is via stackful fibers;ordinary code is scheduler-agnostic.
whole point.
(#).
recover — only
explicit panic is recoverable; faults remain process aborts.
compiler/tests/ and survives
the bootstrap fixed point; details in CHANGELOG.md.
them live in TODO.md (a scratch checklist, not authoritative).
docs/spec.md (normative) and
spec/grammar.ebnf (authoritative grammar).