feat(ci): switch GitLab mirror-to-github job to per-repo SSH deploy key (#331)
- feat(ci): switch mirror-to-github job from PAT to per-repo SSH deploy key
GitHub fine-grained PATs are capped at 366 days, classic PATs would need ‘public_repo’ (broader scope than needed). Per-repo SSH deploy keys are tighter:
- Can ONLY push to BigBodyCobain/Shadowbroker (no access to anything else, not even other repos owned by the same account).
- Never expire.
- Rotating == one-click delete on github.com/…/settings/keys.
Changes:
- New CI/CD variable GITHUB_MIRROR_SSH_KEY (File, Protected) holding the ed25519 private half. Public half lives on the repo’s deploy keys with write access enabled.
- mirror-to-github before_script writes the key to ~/.ssh/id_ed25519, pins github.com host fingerprints (ed25519 + ecdsa + rsa from the 2023-03-24 rotation) into ~/.ssh/known_hosts so we never trust a MITM, then pushes via git@github.com:… instead of HTTPS.
- Job rule now gates on GITHUB_MIRROR_SSH_KEY (the new var) instead of GITHUB_MIRROR_TOKEN (which never existed).
After this lands, every commit pushed directly to GitLab main will mirror back to GitHub main automatically — closing the loop on bi-directional sync.
Co-Authored-By: Claude Opus 4.7 noreply@anthropic.com
- fix(secret-scan): exempt SSH known_hosts entries from leaked-key detection
PR #331 introduced github.com host fingerprints pinned in .gitlab-ci.yml’s mirror-to-github before_script. The scanner flagged them as embedded secrets and blocked CI:
BLOCKED: Embedded secrets/tokens found in: .gitlab-ci.yml 133: github.com ssh-ed25519 AAAA… 135: github.com ssh-rsa AAAA…
These are PUBLIC host keys — the whole point of pinning known_hosts is to publish the fingerprint widely so a MITM is detectable. They are documented at https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/githubs-ssh-key-fingerprints and committing them is the correct, secure practice.
Fix: add a KNOWN_HOSTS_LINE regex to the content-scan block that recognizes
<host-or-ip> [salt] <algo> AAAA...shape lines (the exact format used in ~/.ssh/known_hosts) and filters them out before flagging the file. Baressh-rsa AAAA...lines without a host prefix are still caught — only the host-key shape is exempt.Co-Authored-By: Claude Opus 4.7 noreply@anthropic.com
Co-authored-by: Claude Opus 4.7 noreply@anthropic.com
版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9
京公网安备 11010802047560号
🛰️ S H A D O W B R O K E R
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.
Why This Exists
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.
Shodan Connector
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.Interesting Use Cases
⚡ Quick Start (Docker)
From GitHub (default — uses GHCR images)
From GitLab (uses GitLab Container Registry)
Both paths produce identical containers — same source, same CI, same images byte-for-byte. Pick whichever ecosystem you already use.
Open
http://localhost:3000to view the dashboard! (Requires Docker Desktop or Docker Engine)🔄 How to Update
ShadowBroker uses pre-built Docker images — no local building required. Updating takes seconds:
That’s it.
pullgrabs the latest images,up -drestarts the containers.⚠️ Stuck on the old version?
If
git pullfails ordocker compose upkeeps building from source instead of pulling images, your clone predates a March 2026 repository migration that rewrote commit history. A normalgit pullcannot fix this. Run:How to tell if you’re affected: If
docker compose upshowsRUN apt-get,RUN npm ci, orRUN 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 backend☸️ Kubernetes / Helm (Advanced)
For high-availability deployments or home-lab clusters, ShadowBroker supports deployment via Helm. This chart is based on the
bjw-s-labstemplate and provides a robust, modular setup for both the backend and frontend.1. Add the Repository:
2. Install the Chart:
3. Key Features:
Special thanks to @chr0n1x for contributing the initial Kubernetes architecture.
Experimental Testnet — No Privacy Guarantee
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.
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.
✨ Features
🧅 InfoNet — Decentralized Intelligence Mesh + Sovereign Shell (expanded in v0.9.7)
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. Typehelpto see all commands.Sovereign Shell — governance economy (NEW in v0.9.7):
UPDATE_PARAM,BATCH_UPDATE_PARAMS,ENABLE_FEATURE, andDISABLE_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.pyfor ring signatures, stealth addresses, Pedersen commitments, range proofs, and DEX matching. Theprivacy-coreRust crate is the integration target — no caller of the privacy module needs to know which scheme is active.🔍 Shodan Device Search (NEW in v0.9.6)
SHODAN_API_KEY; results rendered as a local investigative overlay🛩️ Aviation Tracking
🚢 Maritime Tracking
🚆 Rail Tracking (NEW in v0.9.6)
🛰️ Space & Satellites
🌍 Geopolitics & Conflict
🛰️ Satellite Imagery
🛰️ SAR Ground-Change Detection (NEW)
sar_pin_click) and fly the operator’s map to any AOI center (sar_focus_aoi) — enabling collaborative analyst workflows.📻 Software-Defined Radio & SIGINT
📷 Surveillance
🔥 Environmental & Hazard Monitoring
🏗️ Infrastructure Monitoring
🌐 Additional Layers & Tools
🤖 Agentic AI Command Channel — OpenClaw + Compatible Agents (expanded in v0.9.7)
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/commandaccepts{cmd, args}and dispatches to any registered tool.POST /api/ai/channel/batchaccepts 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_TIERcontrols which commands the agent can call:restrictedexposes the read-only set,fulladds writes and injection. Discovery endpoint returnsavailable_commandsso 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
ShadowBrokerClientfrom 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.⏱️ Time Machine — Snapshot Playback (NEW in v0.9.7)
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 fullsnapshot_idslist. Jump to any captured timestamp directly from the timeline scrubber.📦 API Keys Panel — Path-First, Read-Only (NEW in v0.9.7)
Settings → API Keys is now a read-only registry. Key values never reach the browser process — not even an obfuscated prefix. The panel surfaces:
.envfile as resolved byPath(__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.exampletemplate so users can copy it and fill in their keys.CONFIGURED/NOT CONFIGUREDbadge 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.
🏗️ Architecture
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.
📊 Data Sources & APIs
🚀 Getting Started
🐳 Docker Setup (Recommended for Self-Hosting)
The repo includes a
docker-compose.ymlthat pulls pre-built images from GitHub Container Registry.Open
http://localhost:3000to view the dashboard.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 composealso requires a Compose provider. If Podman reportslooking up compose provider failed, install one:If you are in a bash-compatible shell, the included wrapper can auto-detect Docker or Podman:
🐋 Standalone Deploy (Portainer, Uncloud, NAS, etc.)
No 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.ymlwith the following content and deploy it directly — paste it into Portainer’s stack editor,uncloud deploy, or any Docker host:📦 Quick Start (No Code Required)
If you just want to run the dashboard without dealing with terminal commands:
.zipfile from the release.start.bat. Mac/Linux: Open terminal, typechmod +x start.sh,dos2unix start.sh, and run./start.sh.Local launcher notes:
start.bat/start.shrun 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, anddocs/mesh/examples/.💻 Developer Setup
If you want to modify the code or run from source:
Prerequisites
pip— python.org (check “Add to PATH” during install)aisstream.io(required), and optionallyopensky-network.org(OAuth2),lta.gov.sgInstallation
Running
This starts:
http://localhost:3000http://localhost:8000Pre-commit (Optional)
If you use pre-commit, install hooks once from repo root:
Local AIS Receiver (Optional)
You 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.
AIS-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.
🎛️ Data Layers
All 37 layers are independently toggleable from the left panel:
🔧 Performance
The platform is optimized for handling massive real-time datasets:
304 Not Modifiedresponses skip redundant JSON parsingsetData()calls📁 Project Structure
🔑 Environment Variables
Backend (
backend/.env)When
MESH_ARTI_ENABLED=trueorMESH_RNS_ENABLED=true, backend startup now fails closed unless the loadedprivacy-coreartifact reports a parseable version at or abovePRIVACY_CORE_MIN_VERSIONand matches one of the hashes inPRIVACY_CORE_ALLOWED_SHA256.Generate the hash from the artifact you intend to ship:
Then confirm authenticated
GET /api/wormhole/statusorGET /api/settings/wormhole-statusshows the sameprivacy_core.version,privacy_core.library_path, andprivacy_core.library_sha256.Frontend
BACKEND_URLenvironmentindocker-compose.yml, or shell envhttp://backend:8000. Runtime variable — no rebuild needed.BACKEND_PORT.envor shell env beforedocker compose up8000; setBACKEND_PORT=8001if port 8000 is already in use. Does not change Docker-internalBACKEND_URL.How it works: The frontend proxies all
/api/*requests through the Next.js server toBACKEND_URLusing 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_URLdefaults tohttp://localhost:8000.🤝 Contributors
ShadowBroker is built in the open. These people shipped real code:
⚠️ Disclaimer
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.
📜 License
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