Turn a freshly-flashed Raspberry Pi OS card into the Skylight appliance. Tested on a Raspberry Pi 5 with Raspberry Pi OS Bookworm (64-bit, Desktop).
64-bit OS required. Node.js has no 32-bit ARM builds, so the installer refuses to run on 32-bit images. All supported Pis (3/4/5, Zero 2 W) run the 64-bit OS.
No radio? Skip the decoder bits and run against the free public API: after install, set
Environment=DATA_SOURCE=apiin/etc/systemd/system/skylight-server.serviceandsudo systemctl daemon-reload && sudo systemctl restart skylight-server. Already feeding PiAware/FR24 from another box? KeepDATA_SOURCE=radioand point the Radio URL in/control→ Source at that feed'saircraft.json.
Flash Raspberry Pi OS (Desktop) to the card. With the card's boot partition mounted
(e.g. at /mnt/sdboot):
sudo BOOT_MNT=/mnt/sdboot \
HOSTNAME_PI=skylight \
WIFI_SSID="YourWiFi" WIFI_PSK="YourPassword" WIFI_COUNTRY=US \
PUBKEY="$(cat ~/.ssh/id_ed25519.pub)" \
./provision-sd.shThis writes custom.toml (processed on first boot) + an ssh flag file, and prints a
random console/sudo password - save it. SSH is key-only by default (use a
passphrase-less key, or load yours into an agent, so unattended rsync/deploy works).
Eject, boot the Pi, wait ~60–90 s, then:
ssh pi@skylight.local # or ssh pi@<pi-ip>Tip: if your only key is passphrase-protected, either generate a dedicated passphrase-less deploy key and authorize it, or set
password_authentication = truefor first setup. Local-network convenience vs. security is your call.
Copy the repo to the Pi and run the installer:
git clone https://github.com/cpaczek/skylight.git ~/skylight # or rsync it over
cd ~/skylight
LAT=37.6213 LON=-122.379 ./pi-setup/install-on-pi.sh # set your coordinatesInstalls the rtl-sdr-blog V4 driver (+ DVB-T blacklist), dump1090-fa, Node + pnpm,
builds the app, and enables the skylight-server service. Verify decode first with
rtl_test -t and curl -s localhost:8080/data/aircraft.json | head before moving on.
./pi-setup/setup-kiosk.sh
sudo rebootChromium opens full-screen on the display page at boot (via Xwayland - the native Wayland GPU path crashes on the Pi 5), cursor hidden, screen blanking off.
No HDMI signal? The Pi 5 turns HDMI off when nothing is connected at boot and doesn't always re-detect on hotplug. Force it on by appending to
/boot/firmware/cmdline.txt:video=HDMI-A-1:1920x1080@60D(and-A-2for the far port), then reboot. Connect the projector to the port nearest the USB-C power.
From your phone open http://skylight.local:3000/control and tune rotation + mirror
against a real overhead pass until the ceiling tracks the sky (it's a calibration, not a
formula - you're projecting up and looking up).
From your dev machine, after editing code:
PI_HOST=skylight.local ./scripts/deploy-to-pi.sh(rsyncs the source, rebuilds on the Pi, restarts the server, and reloads the kiosk.)
| File | Runs on | Purpose |
|---|---|---|
provision-sd.sh |
your PC | headless WiFi + SSH onto the SD boot partition |
install-on-pi.sh |
the Pi | driver + decoder + Node + app + server service |
skylight-server.service |
the Pi | systemd unit template for the server |
setup-kiosk.sh |
the Pi | Chromium kiosk autostart + no-blanking |