← Back to Home

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 Architecture

Skylight follows a modular, streaming architecture with four main layers:

  1. ADS-B Reception — An RTL-SDR radio captures 1090 MHz ADS-B signals from aircraft. dump1090-fa decodes these into structured JSON with position, altitude, heading, speed, and callsign.
  2. 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.
  3. 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.
  4. 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 dev starts and renders aircraft on localhost:5173
  • Control panel at /control.html is accessible from your phone on the same LAN
  • RTL-SDR is detected: rtl_test -t shows no errors
  • dump1090-fa serves aircraft data: curl localhost:8080/aircraft.json returns 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

← Retour à l'Accueil

Skylight — Projetez les Avions en Temps Réel au Plafond avec un RTL-SDR

Skylight — Projetez les Avions en Temps Réel au Plafond avec un RTL-SDR

Vous êtes-vous déjà demandé où allait cet avion qui passe au-dessus de votre tête ? Skylight transforme cette curiosité en une radiographie en temps réel du ciel au-dessus de vous. Grâce à un récepteur RTL-SDR à 30 €, il décode les signaux ADS-B des avions et les projette sous forme de glyphes lumineux sur un projecteur dirigé vers votre plafond — avec le Soleil, la Lune, les étoiles et même l'ISS positionnés avec précision selon votre lieu et votre heure.

Créé par Cameron Paczek et fort de plus de 2 300 étoiles GitHub depuis sa sortie en juin 2026, Skylight transforme un Raspberry Pi, un RTL-SDR et un projecteur en une installation artistique fascinante.

Pourquoi ça Cartonne

  • Support physique unique — la plupart des trackers de vol restent sur un écran de téléphone. Skylight projette sur votre plafond pour une expérience ambiante continue.
  • RTL-SDR rencontre l'art — un mélange parfait de radio logicielle, rendu temps réel et design d'intérieur.
  • Entièrement auto-hébergé — aucune dépendance cloud avec votre propre récepteur ADS-B.
  • Caméra optionnelle — ajoutez une caméra PTZ et Skylight filme automatiquement les avions projetés.
  • Prêt à l'emploi — démarre en mode kiosque sur Raspberry Pi 5 sans maintenance.

Prérequis

  • Raspberry Pi 5 (8 Go) recommandé (Pi 4 pour affichage seul ; Pi 3B / Pi Zero 2 W pour configurations légères)
  • RTL-SDR Blog V4, V3 ou V5 (ou tout RTL-SDR compatible ADS-B)
  • Un projecteur 1080p pointé vers le plafond (un projecteur LED à 150 € fait l'affaire dans une pièce sombre)
  • Optionnel : Caméra PTZ avec VISCA-over-IP + RTSP pour le suivi automatique
  • Node.js 20+ / pnpm (pour tester en local)
  • Une carte SD avec Raspberry Pi OS (Bookworm, 64-bit)

Architecture

Architecture Skylight

Skylight suit une architecture modulaire en flux continu avec quatre couches principales :

  1. Réception ADS-B — Un récepteur RTL-SDR capte les signaux ADS-B à 1090 MHz. dump1090-fa les décode en JSON structuré avec position, altitude, cap, vitesse et indicatif.
  2. Couche Serveur — Un serveur Node.js (Express + WebSocket) interroge le flux ADS-B à ~1 Hz, enrichit les données avec les compagnies, types et routes via adsbdb, et relaye les TLE satellites depuis Celestrak. Tout l'état est diffusé via WebSocket.
  3. Couche d'Affichage — Une application Vite + React génère quatre vues : le canvas plafond principal (moteur céleste), un panneau de contrôle mobile, un tableau de bord TV et une interface de débogage.
  4. Suivi Caméra Optionnel — Un processus séparé sur le port 3001 gère la sélection de cible, la prédiction de trajectoire (ECEF) et la détection visuelle (YOLOX-Nano ONNX).

Démarrage Rapide (Sans Radio)

Testez Skylight tout de suite sur votre ordinateur avec une API ADS-B gratuite :

git clone https://github.com/cpaczek/skylight.git
cd skylight
pnpm install
DATA_SOURCE=api pnpm dev

Ouvrez http://localhost:5173/ pour voir les avions. Le panneau de contrôle est sur http://localhost:5173/control.html.

Avec une Radio Locale

sudo apt install rtl-sdr    # Debian/Ubuntu
bash scripts/run-dump1090-local.sh
DATA_SOURCE=radio pnpm dev

Installation Raspberry Pi

1. Provisionner la Carte SD

sudo BOOT_MNT=/mnt/sdboot \
HOSTNAME_PI=skylight \
WIFI_SSID="VotreWiFi" WIFI_PSK="VotreMotDePasse" WIFI_COUNTRY=FR \
PUBKEY="$(cat ~/.ssh/id_ed25519.pub)" \
./pi-setup/provision-sd.sh

2. Installer l'Appliance

git clone https://github.com/cpaczek/skylight.git ~/skylight
cd ~/skylight
LAT=48.8566 LON=2.3522 ./pi-setup/install-on-pi.sh

3. Configurer le Mode Kiosque

./pi-setup/setup-kiosk.sh
sudo reboot

4. Calibrer

Depuis votre téléphone : http://skylight.local:3000/control

Déploiement Docker

version: "3.8"
services:
  skylight:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATA_SOURCE=api
    volumes:
      - skylight-data:/app/server/data
    restart: unless-stopped

volumes:
  skylight-data:
docker compose up -d --build

Ressources