A desktop application for visualizing and planning trips using GTFS (General Transit Feed Specification) public transit data. Built with Go, React, and MapLibre GL.
- Interactive Map - Browse transit stations on an OpenStreetMap-based map with MapLibre GL
- Station Search - Search for stations by name with keyboard navigation
- Trip Planning - View upcoming departures and plan multi-leg journeys
- Route Visualization - See route geometries with GTFS-defined colors
- Trip Details - View complete trip itineraries with all stops and times
- Overnight Trip Handling - Correctly handles GTFS times >= 24:00:00
- Service Calendar - Respects weekday rules and calendar exceptions
Prebuilt downloads for each platform are attached to the latest release. No GTFS data ships with the app — it is downloaded/imported from within the app on first launch (see GTFS Data).
This repository doubles as its own Homebrew tap, so you can install and update
straight from brew:
brew tap klaustopher/gtfs-planner https://github.com/klaustopher/gtfs-planner
brew install --cask gtfs-plannerLater updates come with brew upgrade --cask gtfs-planner. The cask installs the
signed, notarized universal .dmg from the latest release.
Download gtfs-planner_<version>_macOS_universal.dmg, open it and drag GTFS
Planner into your Applications folder. The app is signed and notarized, so it
opens normally without any Gatekeeper workaround. Runs natively on both Apple
Silicon and Intel.
Builds are provided for both amd64 (x86-64) and arm64 (aarch64) — match
the _amd64/_arm64 part of the filename to your CPU. The app needs GTK4 and
WebKitGTK 6.0 (Ubuntu 24.04+, Debian 13+, Fedora, Arch and other current
distros).
Install the runtime dependencies, extract and run:
# Ubuntu 24.04+ / Debian
sudo apt install libgtk-4-1 libwebkitgtk-6.0-4
# Fedora
sudo dnf install gtk4 webkitgtk6.0
# Arch
sudo pacman -S gtk4 webkitgtk-6.0
tar xzf gtfs-planner_*_linux_amd64.tar.gz
./gtfs-plannerIf the window stays blank, see Blank or white window.
Download gtfs-planner_<version>_windows_amd64_installer.exe and run it.
The Windows build is not code-signed, so SmartScreen shows a "Windows protected your PC — unknown publisher" warning. Click More info → Run anyway to continue. The app is open source — if you prefer, you can build it yourself.
- Go 1.24+
- Node.js 18+
- Wails v3 CLI
- SQLite3
- Linux only:
libgtk-4-devandlibwebkitgtk-6.0-dev(or your distro's equivalent)
Install the Wails CLI:
go install github.com/wailsapp/wails/v3/cmd/wails3@v3.0.0git clone <repository-url>
cd gtfs-planner# Install Go dependencies
go mod download
# Install frontend dependencies
cd frontend && npm install && cd ..Development mode:
wails3 devThis starts the Go backend with hot reload and the Vite dev server with HMR for the frontend.
Build for production:
wails3 build # executable in bin/
wails3 package # platform package: .app (macOS), NSIS installer (Windows)- Browse the Map - Pan and zoom to find stations (stations appear at zoom level 8+)
- Select a Station - Click a station marker or use the search box
- View Departures - Upcoming trips appear in the sidebar
- Plan a Journey - Click a trip to see details, then "board" to add to your journey
- Continue Planning - After boarding, the app advances to your arrival time + 5 minutes
GTFS data management is built into the app — there is no separate CLI or config file, and no Node.js is required for the import (it is a native Go importer).
When the database is missing or its schedule data has expired, the app opens a setup dialog with two options:
- Download from gtfs.de — fetches the free German feed from an (editable) URL and imports it.
- Open a local GTFS zip — imports a zip you already have, e.g. the registration-gated opendata-ÖPNV / DELFI feed. DELFI's detailed station hierarchy (platforms, track numbers) is normalized so it behaves like the gtfs.de model.
The first national import takes a few minutes and produces a multi-GB SQLite database. You can see the database location and size — and delete it — under Settings.
The database (gtfs.sqlite) and the downloaded feed live in a platform-specific
data directory:
- Linux:
$XDG_DATA_HOME/gtfs-planner(or~/.local/share/gtfs-planner) - macOS:
~/Library/Application Support/gtfs-planner - Windows:
%LocalAppData%\gtfs-planner
On some setups — notably NVIDIA drivers and certain Mesa/WebKitGTK combinations — the window stays blank because of WebKitGTK's DMABUF renderer. Launch with it disabled:
WEBKIT_DISABLE_DMABUF_RENDERER=1 ./gtfs-plannerTo make it permanent, set the variable in a wrapper script or in the Exec= line
of a .desktop entry. For stubborn cases, WEBKIT_DISABLE_COMPOSITING_MODE=1 is
an additional fallback.
For information about the project structure, architecture, and development guidelines, see DEVELOPMENT.md.
This project is licensed under the MIT License - see the LICENSE file for details.
Klaus Zanders
