Rusty Timer forwards IPICO chip-timing reads over the internet so timing software does not need a direct cable to each reader. It is designed for remote timing points, multi-site races, and backup paths for local reads.
It is compatible with timing software that accepts IPICO TCP streams (tested with IPICO Connect).
┌─── Field ───┐ ┌── Timing Tent ──┐
IPICO Reader ──TCP──► Forwarder ───────iroh/P2P──────────────► Receiver ──TCP──► Timing Software
│ │
SQLite journal received-events DB
+ replay cursor + replay cursor
│ │
└────────HTTP coordination─────────────┘
│
▼
Server (registry, allow-list,
status board, announcer)
The Forwarder runs next to each IPICO reader. It journals every read to local SQLite, exposes a typed P2P control/data plane over iroh, and keeps per-stream sequence numbers monotonic across epoch changes.
The Server is the lightweight coordination service. It stores endpoint registrations, distributes allow-lists, receives announcer/status updates, and exposes the status board. It does not carry chip-read data.
The Receiver connects directly to forwarders through iroh, durably stores received events and cursors, acknowledges only after durable writes, and replays subscribed streams as local TCP ports for existing timing software.
If a link drops, reads remain safe: the forwarder journal is the source of truth, receivers resume from durable cursors, and pruned cursors are reported as explicit gap markers.
- Streamer connects to IPICO readers and fans out local TCP streams without the remote forwarding stack.
- Emulator simulates IPICO readers for local development and deterministic tests.
- Forwarder UI, Receiver UI, and Server UI are SvelteKit frontends embedded in their service binaries or desktop shell.
- Shared UI contains reusable UI components, help metadata, and validation logic.
- Readers: tested with IPICO Lite readers; intended for IPICO Elite and Super Elite readers as well.
- Timing software: any software that accepts IPICO TCP streams.
- Forwarder hardware: Raspberry Pi 3/4/5 with a 64-bit OS, or any Linux SBC/server with an ARM64 or x86-64 CPU. The field setup can be built as a self-contained enclosure with a PiSugar UPS, SPI LCD status display, cooling, 12 V battery input, Ethernet bulkhead connector, and cellular hotspot; see the SBC deployment guide.
Run the deterministic loopback P2P stack locally with simulated readers:
uv run scripts/e2e/run_stack.pyThe loopback stack starts the emulator, forwarder, receiver-headless, and server with relay/discovery disabled and injected local addresses. See scripts/README.md for local development commands.
| Component | Guide |
|---|---|
| Forwarder on Raspberry Pi | deploy/sbc/ |
| Race-day operations | docs/runbooks/race-day-operator-guide.md |
| Forwarder operations | docs/runbooks/forwarder-operations.md |
| Receiver operations | docs/runbooks/receiver-operations.md |
| Server operations | docs/runbooks/server-operations.md |
Pre-built binaries are available on the Releases page.
See the full documentation index for all guides, runbooks, and reference docs.
See CONTRIBUTING.md for building from source, running tests, and code quality checks.
GPL-3.0 — see LICENCE.txt