Rusty Timer forwards IPICO chip-timing reads over the internet so your timing software doesn't need a direct cable to each reader. Use it when readers are far from the timing tent, at multi-site events, or as a remote backup for local reads.
It is compatible with any software that works with IPICO readers (tested with IPICO Connect).
┌─── Field ───┐ ┌── Cloud ──┐ ┌── Timing Tent ──┐
IPICO Reader ──TCP──► Forwarder ──WS──► Server ──WS──► Receiver ──TCP──► Timing Software
│
Dashboard (web)
The Forwarder runs on a small computer (e.g. Raspberry Pi) next to each IPICO reader. It journals every read to a local SQLite database for power-loss safety, then forwards reads to a central server over WebSocket with at-least-once delivery.
The Server ingests reads from all forwarders, deduplicates them, stores them in PostgreSQL, and fans them out to receivers over WebSocket. It serves a web dashboard for monitoring streams, managing races, and exporting data.
The Receiver subscribes to one or more streams from the server and re-exposes each as a local TCP port — so your existing timing software sees the data as if the reader were plugged in directly.
If the internet drops, reads are safe: the forwarder journals locally and replays everything once the connection is restored.
Streamer — Connects to one or more IPICO readers over TCP and fans out reads to any number of local TCP clients. Useful as a standalone tool without the remote forwarding stack.
Announcer — A live public-facing screen served by the server that shows recent finishers. Configurable via the server dashboard.
Server UI, Receiver UI, Forwarder UI — Web dashboards for each service (the forwarder and receiver UIs are embedded in their binaries). Built with SvelteKit.
Readers: Tested with IPICO Lite readers. Should also work with IPICO Elite and Super Elite readers. Not compatible with non-IPICO hardware.
Timing software: Compatible with any software that accepts IPICO TCP streams — tested with IPICO Connect.
Forwarder hardware: Raspberry Pi 3, 4, or 5 (64-bit OS). Any Linux SBC with network access and an ARM64 or x86-64 CPU should work.
Performance: Supports multiple readers and forwarders simultaneously with sub-second read forwarding latency.
Run the full stack locally with simulated readers — no hardware needed:
Prerequisites: Rust 1.93.1 (via rust-toolchain.toml), Docker, Node.js 24.x, Python 3.11+ with uv, and tmux.
Just want to see the server? Run it with Docker — no Rust needed:
docker compose -f deploy/quickstart/docker-compose.yml up -d
# Open http://localhost:8080See deploy/quickstart/ for details.
uv run scripts/dev.pyThis launches Postgres, the server, an emulator (simulated reader), a
forwarder, and a receiver in tmux panes. The server dashboard is at
http://localhost:8080. See scripts/README.md for
all component URLs and options.
| Component | Guide |
|---|---|
| Quickstart (Docker, no build) | deploy/quickstart/ |
| Server (Docker) | deploy/server/ |
| Forwarder on Raspberry Pi | deploy/sbc/ |
| Race-day operations | docs/runbooks/race-day-operator-guide.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