loom▌

A distributed expert cache for large mixture-of-experts inference. Pool the RAM and disk of ordinary machines; serve a model none of them could hold alone.

Apache-2.0Zig, one static binaryCPU-first live devnetbyte-identical outputs

The thesis: experts flow, not activations

A modern MoE model activates a small fraction of its weights per token — and only the routed experts change from token to token. Loom treats those experts as an immutable, content-addressed, sparsely accessed blob store. Every node runs its own full forward pass; the only thing that crosses the network is expert weight blocks — cacheable, prefetchable, digest-verified.

layer-split (Petals, exo, RPC) layers 0–26 layers 27–53 layers 54–80 activations cross per token, per layer — serial: one slow peer stalls every token loom full forward, partial store full forward, partial store full forward, partial store immutable expert blocks flow on miss — cached, verified, soft-failure: a lost peer costs a re-fetch

Because the blocks are immutable and Merkle-rooted, integrity is a free side effect: every shard is verified against the manifest digest before it touches a matmul or disk, a poisoned peer costs one rejected block, and a node that dies costs a re-fetch from a replica — never a broken pipeline.

Try it — join the live devnet

# one command: installs loom, syncs your share of the expert shards from
# peers (no model download), serves an OpenAI-compatible API locally
curl -fsSL https://raw.githubusercontent.com/ch4r10t33r/loom/main/scripts/join-devnet.sh | sh

The devnet serves Qwen3-30B-A3B (Q2_K, 6,262 content-addressed shards). Your node holds a random redundant fraction, fetches the rest from peers inside the token loop, and serves shards back. Chat UI on localhost:8555. Details: alpha guide.

Honest expectations. On slow links the win is capacity, not speed — pooling lets a swarm hold what no member can, but a partial holder on a saturated link decodes slowly. Loom is throughput-and-capacity-first serving infrastructure, not a fast single-chat engine. The numbers below say exactly where it helps and by how much.

Measured, not promised

Every design decision in loom carries a dated, append-only decision log entry with the measurement that forced it — including the negative results.

Pre-gating payoff, live−16.1%

aggregate wall time on a 2.5 MB/s link (−9.0% at 119 MB/s), byte-identical output: a 12M-parameter head predicts every layer's experts from layer-0 state and prefetches them.

Restart to serving2 s

was 1–2 minutes: an origin adopts its previous boot's Merkle manifest and audits in the background; every read stays digest-verified.

Output disciplinebyte-exact

a partial holder's output is byte-identical to a full node's; every optimization ships gated on that equality.

RepairRS 8+2

eager churn repair within one 2 s tick, plus systematic Reed–Solomon parity that rebuilds small holes — decode-then-verify, no trust in parity servers.

How it works

Compared honestly

SystemUnit distributedCrosses the network per tokenA lost peer costs
Petals / exo / llama.cpp RPClayer rangesactivations, every layerthe pipeline stalls
Browser swarms (WebRTC layer-split)layer rangesactivations, every layerthe room stalls
Single-node offload (FreeToken, KTransformers)nothing (one machine)nothing—
loomexpert blocks (immutable weights)expert blocks, only on cache missa re-fetch from a replica

Layer-split systems are deployed and effective; the distinction is structural. Single-node offload engines are complementary — they assume the whole model fits one machine's storage; loom removes exactly that assumption.

Research