I’ve been building CanaryGC, a ground station with a different deployment model than Mission Planner or QGC. It runs on the companion computer (a Raspberry Pi in this case) alongside the autopilot and serves a web UI to any browser on the network. The companion talks MAVLink to the flight controller, so the “ground station” is any phone or laptop with a browser, including over a cellular link.
You might be wondering why one would want a GCS on the drone in the first place (See the repo README for a more detailed explanation). The TL;DR is basically user experience and control. Traditional GCS can be flaky over a VPN and specifically for missions that require extended range like EVLOS and BVLOS. In that case, if there were a network blip or a case of one LTE tower handing off to another, a link loss becomes a GCS failsafe event. With Canary the GCS is always connected to the flight controller so temporary blips don’t create a recovery event but instead represent a temporary loss of observability and because the GCS knows when an operator is connected, the operator can define the failsafe behavior in the event that the GCS loses a link to the operator for too long. And while serving a webpage from the drone is heavier compared to raw telemetry data, that is a cost that is really only paid with the first page load. After that, the page is cached in your browser then the only real network traffic is telemetry data.
On the ArduPilot side it auto-detects ArduPilot vs PX4 and encodes commands accordingly: arm/disarm, mode set, takeoff/land, RTL, GUIDED position nudges, mission upload, DO_SET_SERVO for a gripper/payload, and it writes the return parameters per airframe (RTL_ALT / ALT_HOLD_RTL, RTL_TYPE / RTL_AUTOLAND). Fixed-wing landing: if the plan has no Land item it synthesizes a DO_LAND_START approach placed clear of obstacles, terrain, and restricted airspace, uploads it, and flies it, otherwise it returns and loiters.
Before setting AUTO mode, a pre-flight pass validates the mission against geofence radius, min/max altitude, restricted airspace (hard block), controlled airspace (warn), LAANC ceilings, FAA obstacles, and buildings. Airspace comes from FAA (keyless, US), OpenAIP and Altitude Angel (keyed), plus just added keyless national drone-zone sources for Germany, Switzerland, and France.
There’s also a 3D map view with terrain and buidling heights, a one-click path optimizer that routes legs around hazards, survey, orbit, etc ,generators, QGC .plan and Mission Planner .waypoints import, gamepad MANUAL_CONTROL, ADS-B traffic, spoken callouts, SMTP alert emails, MAVLink signing. INAV flies native waypoint missions over MSP; Betaflight (no waypoint engine) flies by companion guidance from the station.
It runs in Docker on the companion. Repo and setup: GitHub - judahpaul16/canarygc: A web-based ground control station (GCS) for remote autopilot management via the MAVLink protocol. · GitHub . Feedback from this crowd is exactly what I’m after. Criticism welcome.


