Skip to content

docs: rebuild the README around the Pi 5 promise, ship CLI binaries — v0.8.1 - #210

Merged
geisten merged 1 commit into
mainfrom
docs/pi5-first-screen
Aug 3, 2026
Merged

docs: rebuild the README around the Pi 5 promise, ship CLI binaries — v0.8.1#210
geisten merged 1 commit into
mainfrom
docs/pi5-first-screen

Conversation

@geisten

@geisten geisten commented Aug 3, 2026

Copy link
Copy Markdown
Owner

First screen = the promise plus its proof: install command (curl + chmod), run example, demo GIF, and three numbers the repo already backs (4 GB Pi per reference_runs.json, 15–18 decode t/s measured, ~1.2 GB download). Everything else moved down or out (docs/MODELS.md, docs/BACKENDS.md, benchmark/README.md, Why-C → ARCHITECTURE.md).

Makes it literally true: release.yml ships geist-linux-arm64 (<1 MB static CLI) and geist-bitnet-linux-arm64 (~1.2 GB, BitNet folded in via .incbin, zero-copy/demand-paged; smoke decodes real tokens before publish). simple_generate gains EOS stop + 256-token default (unbounded loops forever on untemplated prompts — measured) and the -DGEIST_EMBED_MODEL path.

v0.8.1 everywhere, check-version.sh green. Plan: merge → tag v0.8.1 → releases/latest serves the first-screen curl correctly. Release workflow dry-run (workflow_dispatch on this branch, artifacts only) before merging.

… v0.8.1

The first screen is now the product claim and its proof, in order: "Run
Microsoft BitNet 2B locally on a 4 GB Raspberry Pi 5. One binary. No
Python, no model setup, no cloud." — then the install command, a run
example, the demo, and three measured numbers, each of which the repo
already backs: the reference runs come from a 4 GB Pi 5 Model B
(ram_gb 4.0 in benchmark/reference_runs.json), decode measured
17.9 t/s short-context and 15.0 t/s at 512 tokens, and the whole
download is ~1.2 GB. Private and offline after download.

What makes the promise literally true: the release now ships two fully
static musl CLI binaries for linux-arm64 — geist-linux-arm64 (<1 MB,
any GGUF) and geist-bitnet-linux-arm64 (~1.2 GB, the MIT-licensed
BitNet b1.58 2B-4T folded in via .incbin, aliased zero-copy out of
.rodata and demand-paged like an mmap, so RAM behavior on a 4 GB board
equals the file-based load). GNU ld handles the >1 GB section; ld64
does not (measured: registry corruption, then SIGSEGV), which is why
macOS gets no embedded artifact and builds from source instead. The
embedded smoke in release.yml decodes real tokens from the embedded
model before anything is published.

simple_generate stops at the model's EOS (geist_model_eos_token) and
defaults to 256 new tokens — an untemplated completion can run to the
end of the context without ever emitting EOS, so "unbounded" was a
footgun as a default (measured: the demo prompt loops until the window
fills). An explicit count still overrides.

Everything the first screen displaced moved rather than died:
the model table to docs/MODELS.md, Metal/Vulkan to docs/BACKENDS.md,
"Why C?" to docs/ARCHITECTURE.md, the bench methodology and the full
CPU table to benchmark/README.md. v0.8.1 across geist.h, README,
CITATION.cff and the CHANGELOG; check-version.sh green.
@geisten
geisten merged commit ad283fa into main Aug 3, 2026
22 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant