Neo 0.1.4 · open source

A programming language made for LLMs.

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

HTTP throughput 1 worker, hello world req/s, higher is better · x86-64 Linux
Neo 111k
Rust 80.4k
Bun 76.4k
Zig 75.9k
Go 54.2k

1.38× more than Rust1.45× more than Bun1.46× more than Zig2.04× more than Go

x86-64 Linux, all five languages · 2 November 2026 · method

2.00×faster dynamic JSON than Rust's serde_json
1.83×faster N-body simulation than Rust
1.50×more HTTP requests per second than Rust's hyper
0runtime dependencies: static binaries, no libc

x86-64 Linux · 30–31 October 2026 · method

Why Neo

Designed around how models write code.

Models need a grammar with few forms, errors they can parse, and a compiler that refuses to guess. Neo gives them all three.

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.

Diagnostics are data

neo check answers in JSON: node hash, position, normalised goal, status, counterexample and suggested fixes. An agent acts on it without parsing prose.

No lifetimes to annotate

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.

Parallel by default

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.

Why Neo: the full case →

Benchmarks

Faster than Rust, where it counts.

Same machine, same inputs, interleaved runs, outputs checked against each other. Neo against optimised Rust with serde and hyper.

Compute

N-body 4,096 bodies × 10 steps
Neo 345 ms
Rust 633 ms
1.83×faster
N-body 1,024 bodies × 3 steps
Neo 10.0 ms
Rust 16.2 ms
1.62×faster

JSON

Dynamic JSON 1,000-order array × 1,000, vs serde_json::Value
Neo 175 ms
Rust 350 ms
2.00×faster
Dynamic JSON small document × 1M, vs serde_json::Value
Neo 176 ms
Rust 332 ms
1.89×faster

HTTP

HTTP throughput 2 workers, keep-alive, 64 connections
Neo 214k
Rust 143k
1.50×more
HTTP throughput 1 worker, keep-alive, 64 connections
Neo 119k
Rust 88.8k
1.34×more

x86-64 Linux · 30–31 October 2026 · method

Against Go and Bun too 3.0× the HTTP throughput of Go7.5× faster dynamic JSON than Go2.3× the HTTP throughput of Bun15× less server memory than Go

Every table, the HTTP breakdown and the method →

The language

Reads like the math. Checks like a proof.

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.

Take the tour →

; 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}
The refinement that makes bs[i] provably in range. Callers must prove it too.
arr(i in 0..n)
A comprehension: compiled as a parallel region and spread across cores.
Arr Body n
Seven field planes in one buffer, so the inner sum streams contiguous data and vectorises.

Get started

Hand it to your agent.

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.

Read the docs →

terminal
$ 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!