Under active development. Breaking changes expected. APIs, installers, and UI may shift between releases.
A screen and four buttons.
Every ground node ships with a 128 by 64 OLED and four tactile buttons. A bench engineer is fine with SSH. A field pilot is not. This is the field-ready surface.
Why
Because a laptop is not always there.
A headless box breaks the moment something goes wrong in a field. The OLED lets an operator see link quality, battery state, and current uplink at a glance. The buttons let them fix the common cases without sitting down.
Status Screens
Five screens. Auto-cycle every five seconds.
Short-press B1 or B2 to freeze on one screen. The OLED uses a 0.96 inch SSD1306 (or 1.3 inch SH1106) over I2C at address 0x3C.
Link
RSSI, bitrate, FEC repaired, FEC lost, channel
Drone
Device ID, flight mode, battery percent, GPS sat count
GCS
Connected client list, HDMI kiosk status, IP addresses
Net
AP SSID and IP, USB tether IP, current uplink and status
System
CPU, RAM, temp in C, uptime, agent version
Field Tap-to-Pair
The magic moment.
Two nodes, no laptop, under two minutes. This is the mesh-pairing flagship UX. The OLED and four buttons are the entire provisioning surface.
Receiver screen
┌──────────────────────┐ │ [receiver] │ │ │ │ Accepting relay │ │ 60s remaining │ │ │ │ Pending: 1 │ │ Accepted: 0 │ │ │ │ B1 accept B4 deny │ └──────────────────────┘
Relay screen
┌──────────────────────┐ │ [relay joining] │ │ │ │ Scanning for mesh.. │ │ │ │ Found: │ │ ados-gs-a4b2 -52 │ │ ados-gs-1f0c -78 │ │ │ │ B1 join B4 cancel │ └──────────────────────┘
On the receiver, long-press B3 to open the pairing window. On the incoming relay, enter Mesh and pick Join mesh. The relay listens for mDNS broadcasts on UDP 5801 over bat0, filters for receivers with an open window, and shows them with link quality. Tap B1 on the relay to request. The receiver shows the request, tap B1 to accept. Curve25519 ECDH runs, the receiver seals a ChaCha20-Poly1305 invite bundle, the relay decrypts, batman-adv comes up on bat0, and the mesh is live. Total wall clock target: under 120 seconds.
Burn-in Mitigation
OLEDs wear. The agent works around it.
Field units run for long sessions. The OLED driver rotates pixel state and dims the display to stretch life.
Auto-dim
Drops to 20 percent brightness after 60 seconds of no button activity.
Pixel invert
Flips every pixel every 10 minutes. Invisible during status cycling.
Screensaver
Bouncing ADOS logo after 5 minutes idle. Status returns on any button.
Graceful Degradation
Missing hardware is not an error.
If the OLED or the buttons are absent, the agent does not complain. Every menu function is also reachable from the setup webapp or the Mission Control Hardware tab.
No OLED
Status is served over HTTP at the setup webapp endpoint. Menu actions available in the Hardware tab. No boot error, no service crash.
No buttons
Status screens still cycle every 5 seconds. Menu entry disabled. Use the setup webapp, the ados gs CLI, or the Hardware tab to change config.
A screen and four buttons. Enough for the field.
Full screen reference, menu walkthrough, and button reassignment are in public docs.
Physical UI docs