magnetite
Mid-redesign · the core is real · the network layer is LAN‑only

Anyone can re-run the match and check the result.

Clients send inputs, never state. A deterministic WASM sandbox steps the world, and every tick lands in a log a stranger can re-simulate and check byte for byte.

That's magnetite's one real asset — cheating isn't inferred, it's proven from the record. Seven pluggable seams keep every other service swappable, and this page marks exactly what runs today against what's still on paper.

Reading key Every claim below carries one of these marks
Running— built, tested, runs today Verifiable— a replay can prove it Boundary— verification stops here Not built— written down, not in the tree
magnetite · /marketplace
The magnetite marketplace listing six Rust games in the reference client, browser-native via WASM
The proof

A proof, not a promise.

Most anti-cheat guesses whether a player is lying. magnetite makes the match reproducible instead — same state, same commands, same seed, same result, on any machine — so a stranger can re-run it and compare hashes.

Tick
Host
Replay
1041
7f41c0a8e3…938ab1
7f41c0a8e3…938ab1
1042
2ad9e6104b…fb03c8
2ad9e6104b…fb03c8
1043
c184de0a7b…3c5e29
c184de0a7b…3c5e29
1044
9f2c41a7be…d85610
5c8de4f13a…0b7e2c
1045
halted: divergence at 1044
Tampering located — not scored by a heuristic. The two runs disagree at a specific tick, and the log says which one. This is what verify_replay does.

Inputs, never state

A client can only ask. The host validates and steps the world itself — a modified client can send a command, never assert a position, a hit or a score.

The same result anywhere

Game logic compiles to WASM under a sandboxed fuel budget, memory cap and epoch interrupt — no wall clock, no OS randomness reachable from the guest.

The product

The reference client, for real.

Captured from the app in the repository against deterministic fixture data — the shape of the interface, not a live network. Each shot is captioned with what it does not prove.

01 · Discovery

Bring your own server

Nodes advertise themselves; discovery is a phonebook, never an authority. A node measures its own cores and RAM and derives its own shard and player capacity — never a config constant someone assigned it.

Fixture data. Cross-operator routing over the open internet is not built — proven on a LAN only.
magnetite · /servers
magnetite server browser listing discovered nodes by content hash, with a checkable-versus-unverifiable legend and an example node invocation
02 · A listing

Provenance instead of a badge

Every game states what's checkable and what isn't, on the page itself: signed build, replay verification, and playable-artifact status, each marked honestly rather than implied by a green checkmark.

This listing: signed build and replay verification both read not attested, plainly, in the UI.
magnetite · /game/cosmic-raiders
A magnetite game listing for Cosmic Raiders showing signed build, replay verification and playable artifact all marked not attested, plus a provenance panel and a payment disclosure
03 · Wallet

Non-custodial by construction

No balances to hold — only signed receipts, each independently verifiable against the rail's own signing key. The API reports custodial: false, and the protocol fee defaults to 0 bps.

Rail: MOCK. A deterministic offline stub so CI runs with no network — no real payment has ever settled through magnetite.
magnetite · /wallet
magnetite wallet screen listing signed, independently verifiable receipts, marked non-custodial with the payment rail set to mock
How it's built

Seven seams, seven working defaults.

Nothing in the runtime, scheduler or payment path may name a provider directly — only these traits. Every seam ships a default that needs no network, no chain and no account, so the whole test suite runs fully offline.

Seam 01

Identity

A keypair. Sign-a-challenge login over raw Ed25519, with short-lived scoped tokens for entering external comms systems.

Default ships
Seam 02

Naming

Human names are a display layer; the substrate is always raw keys. Short-hash by default, an optional word-based provider proves the seam is genuinely swappable.

Default ships
Seam 03

BlobStore

Content addressing: the hash is the id. Local and HTTP stores today; peer-to-peer distribution is a later adapter behind the same trait.

Default ships
Seam 04

Discovery

A phonebook, never an authority. Nodes sign and lease their own ads, so a tracker can refuse forgeries without gaining any say over who may host.

Default ships
Seam 05

CommsProvider

Chat, voice, video and streaming are adapters, not a product we build. Matrix, Jitsi, LiveKit and Owncast sit behind one trait.

Adapters ship
Seam 06

PaymentRail

Non-custodial by design: no balances, no payout queue, no custody. What ships is the deterministic offline mock — no chain is wired up, so nothing moves real money today.

Mock rail only
/developers/earnings
Developer revenue screen showing settled USDC received over the mock payment rail and a zero-basis-point protocol fee
Seam 07 — where verification stops

InputProvider

Deterministic input — keyboard, gamepad, bot — is replay-verifiable. Attested input — anything sensor-derived — is not, and never will be: the pixels are gone and were never authoritative.

A host-side gate screens attested events for rate, cooldown, human-reachable velocity and monotonic sequence. Rejection means "not physically reachable." Acceptance means nothing stronger than "not obviously impossible."

A signature proves authorship, not truth. A cheater who signs their own fabricated numbers with their own genuine key passes every check — there is a test asserting exactly that.

wibbly · play — live wire ingress
wibbly, a camera-gesture client, running against a live magnetite node and sending signed attested events over the real InputProvider wire route

wibbly — a camera-gesture game built on magnetite — signs pose-derived events and a live magnetite node accepts them. That proves the wire carries traffic and nothing more: no game in either repo consumes those events yet. A validated transport, not gesture multiplayer. Play it →

Transport validated · no producer, no consumer
Audited, not pitched

Component by component.

Checked against the tree, not the pitch. DECENTRALIZATION.md is the authority on what's intended; this table is what exists right now.

CapabilityWhat it isState
Authoritative simulationAuthoritativeGame — deterministic validate / step in the SDKRunning
WASM sandboxWasmtime, fuel budget, memory cap, epoch interrupt; no OS randomness or wall clock in the guestRunning
Replay verificationReplayLog + verify_replay — re-simulate from scratch and locate tamperingRunning
Anti-cheat validatorsComposable validator chain, trust scoring, warn / kick / ban escalationRunning
Zero-backend dev loopmagnetite dev — builds to wasm and serves a live match with no server at allRunning
Seam crateEvery seam a trait with a default needing no external service; CI runs fully offlineRunning
Content-addressed gamesGame id = hash of wasm + manifest; loaded by hash with BLAKE3 verification, fail-closedRunning
Capacity-elastic nodeNode measures cores and RAM, derives its own shard and player budget — never a config constantRunning
Signed discoverySelf-advertised SessionAds, signed, leased and TTL-capped; LAN plus a dumb HTTP trackerRunning
Comms adaptersMatrix, Jitsi, LiveKit, Owncast and a builtin fallback behind one traitRunning
Shard migrationTwo-phase, epoch-fenced handoff, tested in-process and over a LAN; every partial failure keeps the source authoritativeRunning · LAN
Cluster membershipDeny-by-default operator allowlist of node public keys, checked at three separate pointsRunning · LAN
Session followSigned, single-use redirects move players with their shard; a forged redirect is inertRunning · LAN
Attested input wireSigned events reach a live node over a real socket, rate-limited then verified then gatedRunning · LAN
WAN / internet fleetsNAT traversal, relaying, real-world routing between operators not on one LANAbsent
On-chain payment railReal settlement behind PaymentRail. The Stellar testnet rail lands 70/70 crate tests but is not wired into the backendpayment.rs still panics without mock/solanaMock only
Multi-node ShardedThe full "Bucket D" topology rung above a single operator's clusterSpecified
DHT discoveryTrackerless peer discovery behind the same Discovery traitSpecified
Gesture / sensor producerAnything that produces an attested event — camera capture, pose model, vendor SDKNone in tree
Attested input consumerA game that actually drains the accepted-event queueNone in tree
Pre-redesign backendThe central API and database from before the redesign. Fiat and custody are gone; parts remainPartly removed
  • Internet-scale clusters Absent Shard handoff and cluster membership are real, tested code — over a LAN. No NAT traversal, no relay, no WAN validation. Nodes must already be directly reachable.
  • Money Mock only Wallet-to-wallet splits, receipts, escrow — all modelled. What ships is a deterministic mock that signs receipts offline. Fiat and custody were removed outright; no chain replaced them.
  • Anything using attested input None in tree The wire accepts, screens and acknowledges signed events. Nothing produces one — no camera, no pose model — and no game consumes one either. Both ends are missing on purpose: the seam exists to draw the boundary, not to ship gesture control.
  • The redesign itself In progress magnetite is mid-conversion from a conventional central-backend platform to the no-cloud model in DECENTRALIZATION.md. Treat that spec as intent, the ledger above as state.
Get started

A game is a crate that implements one trait.

The dev loop needs no server, no account and no network — and it's the path most exercised in the repository. Licensed MIT OR Apache-2.0.

SHELL
# install the CLI from the repo
$ cargo install --path magnetite-cli

# scaffold a crate implementing AuthoritativeGame
$ magnetite new my-game
$ cd my-game

# cargo build --release --target wasm32-wasip1
$ magnetite build

# sandboxed executor + live match, ZERO backend
$ magnetite dev

# bring a box: it measures its own hardware
$ magnetite node --advertise lan
  1. 1
    Write the game onceImplement AuthoritativeGame — deterministic by construction. No clock, no RNG, because those are what break replay.
  2. 2
    Run it with no backendmagnetite dev compiles to wasm and serves a playable match locally. No database, no account, no cloud.
  3. 3
    Bring your own boxmagnetite node measures cores and RAM and advertises what it can hold — the player cap is emergent from hardware, not a config constant.