Skylight — Project Real-Time Aircraft Overhead onto Your Ceiling with an RTL-SDR
Skylight — Project Real-Time Aircraft Overhead onto Your Ceiling with an RTL-SDR
Ever looked up at a jet passing overhead and wondered where it's headed? Skylight takes that curiosity and turns your ceiling into a real-time X-ray of the sky above you. Using a $30 RTL-SDR radio, it decodes ADS-B transponder signals from aircraft and renders them as luminous, type-aware glyphs on a projector pointed at your ceiling — with the real Sun, Moon, stars, and even the ISS drawn at their true positions for your location and time.
Created by Cameron Paczek and trending with over 2,300 GitHub stars since its June 2026 release, Skylight transforms a Raspberry Pi, an RTL-SDR, and a projector into a mesmerizing art-installation-meets-flight-tracker.
Why It's Trending
- Unique physical output — most flight trackers live on a phone screen. Skylight projects onto your ceiling, creating an ambient, always-on experience.
- RTL-SDR meets art — it's a perfect blend of radio hacking, real-time rendering, and interior design.
- Fully self-hosted — no cloud dependency for aircraft data when paired with your own ADS-B receiver.
- Optional camera tracker — add a PTZ camera and Skylight automatically films the planes it projects, with AI-powered tracking.
- Appliance-ready — runs as a boot-to-kiosk on Raspberry Pi 5 with zero maintenance.
Prerequisites
- Raspberry Pi 5 (8 GB) recommended (Pi 4 works for display-only; Pi 3B/Pi Zero 2 W for light setups)
- RTL-SDR Blog V4, V3, or V5 (or any compatible RTL-SDR with ADS-B capability)
- A 1080p projector pointed at the ceiling (a cheap $150 LED projector works great in a dim room)
- Optional: PTZ camera with VISCA-over-IP + RTSP for the auto-filming tracker
- Node.js 20+ / pnpm (for local development testing)
- An SD card with Raspberry Pi OS (Bookworm, 64-bit)
Architecture
Skylight follows a modular, streaming architecture with four main layers:
- ADS-B Reception — An RTL-SDR radio captures 1090 MHz ADS-B signals from aircraft.
dump1090-fadecodes these into structured JSON with position, altitude, heading, speed, and callsign. - Server Layer — A Node.js (Express + WebSocket) server polls the ADS-B feed at ~1 Hz, enriches aircraft data with airline, type, and route information from
adsbdb, and proxies satellite TLEs from Celestrak. All state is broadcast over WebSocket. - Display Layer — A Vite + React app renders four views: the main ceiling canvas (2D canvas renderer with celestial engine), a mobile control panel, a TV dashboard, and a tracker debug UI. The display interpolates ~1 Hz fixes to 60 fps for silky-smooth aircraft motion.
- Optional Camera Tracker — A separate process on port 3001 handles target selection, lead prediction (ECEF), velocity pursuit, and vision-based plane detection (blob detector + YOLOX-Nano ONNX). It drives a VISCA-over-IP PTZ camera and serves an H.264 WebSocket feed.
Quick Start (No Radio Required)
You can try Skylight right now on your laptop using a free public ADS-B API:
# Clone the repo
git clone https://github.com/cpaczek/skylight.git
cd skylight
# Install dependencies
pnpm install
# Run against the free airplanes.live API
DATA_SOURCE=api pnpm dev
Open http://localhost:5173/ to see simulated aircraft overhead. The control panel at http://localhost:5173/control.html lets you tweak every setting from your phone.
With a Local Radio
# Install the RTL-SDR driver
sudo apt install rtl-sdr # Debian/Ubuntu
# Or use the provided script:
bash scripts/install-rtlsdr-fedora.sh
# Start the ADS-B decoder
bash scripts/run-dump1090-local.sh
# Launch Skylight
DATA_SOURCE=radio pnpm dev
Raspberry Pi Appliance Setup
For a permanent installation, turn your Pi into a dedicated Skylight appliance:
1. Provision the SD Card
Flash Raspberry Pi OS (Desktop, 64-bit) to an SD card, then run the provisioning script:
sudo BOOT_MNT=/mnt/sdboot \
HOSTNAME_PI=skylight \
WIFI_SSID="YourWiFi" WIFI_PSK="YourPassword" WIFI_COUNTRY=US \
PUBKEY="$(cat ~/.ssh/id_ed25519.pub)" \
./pi-setup/provision-sd.sh
2. Install the Appliance
Boot the Pi, SSH in, then:
git clone https://github.com/cpaczek/skylight.git ~/skylight
cd ~/skylight
LAT=37.6213 LON=-122.379 ./pi-setup/install-on-pi.sh
This installs the RTL-SDR driver, dump1090-fa, Node.js, pnpm, builds the app, and installs the systemd service.
3. Set Up the Kiosk Display
./pi-setup/setup-kiosk.sh
sudo reboot
The Pi boots to a full-screen Chromium kiosk showing the display view.
4. Calibrate
From your phone, open http://skylight.local:3000/control and tune rotation and mirror settings against a real overhead pass.
Docker Deployment
For server-driven setups (no Pi at the projector), use Docker Compose:
version: "3.8"
services:
skylight:
image: cpaczek/skylight:latest
build: .
ports:
- "3000:3000"
environment:
- DATA_SOURCE=api
- PORT=3000
volumes:
- skylight-data:/app/server/data
restart: unless-stopped
volumes:
skylight-data:
docker compose up -d --build
# Open http://<host>:3000/ for the display
# Open http://<host>:3000/control from your phone
To use your own ADS-B receiver, set DATA_SOURCE=radio and point AIRCRAFT_JSON_URL at your dump1090 feed.
Configuration
Skylight's config is defined in shared/src/config.ts and is live-editable from the control panel:
| Setting | Description |
|---|---|
centerLat / centerLon |
Your location — where you're looking up from |
radiusMiles |
How far out to show aircraft (default: 3 miles) |
rotationDeg / mirrorX |
Projector calibration for the looking-up flip |
theme |
Visual theme: ambient, telemetry, or focus |
showStars / showSun / showMoon / showSatellites |
Sky layer toggles |
showDestArc / showRouteDetail |
Window-to-elsewhere details |
tracker.* |
Camera tracker subsystem (all live-tunable) |
Verification Checklist
DATA_SOURCE=api pnpm devstarts and renders aircraft onlocalhost:5173- Control panel at
/control.htmlis accessible from your phone on the same LAN - RTL-SDR is detected:
rtl_test -tshows no errors dump1090-faserves aircraft data:curl localhost:8080/aircraft.jsonreturns JSON- Projector displays smoothly at 60 fps with comet trails
- Phone controls persist settings across server restarts
- Stars, Moon, and Sun render at their correct positions
Resources
- GitHub: github.com/cpaczek/skylight
- Website: skylightceiling.com
- ADS-B decoder: dump1090-fa
- RTL-SDR drivers: rtl-sdr-blog
- Route enrichment: adsbdb
- Satellite elements: Celestrak
- Projector recommendations: Check ProjectorCentral for dim-room LED projectors