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.
Built from real race-day requirements — not a generic form builder.
Create meets with readable slug URLs, invite teams, and bulk-import full rosters with automatic team/race fallback.
A single bib-driven entry stream resolves each finish to the right race automatically — time several races at once from one chute.
Auto-refreshing team scores and individual results — meet-wide and per-race — shareable with no login required.
A lightweight hardware module watches a host trigger file and posts monotonic-clock-corrected starts the instant the gun fires.
Connect Impinj or Zebra/Motorola readers, see live per-antenna connection status, and stream tag reads in real time.
One docker compose up. Run it on a laptop for a dry run, or on a Raspberry Pi at the actual course.
A lightweight passcode keeps casual visitors out of meet management, while public results stay open to everyone.
FastAPI + SQLAlchemy + Alembic on the backend, SvelteKit on the frontend, PostgreSQL underneath — fully containerized.
Five containers, one docker-compose.yml. No external services required.
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 ↗.
No hosted service, no subscription — OpenXC lives entirely on hardware you control.