One interface for air, ground, and marine robotics. Tower is a command and control client that manages multi-domain fleets from a single application — no special versions, no forks, no environment-specific builds.
Most C2 systems are built for a single domain: drone GCS software doesn't handle ground robots, marine systems can't visualize UAVs, and mixing platforms means running multiple apps with incompatible data formats.
Tower uses a core protocol + extension architecture. The gateway uses an envelope protocol — common fields for position, heading, and status, plus extension payloads for vehicle-specific data. Each vehicle type is added via a manifest and codec — not a fork. The UI receives the same data structures whether it's a Skydio drone, a Clearpath Husky, or a BlueBoat. Adding a new platform means writing an extension, not maintaining a separate codebase.
| Domain | Rendering | Example Platforms |
|---|---|---|
| Air | 3D altitude-aware (Deck.gl) | Skydio, fixed-wing, VTOL, custom UAVs |
| Ground | 2D symbol layers (MapLibre) | Clearpath Husky, Spot, custom UGVs |
| Marine | 3D with hull occlusion | BlueBoat, custom USVs |
All three render simultaneously on the same map. Plan a mission with a drone providing overwatch, a ground robot for inspection, and a surface vessel for perimeter patrol — all coordinated through one interface.
- 3D Mission Planning — Draw tactical elements (no-go zones, routes, search areas) with terrain-aware 3D rendering
- Unified Fleet Management — Monitor and command air, ground, and marine vehicles from one interface
- LLM-Assisted Operations — Chat interface with full mission context for planning assistance
- Imitation Learning Tooling — Capture operator demonstrations for training autonomous behaviors
See also: Tower-Field — 2D variant for non-expert operators: high-contrast UI, large touch targets, guided workflows.
- Node.js 22+
- Git
git clone https://github.com/EthanMBoos/Tower.git
cd Tower
npm install
npm startFor development with hot reload:
npm run devDrawing on the map:
- Right-click to open the Mission Objects menu
- Select a feature type (no-go zone, Search Zone, Route, etc.)
- Click to place vertices, double-click to finish
- Configure altitude settings in the property panel
Map controls:
- Toggle 3D/2D terrain (top-right)
- Toggle satellite imagery (top-right)
- Drag-rotate enabled in 3D mode
npm run make:mac # macOS (.dmg, .zip)
npm run make:win # Windows (.exe)
npm run make:linux # Linux (.deb, .rpm)Packages output to out/make/.
| Layer | Technologies |
|---|---|
| App | Electron 40, React 19, TypeScript 5.9 |
| State | Zustand 5 |
| Maps | MapLibre GL 5.x, Deck.gl 9.x |
| Drawing | @deck.gl-community/editable-layers |
| Build | Vite 8, Electron Forge |
| Document | Purpose |
|---|---|
| ARCHITECTURE.md | System design, architecture decisions, data flows |
| EXTENSIBILITY.md | Adding new vehicle types via gateway extensions |
| TECH_STACK.md | All technologies, packages, and dependencies |
| PATTERNS.md | Coding conventions, design patterns, best practices |
| COMPONENTS.md | React component hierarchy and specifications |
| UI_DESIGN_PHILOSOPHY.md | UI rationale, layout philosophy, power-user design principles |
| HOOKS_AND_MODULES.md | Custom hooks and core module documentation |
| LLM_INTEGRATION.md | LLM chat infrastructure, context injection, and capability roadmap |
| VEHICLE_SYSTEM.md | Vehicle/fleet management architecture |
| COMMS_PIPELINE.md | Go gateway, WebSocket bridge, protocol abstraction, backpressure design |
| IMITATION_LEARNING_DATA.md | Operator demonstration capture for imitation learning datasets |
Contributions welcome! Key unsolved areas:
- UI extensibility — Dynamic overlays and drawing tools from manifests (see EXTENSIBILITY.md for phased approach)
- Offline maps — Tile generation and self-hosting for deployments without internet
- LLM evals — Prompt optimization, model comparison, and output grading infrastructure
- Performance — Comms pipeline throughput and rendering optimizations
- Extension examples — ROS2 integration + radio node setup for various platforms
- Developer tooling — Telemetry replay, protocol inspection, metrics dashboards, simulation mode
npm run dev # Development with HMR
npm test # Run unit tests
npm run test:e2e # Run E2E testsThe name "Tower" is shared with DroidPlanner/Tower, an Android ground control station for ArduPilot UAVs over MAVLink, started by Arthur Benemann as DroidPlanner in 2013 and renamed to Tower in 2015. That project has been dormant since roughly 2015 and is unrelated to this one — different stack (Java/Android vs. Electron/React), different scope (single-domain UAV GCS vs. multi-domain fleet C2). This project is in early days and makes no claim to that lineage; the name is reused in respect of the original work.
