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 record
  • GET /api/flights — list recent flights
  • GET /api/flights/:id — single flight detail
  • GET /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:

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.