BigBodyCobain / Shadowbroker
- ΠΏΠΎΠ½Π΅Π΄Π΅Π»ΡΠ½ΠΈΠΊ, 18 ΠΌΠ°Ρ 2026β―Π³. Π² 00:00:18
Open-source intelligence for the global theater. Track everything from the corporate/private jets of the wealthy, and spy satellites, to seismic events in one unified interface. Hook an AI agent up to have it parse through data and find previously unseen correlations. The knowledge is available to all but rarely aggregated in the open, until now.
Global Threat Intercept β Real-Time Geospatial Intelligence Platform
ShadowBroker is a decentralized intelligence platform that aggregates real-time, multi-domain OSINT telemetry from 60+ live intelligence feeds into a single dark-ops map interface. Aircraft, ships, satellites, conflict zones, CCTV networks, GPS jamming, internet-connected devices, police scanners, mesh radio nodes, and breaking geopolitical events β all updating in real time on one screen as well as an obfuscated communications protocol and information exchange infrastructure.
Built with Next.js, MapLibre GL, FastAPI, and Python. 35+ toggleable data layers, including SAR ground-change detection. Multiple visual modes (DEFAULT / SATELLITE / FLIR / NVG / CRT). Right-click any point on Earth for a country dossier, head-of-state lookup, and the latest Sentinel-2 satellite photo. No user data is collected or transmitted β the dashboard runs entirely in your browser against a self-hosted backend.
Designed for analysts, researchers, radio operators, and anyone who wants to see what the world looks like when every public signal is on the same map.
A surprising amount of global telemetry is already public β aircraft ADS-B broadcasts, maritime AIS signals, satellite orbital data, earthquake sensors, mesh radio networks, police scanner feeds, environmental monitoring stations, internet infrastructure telemetry, and more. This data is scattered across dozens of tools and APIs. ShadowBroker combines all of it into a single interface.
The project does not introduce new surveillance capabilities β it aggregates and visualizes existing public datasets. It is fully open-source so anyone can audit exactly what data is accessed and how. No user data is collected or transmitted β everything runs locally against a self-hosted backend. No telemetry, no analytics, no accounts.
ShadowBroker includes an optional Shodan connector for operator-supplied API access. Shodan results are fetched with your own SHODAN_API_KEY, rendered as a local investigative overlay (not merged into core feeds), and remain subject to Shodanβs terms of service.
git clone https://github.com/bigbodycobain/Shadowbroker.git
cd Shadowbroker
docker compose pull
docker compose up -dOpen http://localhost:3000 to view the dashboard! (Requires Docker Desktop or Docker Engine)
Backend port already in use? The browser only needs port
3000, but the backend API is also published on host port8000for local diagnostics. If another app already uses8000, create or edit.envnext todocker-compose.ymland setBACKEND_PORT=8001, then rundocker compose up -d.
Blank news/UAP/bases/wastewater after several minutes? Check for backend OOM restarts with
docker events --since 30m --filter container=shadowbroker-backend --filter event=oom. The default compose file gives the backend 4GB; if your host has less memory, reduce enabled feeds or setBACKEND_MEMORY_LIMIT=3Gand expect slower/heavier layers to warm more gradually.
Podman users: Podman works, but
podman composeis a wrapper and still needs a Compose provider installed. On Windows/WSL, if you seelooking up compose provider failed, installpodman-composeand runpodman-compose pullfollowed bypodman-compose up -dfrom inside the clonedShadowbrokerfolder. On Linux/macOS/WSL shells you can also use./compose.sh --engine podman pulland./compose.sh --engine podman up -d.
ShadowBroker uses pre-built Docker images β no local building required. Updating takes seconds:
docker compose pull
docker compose up -dThat's it. pull grabs the latest images, up -d restarts the containers.
Coming from an older version? Pull the latest repo code first, then pull images:
git pull origin main docker compose down docker compose pull docker compose up -dPodman users should run the equivalent provider command, for example
podman-compose pullandpodman-compose up -d, or use./compose.sh --engine podman pulland./compose.sh --engine podman up -dfrom a bash-compatible shell.
If git pull fails or docker compose up keeps building from source instead of pulling images, your clone predates a March 2026 repository migration that rewrote commit history. A normal git pull cannot fix this. Run:
# Back up any local config you want to keep (.env, etc.)
cd ..
rm -rf Shadowbroker
git clone https://github.com/bigbodycobain/Shadowbroker.git
cd Shadowbroker
docker compose pull
docker compose up -dHow to tell if you're affected: If docker compose up shows RUN apt-get, RUN npm ci, or RUN pip install β it's building from source instead of pulling pre-built images. You need a fresh clone.
Other troubleshooting:
docker compose pull --no-cachedocker image prune -fdocker compose logs -f backendFor high-availability deployments or home-lab clusters, ShadowBroker supports deployment via Helm. This chart is based on the bjw-s-labs template and provides a robust, modular setup for both the backend and frontend.
1. Add the Repository:
helm repo add bjw-s-labs https://bjw-s-labs.github.io/helm-charts/
helm repo update2. Install the Chart:
# Install from the local helm/chart directory
helm install shadowbroker ./helm/chart --create-namespace --namespace shadowbroker3. Key Features:
Special thanks to @chr0n1x for contributing the initial Kubernetes architecture.
ShadowBroker v0.9.7 ships InfoNet (decentralized intelligence mesh + Sovereign Shell governance economy), an agentic AI command channel (supports OpenClaw and any HMAC-signing agent), Time Machine snapshot playback, and SAR satellite ground-change detection. This is an experimental testnet β not a private messenger and not a production governance system.
| Channel | Privacy Status | Details |
|---|---|---|
| Meshtastic / APRS | PUBLIC | RF radio transmissions are public and interceptable by design. |
| InfoNet Gate Chat | OBFUSCATED | Messages are obfuscated with gate personas and canonical payload signing, but NOT end-to-end encrypted. Metadata is not hidden. |
| Dead Drop DMs | STRONGEST CURRENT LANE | Token-based epoch mailbox with SAS word verification. Strongest lane in this build, but not yet confidently private. |
| Sovereign Shell governance | PUBLIC LEDGER | Petitions, votes, upgrade hashes, and dispute stakes are signed events on a public hashchain. Pseudonymous via gate persona, but governance actions are intentionally observable. |
| Privacy primitives (RingCT / stealth / DEX) | NOT YET WIRED | Locked Protocol contracts are in place, but the cryptographic scheme has not been chosen. The privacy-core Rust crate is the integration target for a future sprint. |
Do not transmit anything sensitive on any channel. Treat all lanes as open and public for now. E2E encryption and deeper native/Tauri hardening are the next milestones. If you fork this project, keep these labels intact and do not make stronger privacy claims than the implementation supports.
For a full picture of what the mesh actually defends against and what it doesn't, read the threat model and the claims reconciliation. Every sentence above is mapped there to the code path that enforces it (or doesn't).
The first decentralized intelligence communication and governance layer built directly into an OSINT platform. No accounts, no signup, no identity required. v0.9.7 promotes InfoNet from a chat layer into a full governance economy with a clear path to a privacy-preserving decentralized intelligence platform.
Communication layer (since v0.9.6):
send, dm, market commands, gate state inspection. Draggable panel, minimizes to the top bar. Type help to see all commands.Sovereign Shell β governance economy (NEW in v0.9.7):
UPDATE_PARAM, BATCH_UPDATE_PARAMS, ENABLE_FEATURE, and DISABLE_FEATURE. Tunable knobs change by vote β no code deploys required.repr() exactly, so hashes round-trip cleanly through the chain.MappingProxyType.Privacy primitive runway (NEW in v0.9.7):
services/infonet/privacy/contracts.py for ring signatures, stealth addresses, Pedersen commitments, range proofs, and DEX matching. The privacy-core Rust crate is the integration target β no caller of the privacy module needs to know which scheme is active.Experimental Testnet β No Privacy Guarantee: InfoNet messages are obfuscated but NOT end-to-end encrypted. The Mesh network (Meshtastic/APRS) is NOT private β radio transmissions are inherently public. The privacy primitive contracts are scaffolded but not yet wired. Do not send anything sensitive on any channel. Treat all channels as open and public for now.
SHODAN_API_KEY; results rendered as a local investigative overlaysar_pin_click) and fly the operator's map to any AOI center (sar_focus_aoi) β enabling collaborative analyst workflows.ShadowBroker exposes a bidirectional agentic AI command channel β a signed, tier-gated bridge that gives any compatible AI agent full read/write access to the intelligence platform. OpenClaw is the reference agent, but the channel is an open protocol: any LLM-driven agent that signs requests with HMAC-SHA256 (Claude Code, GPT, LangChain, custom Python/TypeScript clients, or your own integration) can connect as an analyst that sees the same data as the operator and can take actions on the map. ShadowBroker does not bundle an LLM, an agent runtime, or model weights β it provides the surface; you bring the agent.
v0.9.7 turns ShadowBroker from a dashboard a human watches into an intelligence surface any agent can act on.
Channel transport (NEW in v0.9.7):
POST /api/ai/channel/command accepts {cmd, args} and dispatches to any registered tool.POST /api/ai/channel/batch accepts up to 20 commands in one request. The backend runs them concurrently and returns a fan-out result map. Cuts agent latency by an order of magnitude over sequential calls.OPENCLAW_ACCESS_TIER controls which commands the agent can call: restricted exposes the read-only set, full adds writes and injection. Discovery endpoint returns available_commands so the agent can introspect its own capabilities.HMAC-SHA256(secret, METHOD|path|timestamp|nonce|sha256(body)) with timestamp + nonce replay protection and request integrity. Supports local mode (no config) and remote mode (agent on a different machine / VPS).Capabilities:
Connect an agent: Open the AI Intel panel in the left sidebar, click Connect Agent, and copy the HMAC secret. From there, point any compatible agent at the channel β for OpenClaw, import ShadowBrokerClient from the OpenClaw skill package; for any other agent, use the same HMAC contract documented above (timestamp + nonce + body digest, tier-gated). The channel is the protocol, not the agent.
A media-style transport for the entire telemetry feed. Treat the live map as a recording that can be scrubbed, paused, and replayed.
count, latest_id, latest_ts, and the full snapshot_ids list. Jump to any captured timestamp directly from the timeline scrubber.Settings β API Keys is now a read-only registry. Key values never reach the browser process β not even an obfuscated prefix. The panel surfaces:
.env file as resolved by Path(__file__).resolve() β works on every OS, every drive, every install location (Linux /home/..., macOS /Users/..., Windows on any drive, Docker containers, cloud VMs).[exists] / [will be created on first save] / [NOT WRITABLE β edit by hand] indicators on the path itself..env.example template so users can copy it and fill in their keys.CONFIGURED / NOT CONFIGURED badge per key, plus a copy-pastable env line (e.g. OPENSKY_CLIENT_ID=YOUR_VALUE) the user can drop into the file by hand.OpenSky API credentials are now a critical-warn environment requirement: the startup environment check flags missing OpenSky OAuth2 credentials with a strong warning, and the changelog modal links directly to the free registration page. Without them, the flights layer falls back to ADS-B-only coverage with significant gaps in Africa, Asia, and Latin America.
ShadowBroker v0.9.7 is composed of three vertically-stacked planes β the Operator UI, the Backend Service Plane, and the Decentralized Layer (InfoNet) β plus two cross-cutting bridges (the Time Machine and the Agentic AI Channel, which is the protocol that OpenClaw and any other compatible agent connects through) and a Privacy Core Rust crate that backstops both the legacy mesh and the future shielded coin / DEX work.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β OPERATOR UI (Next.js + MapLibre) β
β β
β ββββββββββββββββββ ββββββββββββ ββββββββββββββββββ ββββββββββββββββββ β
β β MapLibre GL β β NewsFeed β β Sovereign Shellβ β Mesh Chat β β
β β WebGL render β β SIGINT β β Petitions / β β + Mesh Term. β β
β β + clusters β β GDELT β β Upgrades / β β (Infonet / β β
β β β β Threat β β Disputes / β β Mesh / β β
β β β β β β Gates / β β Dead Drop) β β
β β β β β β Bootstrap / β β β β
β β β β β β Function Keys β β β β
β ββββββββ¬ββββββββββ ββββββ¬ββββββ ββββββββββ¬ββββββββ ββββββββββ¬ββββββββ β
β β β β β β
β ββββββββ΄ββββββββββββββββββ΄ββββββββββββββββββ΄ββββββββββββββββββββ΄ββββββββ β
β β Time Machine βββ snapshot playback ββ snapshotMode toggle βββΆ Live β β
β β hourly index β frame interpolation β profile-aware β per-tier ETag β β
β ββββββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββ β
β β REST + /api/[...path] proxy β
β ββββββββββββββββββββββββββββββββββββββͺββββββββββββββββββββββββββββββββββββββββ£
β BACKEND SERVICE PLANE (FastAPI) β
β β β
β ββββββββββββββββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββ β
β β Data Fetcher (APScheduler β fast / slow tiers) β β
β β β β
β β βββββββββββββ¬ββββββββββββ¬ββββββββββββ¬ββββββββββββ¬ββββββββββββ β β
β β β OpenSky* β adsb.lol β CelesTrak β USGS β AIS WS β β β
β β β Flights β Military β Sats β Quakes β Ships β β β
β β βββββββββββββΌββββββββββββΌββββββββββββΌββββββββββββΌββββββββββββ€ β β
β β β Carrier β GDELT β CCTV (12) β DeepState β NASA β β β
β β β Tracker β Conflict β Cameras β Frontline β FIRMS β β β
β β βββββββββββββΌββββββββββββΌββββββββββββΌββββββββββββΌββββββββββββ€ β β
β β β GPS β KiwiSDR β Shodan β Amtrak β SatNOGS β β β
β β β Jamming β Radios β Devices β DigiTraf β TinyGS β β β
β β βββββββββββββΌββββββββββββΌββββββββββββΌββββββββββββΌββββββββββββ€ β β
β β β Volcanoes β Weather β Fishing β Mil Bases β IODA β β β
β β β Air Qual β Alerts β Activity β PwrPlants β Outages β β β
β β βββββββββββββΌββββββββββββΌββββββββββββΌββββββββββββΌββββββββββββ€ β β
β β β Sentinel β MODIS β VIIRS β Data β Meshtasticβ β β
β β β Hub/STAC β Terra β Nightlts β Centers β APRS β β β
β β βββββββββββββ΄ββββββββββββ΄ββββββββββββ΄ββββββββββββ΄ββββββββββββ€ β β
β β β SAR (NEW v0.9.7) β β β
β β β Mode A: ASF Search catalog (free, no account) β β β
β β β Mode B: NASA OPERA / Copernicus EGMS / GFM / EMS / β β β
β β β UNOSAT ground-change anomalies (opt-in) β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β * OpenSky: REQUIRED for global flight coverage β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββ β
β β Snapshot Store (Time Machine source) β β
β β Hourly index β per-snapshot layer manifest β profile metadata β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Agentic AI Channel (HMAC-SHA256, tier-gated β OpenClaw + others) β β
β β β β
β β POST /api/ai/channel/command β one tool call β β
β β POST /api/ai/channel/batch β up to 20 concurrent tool calls β β
β β β β
β β Tier: restricted (read-only) β full (read + write + inject) β β
β β Auth: X-SB-Timestamp + X-SB-Nonce + X-SB-Signature β β
β β Sig = HMAC-SHA256(secret, METHOD|path|ts|nonce|sha256(body)) β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ£
β DECENTRALIZED LAYER (InfoNet Testnet β signed events) β
β β
β ββββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββββββ β
β β Mesh Hashchain β β Sovereign Shell Governance β β
β β β β β β
β β Ed25519 signed events β β Petitions (DSL: UPDATE_PARAM, β β
β β Public-key binding β β ENABLE_FEATURE β¦) β β
β β Replay / sequence guard β β Upgrade-Hash voting (80% / 40% β β
β β Two-tier finality β β quorum / 67% Heavy) β β
β β β Tier 1 (CRDT, fast) β β Resolution & Dispute markets β β
β β β Tier 2 (epoch finality)β β Gate suspend / shutdown / appealβ β
β β Identity rotation β β Bootstrap eligible-node-1-vote β β
β β Constitutional invariants β β (Argon2id PoW, Heavy-Node only)β β
β β (MappingProxyType) β β Function Keys (5 of 6 pieces) β β
β βββββββββββββββ¬βββββββββββββββ βββββββββββββββ¬βββββββββββββββββββββ β
β β β β
β ββββββββββββββββ¬βββββββββββββββββββ β
β β β
β ββββββββββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββ β
β β Wormhole / InfoNet Relay (transport layer) β β
β β Gate personas β canonical signing β Dead Drop epoch mailboxes β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ£
β PRIVACY CORE (Rust crate β locked Protocol contracts) β
β β
β privacy-core/ ββΊ Argon2id β Ed25519/X25519 β AESGCM β HKDF β
β Ring sigs* β Stealth addrs* β Pedersen* β Bulletproofs*β
β Blind-sig issuance* (RSA / BBS+ / U-Prove / Idemix) β
β β
β * = locked Protocol contract; cryptographic primitive lands Sprint 11+ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Distribution
ββββββββββββ
GitHub (primary): ghcr.io/bigbodycobain/shadowbroker-{backend,frontend}
GitLab (mirror): registry.gitlab.com/bigbodycobain/shadowbroker/{backend,frontend}
Multi-arch: linux/amd64 + linux/arm64 (Raspberry Pi 5 supported)
Desktop: Tauri shell β packaged backend-runtime + Next.js frontend
| Source | Data | Update Frequency | API Key Required |
|---|---|---|---|
| OpenSky Network | Commercial & private flights | ~60s | Yes |
| adsb.lol | Military aircraft | ~60s | No |
| aisstream.io | AIS vessel positions | Real-time WebSocket | Yes |
| CelesTrak | Satellite orbital positions (TLE + SGP4) | ~60s | No |
| USGS Earthquake | Global seismic events | ~60s | No |
| GDELT Project | Global conflict events | ~6h | No |
| DeepState Map | Ukraine frontline | ~30min | No |
| Shodan | Internet-connected device search | On-demand | Yes |
| Amtrak | US train positions | ~60s | No |
| DigiTraffic | European rail positions | ~60s | No |
| Global Fishing Watch | Fishing vessel activity events | ~10min | No |
| Transport for London, NYC DOT, TxDOT | CCTV cameras (UK, US) | ~10min | No |
| Caltrans, WSDOT, GDOT, IDOT, MDOT | CCTV cameras (5 US states) | ~10min | No |
| Spain DGT, Madrid City | CCTV cameras (Spain) | ~10min | No |
| Singapore LTA | Singapore traffic cameras | ~10min | Yes |
| Windy Webcams | Global webcams | ~10min | No |
| SatNOGS | Amateur satellite ground stations | ~30min | No |
| TinyGS | LoRa satellite ground stations | ~30min | No |
| Meshtastic MQTT | Mesh radio node positions | Real-time | No |
| APRS-IS | Amateur radio positions | Real-time TCP | No |
| KiwiSDR | Public SDR receiver locations | ~30min | No |
| OpenMHZ | Police/fire scanner feeds | Real-time | No |
| Smithsonian GVP | Holocene volcanoes worldwide | Static (cached) | No |
| OpenAQ | Air quality PM2.5 stations | ~120s | No |
| NOAA / NWS | Severe weather alerts & polygons | ~120s | No |
| WRI Global Power Plant DB | 35,000+ power plants | Static (cached) | No |
| Military base datasets | Global military installations | Static (cached) | No |
| NASA FIRMS | NOAA-20 VIIRS fire/thermal hotspots | ~120s | No |
| NOAA SWPC | Space weather Kp index & solar events | ~120s | No |
| IODA (Georgia Tech) | Regional internet outage alerts | ~120s | No |
| DC Map (GitHub) | Global data center locations | Static (cached 7d) | No |
| NASA GIBS | MODIS Terra daily satellite imagery | Daily (24-48h delay) | No |
| Esri World Imagery | High-res satellite basemap | Static (periodically updated) | No |
| MS Planetary Computer | Sentinel-2 L2A scenes (right-click) | On-demand | No |
| Copernicus CDSE | Sentinel Hub imagery (Process API) | On-demand | Yes (free) |
| VIIRS Nightlights | Night-time light change detection | Static | No |
| RestCountries | Country profile data | On-demand (cached 24h) | No |
| Wikidata SPARQL | Head of state data | On-demand (cached 24h) | No |
| Wikipedia API | Location summaries & aircraft images | On-demand (cached) | No |
| OSM Nominatim | Place name geocoding (LOCATE bar) | On-demand | No |
| CARTO Basemaps | Dark map tiles | Continuous | No |
The repo includes a docker-compose.yml that pulls pre-built images from GitHub Container Registry.
git clone https://github.com/BigBodyCobain/Shadowbroker.git
cd Shadowbroker
# Add your API keys in a repo-root .env file (optional β see Environment Variables below)
docker compose pull
docker compose up -dOpen http://localhost:3000 to view the dashboard.
Deploying publicly or on a LAN? No configuration needed for most setups. The frontend proxies all API calls through the Next.js server to
BACKEND_URL, which defaults tohttp://backend:8000(Docker internal networking). Host port8000is only published for local API/debug access. If it conflicts with another service, setBACKEND_PORT=8001in.env; leaveBACKEND_URLashttp://backend:8000because that is the Docker-internal port. The backend memory cap is controlled byBACKEND_MEMORY_LIMITand defaults to4G. If Docker reports OOM events, the backend will restart and slow layers can look empty until they repopulate.If your backend runs on a different host or port, set
BACKEND_URLat runtime β no rebuild required:# Linux / macOS BACKEND_URL=http://myserver.com:9096 docker compose up -d # Podman (via compose.sh wrapper) BACKEND_URL=http://192.168.1.50:9096 ./compose.sh up -d # Windows (PowerShell) $env:BACKEND_URL="http://myserver.com:9096"; docker compose up -d # Or add to a .env file next to docker-compose.yml: # BACKEND_URL=http://myserver.com:9096
Podman users: Do not pass the GitHub URL to podman compose pull; clone the repo first, cd Shadowbroker, then run compose from that folder. podman compose also requires a Compose provider. If Podman reports looking up compose provider failed, install one:
# Linux / macOS / WSL
python3 -m pip install --user podman-compose
podman-compose pull
podman-compose up -d# Windows PowerShell
py -m pip install --user podman-compose
podman-compose pull
podman-compose up -dIf you are in a bash-compatible shell, the included wrapper can auto-detect Docker or Podman:
./compose.sh --engine podman pull
./compose.sh --engine podman up -dNo need to clone the repo. Use the pre-built images from GitHub Container Registry. GitLab registry images may be used as a mirror if you publish them there.
Create a docker-compose.yml with the following content and deploy it directly β paste it into Portainer's stack editor, uncloud deploy, or any Docker host:
## Image registry β uncomment ONE line per service:
## GitHub (primary): ghcr.io/bigbodycobain/shadowbroker-backend:latest
## GitLab (mirror): registry.gitlab.com/bigbodycobain/shadowbroker/backend:latest
services:
backend:
image: ghcr.io/bigbodycobain/shadowbroker-backend:latest
# image: registry.gitlab.com/bigbodycobain/shadowbroker/backend:latest
container_name: shadowbroker-backend
ports:
- "${BACKEND_PORT:-8000}:8000"
environment:
- AIS_API_KEY=your_aisstream_key # Required β get one free at aisstream.io
- OPENSKY_CLIENT_ID= # Optional β higher flight data rate limits
- OPENSKY_CLIENT_SECRET= # Optional β paired with Client ID above
- LTA_ACCOUNT_KEY= # Optional β Singapore CCTV cameras
- SHODAN_API_KEY= # Optional β Shodan device search overlay
- SH_CLIENT_ID= # Optional β Sentinel Hub satellite imagery
- SH_CLIENT_SECRET= # Optional β paired with Sentinel Hub ID
- CORS_ORIGINS= # Optional β comma-separated allowed origins
volumes:
- backend_data:/app/data
restart: unless-stopped
frontend:
image: ghcr.io/bigbodycobain/shadowbroker-frontend:latest
# image: registry.gitlab.com/bigbodycobain/shadowbroker/frontend:latest
container_name: shadowbroker-frontend
ports:
- "3000:3000"
environment:
- BACKEND_URL=http://backend:8000 # Docker internal networking β no rebuild needed
depends_on:
- backend
restart: unless-stopped
volumes:
backend_data:How it works: The frontend container proxies all
/api/*requests through the Next.js server toBACKEND_URLusing Docker's internal networking. The browser only ever talks to port 3000. The backend's host port is for local API/debug access and can be changed withBACKEND_PORT=8001without changingBACKEND_URL.
BACKEND_URLis a plain runtime environment variable (not a build-timeNEXT_PUBLIC_*), so you can change it in Portainer, Uncloud, or any compose editor without rebuilding the image. Set it to the address where your backend is reachable from inside the Docker network (e.g.http://backend:8000,http://192.168.1.50:8000).
If you just want to run the dashboard without dealing with terminal commands:
.zip file from the release.start.bat.
Mac/Linux: Open terminal, type chmod +x start.sh, dos2unix start.sh, and run ./start.sh.Local launcher notes:
start.bat / start.sh run the app without Docker β they install dependencies and start both servers directly.docs/mesh/ folder for troubleshooting.docs/mesh/wormhole-dm-root-operations-runbook.md.scripts/mesh/poll-dm-root-health-alerts.mjs, scripts/mesh/export-dm-root-health-prometheus.mjs, scripts/mesh/publish-external-root-witness-package.mjs, scripts/mesh/smoke-external-root-witness-flow.mjs, scripts/mesh/smoke-root-transparency-publication-flow.mjs, scripts/mesh/smoke-dm-root-deployment-flow.mjs, scripts/mesh/sync-dm-root-external-assurance.mjs, and docs/mesh/examples/.If you want to modify the code or run from source:
pip β python.org (check "Add to PATH" during install)
aisstream.io (required), and optionally opensky-network.org (OAuth2), lta.gov.sg# Clone the repository
git clone https://github.com/BigBodyCobain/Shadowbroker.git
cd Shadowbroker
# Backend setup
cd backend
python -m venv venv
venv\Scripts\activate # Windows
# source venv/bin/activate # macOS/Linux
pip install .
# Optional helper scripts (creates venv + installs dev deps)
# Windows PowerShell
# .\backend\scripts\setup-venv.ps1
# macOS/Linux
# ./backend/scripts/setup-venv.sh
# Optional env check (prints warnings for missing keys)
# Windows PowerShell
# .\backend\scripts\check-env.ps1
# macOS/Linux
# ./backend/scripts/check-env.sh
# Create .env with your API keys
echo "AIS_API_KEY=your_aisstream_key" >> .env
echo "OPENSKY_CLIENT_ID=your_opensky_client_id" >> .env
echo "OPENSKY_CLIENT_SECRET=your_opensky_secret" >> .env
# Frontend setup
cd ../frontend
npm ci# From the frontend directory β starts both frontend & backend concurrently
npm run devThis starts:
http://localhost:3000http://localhost:8000If you use pre-commit, install hooks once from repo root:
pre-commit installYou can feed your own AIS ship data into ShadowBroker using an RTL-SDR dongle and AIS-catcher, an open-source AIS decoder. This gives you real-time coverage of vessels in your local area β no API key needed.
docker run -d --device /dev/bus/usb \
ghcr.io/jvde-github/ais-catcher -H http://host.docker.internal:4000/api/ais/feed interval 10AIS-catcher -H http://localhost:4000/api/ais/feed interval 10AIS-catcher decodes VHF radio signals on 161.975 MHz and 162.025 MHz and POSTs decoded vessel data to ShadowBroker every 10 seconds. Ships detected by your SDR antenna appear alongside the global AIS stream.
Docker (ARM/Raspberry Pi): See docker-shipfeeder for a production-ready Docker image optimized for ARM.
Note: AIS range depends on your antenna β typically 20-40 nautical miles with a basic setup, 60+ nm with a marine VHF antenna at elevation.
All 37 layers are independently toggleable from the left panel:
| Layer | Default | Description |
|---|---|---|
| Commercial Flights | β ON | Airlines, cargo, GA aircraft |
| Private Flights | β ON | Non-commercial private aircraft |
| Private Jets | β ON | High-value bizjets with owner data |
| Military Flights | β ON | Military & government aircraft |
| Tracked Aircraft | β ON | Special interest watch list |
| GPS Jamming | β ON | NAC-P degradation zones |
| Carriers / Mil / Cargo | β ON | Navy carriers, cargo ships, tankers |
| Civilian Vessels | β ON | Yachts, fishing, recreational |
| Cruise / Passenger | β ON | Cruise ships and ferries |
| Tracked Yachts | β ON | Billionaire & oligarch superyachts |
| Fishing Activity | β ON | Global Fishing Watch vessel events |
| Trains | β ON | Amtrak + European rail positions |
| Satellites | β ON | Orbital assets by mission type |
| SatNOGS | β ON | Amateur satellite ground stations |
| TinyGS | β ON | LoRa satellite ground stations |
| Earthquakes (24h) | β ON | USGS seismic events |
| Fire Hotspots (24h) | β ON | NASA FIRMS VIIRS thermal anomalies |
| Volcanoes | β ON | Smithsonian Holocene volcanoes |
| Weather Alerts | β ON | Severe weather polygons |
| Air Quality (PM2.5) | β ON | OpenAQ stations worldwide |
| Ukraine Frontline | β ON | Live warfront positions |
| Ukraine Air Alerts | β ON | Regional air raid alerts |
| Global Incidents | β ON | GDELT conflict events |
| CCTV Mesh | β ON | 11,000+ cameras across 13 sources, 6 countries |
| Internet Outages | β ON | IODA regional connectivity alerts |
| Data Centers | β ON | Global data center locations (2,000+) |
| Military Bases | β ON | Global military installations |
| KiwiSDR Receivers | β ON | Public SDR radio receivers |
| Meshtastic Nodes | β ON | Mesh radio node positions |
| APRS | β ON | Amateur radio positioning |
| Scanners | β ON | Police/fire scanner feeds |
| Day / Night Cycle | β ON | Solar terminator overlay |
| MODIS Terra (Daily) | β OFF | NASA GIBS daily satellite imagery |
| High-Res Satellite | β OFF | Esri sub-meter satellite imagery |
| Sentinel Hub | β OFF | Copernicus CDSE Process API |
| VIIRS Nightlights | β OFF | Night-time light change detection |
| Power Plants | β OFF | 35,000+ global power plants |
| Shodan Overlay | β OFF | Internet device search results |
The platform is optimized for handling massive real-time datasets:
304 Not Modified responses skip redundant JSON parsingsetData() callsShadowbroker/
βββ backend/
β βββ main.py # FastAPI app, middleware, API routes (~4,000 lines)
β βββ cctv.db # SQLite CCTV camera database (auto-generated)
β βββ config/
β β βββ news_feeds.json # User-customizable RSS feed list
β βββ services/
β β βββ data_fetcher.py # Core scheduler β orchestrates all data sources
β β βββ ais_stream.py # AIS WebSocket client (25K+ vessels)
β β βββ carrier_tracker.py # OSINT carrier position estimator (GDELT news scraping)
β β βββ cctv_pipeline.py # 13-source CCTV camera ingestion pipeline
β β βββ geopolitics.py # GDELT + Ukraine frontline + air alerts
β β βββ region_dossier.py # Right-click country/city intelligence
β β βββ radio_intercept.py # Police scanner feeds + OpenMHZ
β β βββ kiwisdr_fetcher.py # KiwiSDR receiver scraper
β β βββ sentinel_search.py # Sentinel-2 STAC imagery search
β β βββ shodan_connector.py # Shodan device search connector
β β βββ sigint_bridge.py # APRS-IS TCP bridge
β β βββ network_utils.py # HTTP client with curl fallback
β β βββ api_settings.py # API key management
β β βββ news_feed_config.py # RSS feed config manager
β β βββ fetchers/
β β β βββ flights.py # OpenSky, adsb.lol, GPS jamming, holding patterns
β β β βββ geo.py # AIS vessels, carriers, GDELT, fishing activity
β β β βββ satellites.py # CelesTrak TLE + SGP4 propagation
β β β βββ earth_observation.py # Quakes, fires, volcanoes, air quality, weather
β β β βββ infrastructure.py # Data centers, power plants, military bases
β β β βββ trains.py # Amtrak + DigiTraffic European rail
β β β βββ sigint.py # SatNOGS, TinyGS, APRS, Meshtastic
β β β βββ meshtastic_map.py # Meshtastic MQTT + map node aggregation
β β β βββ military.py # Military aircraft classification
β β β βββ news.py # RSS intelligence feed aggregation
β β β βββ financial.py # Global markets data
β β β βββ ukraine_alerts.py # Ukraine air raid alerts
β β βββ mesh/ # InfoNet / Wormhole protocol stack
β β βββ mesh_protocol.py # Core mesh protocol + routing
β β βββ mesh_crypto.py # Ed25519, X25519, AESGCM primitives
β β βββ mesh_hashchain.py # Hash chain commitment system (~1,400 lines)
β β βββ mesh_router.py # Multi-transport router (APRS, Meshtastic, WS)
β β βββ mesh_wormhole_persona.py # Gate persona identity management
β β βββ mesh_wormhole_dead_drop.py # Dead Drop token-based DM mailbox
β β βββ mesh_wormhole_ratchet.py # Double-ratchet DM scaffolding
β β βββ mesh_wormhole_gate_keys.py # Gate key management + rotation
β β βββ mesh_wormhole_seal.py # Message sealing + unsealing
β β βββ mesh_merkle.py # Merkle tree proofs for data commitment
β β βββ mesh_reputation.py # Node reputation scoring
β β βββ mesh_oracle.py # Oracle consensus protocol
β β βββ mesh_secure_storage.py # Secure credential storage
βββ frontend/
β βββ src/
β β βββ app/
β β β βββ page.tsx # Main dashboard β state, polling, layout
β β βββ components/
β β βββ MaplibreViewer.tsx # Core map β all GeoJSON layers
β β βββ MeshChat.tsx # InfoNet / Mesh / Dead Drop chat panel
β β βββ MeshTerminal.tsx # Draggable CLI terminal
β β βββ NewsFeed.tsx # SIGINT feed + entity detail panels
β β βββ WorldviewLeftPanel.tsx # Data layer toggles (35+ layers)
β β βββ WorldviewRightPanel.tsx # Search + filter sidebar
β β βββ AdvancedFilterModal.tsx # Airport/country/owner filtering
β β βββ MapLegend.tsx # Dynamic legend with all icons
β β βββ MarketsPanel.tsx # Global financial markets ticker
β β βββ RadioInterceptPanel.tsx # Scanner-style radio panel
β β βββ FindLocateBar.tsx # Search/locate bar
β β βββ ChangelogModal.tsx # Version changelog popup (auto-shows on upgrade)
β β βββ SettingsPanel.tsx # API Keys + News Feed + Shodan config
β β βββ ScaleBar.tsx # Map scale indicator
β β βββ ErrorBoundary.tsx # Crash recovery wrapper
β βββ package.json
# Required for airplane telemetry (NEW in v0.9.7 β startup env check flags these as critical)
# Free registration: https://opensky-network.org/index.php?option=com_users&view=registration
OPENSKY_CLIENT_ID=your_opensky_client_id # OAuth2 β global flight state vectors
OPENSKY_CLIENT_SECRET=your_opensky_secret # OAuth2 β paired with Client ID above
# Optional (enhances data quality)
AIS_API_KEY=your_aisstream_key # Maritime vessel tracking (aisstream.io) β ships layer empty without it
LTA_ACCOUNT_KEY=your_lta_key # Singapore CCTV cameras
SHODAN_API_KEY=your_shodan_key # Shodan device search overlay
SH_CLIENT_ID=your_sentinel_hub_id # Copernicus CDSE Sentinel Hub imagery
SH_CLIENT_SECRET=your_sentinel_hub_secret # Paired with Sentinel Hub Client ID
MESH_SAR_EARTHDATA_USER= # NASA Earthdata user (SAR Mode B β OPERA products)
MESH_SAR_EARTHDATA_TOKEN= # NASA Earthdata token (paired with user above)
MESH_SAR_COPERNICUS_USER= # Copernicus Data Space user (SAR Mode B β EGMS / EMS)
MESH_SAR_COPERNICUS_TOKEN= # Copernicus token (paired with user above)
OPENCLAW_ACCESS_TIER=restricted # OpenClaw agent tier: "restricted" (read-only) or "full"
# Private-lane privacy-core pinning (required when Arti or RNS is enabled)
PRIVACY_CORE_MIN_VERSION=0.1.0
PRIVACY_CORE_ALLOWED_SHA256=your_privacy_core_sha256
# Optional override if you load a non-default shared library path
PRIVACY_CORE_LIB=When MESH_ARTI_ENABLED=true or MESH_RNS_ENABLED=true, backend startup now fails closed unless the loaded privacy-core artifact reports a parseable version at or above PRIVACY_CORE_MIN_VERSION and matches one of the hashes in PRIVACY_CORE_ALLOWED_SHA256.
Generate the hash from the artifact you intend to ship:
Get-FileHash .\privacy-core\target\release\privacy_core.dll -Algorithm SHA256sha256sum ./privacy-core/target/release/libprivacy_core.soThen confirm authenticated GET /api/wormhole/status or GET /api/settings/wormhole-status shows the same privacy_core.version, privacy_core.library_path, and privacy_core.library_sha256.
| Variable | Where to set | Purpose |
|---|---|---|
BACKEND_URL |
environment in docker-compose.yml, or shell env |
URL the Next.js server uses to proxy API calls to the backend. Defaults to http://backend:8000. Runtime variable β no rebuild needed. |
BACKEND_PORT |
repo-root .env or shell env before docker compose up |
Host port used to expose the backend API for local diagnostics. Defaults to 8000; set BACKEND_PORT=8001 if port 8000 is already in use. Does not change Docker-internal BACKEND_URL. |
How it works: The frontend proxies all /api/* requests through the Next.js server to BACKEND_URL using Docker's internal networking. Browsers only talk to port 3000; the backend host port is only for local diagnostics. For local dev without Docker, BACKEND_URL defaults to http://localhost:8000.
ShadowBroker is built in the open. These people shipped real code:
| Who | What | PR |
|---|---|---|
| @Alienmajik | Raspberry Pi 5 support β ARM64 packaging, headless deployment notes, runtime tuning for Pi-class hardware | β |
| @wa1id | CCTV ingestion fix β threaded SQLite, persistent DB, startup hydration, cluster clickability | #92 |
| @AlborzNazari | Spain DGT + Madrid CCTV sources, STIX 2.1 threat intel export | #91 |
| @adust09 | Power plants layer, East Asia intel coverage (JSDF bases, ICAO enrichment, Taiwan news, military classification) | #71, #72, #76, #77, #87 |
| @Xpirix | LocateBar style and interaction improvements | #78 |
| @imqdcr | Ship toggle split (4 categories) + stable MMSI/callsign entity IDs | β |
| @csysp | Dismissible threat alerts + stable entity IDs for GDELT & News | #48, #63 |
| @suranyami | Parallel multi-arch Docker builds (11min β 3min) + runtime BACKEND_URL fix | #35, #44 |
| @chr0n1x | Kubernetes / Helm chart architecture for HA deployments | β |
This tool is built entirely on publicly available, open-source intelligence (OSINT) data. No classified, restricted, or non-public data is used. Carrier positions are estimates based on public reporting. The military-themed UI is purely aesthetic.
This project is for educational and personal research purposes. See individual API provider terms of service for data usage restrictions.
Built with β and too many API calls