100% open source · GPL-3.0 · self-hosted

Cross country race timing, without the spreadsheet chaos.

OpenXC is a self-hosted app for running an entire cross country meet: rosters, concurrent live timing, RFID tag acquisition, starting-gun hardware integration, and public results — all in one Docker Compose stack that runs on a laptop or a Raspberry Pi at the course.

Docker Composeone command to run
FastAPI + SvelteKitmodern, fully typed stack
LLRP + hardwareRFID readers & starting guns
OpenXC is fully open source. Every line — backend, frontend, hardware integrations — lives in the public repo. Fork it, self-host it, send a PR.
github.com/openxc-dev/openxc ↗
Features

Everything a meet needs, in one app.

Built from real race-day requirements — not a generic form builder.

Meets, Teams & Rosters

Create meets with readable slug URLs, invite teams, and bulk-import full rosters with automatic team/race fallback.

Concurrent Live Timing

A single bib-driven entry stream resolves each finish to the right race automatically — time several races at once from one chute.

Live Public Results

Auto-refreshing team scores and individual results — meet-wide and per-race — shareable with no login required.

Starting-Gun Integration

A lightweight hardware module watches a host trigger file and posts monotonic-clock-corrected starts the instant the gun fires.

RFID (LLRP) Reader Acquisition

Connect Impinj or Zebra/Motorola readers, see live per-antenna connection status, and stream tag reads in real time.

Self-Hosted, Anywhere

One docker compose up. Run it on a laptop for a dry run, or on a Raspberry Pi at the actual course.

Operator Passcode

A lightweight passcode keeps casual visitors out of meet management, while public results stay open to everyone.

Modern, Typed Stack

FastAPI + SQLAlchemy + Alembic on the backend, SvelteKit on the frontend, PostgreSQL underneath — fully containerized.

Architecture

A small, honest stack.

Five containers, one docker-compose.yml. No external services required.

Browser
operator & spectators
nginx
reverse proxy, port 80
routes / and /api
SvelteKit frontend
dashboard + public results
FastAPI backend
REST API, Alembic migrations
PostgreSQL
durable storage
Starter module
optional — starting-gun trigger
LLRP readers
optional — RFID acquisition
Get started

Running in under a minute.

No signup, no cloud account, no external dependencies.

# clone and configure
git clone https://github.com/openxc-dev/openxc.git
cd openxc
cp .env.example .env

# build and run the whole stack
docker compose up --build

Then open http://localhost — default passcode 1234, a demo meet is seeded automatically. Full setup notes in the README ↗.

Free, open, and yours to run.

No hosted service, no subscription — OpenXC lives entirely on hardware you control.