An air-&-space situational-awareness dashboard for a $10 touchscreen — the sky, on your desk, updating in real time.
Overhead turns a cheap ESP32 "Cheap Yellow Display" (CYD) into a glanceable observation deck for everything happening above you — right now, from where you are. Satellites passing overhead, rockets about to launch, aircraft on approach, aviation and space weather, the solar system, a live all-sky star map, and a "tonight at a glance" agenda — all on a $10–15 touchscreen you can leave on a shelf.
It knows your location and the time, and an Intelligent Focus director quietly surfaces the one thing worth looking at across all of those tabs: an ISS pass in four minutes, a launch window opening, a geomagnetic storm, a thunderstorm rolling in.
Beyond being the best little air-&-space desk clock, Overhead exists to inspire kids. It puts the awe of far-away missions on a child's bedside table and makes it real: space stops being abstract and becomes "look — the ISS goes over our house in four minutes," "that rocket launches tonight," "this is the exact sky from the night you were born." A glowing window to the cosmos, always on, always current.
Most CYD projects do one thing — a weather screen, a clock, a single gauge. Overhead is a modular multi-page application framework:
- A page carousel + a provider / scheduler / event-bus core + a cross-tab director — not a single screen, but a whole dashboard you can extend.
- Engineered to run real HTTPS data feeds on a no-PSRAM device — the hard part most projects avoid. A serialized non-blocking network task, heap-floor-aware TLS (serve stale instead of crash), stale-data resilience, and a WiFi watchdog.
- A full remote debug / automation API: a
/remotebrowser page that mirrors the live screen with click-to-tap and swipe, plus/api/screen.jpg,/api/tap,/api/swipe,/api/status, OTA — almost no hobby firmware ships this.
Versus the alternatives: phone apps (Heavens-Above, SkySafari) and desktop orreries are great but they're not always-on, glanceable, and sitting on your shelf. Generic CYD weather stations are single-purpose. Overhead is always-on, location-aware, multi-domain, on dedicated cheap hardware.
Honest scope: the astronomy is "good enough for a glanceable dashboard," not an observatory ephemeris (low-precision Schlyter orbits, ~arcminute). It's a window to wonder, not a telescope mount controller (though it could drive one — see the backlog).
No toolchain, no IDE, no clone — desktop Chrome or Edge, plug in the board over USB, pick your CYD variant, and click Install (~1 minute). Then join the Overhead-setup Wi-Fi to enter your network.
Eight tabs — swipe left/right between them. Most pages cycle sub-views on a centre tap; up/down swipe scrolls a list or steps sub-views; side taps step items (a satellite, an aircraft, a launch). Tap the page title for a views menu that lists the current page's sub-views by name so you can jump straight to one. Tap the status strip to toggle AUTO / MANUAL (and tap a Director alert banner to jump to the page it's about); long-press to pin.
![]() |
| Trends — 24 h area sparklines for temp / dewpoint / cloud / pressure with a plain-language conclusion ("pressure steady", "+ fog/low-cld risk", "clearing"). |
(The old standalone synoptic "Pressure" view is now folded into the Map above — pressure is the dot colour at every zoom, with inHg as one of its layers.)
Two more views appear only when there's data: a TAF view (decoded FM/BECMG/TEMPO/PROB periods) when a field carries one, and a Hazards view (AIRMET/SIGMET/PIREP in plain language) when an advisory is nearby. When there isn't, they drop out of the carousel — and a hazard or newly-forecast extreme weather (thunderstorms, hail, heavy precip, strong wind) is surfaced cross-tab as a notice instead (see the Director).
![]() |
| Orbits — a top-down orrery at live heliocentric longitudes (√-scaled rings so Mercury isn't crushed by Pluto), with minor bodies/Starman, and each body's orbital speed around the Sun in km/h and mph. |
![]() |
| Moon — phase + illumination %, distance, and near/far-side maps with Apollo crewed, robotic, and 2024+ CLPS landing sites, plus the sub-Earth/sub-solar points. |
![]() |
| Mars — distance + light-time, a surface map with polar caps and Olympus/Marineris, the sub-Earth circle, and rover sols (Perseverance/Curiosity) with status. |
![]() |
| Jupiter — the four Galilean moons strung along the equator in Jupiter-radii, with the whole system tilted by the parallactic angle to match your sky ("field tilt N° for your sky"). |
![]() |
| Saturn — the disk + rings with the live opening angle ("rings 26° open, north face") and a Cassini-division hint, also tilted to your sky. |
![]() |
| Deep Space — Voyager 1/2 & New Horizons distances in AU + light-hours, plus in-flight missions (Psyche, Europa Clipper, JWST, Parker). |
![]() |
| Meteor showers — upcoming showers in date order with ZHR, days-to-peak, and a radiant-quality rating from your latitude (great/good/low/poor); active showers flagged "NOW". |
![]() |
| Tap to zoom — tap any region and it magnifies: fainter stars fade in and star + constellation names appear, with a centre az/el readout. |
These have no single tab — they're part of the whole experience.
![]() |
| 3×3 quick-jump grid — tap the page dots and every tile shows a live micro-status (next launch T-, ISS AOS, nearest METAR, Kp, constellations up…); tap a badged tile to land on its alert. |
![]() |
| Day / Night / Red dark-adapt themes — auto by sun altitude or forced from Health; the red palette preserves night vision at the eyepiece. (Shown here on a memory sky.) |
- Intelligent Focus director — the cross-tab brain. An ambient resting tab by day/night with a multi-page attract tour; interrupts that seize focus for an imminent pass ("ISS 45° in 3m · VIS") or launch ("Launch in 6m" — the Launches shot above); a plane passing overhead; and notice badges for Kp storms, aviation SPECIs, hazards, and extreme weather. In AUTO it switches the carousel (with a brief "▸ page" banner) and pre-focuses the exact item; in MANUAL it just badges the tab — and tapping the alert banner jumps to the page it's about. A new severe condition fires a one-shot cross-tab alert so a dangerous change gets noticed.
- Modes & status-strip chrome — AUTO / MANUAL / pinned. The right cluster is icons: WiFi signal bars (tap → Health), a mode glyph (play/pause/lock), and a location crosshair that opens an on-device saved-locations picker.
- Offline field mode — boot with no WiFi and tap past the captive portal to run on cached data (satellite passes, star map, orrery, agenda all work offline); the WiFi-down reboot watchdog is suppressed and the last-known location is reused.
- Provisioning — WiFiManager captive portal on first boot; IP geolocation; NTP/RTC. The portal also carries mirror screen + invert colours toggles, so a reflected-HUD mounting that's unreadable on the glass can be corrected from your phone before the device leaves setup. (The same two toggles live on the Health page and in the web Appearance settings; SPI panels apply them in hardware, the RGB CrowPanel in software at the framebuffer push.)
/remote— a live screen mirror in your browser with click-to-tap and swipe buttons. Control your desk clock from a laptop./— a tabbed settings app: Location (Leaflet map + address geocode + "My location" + saved locations), Focus (per-page day/night tour checkboxes), Satellites & Bodies pickers, Memory Skies (map picker), Appearance, Aircraft, System./update— ElegantOTA firmware upload./api/status— JSON health/telemetry.- Helper scripts:
scripts/ota.ps1(flash over WiFi) andscripts/shot.ps1(screenshot).
This is the real engineering story (and a genuine differentiator): a single serialized
non-blocking network task so only one TLS session ever exists; heap-floor-aware TLS
that serves stale data instead of running out of memory and crashing; stale-data release
to keep the heap clear; a WiFi watchdog that reconnects and, if needed, reboots; and
live memory-pressure telemetry (heapBlkMin, httpsSkip) you can watch in /api/status.
It runs on a $10–15 ESP32 "Cheap Yellow Display." The full bill of materials, toolchain setup, first flash, WiFi provisioning, OTA, and board-specific quirks live in HARDWARE_SETUP.md.
Open the web flasher in desktop Chrome
or Edge, plug the CYD in over USB, and click Install — it flashes over Web Serial
in about a minute, then you join the Overhead-setup WiFi to provision. (Source for the
page: docs/index.html.)
Install PlatformIO, git clone, build the cyd28_ili9341 env, flash over USB once, then
join the Overhead-setup WiFi to provision. After that, OTA from your desk.
An optional alt/az pointer (rotor/) physically tracks whatever the dashboard is
following. Overhead broadcasts az/el over ESP‑NOW and the rotor homes itself and follows. It's a
separate ESP32 firmware — one build that drives 28BYJ‑48/ULN2003 or NEMA 17 + STEP/DIR motors,
with the motor type, pins, and switches all configured in a browser after flashing.
- The wire format is shared in one place —
shared/telemetry.h, included by both sides so it can't drift. - Self‑measuring calibration replaces entering a gear ratio by hand:
CAL EL(against gravity),CAL AZ(a full switch‑to‑switch turn),SETNORTH— persisted to NVS. - Flash + configure from the browser: install once from the
web flasher, then the rotor hosts a
Rotor-setupWi‑Fi AP where you set motors, pins, switches, channel, and run calibration.
Build, flash, and calibration steps: rotor/README.md. (The Overhead sender
side that broadcasts the packet is deferred — see spec §10.)
Overcome (details in CYD-ESP32-2432S028R.md and PIO_DEBUG.md):
- Running real HTTPS feeds on a no-PSRAM board — the ~42 KB contiguous-TLS floor; a serialized non-blocking net task; serve-stale-instead-of-OOM.
- The JPEG screenshot colour readback — empirically-derived byte-swap + hi5=B/mid6=R/lo5=G, written B,G,R for JPEGENC.
- Backlight via direct LEDC (LovyanGFX's
Light_PWMdidn't drive GPIO21). - Un-mirroring the panel (MV=0 rotation 6) and matching touch calibration.
- Anti-flicker without a framebuffer (
startWritebatching + redraw-on-change). - The stale-data starvation loop (retained data pinned the heap floor) and its fix.
- Observer-relative astronomy: parallactic-angle planet tilt, pass-trajectory arcs.
Still open / known limits — candid, because it builds trust:
- The TLS floor still starves fetches when
heapBlkMindips (can't shrink mbedtls buffers on the precompiled classic platform). The live ADS-B feed is the most affected — it clears and re-fetches contacts frequently, and the 16 KB screenshot buffer eats the headroom it needs, so a busy radar is hard to screenshot. Flash is ~99 % full on the classic env. - OTA flakes under AsyncTCP load (boot-settle ~20 s and retry); occasional WiFi drops (now watchdog-recovered).
- Schlyter astronomy is ~arcminute, not an ephemeris; data caps (TLE watchlist-only, aircraft 24, METAR 12); flicker on dense full-redraw pages.
A few of the juicier backlog items: az/el rotor output (drive a real or DIY antenna rotator) and an IMU handheld antenna-aim mode; externalising the orrery body list to LittleFS (comets, NEOs, dwarf planets); Saturn's moons; true WPC surface fronts (blocked on a data source); aircraft flight trails; rover/APOD imagery on PSRAM boards; on-device watchlist editing; banner + buzzer alerts; and verifying the 4" and ESP32-S3 hardware targets.
The complete, living list is in BACKLOG.md.
Active, single-developer project; the 2.8" CYD (cyd28_ili9341) is the verified target.
License: PolyForm Noncommercial 1.0.0. Free for personal, hobby, educational and research use — clone it, build it, run it, modify and share it. Any commercial use or reselling — of this or derivatives — needs written permission. See LICENSE.
Built on excellent open-source libraries, each under its own license: LovyanGFX, ArduinoJson, Hopperpop SGP4, JPEGENC (bitbank2), ElegantOTA, ESPAsyncWebServer / AsyncTCP, WiFiManager. Data from NOAA SWPC & the Aviation Weather Center, Open-Meteo, ip-api, Launch Library 2, CelesTrak, the HYG database, d3-celestial, and Natural Earth.
Contributors: @dustinsterk — brought up the CrowPanel 7.0 classic on real hardware (his field reports found and pinned four firmware bugs, two of them latent on every board) and contributed the busy-airspace memory fix (streaming ADS-B parse + NetTask watchdog handling, PR #1).
73 de KE7AQA.




























