Command autonomous platforms from one map.
Argus is a command-and-control console for Autonomous Collaborative Platforms. It draws the tactical picture with a custom Qt Quick renderer, speaks UCI to the A-GRA LA-CAL, and runs the same code on the desktop, on Android, and in the browser.
- Standard
- A-GRA / UCI
- Projection
- EPSG:3395
- Stack
- C++23 · Qt 6 · QML
- Targets
- Windows · Linux · Web · Android
Panning the world, switching basemaps, and zooming in. Recorded from an early build.
Built for the picture, not the brochure.
Every part of Argus exists to keep the map correct and responsive while platforms report in. Here is what that amounts to today.
The map
- Custom scene graph renderer
Built directly on the Qt Quick scene graph, not QtLocation. A whole world of borders draws in two draw calls; pan and zoom touch only a transform matrix.
- Ellipsoidal Mercator
EPSG:3395 through PROJ, behind a pluggable projection interface. Positions are stored geographically and distances are measured geodesically.
- Vector ground and satellite imagery
Country polygons filled as vectors stay sharp at any zoom; a pre-baked satellite basemap sits beside them. Country and state borders overlay either.
- Airgapped by design
No tile server, no runtime reprojection. Map data is prepared offline and compiled into the binary, so the same build runs disconnected.
- Never shows beyond the map
The viewport clamps the visible rectangle to the world bounds through every pan, zoom, and resize. Empty margin is a bug, not a feature.
The picture
- Identity-driven symbology
Shape from what a contact is, color from whose it is. Affiliation, environment, platform, and specific type resolve through declared rules; the first match wins.
- Symbols declared in QML
Airframe silhouettes and abstract frames are vector contours in QML, rasterized once into a texture atlas. One quad per item, per frame.
- Adornments and animations
Velocity vectors, emitter dishes, selection borders, and a slow pulse on stale tracks: baked into the atlas cell or streamed as geometry when they depend on live data.
- Ownship, own systems, and the picture
Three models, three layers, one camera. Ownship and friendly platforms draw in their own palette; the fused track picture in affiliation colors.
- Trails, range rings, off-screen cues
Breadcrumb trails along the recent path of each track, screen-fixed range rings labeled in current range, and edge markers for tracks outside the view.
- Track information and focus
A focused track is named, classified, and located in words beside the map; ownship reads out its own instruments.
The A-GRA link
- UCI over OWP
A WebSocket session to the LA-CAL broker speaking OWP, with every message wrapped in a UCI DataPayload envelope both ways.
- Route once, adapt by state
One router demultiplexes inbound messages by type into feeds that own their state: ownship from Detailed reports, platforms from position reports and system status.
- Templates, not generated types
Outbound messages are built from interaction templates checked against the UCI schema, so the supported set is enumerable in one place.
- DCS World bridge
A pure-Lua export bridge publishes a DCS mission as UCI messages through the same broker, so Argus sees a live fight without knowing it is simulated.
Runs everywhere
- Windows, Linux, Web, Android
One C++23 and QML codebase. The WebAssembly build is thread-enabled and runs in any browser that supports cross-origin isolation.
- Reproducible builds
Every dependency, Qt included, comes through a vcpkg manifest with per-target triplets. CMake presets are the only supported way to configure.
- Continuous delivery
Each merge request gets a preview site; merges to develop publish dev builds; merges to main cut a versioned release with web and Windows packages.
The map, at every scale.
Stills from the application. The same build produced all of them; only the camera and the basemap changed.






A C2 node on the bus.
Argus never talks to a platform directly. It publishes and subscribes through the LA-CAL broker, wrapped in UCI DataPayloads, like every other participant.
- OWP session over WebSocket
- DataPayload codec and router
- Feeds write the models
- Layers draw the models
- Language-agnostic CAL
- Topic routing
- Services: argus-c2, naive-dms, dcs-bridge
- Mission Autonomy on each ACP
- or the DCS World bridge
- MA_PositionReport, SystemStatus, MA_PositionReportDetailed
Static ground
GeoJSON and imagery are parsed, projected, and triangulated on a worker thread, once. The result is packed into a handful of vertex buffers. Pan and zoom change only the transform matrix; hundreds of thousands of vertices are never touched again.
Moving items
Symbols bake once into a texture atlas. Every frame, each visible item becomes one quad, and adornments that depend on live data stream as geometry beside it. A constant pixel size cannot live under a world transform, so this path rebuilds per frame and moves the work off it instead.
Built, and designed.
Argus is under active development. The architecture is recorded in decision records before code lands, so the designed column is a plan, not a wish list.
Built
- Projection, GeoJSON loading and tessellation, camera with clamping
- Vector ground, satellite imagery, country and state borders
- Track, ownship, own-systems and waypoint models
- Symbols declared in QML, the symbol atlas, baked and streamed adornments
- Track trails, range rings, off-screen track markers, focus and info block
- OWP session to the LA-CAL, DataPayload codec, message router
- Ownship and own-systems feeds from MA_PositionReportDetailed, MA_PositionReport and SystemStatus
- DCS World bridge exporting ownship and friendly platforms
Designed, not yet built
- Flight commands with the full accept, reject, and counter-proposal lifecycle
- Return to base by mission plan activation
- Task-level commands, CAP first
- Approval requests and contingency alerts
- Selection and lasso, runtime filtering
- Tiled satellite basemap and a 2.5D view over the same models
Message-by-message status is on the message support page.
Try it in the browser.
The web build is the full application compiled to WebAssembly. It needs a current desktop browser and about fifteen megabytes on first load.
Open app.argus-hmi.com