A touchscreen dashboard for N.I.N.A. astrophotography software, built for the Waveshare ESP32-P4-WIFI6-Touch-LCD-4B (720x720). It polls the ninaAPI Advanced plugin over HTTP and WebSocket to show real-time session data: exposure arcs, guiding RMS, filter status, sequence progress, power draw, and more. Monitor up to three separate N.I.N.A. instances from one device. Beyond NINA it also runs a Spotify Now Playing screen, AllSky environmental panel, clock with weather and 3D moon phase, and GOES/solar imagery.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|
![]() |
![]() |
| With controls | Controls hidden |
![]() |
| Clock face with weather data and forecast bars |
Real-time 3D rendered Moon with accurate phase, libration, and sub-solar lighting. Optional glow halo and starfield background.
![]() |
![]() |
| Default | Glow halo |
![]() |
![]() |
| Starfield background | Glow and starfield |
Every setting is managed from the on-device web UI, organized into tabs.
- Waveshare ESP32-P4-WIFI6-Touch-LCD-4B — currently the only tested board. The layout is tuned for its 720x720 display.
- 3D Printed Stand (optional) — a printable stand for the display, designed by @chicago925 (#116).
- 3D Printed Mount (optional) — a printable desk mount for the display, designed by the project author.
- N.I.N.A. Nighttime Imaging 'N' Astronomy
- ninaAPI Advanced plugin by Christian Palm — install it from N.I.N.A.'s plugin manager, then enable it. Required for operation.
Download the latest factory binary from the Releases page. No build environment is needed: use a Chromium-based browser and the ESP Web Flasher, then flash nina-display-factory.bin at address 0x0000. Each release includes step-by-step flashing instructions.
Note: If your board warns about outdated
esp-hostedco-processor firmware, flashnetwork_adapter.binat address0x0000to the ESP32-C6 coprocessor. A pre-built binary is in thefirmware/folder.
After the first flash, further updates can be delivered over the air from GitHub releases (System tab in the web UI).
On first boot (or whenever WiFi is not connected), the device broadcasts a WiFi access point named NINA-DISPLAY (password: 12345678). Connect to it from your phone or laptop and open http://192.168.4.1.
Set at minimum:
- WiFi credentials — your observatory/home network where NINA runs.
- NINA host(s) — the IP or hostname of each NINA PC (e.g.
192.168.1.50). The device builds the full API URL automatically. Up to three instances.
Save. The device reconnects to your network and starts polling immediately.
Once connected to your network, the config AP is disabled to reduce radio interference. If the WiFi connection drops, the AP reappears so you can reconfigure.
The web interface is protected by a session-cookie login (default password: changeme123!; there is no username). Change it on first boot: web UI, System tab, Admin Password section.
- Authentication is enabled by default and covers all configuration, reboot, factory reset, OTA, and secret-returning endpoints. Sessions expire after 12 hours.
- Transport is HTTP, not HTTPS. Treat your LAN segment as the trust boundary.
- Secrets (WiFi/MQTT passwords, Spotify client ID) are redacted as
********in API responses regardless of the auth setting. - Authentication can be disabled (System tab). When off, every endpoint is open to anyone on the LAN, including reboot, factory reset, and OTA. Use only on trusted networks.
The Summary page shows a card for each configured NINA instance: name, active filter, target, progress, RMS, HFR, and time to meridian flip. Tap a card to jump to that instance's full dashboard.
Each instance page is a 720x720 bento-box grid: header (target, profile, WiFi, connection dot), sequence, an animated exposure arc colored by the active filter, filter/timing, guiding RMS, image stats (HFR, star count), mount flip time, session time, and power (voltage, current, watts, dew-heater PWM). A pulsing header dot marks an active API request; grey means NINA is unreachable, and the page dims after prolonged stale data.
Every section on an instance page is tappable:
| Tap area | Opens |
|---|---|
| Header | Full-screen JPEG preview of the last captured image (tap to dismiss) |
| Sequence box | Sequence detail overlay (container, step, exposure counts) |
| Exposure arc | Camera & weather overlay (camera name, temperature, dew point, humidity, pressure) |
| Filter label (arc center) | Filter wheel overlay (current and available filters) |
| RMS box | RMS history graph (up to 500 points, RA/Dec/Total, threshold lines) |
| HFR box (short tap) | HFR history graph (up to 500 points, threshold lines) |
| HFR box (long press) | Autofocus overlay (V-curve, focus position) |
| Flip time box | Mount overlay (RA/Dec, altitude, azimuth, meridian flip state) |
| Session time box | Session statistics overlay (total exposures, imaging time, target altitude, dawn) |
| Stars box | Image statistics overlay (star count, HFR, FWHM, eccentricity, SNR) |
| Power row | Jump back to Summary page |
Swipe to the Settings page for on-device configuration in four tabs: Display (theme, brightness), Behavior (auto-rotate, sleep, timeouts), Nodes (NINA hosts), and System. The web UI exposes the full set of options. The System Info page reports IP, WiFi, CPU, memory, PSRAM, uptime, and task count.
Swipe left/right to cycle pages, or press the BOOT button (GPIO 35) to advance. Auto-cycle rotates through a selectable, reorderable list of pages on a configurable interval with fade, slide, or instant transitions, and can skip disconnected instances. The Home Page setting picks the page the display settles on; when it is a NINA instance, the display also returns there whenever that instance is online. Page-indicator dots at the bottom mark the NINA instance pages.
Add up to three NINA hosts. Only the active (visible) page gets full ~2-second polling; background instances get a slower heartbeat (default 30 s). When the Summary page is active, all instances are polled at full rate.
Nine built-in dark themes, selectable in the Display tab; changes apply instantly without a reboot. A color-brightness slider (0-100%) uniformly dims all theme colors for dark-site use. Filter colors are set per-instance as hex values, and new filters reported by NINA are added automatically with a default color. RMS and HFR threshold colors are configurable, so out-of-range values shift green to amber to red.
The display doubles as a full-screen Spotify Now Playing screen with album art, playback controls, progress bar, and scrolling track info. NINA and AllSky polling pause while the Spotify page is active to free bandwidth for album-art downloads.
Setup (Spotify tab in the web UI):
- Create a free app at developer.spotify.com.
- Set its redirect URI to
http://127.0.0.1:8000/callback. - Paste the Client ID into the Spotify tab and Save.
- Click Login with Spotify and approve access.
- Spotify redirects to a "can't connect" page: copy the full URL from the address bar and paste it into the Redirect URL field.
Point MQTT at your broker to publish the device's own state via Home Assistant auto-discovery: screen brightness and text brightness (dimmable light entities), a reboot button, and an uptime sensor. Home Assistant can then set brightness or reboot the device, for example dimming during a dark-site session. NINA session data is not published over MQTT.
- AllSky — a four-quadrant environmental panel (thermal, sky quality, ambient, power) fed from an AllSky API with configurable field mappings and thresholds.
- Weather — OpenWeatherMap, Open-Meteo, or Weather Underground data on the clock page.
- Image Display — full-screen GOES satellite, NASA SDO/SOHO solar imagery, or a custom image URL.
The device serves an HTTP API on port 80. A full, always-current reference for every endpoint (with copy-paste curl examples) lives in the web UI's API tab.
The /api/screenshot endpoint captures a live JPEG of the current display using the ESP32-P4's hardware JPEG encoder:
curl -o screenshot.jpg http://<device-ip>/api/screenshot







































