Been building this in the open for a while but never actually posted about it anywhere, so here goes.
It started because the laptop was the weakest part of my field setup. The ground station dies when the lid closes, VNC-ing into a Pi running QGC over LTE is misery, and I wanted to check on the bird from my phone without a whole ritual. So I flipped it. The ground station lives on the drone. A Pi rides on the frame, talks to the flight controller over USB, and serves a web app. Any browser works. Phone in the field, desktop at home. With a 4G modem and a public IP SIM the aircraft carries its own GCS, and the link doesn't care where I am or whether my laptop is awake.
Setup on a fresh Pi is one line (docker compose underneath):
curl -s https://raw.githubusercontent.com/judahpaul16/canarygc/main/contrib/setup.sh | bash -s --
It speaks MAVLink to ArduPilot and PX4, and MSP to Betaflight and INAV (telemetry, calibration, flashing, and INAV flies native missions over MSP). The mission planner has 2D and 3D maps, the usual pattern generators (survey, orbit, corridor, expanding square, structure scan), and imports QGC .plan, Mission Planner .waypoints, KML/KMZ, and CSV. Plans are stored autopilot-neutral and get normalized to whatever's actually connected when you upload.
Most of my time lately has gone into the airspace side. Both maps draw restricted and controlled airspace (OpenAIP worldwide, FAA keyless layers in the US), the LAANC ceiling grid, the FAA obstacle database, and live ADS-B traffic. There's a one-click path optimizer that lifts legs over buildings and towers when the ceiling allows and routes around restricted airspace when it doesn't. Before launch, every leg gets checked against the geofence, altitude limits, and the fetched airspace.
Beyond that there's a full parameter editor, six-position accel / compass / gyro / ESC calibration that adapts to whichever autopilot is connected, a firmware tab that flashes all four stacks, gamepad flight, a color-coded event log with a raw MAVLink console, email alerts on failsafe / low battery / link loss, and a WebRTC camera feed. There's also an optional AI PID tuning assistant that talks to any OpenAI-compatible endpoint (a local Ollama works). Ignore it if that's not your thing.
And yes, I know how "GCS on the public internet" sounds. The link supports MAVLink 2 signing (signs outbound, verifies inbound, strict mode drops unsigned traffic), the app sits behind session auth with a single operator account, and login is rate limited. If your threat model is serious, put it behind a VPN anyway. But with signing on, a publicly reachable link only takes commands from whoever holds the key.
Fair warning that it's still early days. It flies constantly in SITL (the compose file ships SITL profiles for all four firmwares, including little flight-dynamics sims so the Betaflight and INAV binaries actually get off the ground), and the reference build is a Pi 4B on a Holybro S500 V2. It's not trying to be Mission Planner's whole toolbox. It's a different operational story for remote, LTE-connected flying.
It's called Canary Ground Control. MIT licensed.
Repo: https://github.com/judahpaul16/canarygc
Build guide and docs: https://github.com/judahpaul16/canarygc/wiki
If you fly companion computer setups over LTE I especially want to hear from you. What would it take before you'd trust something like this on a real aircraft?