Run your own instance
Runway is open source and self-hosted. You need Docker with Compose, a box your players’ phones can reach, and a domain name with a TLS certificate.
-
Clone the repository
Section titled “Clone the repository”Terminal window git clone https://github.com/Jessevdz/RunwayTheGame.git -
Write the
Section titled “Write the .env”.envTerminal window cp .env.example .envVariable What to put in it RUNWAY_DB_PASSWORDAny strong password. Only the containers ever use it S3_ACCESS_KEYMinIO root username / S3 access key ID S3_SECRET_KEYThe MinIO root password / S3 secret access key RUNWAY_WORKER_TOKENShared secret authenticating the background verification worker when submitting AI photo grading verdicts to the server RUNWAY_ROADMAP_ADMIN_KEYSecret key for roadmap and admin management S3_PUBLIC_ENDPOINTThe browser-facing app URL, e.g. http://localhostlocally orhttps://race.example.comin production. Evidence uploads should pass through the frontend proxy’s 50 MB limit.RUNWAY_ALLOWED_ORIGINSComma-separated browser origins for the API and WebSocket (e.g. https://race.example.com). Leave empty locally for loopback/LAN originsSCALEWAY_API_KEYOptional: Scaleway API key to enable AI photo grading (or GEMINI_API_KEYfor Google Gemini)Generate the secrets:
Terminal window openssl rand -hex 32Everything else in the file has a working default.
-
Configure reverse proxy or domain (optional)
Section titled “Configure reverse proxy or domain (optional)”By default,
docker-compose.ymlpublishes the frontend on port80(orFRONTEND_PORTin.env).Copy
docker-compose.override.example.ymltodocker-compose.override.yml:Terminal window cp docker-compose.override.example.yml docker-compose.override.ymlEdit the
frontendservice labels indocker-compose.override.ymlwith your hostname and certificate resolver:- "traefik.http.routers.runway.rule=Host(`race.example.com`)"- "traefik.http.routers.runway.tls.certresolver=your-resolver"Docker Compose automatically applies
docker-compose.override.yml, which is gitignored so your personal setup is never committed or overwritten during updates.Set
FRONTEND_PORTin.envif you want to bind to a non-standard port (e.g.FRONTEND_PORT=8080), and terminate TLS in front of it with Caddy, nginx, or your reverse proxy of choice. -
Bring it up
Section titled “Bring it up”Terminal window docker compose up -d --buildWatch for all services healthy:
Terminal window docker compose ps
Grading photos
Section titled “Grading photos”The launchers offer the honour system and host grading out of the box, and both run entirely on your instance.
The AI referee needs SCALEWAY_API_KEY (or GEMINI_API_KEY) in your .env. The server is told a key
exists and the worker is given the key itself, so the card appears in the
launcher only when a backend can answer it. Cheap EXIF and GPS-velocity
heuristics run first and reject some captures at zero API cost; everything past
them goes to the model. Leave the key empty and the AI card stays hidden.
Updating and backups
Section titled “Updating and backups”git pulldocker compose up -d --buildTwo named volumes hold everything worth keeping: runway_db_data has the event
log every race is replayed from, and runway_minio_data has the photos. Back up
both together, since a photo whose row is gone is unreachable and a row whose
photo is gone renders as a hole in the race report.