Proofs instead of guesses
Every array index, division and range is a proof obligation, discharged at compile time over integer constraints. An unproven obligation is a compile error with a counterexample, never a silent runtime check.
Neo 0.1.4 · open source
Neo's compiler proves that every array index, division and range is safe before the program runs, reports problems as JSON an agent can act on, and builds native binaries faster than Rust.
x86-64 Linux · ARM64 Linux · ARM64 macOS
1.38× more than Rust1.45× more than Bun1.46× more than Zig2.04× more than Go
1.73× more than Rust14.3× more than Zig17.1× more than Bun22.8× more than Go
1.09× faster than Bun1.72× faster than Zig1.80× faster than Rust10.0× faster than Go
2.41× less than Rust2.84× less than Zig14.5× less than Go42.2× less than Bun
1.82× faster than Zig1.82× faster than Rust2.21× faster than Bun3.16× faster than Go
x86-64 Linux, all five languages · 2 November 2026 · method
x86-64 Linux · 30–31 October 2026 · method
Why Neo
Models need a grammar with few forms, errors they can parse, and a compiler that refuses to guess. Neo gives them all three.
Every array index, division and range is a proof obligation, discharged at compile time over integer constraints. An unproven obligation is a compile error with a counterexample, never a silent runtime check.
neo check answers in JSON: node hash, position, normalised goal, status, counterexample and suggested fixes. An agent acts on it without parsing prose.
The compiler owns memory. Ownership moves along a uniqueness discipline, and updates happen in place when a buffer is unique. No GC, no reference counts, no borrow annotations to get wrong.
Every sum(i in a..b) and arr(i in a..b) is outlined and spread across cores. A scalar sum, even with a data-dependent loop inside, runs 16 iterations at a time in vector lanes.
Benchmarks
Same machine, same inputs, interleaved runs, outputs checked against each other. Neo against optimised Rust with serde and hyper.
x86-64 Linux · 30–31 October 2026 · method
The language
Records, comprehensions and refinements, with no annotations for memory, threads or lifetimes. What the model writes is what the compiler proves and what the CPU runs.
; Arr Body n is laid out struct-of-arrays by the compiler;
; the program only ever sees records.
type Body = { x : f64, y : f64, z : f64, vx : f64, vy : f64, vz : f64, m : f64 }
type Vec3 = { x : f64, y : f64, z : f64 }
fn accel (bs : Arr Body n, i : i64{0 <= i, i < n}) -> Vec3
= let xi = bs[i].x in let yi = bs[i].y in let zi = bs[i].z in
sum(j in 0..n)
let dx = bs[j].x - xi in let dy = bs[j].y - yi in let dz = bs[j].z - zi in
let d2 = dx * dx + dy * dy + dz * dz + 0.01 in
let inv = bs[j].m / (d2 * sqrt(d2)) in
Vec3 { x = dx * inv, y = dy * inv, z = dz * inv }
fn kick (bs : Arr Body n, dt : f64) -> Arr Body n
= arr(i in 0..n) let a = accel(bs, i) in let b = bs[i] in
b with { vx = b.vx + a.x * dt, vy = b.vy + a.y * dt, vz = b.vz + a.z * dt }
i : i64{0 <= i, i < n}bs[i] provably in range. Callers must prove it too.arr(i in 0..n)Arr Body nsum streams contiguous data and vectorises.fn starts_with (a : Arr u8 n, b : Arr u8 m) -> bool
= m <= n && loop (i : i64{i >= 0} = 0, ok = true)
while ok && i < m
next (i + 1, a[i] == b[i])
yield ok
fn handle (req : Arr u8 n) -> Arr u8 _
= if starts_with(req, "GET / ") then
"HTTP/1.1 200 OK\r\nContent-Length: 13\r\n\r\nHello, World!"
else
"HTTP/1.1 404 Not Found\r\nContent-Length: 9\r\n\r\nNot Found"
; Sockets, framing, pipelining and workers belong to the runtime,
; which is written in Neo and talks to the kernel directly.
effect fn main (port : i64{port > 0, port < 65536}) -> i64
= serve(port, handle)
handleservea[i] == b[i]i < m <= n: no bounds check is emitted.Showcase
Not just benchmarks: real software, each shipped as a single static binary.
A document database written entirely in the language.
A full-stack web framework, in the spirit of Next.js.
A headless web browser for agents and crawlers, in the spirit of Lightpanda.
Explore
What goes wrong when models write code, and how the compiler catches it.
→LanguageRefinements, loops, records, parallelism, memory, effects and the runtime.
→BenchmarksAgainst Rust, Zig, Go and Bun, with the full method and raw tables.
→ShowcaseA document database, a web framework and a headless browser, each faster than what it replaces.
→DocsInstall, first program, the check loop and skills.md for agents.
→Get started
Python 3 and Clang/LLVM build Neo. Give your model skills.md, which ships with every release, and let it work against neo check until every obligation is proven.
$ curl -fsSL https://neolang.dev/install.sh | sh
$ neo init hello && cd hello
$ neo check src/main.neo # every obligation, as JSON
$ neo build src/main.neo -o hello
$ ./hello
Hello, Neo!