Digital Garden
Strata Star Scan: 110,000 Lines of Self-Written Engine and the Edge of a 3070
The first virtue of star scanning is letting star counts and code quality stand apart in the report.
I. Dissection
Strata, a local inference engine in the llama.cpp/ggml lineage, claims to run a 125B MoE model on a gaming PC. Two weeks, 17,957 stars, 1,591 forks, 406 open issues/PRs — a template of viral growth. The scalpel went in, and the conclusion came first: this is a real, high-quality open-source project, neither malware nor an AI hype shell.
Under src/ and include/strata/ there is not one upstream file verbatim; all is self-written code, about 110,140 lines (86,313 non-test implementation). The coupling with upstream takes three controlled forms: CUDA kernels transcribed at a fixed commit (each file header noted), FetchContent pulling a fixed tag at build time, and a vendored ggml header (with license and version file), with attribution listed item by item in the docs. The self-written core modules each have complete implementations: kernels at 53,000 lines (CUDA-native MoE/dequantization/FlashAttention plus CPU AVX-512 multi-token i-quant, about 40 parity tests against ggml), core at 27,000 (expert caching and SSD streaming reads, MTP drafting layer, speculative decoding verification windows, elastic KV), prefill at 13,000, ngram at 1,140 (a 26.8 GiB n-gram table read directly from SSD, asynchronous ticket-style IO — one of the key means of fitting 125B into 12GB of VRAM), and spec at 949 (the speculative decoding cost model).
II. Security review: clean and above average
The 343KB setup.py is large because it carries a 3,000-character engine changelog and extensive documentation comments, not obfuscation. Item by item: no remote code execution (exec/eval/base64 payloads/shell=True all zero hits, subprocess calls all explicit argv lists); no telemetry egress (all network requests are HEAD/GET; the module named like telemetry is in fact pure local hardware sampling, no sockets); no privilege escalation, no persistence (zero runas, zero registry writes, zero startup entries on Windows); download verification is solid (engine zip SHA-256 against the GitHub releases API, models via fixed HF commits, MTP drafting layer with per-tensor hardcoded hashes). The server binds 127.0.0.1 by default, API keys use constant-time comparison, and when no key is set there are Host and Origin checks against DNS rebinding. The points to watch are all by design: Docker defaults to 0.0.0.0 with an empty key, STRATA_SKIP_SHA256=1 is a deliberate escape hatch, and run config’s before_load and mcp_servers execute arbitrary commands — config files must be trusted as code.
III. Three signals
The positive signal best reveals the project’s caliber: today’s latest commit title reads “Stage buffers: pinning is opt-in; enabling it by default broke IQ3_S decoding in the release gate” — they caught a bug in their own release gate and reverted the default, and combined with the documented “no claims without a measurement” requirement, this culture of self-correction says more about the project than star counts. The neutral signals: .github/ has no workflows (no CI), and the git history was rewritten two days ago — the audit can only examine the current tree, with no traceable evolution. The judgment call: its route is aggressive quantization plus expert SSD streaming plus n-gram tables, trading output quality to fit 125B into 12GB of VRAM.
IV. The sharp edge
The user’s configuration is a 3070 8GB plus 32GB of RAM. The answer was bracketed from the repository’s measured data, not from marketing copy: with 32GB the only tier that fits is Coder (IQ1_M), and the official wording is “8GB runs, slowly”; the closest measured anchor (RX 5700 XT 8GB + 32GB on Coder) decodes at 18–23 tok/s, while the anchors above (2080 Ti 11GB, dual 3060 12GB) reach 34–44 tok/s. Conclusion: about 25–35 tok/s for short dialogue, median 28; 20–28 at 32K context, 15–22 at 128K; prompt reading 400–700 tok/s — the real pain is not generation speed but first-token latency on long documents: pouring in 30,000 characters waits 45–80 seconds for the first token. Three scenarios that drop you to 18 or even single digits are marked one by one: insufficient headroom in resident mode falling back to SSD streaming (the model must be on NVMe), wrong worker counts, and Coder’s lopsidedness — it keeps only 256 of 512 experts selected by code data: strong at code, weak generally, weaker still in Chinese. Reserve about 80GB of disk.
Real coordinates
- Project: llama.cpp-derivative local inference engine, aimed at running 125B MoE (Qwen3.8-Flash-Next, 512 experts, real) on a single gaming GPU
- Scale: 17,957 stars/1,591 forks/406 issues+PRs, MIT, created 2026-09-24, latest commit the same day
- Self-written engine about 110,140 lines (86,313 non-test): kernels 53k (CUDA MoE/dequant/FlashAttention + CPU AVX-512, 40 parity tests), core 27k, prefill 13k, ngram 1,140 (26.8GiB SSD direct read), spec 949
- Tests: 40 test files, 79 parity/bench, 28 GPU-free installer tests, 1,586 committed benchmark JSONs
- Security: no RCE/telemetry/privilege escalation/persistence; multi-ring SHA-256 verification; default 127.0.0.1 + constant-time comparison + Host/Origin checks; reservations = Docker default 0.0.0.0 empty key, escape-hatch env vars, config-as-code
- Three signals: positive = catching a bug in their own release gate and reverting the default + “no claims without a measurement”; neutral = no CI + rewritten history; judgment = aggressive quantization trading output quality
- 3070 8GB + 32GB conclusion: only Coder (IQ1_M) fits; decode 25–35 tok/s (median 28); prefill 400–700; first token at 32K waits 45–80s — the real pain; model must be on NVMe; reserve 80GB disk; Coder is lopsided (strong at code, weak generally, weaker in Chinese)
Comments