One page for the question from outside: where does the language stand, how risky is it to rely on it, and which parts of the specification are built and tested and which are still to be built or proved. As of 0.0.1311, October 30, 2026.
How this page stays current. It holds no list of work and no percentage counted by hand; the work is in the issue tracker, and each row below links to it. A row changes when a chapter changes its level (below), not when an issue closes. A figure on this page names the command that recounts it.
Pre-alpha. Single programs and multi-file projects on Linux build and run, and the compiler is mostly written in Nikaia itself. The specification is ahead of the compiler: several chapters are decided and written but only partly built, and syntax and diagnostics still change between versions with no migration.
| Figure | Today | Recounted by |
|---|---|---|
| Toolchain written in Nikaia (self-hosting, ADR-294) | 82.4 % | python3 scripts/self_hosting.py |
| Issues closed / open | 584 / 216 | the tracker |
| Change packages, one per CHANGELOG heading | 1304 | grep -c '^## \[' CHANGELOG.md |
The version 0.0.N counts change packages and says nothing about readiness.
Most defects are now found by moving the compiler into Nikaia and by writing the
official packages: each move puts real code through the compiler, and each
defect found is fixed in the compiler, with a test, never worked around
(CLAUDE.md, Moving Rust into Nikaia). Hundreds have been found and fixed
this way. Defects are not equally serious; the order in which they are taken
is scored in priorities.md, and the classes, worst first,
are these:
overlap branches that write the same
thing (#985,
#993) or a lock
taken inside a lock (#677).rustc: Nikaia’s checker accepts a program the
Rust compiler under it refuses. Nothing wrong runs, but the message is in
Rust’s words. This is the largest open group, nearly all in memory and
ownership (chapter 6).Questions that need the owner’s decision first are labelled
decision;
work that can be built now is labelled
ready.
The levels, from most to least settled:
| Chapter | Level | What stands | Open |
|---|---|---|---|
| Part I | |||
| 2 Variables and data types | Proven | numbers typed by their uses, one text type (ADR-282), T? and null |
rounding of / and % unspecified (#682); text::Pos (#743); f32 literals (#728, decision) |
| 3 Control flow | Proven | if, while, for, match, break/continue |
parser gaps such as #939 |
| 4 Data structures | Proven | structs, enums, lists, maps, sets, arrays; the collections offer one surface (ADR-collections-1, -2) | BTreeMap::entry and the rewrite after it (#950); type kinds (#859) |
| 5 Functions and arguments | Proven | Subject ; Config, lambdas, inferred sync |
the receiver rule (#870); ref on parameters (#875, decision) |
| 6 Memory and ownership | Partial, highest risk | views that outlive their buffer with no annotation (the tether, ADR-283), text tiers, mut parameters and views (ADR-views-1) |
most class-3 defects live here; for mut (ADR-views-2); a struct that hands out views of text it read (#929) |
| 7 Error handling | Proven | throws with typed sets, catch, errors that keep their site |
a code parameter’s failures per call (ADR-error-sets-1, specified) |
| 8 Concurrency | Rebuilding | today: spawn, overlap, an executor at both user-parallelism settings, supervision |
one concept, the task, started by async (ADR-async-5); the build is #983 and its sub-issues |
| 9 Project organisation | Built | modules, pub, packages by path |
no registry, so no dependency by version |
| Part II | |||
| 10 Metaprogramming | Proven | grammars and dsl blocks, used by the json and yaml packages and the HTTP parser; build-time evaluation; no macros, on purpose (ADR-298) |
grammar defects #999, #1001-#1004; streaming a grammar’s input one item at a time (in the parser generator, not yet written by Nikaia, #928); specialising per build-time value (#906) |
| 11 Running code at once | Rebuilding | the same source on one thread or on a pool (user_parallelism), implicit pausing, par_iter |
the free task async(detached) and fan-out by par_iter (ADR-async-5, #983) |
| 12 Thread safety | Partial | Shared/Locked, access_all, no lock held across a pause (NK2202) |
the refusals of class 2 above (#677, #985) |
| Part III | |||
| 13 Toolchain | Built | build, run, check, test, fmt (ADR-337), describe, bind, content-keyed cache |
nikaia doc, a language server, a package registry |
| 14 Testing and quality | Proven | test blocks, output tests, assert proved while building or checked at run time, contracts across packages |
tests of several files (#926); facts about data (#797, #798) |
| 15 Interoperability | Partial | calling C (extern, libraries from nikaia.toml), calling a described Rust crate, a C library built from a package, Python and Node bindings (ADR-284) |
a package as a Rust library (#978); WebAssembly and bare metal (ADR-119) |
| 16 Hardware instructions | Partial | vectors in std::simd |
the rest of ADR-371 (#755, decision; #876) |
| 17 Standard library and packages | Partial | text, collections, files, I/O, sockets, processes, std::regex (ADR-regex-1), a minimal HTTP/1.1 server; the packages json and yaml (ADR-yaml-1, in progress) |
std::db and the SQL checked while building (ADR-299); TLS, HTTP/2; entries the toolchain’s move needs (#920, #922) |
| You try to… | What happens |
|---|---|
| depend on a Nikaia package by version | refused: no registry yet, path = "..." only |
| use a crate from crates.io | works after nikaia describe <crate>, whose output you review and commit |
| get completion or generated docs | nothing: no language server, no nikaia doc; editors/vscode highlights syntax |
| talk to a database | only through its C library, as examples/sqlite does; std::db is specified, not built |
| serve HTTPS, HTTP/2, or many connections at once | not possible yet |
write the new async |
not yet: it is being built (#983); spawn and overlap work until it replaces them |
find a function you expect in std |
sometimes missing; a missing entry is worth an issue |
Some errors still arrive in rustc’s words (class 3 above), pointed at your
.nika line.
The order is set by the score in priorities.md. Current
direction, in short:
selfhosting-plan.md and the issues.async, then overlap, task::scope
and spawn are removed.yaml package, also as a drop-in Rust crate, with streaming input
(#928).std::db and the query DSL, WebAssembly,
bare metal, nikaia doc, a language server, a registry.Every design decision is argued in an ADR and accepted by a human. The history of each change is in the CHANGELOG.