๐Ÿ“ฆ Where your data lives

local-first darts โ€” every byte accounted for

The trainer is built local-first: your board plays perfectly with zero internet, forever. The network exists for exactly one reason โ€” the shared detection model that every board helps train and every board gets back. This page shows everything that is stored, where, and why. Numbers are live as of 2026-07-18.

On your board (the Raspberry Pi)

๐ŸŽฏ Every throw โ€” stats.db

SQLite on the Pi ยท the local-first source of truth ยท works offline forever

๐Ÿ“ธ Frames in flight โ€” RAM staging

ramdisk (/dev/shm) ยท ephemeral ยท never wears the SD card

๐Ÿ† Boards, players, identity โ€” small JSON stores

on the board, not in the browser

๐Ÿง  The model & calibration

the seeing part

On central (dart-room.com)

One small service holds the shared brain: the training data both boards contribute, the model registry they update from, and the cross-board leaderboards. The darts themselves are tiny โ€” the whole database is 12 MB; it is the camera frames that weigh 13 GB.

TableRowsWhat it holds
game_throw6,464every uploaded throw: label, model proposal, correction flag, game context, capture timestamp
capture / capture_image6,464 / 19,392the capture sets โ€” 3 camera frames per throw, lossless WebP, content-addressed (SHA-256), stored in the 13 GB blob volume
highscore + highscore_tag91 + 9leaderboard rows with extensible tags (board:, group:, variant:โ€ฆ) โ€” new scopes need no schema change
elo_rating5the ranked-match ladder (K=32, saved players only)
player / player_identity9 / 1display names ยท opt-in 12-word key bindings (only the public key is stored โ€” never the words)
rig / rig_token3 / 5enrolled boards and their per-board access tokens (each board holds only its own key; any one can be revoked alone)
rig_health / rig_event471 / 14,313heartbeats + the shipped decision log โ€” a friend's board can be debugged without SSH
rig_calibration28calibration snapshots โ€” per-throw provenance for training
model16the published model registry: every trained model with its provenance and metrics โ€” boards pull updates from here
feedback11in-app bug reports, arriving with screenshot + rig context as evidence
eval_run / eval_result0 / 0reserved: detector-vs-truth evaluation slices

๐Ÿ” Access

The flywheel โ€” how a dart becomes a better model

you throwโ†’ 3 cams captureโ†’ model proposes a tip positionโ†’ you accept โ€” or tap to correct
โ†ณ scored instantly, stored in stats.db and frames + label queue in the outboxโ†’ central capture store
โ†ณ training pulls the throws โ€” your corrections are the gold (a tap marks exactly where the tip really was)
โ†ณ new model trained & field-testedโ†’ published to the registryโ†’ every board updates over the air

The loop's honest rule: models are judged by field acceptance โ€” how often real players accept proposals untouched at a real board โ€” not by lab metrics alone. A model that aces the test set and annoys players does not ship.

What never leaves your board

install ยท game modes ยท statistics
dart-room.com โ€” open dart detection, local-first