Show HN: Reame – a CPU inference server that gets faster as it runs Reame, a CPU inference server built on llama.cpp, launches as a lean LLM server optimized for cheap hardware like shared vCPUs and ARM boxes. It uses persistent KV caching, n-gram drafting, and speculative decoding to accelerate repetitive AI workloads, making later requests cost a fraction of the first. The server targets narrow tasks such as document extraction and batch pipelines, offering an OpenAI-compatible API and zero-config CLI. A lean, fully-tested LLM inference server built on llama.cpp — designed for the hardware you already have: shared vCPUs, free tiers, 2-core ARM boxes. Reame is not the first inference server. It's the first one that treats cheap CPU hardware as a first-class citizen instead of a fallback. Its thesis is simple: On a CPU, never compute the same thing twice. Reame is built for narrow, repetitive AI workloads over your own data, on hardware you already pay for — the case where the answer lives in the context you provide, not in the model's general knowledge. That is exactly where a small model matches a frontier one we measured 100% accuracy on long-context extraction with a 7B on a free 2-core ARM box and where Reame's memory makes request 100 cost a fraction of request 1. | Use case | Why it fits | Suggested model | |---|---|---| | Document extraction & classification RAG, invoices, tickets, scraping | answers live in the context; prompts share prefixes → the disk cache pays | Qwen2.5 1.5B–7B | | Batch pipelines tag 10k products overnight, meta descriptions, email triage | repetitive by nature → Palimpsest drafts them; €0 per token, no rate limits | Qwen2.5 1.5B–3B | | AI features inside a thin-margin SaaS | a €5 VPS instead of a metered API keeps unit economics alive | Qwen2.5 1.5B–7B | | Privacy-bound work legal, medical, public sector | data never leaves your server — full sovereignty | Qwen2.5 7B | | Private code autocomplete Continue.dev + OpenAI-compatible API | line-level completion is a narrow task; code never leaves the laptop | Qwen2.5-Coder 1.5B | What Reame is NOT for — said plainly, because trust is built here: a general-purpose ChatGPT replacement frontier reasoning and broad knowledge need frontier parameter counts , agentic coding assistants, or creative long-form writing at scale. If your task needs a 100B-class brain, buy one; if it needs your documents processed privately, forever, at zero marginal cost — that's a realm you can own. - 🗂️ Persistent shared-prefix KV cache — prompt prefixes are snapshotted to disk zstd, checksummed, LRU-budgeted and reused across different prompts, restarts and processes . A system prompt is paid for once, by the first user. - 📜 Palimpsest: the server remembers what it generated — every completed generation feeds an on-disk n-gram archive; future requests draft from it at zero cost. Domain workloads repeat themselves — let them pay off. - 🎭 Il Suggeritore: grammar as a draft source — constrained decoding uses structure to forbid tokens; Reame inverts it and uses structure to propose them. List numbering, bullets and format tokens are speculated for free on content nobody has ever generated before. - 🔮 Self-regulating speculative decoding — a small draft model or zero-cost n-gram lookup proposes tokens; the target verifies them in one batched pass. Reame measures whether speculation pays on your hardware and switches it off by itself when it doesn't. - 🏛️ The Conclave: consensus as a quality knob — --best-of N generates N candidate answers to the same prompt in one interleaved batch one prefill, cloned into the others via KV copy; every weight read shared and elects the winner by majority on the final result. The moment an absolute majority agrees, the stragglers are stopped. Honestly measured: it squeezes roughly one extra correct answer per quiz out of the model you already run — it does not make a 1.5B out-reason a 3B consensus fixes variance, not bias . - 👥 Interleaved multi-user serving — N concurrent generations advance together inside single multi-sequence batches, sharing every read of the model weights the cost that dominates memory-bound CPU decoding . - 🌐 OpenAI-compatible REST API — /v1/completions , /v1/chat/completions , SSE streaming, sessions, bearer auth, metrics. Point any OpenAI client at it. - ⚡ Zero-config CLI — reame run qwen2.5-1.5b downloads the model once, autoconfigures threads/KV/cache for the host and drops into a chat or --serve . No config file until you want one. - 🧪 210 isolated test cases — every layer is mockable and tested without a model; correctness of the multi-sequence, speculative and KV-clone paths is pinned against real models in integration tests. Every number below was produced by the shipped binary on the hardware named — including the negative results that shaped the design. | Hardware | Model | Configuration | Result | |---|---|---|---| Oracle Cloud free tier 2× ARM, 12 GB, €0/mo | Qwen2.5-7B Q4 K M | plain, KV q8 0 | 3.3 tok/s | | Oracle Cloud free tier | TriLM 3.9B ternary TQ2 0 | 1.1 GB total RAM | ~10 tok/s | | Apple M3 Pro 6 threads | Qwen2.5-1.5B Q4 K M | plain | 52 tok/s | | Shared Contabo VPS 18 oversubscribed vCPUs | 1.5B + 0.5B draft | speculative, 87% acceptance | 3.2× speedup | | Shared Contabo VPS | TinyLlama 1.1B | warm disk cache vs cold | 4.8× end-to-end | | Apple M3 Pro | Qwen2.5-1.5B | prompt-lookup on a rewrite task | 1.44× | | Apple M3 Pro | TinyLlama, 3 concurrent users | interleaved vs serialized | 1.6× | | Apple M3 Pro | Qwen2.5-1.5B, repeated request | archive speculation palimpsest | 2.3× 22→51 tok/s | | Apple M3 Pro | Qwen2.5-1.5B, fresh list generation | form drafting suggeritore | 2.1× 4.4s→2.1s | | Apple M3 Pro | Qwen2.5-1.5B ×5 candidates | Conclave: shared prefill + early consensus + fast nucleus | 8-question quiz wall 97s → ~50s | | Apple M3 Pro | Qwen2.5-1.5B --best-of 5 vs single | 3 arithmetic quizzes, strict grading | +0.5 to +2 correct, ~2.5× wall not 5× | | Oracle Cloud free tier | OLMoE 7B-A1B MoE vs dense 7B | same 8-needle long-context test | 100% accuracy both · 17.8 vs 3.3 tok/s 5.4× | Two negative results that matter. On heavily oversubscribed shared vCPUs a draft model runs as slowly as its target, so speculation is counter-productive there — Reame detects this and disables it at runtime. And the Conclave does not close the gap to a model twice the size on hard reasoning: majority voting corrects random slips, not systematic misunderstanding — we measured a 1.5B ×5 land between the 1.5B and a 3B, never above the 3B. Benchmarks that only show wins are advertising; these are engineering. Shared-prefix disk cache. Prompts are split into fixed token blocks; a chain hash keys a KV snapshot at every block boundary. A different prompt that shares a prefix restores the longest cached boundary and decodes only its own tail. Unlike GPU-resident prefix caches, snapshots live on NVMe: they survive restarts. Self-regulating speculation. Classic Leviathan/Chen acceptance the rejected token is resampled from the residual distribution, so the output distribution is exactly the target's , with two CPU-first twists: the draft source can be free n-gram lookup mined from the prompt itself — ideal for extraction and rewrite workloads — and a feedback controller adapts the draft length and turns speculation off when measured acceptance or draft economics go negative. The Conclave. --best-of N submits N attempts at the same prompt to the interleaved scheduler: attempt 0 is the untouched anchor greedy stays greedy , the explorers shift seed and heat up. The scheduler notices the identical prompts and clones the prompt KV instead of prefilling N times copy the donor's cache, decode only the last prompt token — argmax-verified equal to a full prefill . Election is an exact-majority vote on each candidate's final number, with a Jaccard text-medoid fallback for prose; the moment a majority exists the remaining candidates are stopped mid-generation, and the CLI reports CONCLAVE consensus=k/N so a caller can escalate only when the conclave split. Use it as a quality knob: more accuracy from the model your hardware can afford, paid in idle interleaved compute rather than a bigger model's RAM. reame list model catalog + what's on disk reame run qwen2.5-1.5b download once, auto-config, chat reame run qwen2.5-1.5b "Explain mmap" one-shot answer reame run qwen2.5-1.5b --serve OpenAI-compatible API on :8080 reame run qwen2.5-1.5b "12 13-50?" --best-of 5 the Conclave run resolves a catalog name or any local GGUF path , downloads to ~/.reame/models on first use and picks threads, KV quantization and cache directory for the host. A config file is only needed when you want control. Homebrew macOS / Linux : brew tap swellweb/reame brew install reame Prebuilt binaries — Linux x64/arm64 and macOS arm64 on the releases page https://github.com/swellweb/reame/releases runtime dependency: libzstd . npm npx reame : planned — binaries are already built per platform. git clone https://github.com/swellweb/reame cd reame git submodule update --init --depth 1 third party/llama.cpp ./build.sh Release build + 210 test cases ./scripts/download models.sh TinyLlama test model, ~670 MB ./build/src/reame --config config/reame.conf --prompt "Hello" --max-tokens 32 ./build/src/reame --config config/reame.conf --serve OpenAI-compatible API Dependencies: CMake ≥ 3.16, a C++17 compiler, and for the server Boost headers , nlohmann-json and zstd: Debian/Ubuntu sudo apt install build-essential cmake libboost-dev nlohmann-json3-dev libzstd-dev pkg-config macOS brew install cmake boost nlohmann-json zstd pkg-config model path = models/qwen2.5-7b-instruct-q4 k m.gguf context length = 4096 total KV budget shared across users when parallel 1 threads = 4 fewer is often faster on shared vCPUs — measure memory kv cache type = q8 0 f16 | q8 0 | q4 0 — halve/quarter context RAM speculative enabled = true mode = lookup model needs draft model path | lookup no 2nd model cache directory = /opt/reame/cache max size mb = 4096 LRU byte budget on disk server port = 8080 api key = bearer auth when set parallel = 1 1 = interleaved multi-user serving | Endpoint | Description | |---|---| POST /v1/completions | text completion SSE with "stream": true | POST /v1/chat/completions | chat completion | POST /v1/sessions · .../save · .../load · DELETE .../{id} | KV session snapshots | GET /metrics | request counters + speculative/cache metrics | GET /health | liveness auth-exempt | Reame's footprint is watt-scale, not kilowatt-scale: it targets machines that already exist and are already powered on — no new silicon is racked to serve your model. We don't claim better joules-per-token than a saturated datacenter GPU — we claim you don't need one. Reame is young and deliberately opinionated and focused : CPU-only serving, one model per process, correctness pinned by tests at every layer. Not goals: GPU offload, training, model management UX. The llama.cpp submodule is pinned to a known-good commit and bumped deliberately. Documentation in Italian: docs/README.it.md /swellweb/reame/blob/main/docs/README.it.md . The laptop story is the same one command: reame run qwen2.5-1.5b downloads, autoconfigures and chats — nothing to learn. From there the two projects diverge: Ollama optimizes for running many models casually; Reame optimizes for serving one workload seriously on hardware that costs nothing. The difference is one sentence: Ollama runs models. Reame remembers having run them. General-purpose servers treat every request as brand new: compute, discard, repeat. On a GPU that's fine — compute is cheap. On a cheap CPU, compute is the most expensive thing you have, and throwing it away is the cardinal sin. Everything in Reame attacks that: the disk prefix cache, the generation archive, the grammar prompter, self-regulating speculation, interleaved multi-user batches, the Conclave. None of it exists in Ollama. The practical consequence: a Reame server gets faster the longer it runs. The hundredth request costs a fraction of the first — the system prompt was paid once, similar answers draft themselves from the archive, structure is speculated for free. No other server has that property. Reame is free, MIT-licensed and built on nights and free-tier hardware. If it saves you API bills or GPU rent, consider sponsoring https://github.com/sponsors/swellweb the work — sponsorships fund the roadmap: ARCA the shared memory daemon , warm-ahead prefill, and first-class MoE serving. Reame stands on the shoulders of llama.cpp https://github.com/ggml-org/llama.cpp all tensor kernels; MIT . The disk-first cache thesis was inspired by antirez's DwarfStar4 line of thinking; the speculative pipeline by DeepSeek's DSpark work and the Leviathan/Chen speculative sampling theorem; archive drafting is a shipped, persistent take on retrieval-based speculation REST ; form drafting inverts grammar-constrained decoding. Ideas are cited, numbers are ours.