Aether: Flight Sharing on the Mesh
This one is for the aviation enthusiasts. Aether is a flight sharing feature: Meshtastic ground stations can report which aircraft they are receiving and share that data to a global leaderboard.
The concept
Some Meshtastic users run ground stations that receive ADS-B signals from aircraft. They already see planes on their local setup. Aether lets them share that reception data with the mesh community.
Schedule a flight you are tracking, associate it with a ground station node, and Aether records the reception. The leaderboard shows which ground stations have the best coverage, the most unique flights tracked, and the longest reception distances.
The API
Same pattern as Sigil: Express server on Railway, SQLite storage, REST API.
POST /api/flights— submit a flight recordGET /api/flights— list recent flightsGET /api/flights/:id— single flight detailGET /api/leaderboard— ranked ground stations
The Flutter app integrates with OpenSky Network to validate flight numbers. When you enter a flight number, the app checks if it is a real active flight and auto-populates departure, arrival, and aircraft type. This prevents garbage data in the leaderboard.
Naming
This feature was originally called “Sky Scanner.” We renamed it to “Aether” for branding consistency. The rename touched about 30 files — providers, screens, models, tests. Worth it. “Sky Scanner” sounds like a weather app. “Aether” sounds like a mesh-native feature.
Also renamed “Presence Feed” to “Signals” in the same pass. The word “presence” was overloaded — it meant both the always-on presence broadcasts and the timeline of signal posts. Now “Presence” is the always-on heartbeat, and “Signals” are the ephemeral broadcast posts. Clearer.
Leaderboard
The leaderboard uses the API as primary source with Firestore as fallback. If the API is down, the app falls back to Firestore. If Firestore is also unavailable (offline mode), it shows cached data. Three-tier resilience for what is essentially a fun scoreboard.
The web portal at aether.socialmesh.app renders the same data in a browser. Same pattern as Sigil: static HTML on Firebase Hosting, client-side fetch to the API.
Infrastructure count
With Aether, the backend count is now:
- map.socialmesh.app — World Mesh (mesh-observer, MQTT)
- sigil.socialmesh.app — Sigil API (node identity cards)
- aether.socialmesh.app — Aether API (flight sharing)
- api.socialmesh.app — API Gateway (unified entry point)
- socialmesh.app — Landing page, docs, legal (Firebase Hosting)
Five subdomains. All serving JSON except the Firebase Hosting site. All running on Railway except the static site. The guiding principle: subdomains are products, not services.