中文 | English
Universal web-based ground control station for MAVLink drones.

Argus is a universal web GCS — one browser interface for MAVLink drones, on any platform (desktop, tablet, mobile), in 10 languages. No install, no native dependencies, just open a URL and fly.
Status: ArduPilot is production-tested today. PX4 has frontend adapter scaffolding in
src/lib/fc/and the backend readsHEARTBEAT.autopilot, but end-to-end wiring is incomplete — seeCLAUDE.md ## PX4 Status.
Why another GCS:
| Existing GCS | Limitation |
|---|---|
| QGroundControl | Native app, heavy install, no first-class web build |
| Mission Planner | Windows-only, legacy UI |
| Cloud platforms (FlytBase, ADOS) | Vendor lock-in, closed source |
Argus fills the gap: open-source + web-native + protocol-agnostic + white-label ready.
| Category | Features |
|---|---|
| Connections | TCP / UDP / Serial / WebSerial (browser-direct USB, no backend needed for telemetry + basic control) |
| Protocols | MAVLink v2 (ArduPilot production-tested; PX4 adapter scaffolded, unwired) |
| Vehicles | Copter, Plane, VTOL, Rover, Sub |
| Map | 8 tile sources (Amap, Google, OSM, Esri, CartoDB, Tianditu) + 3D terrain (MapLibre GL) + offline mbtiles |
| Mission | WP / Spline / Loiter / Survey grid / Crosshatch / Spiral / Orbit + terrain profile with clearance check |
| Formats | .waypoints (MP) / .plan (QGC) / .gpx / .kml import & export |
| Parameters | Metadata-driven UI (desc/range/units/enum/bitmask), tree view, diff export, default reset |
| Calibration | Compass, accel, gyro, level, baro wizards with real-time progress |
| RTK | NTRIP client with HTTP/1.0 + ICY-200 negotiation, streaming RTCM injection |
| Firmware | Upload .apj, online firmware browser, reboot to bootloader |
| Fleet | Multi-vehicle dashboard with live telemetry per vehicle |
| Video | RTSP proxy, AR waypoint overlay, screenshot capture |
| HUD | PFD (attitude/speed/altitude/compass/wind), real-time charts, EKF status |
| Audio | Localized voice callouts (mode, battery, altitude, waypoints) in all 10 languages |
| i18n | 10 languages (zh, en, ja, ko, de, fr, es, pt, ru, ar) + RTL |
| Offline | PWA with service worker, mbtiles support, tile caching (5000-entry LRU) |
| Desktop | Tauri v2 packaging (Windows MSI/NSIS installer) |
| Security | Token auth, SSRF + path-traversal guards, statustext filtering |
One-time setup:
npm install # Frontend dependencies
pip install -e . # Backend (uses pyproject.toml — pulls all required deps)
python run.py # Backend at http://localhost:8100
# In another shell:
npm run dev # Dev server at http://localhost:5173
# Open the URL, plug in USB, pick your serial port from the dropdown
For production: npm run build builds the bundle into dist/, then python run.py serves it on :8100.
sim_vehicle.py -v ArduCopter --out=udp:127.0.0.1:14550
python run.py
# Open the UI, click the "SITL" quick-connect button
python run.py --sim # Starts backend + sim_pllink.py together
# Connect to "tcp:localhost:5770"
The simulator (scripts/sim_pllink.py) emits realistic telemetry (GPS, attitude, battery drain, heartbeat) and responds to arm/disarm/mode commands.
Open Argus in Chrome/Edge, click the USB button, pick your flight controller. Telemetry, arm/disarm/mode/RTL, param read+write, mission upload/download/clear, fence upload, log list/download, and all 5 calibration types flow directly via WebSerial and the built-in TypeScript MAVLink v2 codec. Firmware upload requires the Python backend.
+------------------------------------------+
| Browser (Svelte 5 + TypeScript 6) |
| 78 components + 159 libs, 22K lines |
| MAVLink v2 codec (pure TS) |
| WebSerial direct USB connection |
| 43 lazy-loaded panels + view splitting |
+------------------------------------------+
| WebSocket (JSON delta push) |
+------------------------------------------+
| Python Backend (FastAPI + uvicorn) |
| 29 modules, 4.9K lines |
| MAVLink dispatch + 32 message handlers |
| 51 commands, tile/video/firmware API |
+------------------------------------------+
| MAVLink v2 |
| TCP / UDP / Serial / PL-Link |
+------------------------------------------+
| Flight Controller (ArduPilot / PX4) |
+------------------------------------------+
| Module | Description |
|---|---|
src/lib/mavlink/ |
Pure TypeScript MAVLink v2 encoder/decoder with CRC validation |
src/lib/fc/ |
Flight controller adapter (ArduPilot wired; PX4 mode tables exist, not imported in production) |
src/lib/transport.ts |
Dual-mode transport (WebSocket backend vs WebSerial direct) |
src/lib/serial.ts |
Web Serial API wrapper with FC USB vendor filters |
src/lib/terrain.ts |
SRTM elevation queries for terrain-following missions |
src/lib/missionIO.ts |
Mission import/export (.waypoints / .plan / .gpx) |
src/lib/survey.ts |
Survey patterns (grid, crosshatch, spiral, orbit) |
src/lib/i18n.svelte.ts |
10-language i18n with RTL support |
backend/drone_link.py |
MAVLink connection, frame parsing, state management |
backend/commands/ |
51 command handlers (arm, mode, mission, calibration, gimbal, NTRIP, etc.) |
backend/config.py |
Centralized configuration (all timeouts/ports/rates) |
# Backend unit + contract tests
python -m pytest tests/test_unit_*.py tests/test_contract_*.py -v
# Frontend unit tests
npx vitest run
# Type check (must be 0 errors, 0 warnings)
npx svelte-check --tsconfig ./tsconfig.json
# Python lint
ruff check backend/ scripts/ tests/
# E2E (requires dev server)
npx playwright test
# Production build
npm run build
Git hooks (auto-installed from .githooks/):
Deeper docs:
CLAUDE.md — project conventions, PX4 status, protocol-coupling disciplinedocs/FEATURE_CHECKLIST.md — feature verification statusdocs/protocol_design.md — load-bearing design decisionsdocs/audits/ — archived audit reportsbash scripts/make-release.sh 3.6.0
This single command bumps version across 6 files, commits, tags, and pushes. GitHub Actions then runs the full test gate, builds the Windows package, generates a changelog, and publishes a GitHub Release with artifacts.
Alternatively, to generate a changelog preview locally:
bash scripts/changelog.sh v3.5.0 # Changes since v3.5.0
Recently shipped
In progress / partial
HEARTBEAT.autopilot; frontend adapter exists but no code path imports it yet)Future
Issues and PRs welcome. Before sending a PR:
npx vitest run && python -m pytest tests/test_unit_*.py tests/test_contract_*.pynpx svelte-check (0 errors, 0 warnings)ruff check backend/ scripts/ tests/<type>: <imperative description> (types: feat, fix, refactor, test, docs, ci, chore)file:line in a comment — see CLAUDE.md ## Protocol Code DisciplineArgus stands on the shoulders of:
MIT — see LICENSE.