πŸ›°οΈ S H A D O W B R O K E R

Global Threat Intercept β€” Real-Time Geospatial Intelligence Platform

--- ![Shadowbroker1](https://github.com/user-attachments/assets/000b94eb-bf33-4e8b-8c60-15ca4a723c68) **ShadowBroker** is a real-time, multi-domain OSINT dashboard that aggregates live data from dozens of open-source intelligence feeds and renders them on a unified dark-ops map interface. It tracks aircraft, ships, satellites, earthquakes, conflict zones, CCTV networks, GPS jamming, and breaking geopolitical events β€” all updating in real time. Built with **Next.js**, **MapLibre GL**, **FastAPI**, and **Python**, it's designed for analysts, researchers, and enthusiasts who want a single-pane-of-glass view of global activity. --- ## Interesting Use Cases * Track private jets of billionaires * Monitor satellites passing overhead * Watch naval traffic worldwide * Detect GPS jamming zones * Follow earthquakes and disasters in real time --- ## ⚑ Quick Start (Docker or Podman) ```bash git clone https://github.com/BigBodyCobain/Shadowbroker.git cd Shadowbroker ./compose.sh up -d ``` Open `http://localhost:3000` to view the dashboard! *(Requires Docker or Podman)* `compose.sh` auto-detects `docker compose`, `docker-compose`, `podman compose`, and `podman-compose`. If both runtimes are installed, you can force Podman with `./compose.sh --engine podman up -d`. Do not append a trailing `.` to that command; Compose treats it as a service name. --- ## ✨ Features ### πŸ›©οΈ Aviation Tracking * **Commercial Flights** β€” Real-time positions via OpenSky Network (~5,000+ aircraft) * **Private Aircraft** β€” Light GA, turboprops, bizjets tracked separately * **Private Jets** β€” High-net-worth individual aircraft with owner identification * **Military Flights** β€” Tankers, ISR, fighters, transports via adsb.lol military endpoint * **Flight Trail Accumulation** β€” Persistent breadcrumb trails for all tracked aircraft * **Holding Pattern Detection** β€” Automatically flags aircraft circling (>300Β° total turn) * **Aircraft Classification** β€” Shape-accurate SVG icons: airliners, turboprops, bizjets, helicopters * **Grounded Detection** β€” Aircraft below 100ft AGL rendered with grey icons ### 🚒 Maritime Tracking * **AIS Vessel Stream** β€” 25,000+ vessels via aisstream.io WebSocket (real-time) * **Ship Classification** β€” Cargo, tanker, passenger, yacht, military vessel types with color-coded icons * **Carrier Strike Group Tracker** β€” All 11 active US Navy aircraft carriers with OSINT-estimated positions * Automated GDELT news scraping for carrier movement intelligence * 50+ geographic region-to-coordinate mappings * Disk-cached positions, auto-updates at 00:00 & 12:00 UTC * **Cruise & Passenger Ships** β€” Dedicated layer for cruise liners and ferries * **Clustered Display** β€” Ships cluster at low zoom with count labels, decluster on zoom-in ### πŸ›°οΈ Space & Satellites * **Orbital Tracking** β€” Real-time satellite positions via CelesTrak TLE data + SGP4 propagation (2,000+ active satellites, no API key required) * **Mission-Type Classification** β€” Color-coded by mission: military recon (red), SAR (cyan), SIGINT (white), navigation (blue), early warning (magenta), commercial imaging (green), space station (gold) ### 🌍 Geopolitics & Conflict * **Global Incidents** β€” GDELT-powered conflict event aggregation (last 8 hours, ~1,000 events) * **Ukraine Frontline** β€” Live warfront GeoJSON from DeepState Map * **SIGINT/RISINT News Feed** β€” Real-time RSS aggregation from multiple intelligence-focused sources * **Region Dossier** β€” Right-click anywhere on the map for: * Country profile (population, capital, languages, currencies, area) * Head of state & government type (Wikidata SPARQL) * Local Wikipedia summary with thumbnail ### πŸ›°οΈ Satellite Imagery * **NASA GIBS (MODIS Terra)** β€” Daily true-color satellite imagery overlay with 30-day time slider, play/pause animation, and opacity control (~250m/pixel) * **High-Res Satellite (Esri)** β€” Sub-meter resolution imagery via Esri World Imagery β€” zoom into buildings and terrain detail (zoom 18+) * **Sentinel-2 Intel Card** β€” Right-click anywhere on the map for a floating intel card showing the latest Sentinel-2 satellite photo with capture date, cloud cover %, and clickable full-resolution image (10m resolution, updated every ~5 days) * **SATELLITE Style Preset** β€” Quick-toggle high-res imagery via the STYLE button (DEFAULT β†’ SATELLITE β†’ FLIR β†’ NVG β†’ CRT) ### πŸ“» Software-Defined Radio (SDR) * **KiwiSDR Receivers** β€” 500+ public SDR receivers plotted worldwide with clustered amber markers * **Live Radio Tuner** β€” Click any KiwiSDR node to open an embedded SDR tuner directly in the SIGINT panel * **Metadata Display** β€” Node name, location, antenna type, frequency bands, active users ### πŸ“· Surveillance * **CCTV Mesh** β€” 2,000+ live traffic cameras from: * πŸ‡¬πŸ‡§ Transport for London JamCams * πŸ‡ΊπŸ‡Έ Austin, TX TxDOT * πŸ‡ΊπŸ‡Έ NYC DOT * πŸ‡ΈπŸ‡¬ Singapore LTA * Custom URL ingestion * **Feed Rendering** β€” Automatic detection & rendering of video, MJPEG, HLS, embed, satellite tile, and image feeds * **Clustered Map Display** β€” Green dots cluster with count labels, decluster on zoom ### πŸ“‘ Signal Intelligence * **GPS Jamming Detection** β€” Real-time analysis of aircraft NAC-P (Navigation Accuracy Category) values * Grid-based aggregation identifies interference zones * Red overlay squares with "GPS JAM XX%" severity labels * **Radio Intercept Panel** β€” Scanner-style UI for monitoring communications ### 🌐 Additional Layers * **Earthquakes (24h)** β€” USGS real-time earthquake feed with magnitude-scaled markers * **Day/Night Cycle** β€” Solar terminator overlay showing global daylight/darkness * **Global Markets Ticker** β€” Live financial market indices (minimizable) * **Measurement Tool** β€” Point-to-point distance & bearing measurement on the map * **LOCATE Bar** β€” Search by coordinates (31.8, 34.8) or place name (Tehran, Strait of Hormuz) to fly directly to any location β€” geocoded via OpenStreetMap Nominatim --- ## πŸ—οΈ Architecture ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ FRONTEND (Next.js) β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ MapLibre GL β”‚ β”‚ NewsFeed β”‚ β”‚ Control Panelsβ”‚ β”‚ β”‚ β”‚ 2D WebGL β”‚ β”‚ SIGINT β”‚ β”‚ Layers/Filtersβ”‚ β”‚ β”‚ β”‚ Map Render β”‚ β”‚ Intel β”‚ β”‚ Markets/Radio β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ REST API (60s / 120s) β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ BACKEND (FastAPI) β”‚ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Data Fetcher (Scheduler) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β”‚ β”‚ OpenSky β”‚ adsb.lol β”‚CelesTrak β”‚ USGS β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Flights β”‚ Military β”‚ Sats β”‚ Quakes β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ β”‚ β”‚ AIS WS β”‚ Carrier β”‚ GDELT β”‚ CCTV β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Ships β”‚ Tracker β”‚ Conflict β”‚ Cameras β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ β”‚ β”‚ DeepStateβ”‚ RSS β”‚ Region β”‚ GPS β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Frontlineβ”‚ Intel β”‚ Dossier β”‚ Jamming β”‚ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- ## πŸ“Š Data Sources & APIs | Source | Data | Update Frequency | API Key Required | |---|---|---|---| | [OpenSky Network](https://opensky-network.org) | Commercial & private flights | ~60s | Optional (anonymous limited) | | [adsb.lol](https://adsb.lol) | Military aircraft | ~60s | No | | [aisstream.io](https://aisstream.io) | AIS vessel positions | Real-time WebSocket | **Yes** | | [CelesTrak](https://celestrak.org) | Satellite orbital positions (TLE + SGP4) | ~60s | No | | [USGS Earthquake](https://earthquake.usgs.gov) | Global seismic events | ~60s | No | | [GDELT Project](https://www.gdeltproject.org) | Global conflict events | ~6h | No | | [DeepState Map](https://deepstatemap.live) | Ukraine frontline | ~30min | No | | [Transport for London](https://api.tfl.gov.uk) | London CCTV JamCams | ~5min | No | | [TxDOT](https://its.txdot.gov) | Austin TX traffic cameras | ~5min | No | | [NYC DOT](https://webcams.nyctmc.org) | NYC traffic cameras | ~5min | No | | [Singapore LTA](https://datamall.lta.gov.sg) | Singapore traffic cameras | ~5min | **Yes** | | [RestCountries](https://restcountries.com) | Country profile data | On-demand (cached 24h) | No | | [Wikidata SPARQL](https://query.wikidata.org) | Head of state data | On-demand (cached 24h) | No | | [Wikipedia API](https://en.wikipedia.org/api) | Location summaries & aircraft images | On-demand (cached) | No | | [NASA GIBS](https://gibs.earthdata.nasa.gov) | MODIS Terra daily satellite imagery | Daily (24-48h delay) | No | | [Esri World Imagery](https://www.arcgis.com) | High-res satellite basemap | Static (periodically updated) | No | | [MS Planetary Computer](https://planetarycomputer.microsoft.com) | Sentinel-2 L2A scenes (right-click) | On-demand | No | | [KiwiSDR](https://kiwisdr.com) | Public SDR receiver locations | ~30min | No | | [OSM Nominatim](https://nominatim.openstreetmap.org) | Place name geocoding (LOCATE bar) | On-demand | No | | [CARTO Basemaps](https://carto.com) | Dark map tiles | Continuous | No | --- ## πŸš€ Getting Started ### 🐳 Docker / Podman Setup (Recommended for Self-Hosting) The repo includes a `docker-compose.yml` that builds both images locally. ```bash 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) ./compose.sh up -d ``` Open `http://localhost:3000` to view the dashboard. > **Deploying publicly or on a LAN?** The frontend **auto-detects** the > backend β€” it uses your browser's hostname with port `8000` > (e.g. if you visit `http://192.168.1.50:3000`, API calls go to > `http://192.168.1.50:8000`). **No configuration needed** for most setups. > > If your backend runs on a **different port or host** (reverse proxy, > custom Docker port mapping, separate server), set `NEXT_PUBLIC_API_URL`: > > ```bash > # Linux / macOS > NEXT_PUBLIC_API_URL=http://myserver.com:9096 docker-compose up -d --build > > # Podman (via compose.sh wrapper) > NEXT_PUBLIC_API_URL=http://192.168.1.50:9096 ./compose.sh up -d --build > > # Windows (PowerShell) > $env:NEXT_PUBLIC_API_URL="http://myserver.com:9096"; docker-compose up -d --build > > # Or add to a .env file next to docker-compose.yml: > # NEXT_PUBLIC_API_URL=http://myserver.com:9096 > ``` > > This is a **build-time** variable (Next.js limitation) β€” it gets baked into > the frontend during `npm run build`. Changing it requires a rebuild. If you prefer to call the container engine directly, Podman users can run `podman compose up -d`, or force the wrapper to use Podman with `./compose.sh --engine podman up -d`. Depending on your local Podman configuration, `podman compose` may still delegate to an external compose provider while talking to the Podman socket. --- ### πŸ“¦ Quick Start (No Code Required) If you just want to run the dashboard without dealing with terminal commands: 1. Go to the **[Releases](../../releases)** tab on the right side of this GitHub page. 2. Download the latest `.zip` file from the release. 3. Extract the folder to your computer. 4. **Windows:** Double-click `start.bat`. **Mac/Linux:** Open terminal, type `chmod +x start.sh`, and run `./start.sh`. 5. It will automatically install everything and launch the dashboard! --- ### πŸ’» Developer Setup If you want to modify the code or run from source: #### Prerequisites * **Node.js** 18+ and **npm** β€” [nodejs.org](https://nodejs.org/) * **Python** 3.10, 3.11, or 3.12 with `pip` β€” [python.org](https://www.python.org/downloads/) (**check "Add to PATH"** during install) * ⚠️ Python 3.13+ may have compatibility issues with some dependencies. **3.11 or 3.12 is recommended.** * API keys for: `aisstream.io` (required), and optionally `opensky-network.org` (OAuth2), `lta.gov.sg` ### Installation ```bash # Clone the repository git clone https://github.com/your-username/shadowbroker.git cd shadowbroker/live-risk-dashboard # Backend setup cd backend python -m venv venv venv\Scripts\activate # Windows # source venv/bin/activate # macOS/Linux pip install -r requirements.txt # includes pystac-client for Sentinel-2 # 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 install ``` ### Running ```bash # From the frontend directory β€” starts both frontend & backend concurrently npm run dev ``` This starts: * **Next.js** frontend on `http://localhost:3000` * **FastAPI** backend on `http://localhost:8000` --- ## πŸŽ›οΈ Data Layers All 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 | | Satellites | βœ… ON | Orbital assets by mission type | | Carriers / Mil / Cargo | βœ… ON | Navy carriers, cargo ships, tankers | | Civilian Vessels | ❌ OFF | Yachts, fishing, recreational | | Cruise / Passenger | βœ… ON | Cruise ships and ferries | | Earthquakes (24h) | βœ… ON | USGS seismic events | | CCTV Mesh | ❌ OFF | Surveillance camera network | | Ukraine Frontline | βœ… ON | Live warfront positions | | Global Incidents | βœ… ON | GDELT conflict events | | GPS Jamming | βœ… ON | NAC-P degradation zones | | MODIS Terra (Daily) | ❌ OFF | NASA GIBS daily satellite imagery | | High-Res Satellite | ❌ OFF | Esri sub-meter satellite imagery | | KiwiSDR Receivers | ❌ OFF | Public SDR radio receivers | | Day / Night Cycle | βœ… ON | Solar terminator overlay | --- ## πŸ”§ Performance The platform is optimized for handling massive real-time datasets: * **Gzip Compression** β€” API payloads compressed ~92% (11.6 MB β†’ 915 KB) * **ETag Caching** β€” `304 Not Modified` responses skip redundant JSON parsing * **Viewport Culling** β€” Only features within the visible map bounds (+20% buffer) are rendered * **Clustered Rendering** β€” Ships, CCTV, and earthquakes use MapLibre clustering to reduce feature count * **Debounced Viewport Updates** β€” 300ms debounce prevents GeoJSON rebuild thrash during pan/zoom * **Position Interpolation** β€” Smooth 10s tick animation between data refreshes * **React.memo** β€” Heavy components wrapped to prevent unnecessary re-renders * **Coordinate Precision** β€” Lat/lng rounded to 5 decimals (~1m) to reduce JSON size --- ## πŸ“ Project Structure ``` live-risk-dashboard/ β”œβ”€β”€ backend/ β”‚ β”œβ”€β”€ main.py # FastAPI app, middleware, API routes β”‚ β”œβ”€β”€ carrier_cache.json # Persisted carrier OSINT positions β”‚ β”œβ”€β”€ cctv.db # SQLite CCTV camera database β”‚ └── services/ β”‚ β”œβ”€β”€ data_fetcher.py # Core scheduler β€” fetches all data sources β”‚ β”œβ”€β”€ ais_stream.py # AIS WebSocket client (25K+ vessels) β”‚ β”œβ”€β”€ carrier_tracker.py # OSINT carrier position tracker β”‚ β”œβ”€β”€ cctv_pipeline.py # Multi-source CCTV camera ingestion β”‚ β”œβ”€β”€ geopolitics.py # GDELT + Ukraine frontline fetcher β”‚ β”œβ”€β”€ region_dossier.py # Right-click country/city intelligence β”‚ β”œβ”€β”€ radio_intercept.py # Scanner radio feed integration β”‚ β”œβ”€β”€ kiwisdr_fetcher.py # KiwiSDR receiver scraper β”‚ β”œβ”€β”€ sentinel_search.py # Sentinel-2 STAC imagery search β”‚ β”œβ”€β”€ network_utils.py # HTTP client with curl fallback β”‚ └── api_settings.py # API key management β”‚ β”œβ”€β”€ frontend/ β”‚ β”œβ”€β”€ src/ β”‚ β”‚ β”œβ”€β”€ app/ β”‚ β”‚ β”‚ └── page.tsx # Main dashboard β€” state, polling, layout β”‚ β”‚ └── components/ β”‚ β”‚ β”œβ”€β”€ MaplibreViewer.tsx # Core map β€” 2,000+ lines, all GeoJSON layers β”‚ β”‚ β”œβ”€β”€ NewsFeed.tsx # SIGINT feed + entity detail panels β”‚ β”‚ β”œβ”€β”€ WorldviewLeftPanel.tsx # Data layer toggles β”‚ β”‚ β”œβ”€β”€ WorldviewRightPanel.tsx # Search + filter sidebar β”‚ β”‚ β”œβ”€β”€ FilterPanel.tsx # Basic layer filters β”‚ β”‚ β”œβ”€β”€ 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 β”‚ β”‚ β”œβ”€β”€ SettingsPanel.tsx # App settings β”‚ β”‚ β”œβ”€β”€ ScaleBar.tsx # Map scale indicator β”‚ β”‚ β”œβ”€β”€ WikiImage.tsx # Wikipedia image fetcher β”‚ β”‚ └── ErrorBoundary.tsx # Crash recovery wrapper β”‚ └── package.json ``` --- ## πŸ”‘ Environment Variables ### Backend (`backend/.env`) ```env # Required AIS_API_KEY=your_aisstream_key # Maritime vessel tracking (aisstream.io) # Optional (enhances data quality) OPENSKY_CLIENT_ID=your_opensky_client_id # OAuth2 β€” higher rate limits for flight data OPENSKY_CLIENT_SECRET=your_opensky_secret # OAuth2 β€” paired with Client ID above LTA_ACCOUNT_KEY=your_lta_key # Singapore CCTV cameras ``` ### Frontend (optional) | Variable | Where to set | Purpose | |---|---|---| | `NEXT_PUBLIC_API_URL` | `.env` next to `docker-compose.yml`, or shell env | Override backend URL when deploying publicly or behind a reverse proxy. Leave unset for auto-detection. | **How auto-detection works:** When `NEXT_PUBLIC_API_URL` is not set, the frontend reads `window.location.hostname` in the browser and calls `{protocol}//{hostname}:8000`. This means the dashboard works on `localhost`, LAN IPs, and public domains without any configuration β€” as long as the backend is reachable on port 8000 of the same host. --- ## ⚠️ Disclaimer This is an **educational and research tool** built entirely on publicly available, open-source intelligence (OSINT) data. No classified, restricted, or non-public data sources are used. Carrier positions are estimates based on public reporting. The military-themed UI is purely aesthetic. **Do not use this tool for any operational, military, or intelligence purpose.** --- ## πŸ“œ 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