Talking to drones without the internet

Two questions landed on me this week, back to back: how does a ground control station work with no internet, and how does it talk to a real drone? They sound like the same question. Hindi pala (turns out they're not) — and untangling them is the whole design.

"How is this supposed to work with no internet?"
"But then how does it talk back and forth to a real device?"

They sound like one question. They're actually opposite ends of the design, and the most important thing I can say is: air-gap means no internet — it does not mean no communication. A field laptop with no signal still flies its drones. Yan mismo yung buong punto (that's the entire point) of building it this way.

Two channels, and neither is the internet

There are two completely separate channels in this system. People collapse them into one ("the network") and then the air-gap claim sounds impossible.

   INTERNET  ✗ ───────  [ operator laptop ]  ─────────────────┐
   (never required)        │                                   │
          channel A: MAP   │                  channel B: DEVICE LINK
          (local file)     ▼                  (local radio / serial / Wi-Fi)
                    basemap.pmtiles      UDP · serial · RF · mesh · SATCOM → the asset

Channel A is the map. Tiles come from a single file that ships in the bundle, not from a tile server. You build or download that file once, with internet, commit it, and from then on the map renders offline forever. Build-time touches the network; runtime never does.

Channel B is the device link. This is the one people don't expect to exist on an "air-gapped" box. It's a local bearer — a point-to-point radio, a serial cable, a Wi-Fi access point the drone itself broadcasts, a mesh, a satellite modem. None of those is the public internet. A SiK radio on 915 MHz doesn't route through Cloudflare.

So: no internet, full comms. Hindi sila magkalaban (the two aren't in tension) once you stop treating them as the same wire.

The device bearers

Every supported asset talks over something local:

AssetBearerTransport
Micro-UAS (Tello)the drone's own Wi-Fi APUDP text protocol
PX4 / ArduPilotSiK/RF radio, or a tactical LANserial, or UDP
STANAG 4586 UAVmilitary datalinkLAN / serial
Swarmmesh radio(planned MeshLink)
Long rangeSATCOMits own bearer

Notice there's no row that says "the cloud."

The implementation detail is behind the wall

The concept above is open. Where this lives in the code, the clean-room Tello adapter, and the device-swap mechanics need a password — same one as the other GCS posts, or request access below.

The shape of the answer to both questions turns out to be the same: draw the seam in the right place, and keep the internet out of the parts that don't need it. The map reads a local file. The drone talks over a local radio. Neither one calls home. And when the next device shows up, it plugs into the same hole the last one did.

Build log entry. Apache-2.0. The air-gap + comms design is written up in docs/architecture/04-air-gap-and-comms.md.