- Introduced CombinedTrackModel, CombinedTrackCreate, and CombinedTrackRepository for managing combined tracks. - Implemented logic to create combined tracks based on existing tracks between two stations. - Added methods to check for existing combined tracks and retrieve constituent track IDs. - Enhanced TrackModel and TrackRepository to support OSM ID and track updates. - Created migration scripts for adding combined tracks table and OSM ID to tracks. - Updated services and API endpoints to handle combined track operations. - Added tests for combined track creation, repository methods, and API interactions.
Rail Game
A browser-based railway simulation game using real-world railway maps from OpenStreetMap.
At a glance
- Frontend: React + Vite (TypeScript)
- Backend: Python (FastAPI, SQLAlchemy)
- Database: PostgreSQL with PostGIS (spatial types)
- Mapping: Leaflet + OpenStreetMap
Features
- Real-world railway maps
- Interactive Leaflet map preview of a demo network snapshot
- Build and manage your railway network
- Dynamic train schedules and simulated trains
Current project layout
This repository contains a full-stack demo app (frontend + backend), supporting scripts, docs and infra. Key folders:
backend/— FastAPI application, models, services, migration scripts and backend tests.frontend/— React app (Vite) and frontend tests.docs/— Architecture docs and ADRs.infra/— Deployment assets (Dockerfiles, compose files, init scripts).data/— Fixtures and imported OSM snapshots.scripts/— Utility scripts (precommit helpers, setup hooks).tests/— End-to-end tests and cross-cutting tests.
Refer to the in-repo docs/ for architecture decisions and deeper design notes.
Installation
Below are concise, verified steps for getting the project running locally. Commands show both PowerShell (Windows) and Bash/macOS/Linux variants where they differ.
Prerequisites
- Git
- Python 3.10+ (3.11 recommended) and pip
- Node.js 16+ (or the version required by
frontend/package.json) - PostgreSQL with PostGIS if you want to run the full DB-backed stack locally
- Docker & Docker Compose (optional, for containerized dev)
Clone repository
PowerShell / Bash
git clone https://github.com/zwitschi/rail-game.git
cd rail-game
Backend: create virtual environment and install
PowerShell
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -e .[dev]
Bash / macOS / Linux
python -m venv .venv
source .venv/bin/activate
python -m pip install -e '.[dev]'
Notes
- Installing editable extras (
.[dev]) installs dev/test tools used by the backend (pytest, black, isort, alembic, etc.).
Environment file
Copy the sample .env.example to .env and adjust the database connection strings as needed.
PowerShell
Copy-Item .env.example .env
Bash
cp .env.example .env
Important environment variables
DATABASE_URL— runtime DB connection for the appTEST_DATABASE_URL— database used by pytest in CI/local testsALEMBIC_DATABASE_URL— used when running alembic outside the app process
Database (Postgres + PostGIS)
If you run Postgres locally, create the dev/test DBs and ensure the postgis extension is available. Example (psql):
-- create DBs (run in psql as a superuser or role with create privileges)
CREATE DATABASE railgame_dev;
CREATE DATABASE railgame_test;
-- connect to the db and enable extensions
\c railgame_dev
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE EXTENSION IF NOT EXISTS pgcrypto;
Adjust DB names and roles to match your .env values.
Quick database setup (recommended)
For a streamlined setup, use the included initialization script after configuring your .env file:
PowerShell / Bash
python scripts/init_demo_db.py
This script validates your environment, runs migrations, and loads demo OSM data. Use --dry-run to preview changes, or --region to load specific regions.
Note: The script uses python-dotenv to load your .env file. If not installed, run pip install python-dotenv.
Run migrations
PowerShell / Bash
cd backend
alembic upgrade head
cd ..
If you prefer to run alembic with a specific URL without editing .env, set ALEMBIC_DATABASE_URL in the environment before running the command.
Load OSM fixtures (optional)
Use the included scripts to refresh stations and tracks from saved OSM fixtures. This step assumes the database is migrated and reachable.
PowerShell / Bash
# dry-run
python -m backend.scripts.osm_refresh --region all --no-commit
# commit to DB
python -m backend.scripts.osm_refresh --region all
See backend/scripts/*.py for more granular import options (--skip-* flags).
Frontend
Install dependencies and run the dev server from the frontend/ directory.
PowerShell / Bash
cd frontend
npm install
npm run dev
The frontend runs at http://localhost:5173 by default (Vite). The React app talks to the backend API at the address configured in its environment (see frontend README or vite config).
Run backend locally (development)
PowerShell / Bash
# from project root
uvicorn backend.app.main:app --reload --port 8000
The backend API listens at http://localhost:8000 by default.
Tests & linters
Backend
pytest
black backend/ && isort backend/
Frontend
cd frontend
npm run lint
npm run build # type/build check
Docker / Compose (optional)
Build and run both services with Docker Compose if you prefer containers:
PowerShell / Bash
docker compose up --build
This starts all services (Postgres, Redis, backend, frontend) and automatically initializes the database with demo data on first run. The backend waits for the database to be ready before running migrations and loading OSM fixtures.
Services:
- Backend API:
http://localhost:8000 - Frontend:
http://localhost:8080 - Postgres:
localhost:5432 - Redis:
localhost:6379
This expects a working Docker environment and may require you to set DB URLs to point to the containerized Postgres service if one is defined in docker-compose.yml.
Troubleshooting
- If migrations fail with missing PostGIS functions, ensure
postgisis installed and enabled in the target database. - If alembic autogenerate creates unexpected changes, confirm the models being imported match the app import path used by
alembic(seebackend/migrations/env.py). - For authentication/debugging, the demo user is
demo/railgame123(used by some integration tests and the demo auth flow). - If frontend dev server fails due to node version, check
frontend/package.jsonengines or usenvm/nvm-windowsto match the recommended Node version.
API preview
Some useful endpoints for local testing:
GET /api/health— readiness probePOST /api/auth/register— demo account creation + JWTPOST /api/auth/login— exchange credentials for JWT (demo user:demo/railgame123)GET /api/auth/me— current user profile (requires bearer token)GET /api/network— sample network snapshot (requires bearer token)
Contributing
- See
docs/for architecture and ADRs. - Keep tests green and follow formatting rules (black, isort for Python; Prettier/ESLint for frontend).
- Open issues or PRs for bugs, features, or docs improvements.