Pi MTA Sign!
This project gives you a docker image that you can run locally to pull MTA data and self-host a webpage that looks very similar to the classic MTA Signs found in the metro.
Initially designed to run directly on a raspberry pi, it has been containerized and now runs anywhere you can install podman or docker!
Additionally, this can be run without the frontend in case you just wanted a slightly more sane way to query MTA's data
sources compared to their stock APIs. Swagger is hosted at /swagger

Features
- Real-time MTA Data: Live train arrival times for NYC subway stations - available for free here
- Configurable Stations: Monitor multiple stations simultaneously with separate cards
- Line Filtering: Show/hide specific transit lines for each station
- Direction Selection: Toggle between North/South bound trains independently
- Responsive Design: Works on desktop, tablet, and mobile displays
- Configuration Persistence: Save your selected stations and preferences to localStorage or export/import them via JSON
- Docker Ready: Easy deployment with Docker or Docker Compose
Running via Docker
Quick Start with Docker
Pull the latest image from GitHub Container Registry:
docker pull ghcr.io/lucasoskorep/pi-mta-sign:latest
Run the container:
docker run -d \
-p 8000:8000 \
--name pi-mta-sign \
ghcr.io/lucasoskorep/pi-mta-sign:latest
The application will be available at http://localhost:8000
Environment Variables
| Variable | Description | Default | Required |
|---|---|---|---|
FRONTEND_ENABLE |
Enable/disable the web frontend | true |
No |
SHOW_SWAGGER |
Enable/disable Swagger API documentation at /swagger |
false |
No |
Running with Docker Compose
For a more convenient setup, use the provided docker-compose configuration:
# Run with docker-compose
docker-compose up -d
See docker/docker-compose.example.yaml for a complete example configuration.
Local Development
To develop on this app locally you can clone the repo and then in the repo root run the following
Tools needed:
Once you have all the required tooling all you need to do is
just init # uses uv and fnm/pnpm to download and setup all python and node depencencies
just dev # this will spin up the nextjs frontend and fastapi backend in hot reload mode
