Nobody paid us for this one. We wanted a single project that would show — better than any list of services can — what our engineers do on an ordinary working day. So we picked a problem with nowhere to hide.
No fork, no borrowed code. A hand-written lexer, parser, evaluator, regex engine, arbitrary-precision arithmetic, and full Unicode tables.
C++17 and the standard library. Zero third-party dependencies, so it builds anywhere a compiler runs.
Graded against the language's own executable specification — not against our own opinion of what "working" means.
A compiler on its own is a curiosity. To be useful it needs a way to install it, a way to try it, a way to look things up, and a way to prove it is right.
One binary runs your program, or turns it into a standalone native executable.
Not a rewrite — the identical source, running client-side with no server behind it.
A live editor, a ~700-page behavioural spec, eighteen lessons, 150 graded exercises — all running the engine in your tab.
Homebrew, Guix, Nix, release archives for three systems, a CI action — and test and benchmark harnesses that run on the compiler.
Each yardstick is blind to what the others catch. Running all of them — and trusting whichever is currently pointing at a problem — is what kept the work honest.
Specifications test features in isolation. Real software does not. So we pointed the compiler at code nobody wrote for our benefit.
A feature can be "done" by the specification's lights and still be quietly wrong in a way only real code reveals. That is why this front exists.
A small native binary with no virtual machine to boot: ~2 ms cold, best of a 200-launch loop 1.8 ms. On one run that is invisible. On the two-hundredth run of an edit-and-regenerate loop — or inside a shell script that calls it repeatedly — it is the difference between a tool that interrupts your thinking and one that doesn't.
Engines that carry a runtime with them typically spend a good fraction of a second before your first line executes. We treated that cost as a bug.
We replaced the site's syntax highlighter with our own. It is both faster and more correct: it parses the code instead of pattern-matching words, so a method named role is no longer painted as a keyword.
There are three defensible ways to compute the pass rate. We headline the harshest, quote both key figures together, and write the method down.
The better it gets, the further broken files run — so they declare more tests and the denominator grows. We documented that instead of picking a friendlier baseline.
More than once a correctness fix exposed a test that had been passing by accident. Keep the fix, re-baseline, say so.
Every closed defect becomes one. No release ships without passing all of them.
A release literally cannot contain a performance regression: a recorded baseline is re-measured automatically and fails the build.
Optimisations we measured and rejected are documented beside the ones that landed — so nobody burns a week retrying them.
One universal binary covering Apple Silicon and Intel, installed with a single Homebrew command.
Statically linked, no runtime dependencies — plus a Guix channel and a Nix flake for distributions that build from source.
A static build that needs no redistributable packages installed alongside it.
The same engine as WebAssembly, running client-side with nothing sent to a server.
Every push is built and smoke-tested on all three desktop systems automatically. Outside contributors have started sending packaging of their own — which is its own kind of proof that the codebase is clean enough for strangers to work in.
Raku++ is open source and free, and it was never billed to anyone. It exists because it is the most complete demonstration we could build of how we work.