Target: Raspberry Pi 3, 5" touchscreen, Debian 13 (arm64), running an X11 desktop session. The app is built natively on the Pi — cross-compiling Fyne (CGO + OpenGL) from the AMD64 dev box is far more error-prone than just compiling on-device.
# Build/runtime dependencies for Fyne (OpenGL + X11).
sudo apt update
sudo apt install -y gcc libgl1-mesa-dev xorg-dev
# Go: Debian 13 ships Go 1.24, but this project needs Go 1.25 (a dependency
# requires it). Two options:
# a) Do nothing — Go's GOTOOLCHAIN=auto (the default) downloads the 1.25
# toolchain automatically on first build (needs internet, ~150 MB once).
# b) Install Go 1.25 explicitly:
# curl -LO https://go.dev/dl/go1.25.0.linux-arm64.tar.gz
# sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.25.0.linux-arm64.tar.gz
# export PATH=$PATH:/usr/local/go/binCreate the API key file in the app directory (get a free key from https://511.org/open-data):
mkdir -p /home/pi/wheres-that-muni
printf '511ORG_API_KEY=YOUR-KEY-HERE\n' > /home/pi/wheres-that-muni/.envFrom the dev machine, sync the source and build it on the Pi:
make deploy # rsync source to the Pi and `go build` theremake deploy runs go build over SSH with GOTOOLCHAIN=auto so the right Go
toolchain is fetched if needed. Equivalent manual steps on the Pi:
cd /home/pi/wheres-that-muni
GOTOOLCHAIN=auto go build -o muni-display ./cmd/muni-displayThe app needs the graphical (X11) session — DISPLAY=:0 — not an SSH shell.
Launch it from the Pi's desktop, or test over SSH with:
DISPLAY=:0 ./muni-displayCopy the provided desktop entry into the user's autostart directory (edit the
Exec path if you cloned elsewhere):
mkdir -p ~/.config/autostart
cp deploy/muni-display.desktop ~/.config/autostart/On first launch the line → direction → stop picker appears; the selection is saved to
~/.config/wheres-that-muni/settings.json, and subsequent boots go straight to
the arrivals board. Touch the screen to reveal the Change Stop / Quit menu.