SkyHub is a polyrepo platform: no monorepo, no shared build. Each responsibility lives in its own Git repository, and every repo is hosted under the same GitHub organization — github.com/ID-Robots. This page is the index: it maps each repo to its role, its language/stack, and the docs section that covers it in depth. Fifteen repositories make up the platform today. Twelve are live services or firmware; three (observer, probe, carrier) are stubs — a README.md with generic development principles and no source code yet. Treat the stubs as planned work, not running systems.
Clone URLs follow one pattern — https://github.com/ID-Robots/<repo>.git. To pull the whole platform into a ~/Projects layout that matches this documentation:
for repo in gateway_service dashboard core terraform \
            janus whip sitl user_vpn ws_proxy \
            nexus rover ugv observer probe carrier; do
  git clone "https://github.com/ID-Robots/skyhub_${repo}.git"
done

How the repos fit together

The repos cluster into functional planes around the Gateway control-plane hub. The Gateway (Flask/Socket.IO) authenticates users and dispatches drone commands over rosbridge; everything else feeds into or hangs off that spine. For the end-to-end request/telemetry/video walkthroughs across these repos, see Platform Architecture Overview and the Ecosystem Overview.

The repositories

Control plane

RepoRoleLanguage / stackDocs
skyhub_dashboardBrowser fleet-ops UI: live map tracking, mission planning, video, manual flightAngular 16, TypeScript 5.1.6, socket.io-client, Three.js, Mapbox GL, PrimeNG, Janus WebRTC (Node 24+ build)/dashboard/overview
skyhub_gateway_serviceControl-plane hub: HTTP/JWT auth, Socket.IO telemetry, rosbridge command dispatch, SITL orchestration, Stripe billingPython 3.10, Flask + Flask-SocketIO, SQLAlchemy, PostgreSQL, boto3, Stripe/gateway/overview
skyhub_coreSkyCore Drone OS — on-drone microservice stack (MAVROS, rosbridge, video, Isaac SLAM, ArUco landing, gamepad)ROS2 Humble, Python 3.10, Docker Compose, GStreamer, Redis, NVIDIA Isaac ROS (runs on Jetson)/drone-os/overview

Video plane

RepoRoleLanguage / stackDocs
skyhub_whipWebRTC ingest front door: drone/SITL GStreamer pipelines publish H264 via the WHIP REST API on :7080, mapped to a Janus VideoRoom publisherNode.js / Express (meetecho simple-whip-server fork)/ecosystem/whip
skyhub_janusWebRTC Selective Forwarding Unit: VideoRooms that WHIP publishes into and the Dashboard subscribes to. WS API on :8188, ICE via Google STUN :19302C (meetecho janus-gateway built from source), dockerize-templated .jcfg/ecosystem/janus

Simulation

RepoRoleLanguage / stackDocs
skyhub_sitlDockerized Software-In-The-Loop drone. Runs sim_vehicle.py + MAVROS (UDP 14550) + rosbridge (:9090) + WHIP video under supervisord. Speaks the identical rosbridge/topic contract as skyhub_core, so the Gateway treats it like a real droneDocker, ArduPilot SITL, ROS2 Humble, supervisord/ecosystem/sitl

Network & manual control

RepoRoleLanguage / stackDocs
skyhub_user_vpnPer-user/per-drone network isolation. Runs three WireGuard planes on one host — core 10.69.0.0/16:51822, user 10.70.0.0/16:51823, drone 10.71.0.0/16:51824 — and derives iptables rules from user_drone_access. Status API on :5050Python / Flask, WireGuard, iptables, S3 (peer configs)/ecosystem/user-vpn
skyhub_ws_proxyLow-latency gamepad/manual-control relay on :7070. /redispad/{id} bridges the Dashboard to the drone via Redis pub/sub; /gamepad/{id} bridges directly to ws://drone_ip:5001. A separate control path from the Gateway’s rosbridge channelPython, FastAPI / uvicorn, Redis, PostgreSQL/ecosystem/ws-proxy

Ground hardware & firmware

RepoRoleLanguage / stackDocs
skyhub_nexusNexus “airhub” battery-swap & charging station. Drives an Arduino over USB serial (/dev/ttyACM0) and an IMAX B6 charger over USB (pyusb). Standalone ground hardware — not wired into the Gateway control planePython (pyusb / pyserial) + Arduino sketch/ecosystem/nexus-and-vehicles
skyhub_roverWaveShare-class UGV rover firmware: WiFi AP/STA, ESP-NOW, onboard control web page, IMU, motor/servo control. Reached through the WS Proxy gamepad channel. Requires ESP32 Arduino core exactly 2.0.17ESP32 / Arduino C++/ecosystem/nexus-and-vehicles
skyhub_ugvLower-level UGV base controller firmware: OLED, power monitor, encoders, bus servos, ICM-20948 IMU, JSON config. Sibling to skyhub_roverESP32 / PlatformIO C++/ecosystem/nexus-and-vehicles

Deployment

RepoRoleLanguage / stackDocs
skyhub_terraformAWS infrastructure as code (eu-central-1, ECS Fargate). Terraform state lives in the S3 bucket skyhub-terraform-environment-states; the built Dashboard dist/ is served from an S3 bucketTerraform / AWS/deployment/infra-overview

Planned / stub repos

These repos exist on GitHub but contain only a README.md (development principles, no source). Document intent, do not assume running behavior.
RepoIntended role (inferred)StatusDocs
skyhub_observerPlatform observability / spectator role (name-inferred)Stub — README only/ecosystem/planned-services
skyhub_probe”Prob-E” hybrid vehicle that both flies and rolls on the ground, riding on the Carrier. Would run SkyCore + rosbridge like any droneStub — README only/ecosystem/planned-services
skyhub_carrierGround carrier platform that transports the Prob-E vehicleStub — README only/ecosystem/planned-services

Shared infrastructure (not a repo)

Three backing stores are provisioned by skyhub_terraform and touched by multiple services rather than owned by any single repo:
  • PostgreSQL — the shared skyhub database (user, drone, user_drone_access, and more). Read/written by skyhub_gateway_service, skyhub_ws_proxy, and skyhub_user_vpn. See Database Schema Reference.
  • Redis — the pub/sub bus for gamepad and telemetry channels, keyed off drone IP. Shared by the Gateway, WS Proxy, and on-drone skyhub_core. See Redis Channels & MAVLink Port Map.
  • AWS S3 / ECR — asset storage, VPN peer configs, Terraform state, and the container registry each service pulls images from.

Scoping a cross-repo change

Because SkyHub is a polyrepo with shared infrastructure, some changes cannot stay in one repo:
These tables are read by three repos simultaneously: skyhub_gateway_service (ORM models), skyhub_ws_proxy (drone IP lookup), and skyhub_user_vpn (iptables rule generation). A migration in the Gateway ripples into VPN isolation and gamepad routing — coordinate all three.
The Gateway’s command/telemetry contract on :9090 is implemented by both skyhub_core (physical) and skyhub_sitl (simulated). A new topic or field must be added to both, or SITL and physical drones will diverge.
Manual gamepad control does not flow through the Gateway. It travels Dashboard → skyhub_ws_proxy → Redis → skyhub_core’s gamepad service. Changes here span the Dashboard, WS Proxy, and Core — never the Gateway.
A single stream crosses four repos: producer (skyhub_core or skyhub_sitl) → skyhub_whipskyhub_janus → consumer (skyhub_dashboard), with the Gateway creating the room. SDP/codec/room-ID changes must be verified end-to-end.
New to the platform? Start with the SkyHub Platform Introduction, skim the Core Concepts & Glossary, then stand up a local stack with the Local Development Quickstart.