<?xml version='1.0' encoding='utf-8'?>
<?xml-stylesheet type="text/xsl" href="/sheet.xsl"?><rss version="2.0"><channel><title>Hacker News</title><link>https://news.ycombinator.com/</link><description>Links for the intellectually curious, ranked by readers.</description><item><title>Show HN: Getting GLM 5.2 running on my slow computer</title><link>https://github.com/JustVugg/colibri</link><pubDate>Thu, 09 Jul 2026 08:05:04 +0000</pubDate><comments>https://news.ycombinator.com/item?id=48842459</comments><description>&lt;a href="https://news.ycombinator.com/item?id=48842459"&gt;Comments&lt;/a&gt;</description><ns0:encoded xmlns:ns0="http://purl.org/rss/1.0/modules/content/">&lt;article class="markdown-body entry-content container-lg" itemprop="text" morss_own_score="9.836790207412445" morss_score="148.12914568647693"&gt;&lt;p&gt;
&lt;a href="https://github.com/JustVugg/colibri/blob/main/assets/colibri.svg"&gt;&lt;img src="https://github.com/JustVugg/colibri/raw/main/assets/colibri.svg"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tiny engine, immense model.&lt;/strong&gt; Run &lt;strong&gt;GLM-5.2 (744B-parameter MoE)&lt;/strong&gt; on a consumer machine with ~25 GB of RAM — in pure C, with zero dependencies, by streaming experts from disk.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ./coli chat
  🐦 colibrì v1.0 — GLM-5.2 · 744B MoE · int4 · streaming CPU
  ✓ pronto in 32s · residente 9.9 GB
  › ciao!
  ◆ Ciao! 😊 Come posso aiutarti oggi?
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;The idea&lt;/h2&gt;
&lt;p&gt;A 744B Mixture-of-Experts model activates only ~40B parameters per token — and only ~11 GB of those change from token to token (the routed experts). So:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the &lt;strong&gt;dense part&lt;/strong&gt; (attention, shared experts, embeddings — ~17B params) stays &lt;strong&gt;resident in RAM at int4&lt;/strong&gt; (~9.9 GB);&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;21,504 routed experts&lt;/strong&gt; (75 MoE layers × 256 experts + the MTP head, ~19 MB each at int4) live &lt;strong&gt;on disk&lt;/strong&gt; (~370 GB) and are &lt;strong&gt;streamed on demand&lt;/strong&gt;, with a per-layer LRU cache, an optional pinned hot-store, and the OS page cache as a free L2.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The engine is a single C file (&lt;code&gt;c/glm.c&lt;/code&gt;, ~1,300 lines) plus small headers. No BLAS, no Python at runtime, no GPU.&lt;/p&gt;
&lt;h2&gt;What's implemented&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Faithful GLM-5.2 (&lt;code&gt;glm_moe_dsa&lt;/code&gt;) forward&lt;/strong&gt; — validated token-exact against a &lt;code&gt;transformers&lt;/code&gt; oracle (teacher-forcing 32/32, greedy 20/20 on a tiny-random model with the real architecture).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MLA attention&lt;/strong&gt; (q/kv-LoRA, interleaved partial RoPE) with &lt;strong&gt;compressed KV-cache&lt;/strong&gt;: 576 floats/token instead of 32,768 (57× smaller — GLM-5.2 has 64 heads and no GQA).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DeepSeek-V3-style sigmoid router&lt;/strong&gt; (noaux_tc, routed_scaling_factor), shared expert, first-3-dense layers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Native MTP speculative decoding&lt;/strong&gt; — GLM-5.2's own multi-token-prediction head (layer 78) drafts tokens that the main model verifies in one batched forward. &lt;strong&gt;The head must be int8&lt;/strong&gt; (the converter does this by default): at int4 draft acceptance collapses to 0–4% and speculation never engages; at int8 it's 39–59% acceptance, &lt;strong&gt;2.2–2.8 tokens/forward&lt;/strong&gt; (community-measured, &lt;a href="https://github.com/JustVugg/colibri/issues/8"&gt;#8&lt;/a&gt;). Lossless — &lt;em&gt;and stays lossless under sampling&lt;/em&gt; via rejection sampling. Honest caveat from the same measurement: on a &lt;strong&gt;cold&lt;/strong&gt; cache each verified draft routes to extra experts (~660 → ~1100 expert-loads/token), so speculation can be a net &lt;em&gt;time&lt;/em&gt; loss until the cache/pin warms up — the adaptive guard and &lt;code&gt;DRAFT=0&lt;/code&gt; are there for that.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;True sampling&lt;/strong&gt; — temperature + nucleus, defaults tuned for int4 reality (0.7 / 0.90; the official 1.0 / 0.95 samples quantization noise from the tail).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integer-dot kernels&lt;/strong&gt; (Q8_0-style int8 activations, AVX2 &lt;code&gt;maddubs&lt;/code&gt;): int8 matmuls 1.4–2.5× faster (119 GFLOP/s measured), int4 1.8× in batch — routing decided per shape by measurement (int4 single-row stays f32: it measured slower).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MLA weight absorption&lt;/strong&gt; (DeepSeek trick) for decode: no per-token k/v reconstruction — the query absorbs &lt;code&gt;kv_b&lt;/code&gt;, context is projected after attention. Validated exact: TF 32/32 and generation 20/20 with absorption forced everywhere.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Async expert readahead&lt;/strong&gt;: while one block of experts is being multiplied, the kernel is already reading the next (&lt;code&gt;WILLNEED&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quantization kernels&lt;/strong&gt;: int8 / packed int4 / packed int2, per-row scales, AVX2, dequant-on-use. Packing validated bit-identical to the int8 container.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DSA sparse attention: in progress&lt;/strong&gt; — the lightning-indexer weights (a ~108 GB extraction from the FP8 repo, &lt;code&gt;--indexer&lt;/code&gt; converter mode) are downloading; the indexer forward lands next. Until then attention is dense and exact for contexts ≤ 2048 tokens.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Batch-union MoE&lt;/strong&gt;: in prefill (and MTP verification), each unique expert of the batch is read once and applied to every position that routes to it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Byte-level BPE tokenizer in C&lt;/strong&gt; (GPT-2-style with Unicode-property regex, 320k merges).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAM safety&lt;/strong&gt;: the expert cache is auto-sized from &lt;code&gt;MemAvailable&lt;/code&gt; at startup — an honest peak projection (working set, KV, MTP row, reconstruction buffers) so the kernel OOM-killer never fires.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Offline FP8→int4 converter&lt;/strong&gt; (&lt;code&gt;c/tools/convert_fp8_to_int4.py&lt;/code&gt;): downloads one shard at a time (~5 GB), dequants (128×128 block scales), requantizes to the engine's container, deletes the shard — the 756 GB FP8 checkpoint never needs to exist on disk at once. Resumable.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Honest numbers (WSL2, 12 cores, 25 GB RAM, NVMe via VHDX)&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;metric&lt;/th&gt;
&lt;th&gt;value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;model on disk (int4 container)&lt;/td&gt;
&lt;td&gt;~370 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;resident RAM (dense, int4)&lt;/td&gt;
&lt;td&gt;9.9 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;load time&lt;/td&gt;
&lt;td&gt;~30 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;peak RSS during chat&lt;/td&gt;
&lt;td&gt;~20 GB (auto-capped)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cold decode cost&lt;/td&gt;
&lt;td&gt;~11 GB disk reads/token (75 layers × 8 experts)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;disk ceiling (VHDX random)&lt;/td&gt;
&lt;td&gt;~1 GB/s → ~0.05–0.1 tok/s cold&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MTP speculation (int8 head)&lt;/td&gt;
&lt;td&gt;2.2–2.8 tok/forward measured (&lt;a href="https://github.com/JustVugg/colibri/issues/8"&gt;#8&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;This is not fast. It is a 744B frontier-class model &lt;strong&gt;answering correctly on a machine that costs less than one H100 fan&lt;/strong&gt;. Warm cache, pinned hot experts and MTP push the useful-response latency down considerably; the physics of the disk does the rest.&lt;/p&gt;
&lt;h3&gt;SSD note&lt;/h3&gt;
&lt;p&gt;Cold starts are heavy on random reads (~11 GB/token), but reads don't meaningfully wear an SSD — colibrì's streaming is read-only. The real concerns under heavy use are (1) &lt;strong&gt;swap traffic&lt;/strong&gt; if the system runs out of RAM (writes do wear the drive — keep a sane &lt;code&gt;--ram&lt;/code&gt; budget; colibrì's auto-budget is designed to stay clear of swap) and (2) &lt;strong&gt;sustained thermals&lt;/strong&gt;: hours at full read duty cycle will heat cheaper drives. Monitor drive temperature and health.&lt;/p&gt;
&lt;h2&gt;Download the model&lt;/h2&gt;
&lt;p&gt;A pre-converted &lt;strong&gt;GLM-5.2 int4&lt;/strong&gt; model for colibrì is available on Hugging Face:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://huggingface.co/jlnsrk/GLM-5.2-colibri-int4"&gt;https://huggingface.co/jlnsrk/GLM-5.2-colibri-int4&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If the MTP files there are still the int4 head (see &lt;a href="https://github.com/JustVugg/colibri/issues/8"&gt;#8&lt;/a&gt; — sizes &lt;code&gt;1765523544/2686077736/536747200&lt;/code&gt; = int4, unusable), grab the &lt;strong&gt;int8 MTP heads&lt;/strong&gt; from the community clone by matey-0: &lt;strong&gt;&lt;a href="https://huggingface.co/mateogrgic/GLM-5.2-colibri-int4-with-int8-mtp"&gt;https://huggingface.co/mateogrgic/GLM-5.2-colibri-int4-with-int8-mtp&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Download the repository and point &lt;code&gt;COLI_MODEL&lt;/code&gt; to its directory:&lt;/p&gt;
&lt;pre&gt;COLI_MODEL=/path/to/GLM-5.2-colibri-int4 ./coli chat&lt;/pre&gt;
&lt;p&gt;This skips the FP8 → int4 conversion step entirely.&lt;/p&gt;
&lt;p&gt;Thanks DatPat for your help!&lt;/p&gt;
&lt;h3&gt;Quick start&lt;/h3&gt;
&lt;pre&gt;&lt;span&gt;cd&lt;/span&gt; c
./setup.sh                      &lt;span&gt;&lt;span&gt;#&lt;/span&gt; checks gcc/OpenMP, builds, self-tests&lt;/span&gt;

&lt;span&gt;&lt;span&gt;#&lt;/span&gt; ONE command does everything model-side: downloads GLM-5.2-FP8 shard by shard&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#&lt;/span&gt; (never needs the full 756 GB at once), converts to the int4 container, then&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#&lt;/span&gt; converts the MTP head for speculative decoding. Resumable at any point.&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#&lt;/span&gt; Conversion (only) needs python with: pip install torch safetensors huggingface_hub numpy&lt;/span&gt;
./coli convert --model /nvme/glm52_i4     &lt;span&gt;&lt;span&gt;#&lt;/span&gt; ~400 GB free on a real ext4/NVMe path&lt;/span&gt;

&lt;span&gt;&lt;span&gt;#&lt;/span&gt; chat — RAM budget, expert cache and MTP are all detected automatically:&lt;/span&gt;
COLI_MODEL=/nvme/glm52_i4 ./coli chat&lt;/pre&gt;
&lt;p&gt;The engine at runtime is pure C — python is only used by the one-time converter.&lt;/p&gt;
&lt;h3&gt;Experimental resident CUDA backend&lt;/h3&gt;
&lt;p&gt;colibrì includes an opt-in CUDA backend for model-resident tensors. Streaming
experts deliberately remain on the original CPU path for now: copying an expert
from NVMe to the GPU on every use would only replace the disk bottleneck with a
PCIe bottleneck. Resident quantized tensors are uploaded lazily once and reused.&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;cd&lt;/span&gt; c
make cuda-test CUDA=1                  &lt;span&gt;&lt;span&gt;#&lt;/span&gt; q8/q4/q2/f32 kernel correctness&lt;/span&gt;
make CUDA=1
&lt;span&gt;&lt;span&gt;#&lt;/span&gt; optional dense-path experiment (hot experts are configured below)&lt;/span&gt;
COLI_CUDA=1 COLI_GPU=0 CUDA_DENSE=1 SNAP=/nvme/glm52_i4 ./glm 64 4 4&lt;/pre&gt;
&lt;p&gt;Requirements: Linux, an NVIDIA driver, and a CUDA Toolkit under
&lt;code&gt;/usr/local/cuda&lt;/code&gt; (override with &lt;code&gt;CUDA_HOME=/path/to/cuda&lt;/code&gt;). &lt;code&gt;CUDA_ARCH=native&lt;/code&gt;
builds for the GPU in the current machine; set an explicit architecture when
cross-compiling. Requesting CUDA with a CPU-only binary, an invalid device, or
an unavailable runtime fails at startup instead of silently falling back.&lt;/p&gt;
&lt;p&gt;The normal &lt;code&gt;make&lt;/code&gt; build and runtime behavior are unchanged. CUDA defaults to an
expert-only accelerator: resident dense/attention tensors stay on CPU because
fixture measurements show that moving them does not help while expert I/O is
the bottleneck. &lt;code&gt;CUDA_DENSE=1&lt;/code&gt; keeps the earlier all-resident experimental path.
A measured &lt;code&gt;PIN&lt;/code&gt; profile can promote its hottest experts into the persistent
VRAM tier while keeping the rest in RAM:&lt;/p&gt;
&lt;pre&gt;STATS=stats.txt SNAP=/nvme/glm52_i4 ./glm 64 4 4   &lt;span&gt;&lt;span&gt;#&lt;/span&gt; collect routing frequencies first&lt;/span&gt;
COLI_CUDA=1 COLI_GPU=0 CUDA_EXPERT_GB=16 \
PIN=stats.txt PIN_GB=160 SNAP=/nvme/glm52_i4 ./glm 64 4 4
&lt;span&gt;&lt;span&gt;#&lt;/span&gt; multi-GPU expert tier, 96 GB total budget across six devices&lt;/span&gt;
COLI_CUDA=1 COLI_GPUS=0,1,2,3,4,5 CUDA_EXPERT_GB=96 \
PIN=stats.txt PIN_GB=160 SNAP=/nvme/glm52_i4 ./glm 64 4 4&lt;/pre&gt;
&lt;p&gt;Selected experts are uploaded during startup, so capacity failures occur before
inference and the log reports their exact tensor footprint. The budget is clamped
against free VRAM after reserving the projected dense resident set and 2 GB of
runtime headroom per selected device. With &lt;code&gt;COLI_GPUS&lt;/code&gt;, &lt;code&gt;CUDA_EXPERT_GB&lt;/code&gt; is a
total budget across the device set; experts are assigned whole to the
least-loaded device that can hold them. A NUMA-local RAM backing store is not
implemented yet.&lt;/p&gt;
&lt;p&gt;Current limitations: devices use independent contexts and synchronous
host-staged activation copies—there is no P2P/NCCL dependency yet. The kernels
are correctness-first custom kernels rather than cuBLAS/Tensor Core kernels.
This draft intentionally makes no end-to-end speedup claim before the full model
is benchmarked.&lt;/p&gt;
&lt;p&gt;For a reproducible backend A/B without the full checkpoint, generate the
deterministic 313M-parameter &lt;code&gt;glm_moe_dsa&lt;/code&gt; fixture and run fixed-token replay:&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;cd&lt;/span&gt; c
python tools/make_glm_bench_model.py --output /nvme/colibri-bench-medium --device cuda
python tools/benchmark_cuda_fixture.py --model /nvme/colibri-bench-medium --gpu 0&lt;/pre&gt;
&lt;p&gt;The fixture has random weights and is not a language model. It exists only to
preserve the real MLA/MoE/streaming shapes and compare CPU streaming, dense-only
CUDA, CPU hot-store, and CUDA hot-expert execution with identical replay tokens.&lt;/p&gt;
&lt;p&gt;Useful knobs (env or flags): &lt;code&gt;--temp T&lt;/code&gt; token sampling temperature (default 0.7 + nucleus 0.90 — tuned for int4; 0 = greedy), &lt;code&gt;--topp 0.7&lt;/code&gt; adaptive expert top-p (30–40% less disk), &lt;code&gt;--ngen N&lt;/code&gt; max tokens per answer (&lt;code&gt;:piu&lt;/code&gt; in chat continues a truncated one), &lt;code&gt;AUTOPIN=0&lt;/code&gt; disable the learning cache's auto-pin, &lt;code&gt;THINK=1&lt;/code&gt; enable GLM-5.2's reasoning block, &lt;code&gt;DRAFT=n&lt;/code&gt; MTP draft depth, &lt;code&gt;TF=1&lt;/code&gt; teacher-forcing validation, &lt;code&gt;PILOT=1&lt;/code&gt; router-lookahead disk prefetch (experimental — see below), &lt;code&gt;CAP_RAISE=0&lt;/code&gt; don't auto-grow the expert cache.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The expert cache auto-sizes to your RAM&lt;/strong&gt; (since 2026-07-10): the engine now &lt;em&gt;raises&lt;/em&gt; the LRU cap to fill your &lt;code&gt;--ram&lt;/code&gt; budget instead of only lowering it. Before this fix a 128 GB machine ran with the same 8-experts/layer cache as a 16 GB one (issue #12) — &lt;strong&gt;if you benchmarked colibrì before this date, rerun: your numbers were capped.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Router-lookahead prefetch&lt;/strong&gt; (&lt;code&gt;PILOT=1&lt;/code&gt;, experimental): GLM-5.2's expert routing is measurably predictable &lt;em&gt;ahead of time&lt;/em&gt; — applying layer L+1's router to layer L's post-attention state recalls &lt;strong&gt;71.6%&lt;/strong&gt; of the true top-8 (vs 41.3% for "same experts as last token"). &lt;code&gt;PILOT=1&lt;/code&gt; uses this to issue next-layer expert readahead from a dedicated I/O thread while the current layer computes. On our dev box the disk is already ~80% saturated, so it measures neutral; on machines where compute and disk are balanced (like the Ryzen AI 9 in issue #12: 43% disk / 46% matmul) it should overlap real work — measurements welcome.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The learning cache&lt;/strong&gt;: the engine records which experts your usage actually routes to (&lt;code&gt;.coli_usage&lt;/code&gt; next to the model, updated every turn) and at startup automatically pins the hottest ones in spare RAM. colibrì literally gets faster the more you use it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conversations reopen warm&lt;/strong&gt; (&lt;code&gt;.coli_kv&lt;/code&gt;, since 2026-07-10): &lt;code&gt;coli chat&lt;/code&gt; persists the compressed MLA KV-cache to disk after every turn (~182 KB/token, appended incrementally, crash-safe). Close the chat, reopen it tomorrow — the model still remembers the whole conversation and &lt;strong&gt;zero re-prefill happens&lt;/strong&gt;: validated byte-identical to an uninterrupted session. &lt;code&gt;:reset&lt;/code&gt; clears it, &lt;code&gt;KVSAVE=0&lt;/code&gt; disables it.&lt;/p&gt;
&lt;h2&gt;Got a better machine? Try it — here's what to expect&lt;/h2&gt;
&lt;p&gt;colibrì was built on deliberately humble hardware (12 cores, 25 GB RAM, NVMe behind a WSL2 VHDX that caps random reads at ~1 GB/s). &lt;strong&gt;Every one of those constraints is a knob your machine can turn up.&lt;/strong&gt; The engine needs: Linux (or WSL2), gcc with OpenMP, AVX2, ≥16 GB RAM, and the ~370 GB int4 model on a local NVMe (ext4 — never a network/9p mount).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How to test it, in order:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;cd&lt;/span&gt; c &lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./setup.sh                 &lt;span&gt;&lt;span&gt;#&lt;/span&gt; build + architecture self-test (expects 32/32)&lt;/span&gt;

&lt;span&gt;&lt;span&gt;#&lt;/span&gt; 1) measure YOUR disk the way the engine uses it (parallel 19 MB random reads):&lt;/span&gt;
gcc -O2 -fopenmp iobench.c -o iobench
./iobench /path/to/glm52_i4/out-00069.safetensors 19 64 8 0   &lt;span&gt;&lt;span&gt;#&lt;/span&gt; buffered, 8 threads&lt;/span&gt;
./iobench /path/to/glm52_i4/out-00069.safetensors 19 64 8 1   &lt;span&gt;&lt;span&gt;#&lt;/span&gt; O_DIRECT&lt;/span&gt;

&lt;span&gt;&lt;span&gt;#&lt;/span&gt; 2) chat; watch the per-turn stats line (tok/s, expert hit-rate, RSS):&lt;/span&gt;
COLI_MODEL=/path/to/glm52_i4 ./coli chat

&lt;span&gt;&lt;span&gt;#&lt;/span&gt; 3) record expert usage, then pin the hottest experts in your spare RAM:&lt;/span&gt;
STATS=stats.txt ./coli chat
PIN=stats.txt PIN_GB=20 ./coli chat        &lt;span&gt;&lt;span&gt;#&lt;/span&gt; scale PIN_GB to your free RAM&lt;/span&gt;

&lt;span&gt;&lt;span&gt;#&lt;/span&gt; 4) quality benchmarks (MMLU/HellaSwag/ARC):&lt;/span&gt;
./coli bench&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Back-of-envelope predictions&lt;/strong&gt; (decode is disk-bound: a cold token costs ~11.4 GB of expert reads; MTP speculation roughly halves the effective cost &lt;em&gt;once the cache is warm&lt;/em&gt;; RAM turns cold reads into free cache hits):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;machine&lt;/th&gt;
&lt;th&gt;expected&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;this dev box (WSL2 VHDX, ~1 GB/s, 25 GB RAM)&lt;/td&gt;
&lt;td&gt;~0.05–0.1 tok/s cold — proven baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;native Linux, PCIe4 NVMe (~3–5 GB/s random), 32 GB&lt;/td&gt;
&lt;td&gt;~0.5–1 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PCIe5 NVMe or 2×NVMe RAID0 (~8–12 GB/s), 64 GB (PIN ~40 GB of hot experts)&lt;/td&gt;
&lt;td&gt;~2–4 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;128–256 GB RAM, 12 cores (hot experts cached)&lt;/td&gt;
&lt;td&gt;~2–4 tok/s — matmul-bound: ~80 GFLOP/token vs ~250 GFLOP/s of our AVX2 kernels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;same RAM + 24–32 cores, or AVX-512/VNNI kernels&lt;/td&gt;
&lt;td&gt;~5–15 tok/s — interactive; kernel work is the multiplier&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;These are estimates, not measurements — if you run colibrì on serious hardware, &lt;strong&gt;please open an issue with your numbers&lt;/strong&gt;: real datapoints from better machines are exactly what this project needs next.&lt;/p&gt;
&lt;h3&gt;Community benchmarks (measured)&lt;/h3&gt;
&lt;p&gt;Real numbers from real machines, stock build (&lt;code&gt;setup.sh&lt;/code&gt;, gcc 13), greedy decoding, &lt;code&gt;--ngen 32&lt;/code&gt;, MTP active:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;machine&lt;/th&gt;
&lt;th&gt;disk (iobench, 19 MB × 64, 8 threads)&lt;/th&gt;
&lt;th&gt;config&lt;/th&gt;
&lt;th&gt;measured&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Intel Core Ultra 7 270K Plus (24 threads) · WSL2 · 24 GB RAM · NVMe VHDX (&lt;a href="https://github.com/JustVugg/colibri/issues/2"&gt;#2&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;1.96 GB/s buffered · 2.74 GB/s O_DIRECT&lt;/td&gt;
&lt;td&gt;default&lt;/td&gt;
&lt;td&gt;0.07 tok/s · expert hit 3–4% · RSS 14.1 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;〃&lt;/td&gt;
&lt;td&gt;〃&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--topp 0.7&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.11 tok/s&lt;/strong&gt; · expert hit 11% · RSS 14.7 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apple M5 Max (18 cores) · macOS · 128 GB unified · internal SSD (&lt;a href="https://github.com/JustVugg/colibri/issues/4"&gt;#4&lt;/a&gt;, &lt;a href="https://github.com/JustVugg/colibri/issues/5"&gt;#5&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;14.2 GB/s O_DIRECT&lt;/td&gt;
&lt;td&gt;default, MTP off&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.06 tok/s&lt;/strong&gt; · expert hit 23% · RSS 21.8 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Epyc 9654 ES · Linux · 4x16GB DDR5-4800-rdimm · Samsung PCIe Gen3 x4 NVME SSD&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;code&gt;MTP=1 DIRECT=1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0.31 tok/s · expert hit 35% · RSS 21.52 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ryzen AI 9 HX 370 (Framework 13) · Arch Linux · 128 GB · WD SN850X, BTRFS zstd (&lt;a href="https://github.com/JustVugg/colibri/issues/12"&gt;#12&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;int8 MTP head · &lt;code&gt;--cap 32&lt;/code&gt; · 46.7 GB auto-learned PIN&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.37 tok/s&lt;/strong&gt; · expert hit 66% · MTP acceptance 52% (2.59 tok/fw) · RSS 105 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Takeaways: with 24 GB of RAM the engine auto-caps the expert cache to 2 slots/layer, so decode stays cold even on a disk 2–2.7× faster than the dev box — &lt;strong&gt;on small-RAM machines the RAM cap, not the disk, is the binding constraint&lt;/strong&gt;, exactly as the table above predicts; &lt;code&gt;--topp 0.7&lt;/code&gt; alone bought a clean 1.6× end-to-end speedup. The M5 Max datapoint lands right on the table's second row: &lt;strong&gt;~1 tok/s of a 744B model on a laptop SSD&lt;/strong&gt; — and its 14 GB/s disk shifts the bottleneck back to RAM budget and kernels. The Framework 13 rows are the cache thesis proven end-to-end on one machine: 0.29 → 0.37 tok/s (hit 28% → 66%, speculation finally engaging at 52% acceptance) just by giving the cache its RAM — int8 MTP head + a bigger cap + the learned pin. The cap part is now automatic (cap auto-raise, 2026-07-10).&lt;/p&gt;
&lt;h2&gt;Quality benchmark — help wanted&lt;/h2&gt;
&lt;p&gt;We have never measured how much the int4 quantization costs in accuracy — the harness is built and wired, but scoring is one forward per answer option, and on the dev box's ~1 GB/s disk a full run takes the better part of a day. &lt;strong&gt;This is the single most valuable thing a faster machine can contribute.&lt;/strong&gt; The code is here and ready; one command runs it end to end (it auto-downloads the datasets on first use):&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;cd&lt;/span&gt; c
./coli bench                                   &lt;span&gt;&lt;span&gt;#&lt;/span&gt; hellaswag, arc_challenge, mmlu — 40 questions each&lt;/span&gt;
./coli bench hellaswag --limit 200             &lt;span&gt;&lt;span&gt;#&lt;/span&gt; one task, more questions&lt;/span&gt;
./coli bench mmlu arc_challenge --ram 100      &lt;span&gt;&lt;span&gt;#&lt;/span&gt; pick tasks, set a RAM budget&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;It prints per-task accuracy (log-likelihood scoring, EleutherAI-harness style). Published full-precision GLM-5.2 scores on these tasks sit around 85–95%; if our int4 container lands within a few points, the quantization is validated — if it doesn't, we know to invest in mixed / grouped-scale quantization. &lt;strong&gt;If you have the hardware to run this, please open an issue with the numbers&lt;/strong&gt; — it's the measurement the project is missing.&lt;/p&gt;
&lt;h2&gt;Supporting the project&lt;/h2&gt;
&lt;p&gt;colibrì is a one-person project, written and tested entirely on a 12-core laptop with 25 GB of RAM — the numbers above are the ceiling of what I can measure at home. If this project is useful or interesting to you and you'd like to support its development (better test hardware translates &lt;em&gt;directly&lt;/em&gt; into a faster engine for everyone: real NVMe scaling data, bigger pinned caches, int2/int3 quality sweeps on real benchmarks), you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;⭐ star the repo and share it;&lt;/li&gt;
&lt;li&gt;🐛 open issues with benchmark numbers from your hardware;&lt;/li&gt;
&lt;li&gt;💬 reach out via GitHub issues if you'd like to sponsor development or donate hardware.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every contribution, from a datapoint to a disk, moves the ceiling.&lt;/p&gt;
&lt;h2&gt;Repo layout&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Makefile                  root build/check entry point
c/
├── glm.c                 single-file GLM engine
├── st.h, tok.h, json.h   runtime headers
├── backend_cuda.*        optional CUDA tier
├── Makefile              build and local checks
├── coli                  user-facing CLI
├── setup.sh              one-command local setup
├── tools/                offline conversion, fixtures and benchmarks
├── scripts/              long-running conversion helpers
└── tests/                dependency-free C and Python tests
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The runtime path intentionally stays flat and readable: &lt;code&gt;glm.c&lt;/code&gt; plus its small
headers. Auxiliary Python and shell tooling is grouped separately and is never a
runtime dependency of the engine.&lt;/p&gt;
&lt;p&gt;From the repository root, &lt;code&gt;make&lt;/code&gt;, &lt;code&gt;make check&lt;/code&gt;, and &lt;code&gt;make clean&lt;/code&gt; delegate to the
engine Makefile. Existing commands run from &lt;code&gt;c/&lt;/code&gt; continue to work unchanged.&lt;/p&gt;
&lt;h2&gt;Why "colibrì"&lt;/h2&gt;
&lt;p&gt;The hummingbird weighs a few grams, hovers in place, and visits a thousand flowers a day. This engine keeps a 744-billion-parameter giant alive on hummingbird rations: 25 GB of RAM, twelve CPU cores, and a lot of disk patience.&lt;/p&gt;
&lt;h2&gt;License&lt;/h2&gt;
&lt;p&gt;Apache 2.0. GLM-5.2 weights are released by Z.ai under MIT.&lt;/p&gt;
&lt;/article&gt;</ns0:encoded></item><item><title>EU Parliament greenlights Chat Control 1.0</title><link>https://www.patrick-breyer.de/en/eu-parliament-greenlights-chat-control-1-0-breyer-our-children-lose-out/</link><pubDate>Thu, 09 Jul 2026 11:03:54 +0000</pubDate><comments>https://news.ycombinator.com/item?id=48843923</comments><description>&lt;a href="https://news.ycombinator.com/item?id=48843923"&gt;Comments&lt;/a&gt;</description><ns0:encoded xmlns:ns0="http://purl.org/rss/1.0/modules/content/">&lt;div class="entry-content wp-blocks" morss_own_score="5.703148425787107" morss_score="100.15749844016732"&gt;
&lt;p&gt;Today, the European Parliament allowed the suspicionless mass scanning of private communications (“Chat Control 1.0”) to pass, a measure it had rejected twice in March. Although a majority of voting Members of the European Parliament (MEPs) actually opposed the regulation (&lt;a href="https://howtheyvote.eu/votes/195775"&gt;314 against, 276 in favor, 17 abstentions&lt;/a&gt;), the motion to reject it failed to secure the required absolute majority of 361 votes. As a result, mass scanning is now permitted again until 2028.&lt;/p&gt;
&lt;p&gt;A symbolic exemption was &lt;a href="https://howtheyvote.eu/votes/195778"&gt;adopted&lt;/a&gt; for encrypted communications—though in practice, service providers do not scan these anyway. Furthermore, while a majority of voting MEPs wanted to restrict the scanning of private communications strictly to suspects identified by the judiciary (&lt;a href="https://howtheyvote.eu/votes/195788"&gt;322 to 255 votes&lt;/a&gt;), this amendment likewise fell short of the required absolute majority.&lt;/p&gt;
&lt;p&gt;Dr. Patrick Breyer, civil rights activist and former Member of the European Parliament (MEP), warns of the consequences:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“The fact that Chat Control is moving forward against the will of the majority of voting MEPs is a farce and damages democracy. Our children are the real losers in this undemocratic process. The passage of a genuine, permanent child protection regulation is now in serious jeopardy. The Council will never agree to a desperately needed paradigm shift as long as they can simply stick to the old approach of suspicionless scanning at the whim of the tech industry.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Despite the legislative defeat, Breyer remains defiant regarding the upcoming negotiations:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“Today’s vote on the interim regulation was a setback, but the political battle over the permanent ‘Chat Control 2.0’ is just getting started. The resistance we saw in Parliament today was so strong that finding a majority for permanent, suspicionless mass scanning in future negotiations is a complete pipe dream.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Breyer fundamentally rejects the mass surveillance approach:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“Trying to protect children with suspicionless mass surveillance is like frantically mopping the floor while the faucet is still running. Blanket chat control is just as unacceptable as indiscriminately opening everyone’s physical mail. For five years, this failed system has served as a smokescreen to delay real action, all while overwhelming the police with false alarms. We need more child protection, not less—but we need effective protection, not the illusion of security.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What happens next?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The interim regulation passed today will remain in effect until 2028, or until an agreement on a permanent regulation is reached. Negotiations for the permanent law will resume in September. The core dispute between the EU Parliament, member state governments, and the EU Commission remains the scanning of private chats: should it be indiscriminate, or targeted at criminal suspects?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What changes with the return of Chat Control 1.0—and what stays the same:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What is coming back:&lt;/strong&gt; US tech companies are once again allowed to scan private messages without a warrant or prior suspicion. This affects direct messages on platforms like Instagram, Discord, Snapchat, Skype, and Xbox, as well as emails via Google’s Gmail and Apple’s iCloud.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What remains unchanged:&lt;/strong&gt; Public social media posts and files hosted in cloud storage could already be scanned without this law. Furthermore, private messages can always be reported by users, or monitored by authorities using targeted, court-ordered wiretapping.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What is still NOT being scanned:&lt;/strong&gt; End-to-end encrypted chats, such as those on WhatsApp, have always been exempt from these scans. Additionally, European providers of messaging and email services have never implemented chat control measures.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why Chat Control is the wrong approach:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Since 2022, the volume of suspected abuse reports from the US has already &lt;a href="https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:52025DC0740"&gt;dropped by 50 percent&lt;/a&gt; due to the growing use of message encryption.&lt;/li&gt;
&lt;li&gt;According to &lt;a href="https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:52025DC0740"&gt;EU Commission figures&lt;/a&gt;, mass scanning of private chats accounted for only 36 percent of all abuse reports in 2024 (the majority came from public posts and cloud storage).&lt;/li&gt;
&lt;li&gt;The German Federal Criminal Police Office (BKA) reports that &lt;a href="https://www.bka.de/SharedDocs/Downloads/DE/Publikationen/JahresberichteUndLagebilder/SexualdeliktezNvKindernuJugendlichen/BLBSexualdeliktezNvKindernuJugendlichen2024.pdf?__blob=publicationFile&amp;amp;v=2"&gt;48 percent&lt;/a&gt; of all incoming alerts are not criminally relevant in the first place.&lt;/li&gt;
&lt;li&gt;Crime statistics reveal that 40 percent of the resulting investigations actually target minors themselves.&lt;/li&gt;
&lt;li&gt;Under the chat control system, an estimated 99 percent of reports generated by Meta consist of previously known material, which generally does little to stop ongoing, active abuse.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:52025DC0740"&gt;The EU Commission admits&lt;/a&gt; there is no evidence that suspicionless scanning of private communications has led to an increase in criminal convictions or in rescued children.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Talk of averting a “protection gap” is therefore highly misleading. The most effective law enforcement tools—court-ordered wiretaps, user reports, and the scanning of public platforms and cloud storage—were never at risk and remain fully intact. The only practice that was temporarily banned since April was the indiscriminate, warrantless searching of private, unencrypted messages of innocent people on a handful of US platforms.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Background: The deadlock over a permanent solution&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In parallel, negotiations are ongoing for a permanent regulation to protect children from sexualized online violence (the “CSAM Regulation” or “Chat Control 2.0”). In these talks, the EU Parliament is pushing for a paradigm shift in how we approach online child safety, demanding:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Mandatory, targeted detection orders against actual criminal suspects, rather than blanket mass scanning left to the tech industry’s discretion.&lt;/li&gt;
&lt;li&gt;An EU Child Protection Centre tasked with the systematic removal of known abuse material from the public internet.&lt;/li&gt;
&lt;li&gt;Strict security standards for messaging apps (“Security by Design”) to prevent cyber grooming.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This permanent legislation has stalled because EU member states insist on maintaining the outdated approach of voluntary, suspicionless scanning of private communications. Critics warn that repeatedly extending the interim rules removes the political pressure needed to reach a viable, permanent agreement. Ultimately, clinging to the status quo threatens to derail real progress on child protection.&lt;/p&gt;
&lt;p&gt;Patrick Breyer sums up the problem:&lt;br&gt;&lt;em&gt;“As long as EU governments can use procedural loopholes to continually extend their comfortable status quo of voluntary, indiscriminate mass scanning, they have zero incentive to engage with the Parliament’s targeted, legally sound, and far more effective child protection strategy.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“&lt;/em&gt;&lt;strong&gt;The Voices of Survivors: “We need privacy to bring abusers to justice”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Survivors of sexual violence explicitly emphasize that untargeted Chat Control did not help victims:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alexander Hanff&lt;/strong&gt;, survivor of child sexual abuse and privacy advocate, clarifies:&lt;br&gt;&lt;em&gt;“As a survivor I relied on confidential communications to tell my story and find justice for 28 schoolboys—myself included—resulting in the conviction of multiple offenders. We survivors need privacy, because without it we lose our voice. Chat Control was not created to protect children. It was about Big Tech companies like Meta or Google wanting access to our data for profiteering, and states attempting to expand mass surveillance. The EU Commission has wasted five years and millions of euros on algorithms that cannot protect children and were never meant to. This money should have been diverted to real policing, causal research, and support for survivors, millions of whom have never received any support at all.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Marcel Schneider&lt;/strong&gt;* &lt;em&gt;(name changed)&lt;/em&gt;, a survivor who has been &lt;a href="https://freiheitsrechte.org/en/ueber-die-gff/presse/pressemitteilungen/pr_chatcontrol_facebook"&gt;suing Meta in court over its voluntary Chat Control&lt;/a&gt;, adds:&lt;br&gt;&lt;em&gt;“Anyone mourning the end of Chat Control has not understood what actually helps survivors of sexual violence. Mass surveillance by corporations like Meta does not prevent abuse. Genuine protection means: deleting material at the source, proactive police work on the Darknet, and apps that are safe by design for children from the very start.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dorothée Hahne&lt;/strong&gt;, founding member and vice-chair of the survivors’ initiative MOGiS e.V. (A Voice for Survivors), emphasizes the danger mass surveillance poses to victims themselves:&lt;br&gt;&lt;em&gt;“As survivors, we see our ‘safe spaces’, our protected areas and communication channels, endangered or destroyed by this. For survivors, this need is existential.&lt;/em&gt;&lt;em&gt;“&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
</ns0:encoded></item><item><title>Train sim created by just one person is being called the best ever made</title><link>https://kotaku.com/a-train-sim-created-by-just-one-person-is-being-called-the-best-ever-made-2000699429</link><pubDate>Sun, 05 Jul 2026 08:40:27 +0000</pubDate><comments>https://news.ycombinator.com/item?id=48792383</comments><description>&lt;a href="https://news.ycombinator.com/item?id=48792383"&gt;Comments&lt;/a&gt;</description><ns0:encoded xmlns:ns0="http://purl.org/rss/1.0/modules/content/">&lt;div class="lg:max-w-[800px]" morss_own_score="1.4073107049608358" morss_score="3.874834385610362"&gt;


&lt;span&gt;
    By
    &lt;a href="https://kotaku.com/author/rebotherer"&gt;
      John Walker    &lt;/a&gt;
&lt;/span&gt;
&lt;time title="Published May 26, 2026 at 10:15 am"&gt;
      Published May 26, 2026
  &lt;/time&gt;
&lt;span&gt;|&lt;/span&gt;
&lt;a href="https://kotaku.com/a-train-sim-created-by-just-one-person-is-being-called-the-best-ever-made-2000699429#comments"&gt;
      Comments (&lt;span&gt;4&lt;/span&gt;)
    &lt;/a&gt;

&lt;span&gt;|&lt;/span&gt;



&lt;div class="featured -mx-4 sm:mx-0 relative" id="featured-image" morss_own_score="1.0" morss_score="3.5"&gt;
&lt;figure id="attachment_featured" aria-describedby="featured-caption" class="wp-caption" morss_own_score="5.0" morss_score="10.5"&gt;
&lt;img width="1920" height="1080" src="https://kotaku.com/app/uploads/2026/05/06-running-train.jpg" class="attachment-full size-full wp-post-image" alt="A blue train under cherry blossom." loading="" fetchpriority="high" decoding="async" srcset="https://kotaku.com/app/uploads/2026/05/06-running-train.jpg 1920w, https://kotaku.com/app/uploads/2026/05/06-running-train-336x189.jpg 336w, https://kotaku.com/app/uploads/2026/05/06-running-train-1280x720.jpg 1280w, https://kotaku.com/app/uploads/2026/05/06-running-train-768x432.jpg 768w, https://kotaku.com/app/uploads/2026/05/06-running-train-672x378.jpg 672w, https://kotaku.com/app/uploads/2026/05/06-running-train-960x540.jpg 960w, https://kotaku.com/app/uploads/2026/05/06-running-train-1600x900.jpg 1600w, https://kotaku.com/app/uploads/2026/05/06-running-train-1200x675.jpg 1200w" sizes="(max-width: 639px) 100vw, (max-width: 1023px) calc(100vw - 2rem), (max-width: 1258px) calc((100vw - 3.68rem) * 2 / 3), 800px" morss_own_score="3.0" morss_score="3.0"&gt; &lt;figcaption id="featured-caption" class="wp-caption-text" morss_own_score="8.0" morss_score="8.0"&gt;
&lt;span&gt;A blue train under cherry blossom.&lt;/span&gt; © Novatetsu Games / Kotaku
                  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;div class="mt-5 mx-auto" morss_own_score="2.935047361299053" morss_score="6.870094722598106"&gt;
&lt;div class="entry-content prose dark:prose-invert lg:prose-lg lg:leading-[29px] font-serif max-w-none" morss_own_score="5.870094722598106" morss_score="50.056661886777206"&gt;
&lt;p morss_own_score="6.3731343283582085" morss_score="6.3731343283582085"&gt;I spent a rather embarrassing amount of time trying to match up &lt;a href="https://store.steampowered.com/app/4630570/RUNNING_TRAIN/"&gt;&lt;em&gt;Running Train&lt;/em&gt;&lt;/a&gt;‘s hyper-realistic train lines and Japanese terrain with the real world. And in doing so, I paid the game the highest possible compliment. This extraordinarily realistic sim made by one-person development team Novatetsu Games is in fact set in a fictional region of Japan, but is created so lovingly that you’ll believe it’s real life.&lt;/p&gt; &lt;figure id="attachment_2000699447" aria-describedby="caption-attachment-2000699447" class="wp-caption alignnone" morss_own_score="4.0" morss_score="7.5"&gt;&lt;img src="https://kotaku.com/app/uploads/2026/05/07-running-train.jpg"&gt;&lt;figcaption id="caption-attachment-2000699447" class="wp-caption-text" morss_own_score="7.0" morss_score="7.0"&gt;© Novatetsu Games / Kotaku&lt;/figcaption&gt;&lt;/figure&gt; &lt;p morss_own_score="7.0" morss_score="9.0"&gt;I’m not exactly a train enthusiast, nor indeed particularly au fait with the range of train sim games previously available, but in &lt;em morss_own_score="4.0" morss_score="4.0"&gt;Running Train&lt;/em&gt; I’ve found something absolutely captivating. And most bizarrely, I’ve found that quality not by actually playing it, but rather by letting it play itself. While the game encourages you to master the reasonably simple controls of its range of perfectly crafted engines, you can also just set it to play itself and then take over the free camera as it does. Doing so has brought me so much pleasure.&lt;/p&gt;&lt;div class="not-prose my-8 -mx-4 xs:mx-auto" morss_own_score="3.0" morss_score="3.0"&gt;&lt;/div&gt;  &lt;p morss_own_score="7.0" morss_score="9.0"&gt;Played properly, &lt;em morss_own_score="4.0" morss_score="4.0"&gt;Running Train&lt;/em&gt; asks you to carefully control your speed, braking, and prompt, safe arrival at train stations, and rewards or penalizes you accordingly. By turning off in-game guides and even the UI, you can earn higher scores and more credit, contributing to your overall rating for each of the 42 different routes it currently features. These routes feature ten 12-minute routes on the fictional Fukugawa Line, and a further 32 of hugely varying length on the equally made up Sankai Main Line. They can be as short as six minutes, or as long as 44, each set at different times of day.&lt;/p&gt; &lt;p morss_own_score="7.0" morss_score="7.0"&gt;And oh my goodness, it’s so pretty. Vast stretches of imagined Japanese towns and countryside have been created (40 kilometers of track, apparently), and it’s not just randomly placed assets. Jumping into that free camera, I couldn’t believe it when I noticed that even powerlines are logically placed, with wires beginning at substations, then stretching across pylon networks. Roads are filled with traffic, cars are parked in bays outside apartment buildings, Shinto temples sit on hillsides, ferries bob on the sea while waves lap onto shores.&lt;/p&gt;



&lt;figure id="attachment_2000699444" aria-describedby="caption-attachment-2000699444" class="wp-caption alignnone" morss_own_score="4.0" morss_score="7.5"&gt;&lt;img src="https://kotaku.com/app/uploads/2026/05/02-running-train.jpg"&gt;&lt;figcaption id="caption-attachment-2000699444" class="wp-caption-text" morss_own_score="7.0" morss_score="7.0"&gt;© Novatetsu Games / Kotaku&lt;/figcaption&gt;&lt;/figure&gt; &lt;p morss_own_score="7.0" morss_score="7.0"&gt;The key thing about all these details is that…you don’t see most of them from the train! If you stuck with the driver cam, you’d miss almost all of it. It’s so much effort that the developers could easily have gotten away without, but it adds so much by being included. It’s also possible to play any of the routes in different weather conditions, from sunny days to torrential rain, or indeed in either spring or winter, with optional blizzards covering the entire game in snow.&lt;/p&gt; &lt;figure id="attachment_2000699445" aria-describedby="caption-attachment-2000699445" class="wp-caption alignnone" morss_own_score="4.0" morss_score="7.5"&gt;&lt;img src="https://kotaku.com/app/uploads/2026/05/09-running-train.jpg"&gt;&lt;figcaption id="caption-attachment-2000699445" class="wp-caption-text" morss_own_score="7.0" morss_score="7.0"&gt;© Novatetsu Games / Kotaku&lt;/figcaption&gt;&lt;/figure&gt; &lt;p morss_own_score="7.0" morss_score="7.0"&gt;Zoom out far enough—and for some reason it will let you—and you see the tiles, the roads that don’t line up, and the various tricks and techniques that allow it to look so realistic from low down. But don’t do that! That’s silly. This is a train sim, not a plane sim, you’ve no business in the sky.&lt;/p&gt;



&lt;p morss_own_score="7.0" morss_score="7.0"&gt;From those who know what they’re doing, Steam reviews could not be more glowing. “Honestly, I really, really do not know what to say,” begins one, before adding, “Hands down the most beautiful train sim that has been released on the market thus far. The modeling is top tier. The environment details, the clouds, the lighting, the weather effects all of it is just absolutely insane!”&lt;/p&gt; &lt;figure id="attachment_2000699446" aria-describedby="caption-attachment-2000699446" class="wp-caption alignnone" morss_own_score="4.0" morss_score="7.5"&gt;&lt;img src="https://kotaku.com/app/uploads/2026/05/12-running-train.jpg"&gt;&lt;figcaption id="caption-attachment-2000699446" class="wp-caption-text" morss_own_score="7.0" morss_score="7.0"&gt;© Novatetsu Games / Kotaku&lt;/figcaption&gt;&lt;/figure&gt; &lt;p morss_own_score="7.0" morss_score="7.0"&gt;Another says, “Best train simulator game so far!” while a third compliments the solo dev for including support for the Zuiki MASCON, a bespoke peripheral for train driving sims.&lt;/p&gt; &lt;p morss_own_score="7.0" morss_score="7.0"&gt;This is all for the Early Access release, and there are still big plans to make the game far more detailed. The developer wants to add a passenger system (currently the trains run empty) and a conductor mode, and the ultimate goal is up to 100 km of track. The hope is to have that all done by the end of next year.&lt;/p&gt;



&lt;p morss_own_score="7.0" morss_score="7.0"&gt;As it is, you can absolutely enjoy it as a top-notch train sim, but for me the experience has been about letting the model railway run itself as I swoop about in the camera. It’s a rare pleasure.&lt;/p&gt; &lt;p&gt;&lt;em&gt;Running Train&lt;/em&gt; is &lt;a href="https://store.steampowered.com/app/4630570/RUNNING_TRAIN/"&gt;out now in Early Access on Steam&lt;/a&gt; for $18.&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;




&lt;h2&gt;🕹️ Level up your inbox&lt;/h2&gt;

&lt;p&gt;Don’t miss the latest reviews, news and tips. Sign up for our free newsletter.&lt;/p&gt;


&lt;h2&gt;You May Also Like&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;

&lt;a href="https://kotaku.com/denshattack-train-game-tony-hawk-anime-onl-gamescom-2025-trailer-2000618578"&gt;
&lt;img src="https://kotaku.com/app/uploads/2025/08/traingame.jpg"&gt;
&lt;/a&gt;


&lt;span&gt;
    By
    &lt;a href="https://kotaku.com/author/zackzwiezen"&gt;
      Zack Zwiezen    &lt;/a&gt;
&lt;/span&gt;
&lt;time title="Published August 19, 2025 at 5:48 pm"&gt;
      Published August 19, 2025
  &lt;/time&gt;



&lt;/li&gt;
&lt;li&gt;

&lt;a href="https://kotaku.com/starfield-ship-increase-skills-level-up-pilot-simulator-1850834218"&gt;
&lt;img src="https://kotaku.com/app/uploads/2023/09/978ae13896a7a72ea7209b8491c33438.jpg"&gt;
&lt;/a&gt;


&lt;span&gt;
    By
    &lt;a href="https://kotaku.com/author/xoelleslow"&gt;
      Levi Winslow    &lt;/a&gt;
&lt;/span&gt;
&lt;time title="Published September 13, 2023 at 12:00 pm"&gt;
      Published September 13, 2023
  &lt;/time&gt;



&lt;/li&gt;
&lt;li&gt;

&lt;a href="https://kotaku.com/gas-station-simulator-is-one-of-steams-biggest-games-ri-1847696557"&gt;
&lt;img src="https://kotaku.com/app/uploads/2021/09/e69da17da8125d5fef153b72f525f056.gif"&gt;
&lt;/a&gt;


&lt;span&gt;
    By
    &lt;a href="https://kotaku.com/author/shineyezehuhh"&gt;
      Isaiah Colbert    &lt;/a&gt;
&lt;/span&gt;
&lt;time title="Published September 17, 2021 at 1:05 pm"&gt;
      Published September 17, 2021
  &lt;/time&gt;



&lt;/li&gt;
&lt;li&gt;

&lt;a href="https://kotaku.com/powerwash-sim-devs-on-making-cleaning-fun-advanced-cro-1847319502"&gt;
&lt;img src="https://kotaku.com/app/uploads/2021/07/f846aa9fcaa95cfeaabac9d02370fbf8.jpg"&gt;
&lt;/a&gt;


&lt;span&gt;
    By
    &lt;a href="https://kotaku.com/author/fahey"&gt;
      Mike Fahey    &lt;/a&gt;
&lt;/span&gt;
&lt;time title="Published July 19, 2021 at 12:20 pm"&gt;
      Published July 19, 2021
  &lt;/time&gt;



&lt;/li&gt;
&lt;li&gt;

&lt;a href="https://kotaku.com/microsoft-flight-simulator-is-much-smaller-now-1846992997"&gt;
&lt;img src="https://kotaku.com/app/uploads/2021/05/9fe16eb473b149e28cd4ef3e4d2e1b7a.jpg"&gt;
&lt;/a&gt;


&lt;span&gt;
    By
    &lt;a href="https://kotaku.com/author/iantothemax"&gt;
      Ian Walker    &lt;/a&gt;
&lt;/span&gt;
&lt;time title="Published May 28, 2021 at 1:30 pm"&gt;
      Published May 28, 2021
  &lt;/time&gt;



&lt;/li&gt;
&lt;li&gt;

&lt;a href="https://kotaku.com/zohran-mamdani-twitch-nyc-mayor-mario-kart-world-bus-2000714306"&gt;
&lt;img src="https://kotaku.com/app/uploads/2026/07/Screen-Shot-2026-07-09-at-7.10.13-PM.jpg"&gt;
&lt;/a&gt;


&lt;span&gt;
    By
    &lt;a href="https://kotaku.com/author/kennethshepard"&gt;
      Kenneth Shepard    &lt;/a&gt;
&lt;/span&gt;
&lt;time title="Published July 9, 2026 at 7:31 pm"&gt;
      Published July 9, 2026
  &lt;/time&gt;



&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
</ns0:encoded></item><item><title>Show HN: 18 Words</title><link>https://18words.com/</link><pubDate>Thu, 09 Jul 2026 12:48:52 +0000</pubDate><comments>https://news.ycombinator.com/item?id=48845049</comments><description>&lt;a href="https://news.ycombinator.com/item?id=48845049"&gt;Comments&lt;/a&gt;</description></item></channel></rss>