
Tracker open source della flotta ombra del Mar Baltico. 1200+ navi, AIS in tempo reale, avvisi di prossimità ai cavi. Nessun cloud, nessun abbonamento, funziona localmente.
Monitoraggio della flotta ombra del Mar Baltico tramite dati AIS in tempo reale. Osserva oltre 1200 navi dal catalogo War&Sanctions del GUR ucraino confrontandole con il feed WebSocket di AISStream, traccia le posizioni su una mappa auto-aggiornante, segnala la prossimità ai cavi sottomarini e rileva schemi di trasbordo Russia↔Occidente.
Gratuito, open source, funziona localmente. Nessun cloud, nessun abbonamento oltre a una chiave API AISStream gratuita.
Parte della catena di strumenti di intelligence sovrana di Former Lab.
Shadow Fleet Tracker Light è costruito e mantenuto dal team di Former Lab — computing sovrano, costruzione di strumenti aperti e privacy-first su vecchio hardware senza supporto di venture capital.
Se questo strumento ti è utile, considera di supportarci su Patreon. È disponibile un livello gratuito, con una prova di 7 giorni sui livelli a pagamento. Sostieni sempre l'Ucraina!
Blog post sul tracker, screenshot e altro: https://www.patreon.com/posts/153285871
git clone https://github.com/FormerLab/shadow-fleet-tracker-light.git
cd shadow-fleet-tracker-light
pip install -r requirements.txt
export AISSTREAM_API_KEY=your_key_here # free at aisstream.io
python shadow_tracker.py &
uvicorn webserver:app --host 0.0.0.0 --port 8000
Apri http://localhost:8000 — la mappa è su /map.
Utenti Windows: vedi la sezione Setup per la sintassi delle variabili d'ambiente in PowerShell/cmd.
Gli utenti Linux / macOS possono usare start.sh. Gli utenti Windows possono usare start.bat o start.ps1 — entrambi aprono tracker e dashboard in finestre separate e avviano il browser automaticamente.
Vessels1.db)filtered_cables.kml)Mappa di base CartoDB scura con rotte dei cavi sovrapposte in verde. I marcatori delle navi si aggiornano ogni 3 minuti con un conto alla rovescia dal vivo fino al prossimo aggiornamento — la pagina si ricarica automaticamente. I popup mostrano MMSI, IMO, bandiera, velocità, rotta, destinazione e collegamenti diretti a MarineTraffic, VesselFinder e War&Sanctions. Lo stato delle sanzioni OpenSanctions viene mostrato se è configurata una chiave API.
I nomi delle navi noti da Vessels1.db vengono mostrati immediatamente alla prima apparizione senza attendere un messaggio AIS statico.
All'avvio la mappa viene pre-popolata con le ultime 24 ore del registro delle posizioni. Le navi non ancora viste nella sessione corrente vengono mostrate come marcatori grigi con un'etichetta "vista l'ultima volta Xh fa" — passano al colore vivo quando arrivano nuovi ping.
shadow_tracker.py Processo principale — consumatore WS, renderer mappa, scritture DB
loitering_module.py Rilevamento stazionamento e annotazione mappa
transshipment_module.py Rilevamento scali portuali e segnalazione trasbordo Russia↔Occidente
webserver.py Dashboard FastAPI
gur_scrape.py Scraper one-shot — costruisce mappatura IMO→GUR-ID + catalogo completo navi
check.py Controlli preflight — versione Python, dipendenze, chiave API, rete
start.sh Avviatore per Linux / macOS
start.bat Avviatore per Windows (Prompt dei comandi)
start.ps1 Avviatore per Windows (PowerShell)
requirements.txt Dipendenze
Vessels1.db Watchlist — oltre 1200 navi (MMSI + IMO + nome dove noto)
vessel_data_log.db Registro posizioni — runtime, solo append
vessel_static.db Cache dati statici AIS (nome, destinazione, storico bandiere)
transshipment.db Registro scali portuali ed eventi di trasbordo
loitering_events.db Eventi di stazionamento
filtered_cables.kml Geometria cavi sottomarini Mar Baltico
cables.kml Dataset completo cavi (sorgente pre-filtro)
gur_mapping.json Mappatura IMO→GUR-ID (prodotta da gur_scrape.py, opzionale)
gur_vessels_full.json Catalogo GUR completo — GUR-ID→{imo, mmsi, name, flag} (prodotto da gur_scrape.py)
Vessels1.db è l'elenco canonico delle navi tracciate. Oltre 1200 voci provenienti dal catalogo War&Sanctions del GUR ucraino, che copre petroliere e navi da carico identificate come parte della flotta ombra russa o coinvolte in attività ibride nel Baltico.
L'elenco include navi recentemente sequestrate o intercettate dalle autorità baltiche:
| Nave | IMO | Evento |
|---|---|---|
| EAGLE S | 9329760 | Finlandia sequestrata Dic 2024 — sabotaggio cavo Estlink-2, trovata attrezzatura spia |
| EVENTIN | 9308065 | Germania sequestrata Gen-Mar 2025 — alla deriva al largo di Rügen, confiscate 100.000t di greggio russo |
| KIWALA | 9332810 | Estonia fermata Apr 2025 — senza bandiera, sanzionata UE/UK |
| JAGUAR | 9293002 | Estonia intercettata Mag 2025 — Russia ha fatto decollare Su-35 per scortarla |
| KIRA K | 9346720 | Equipaggio Wagner/GRU confermato a bordo Dic 2025 |
| QENDIL | 9310525 | Equipaggio Wagner/GRU Set 2025 — attacco drone ucraino Dic 2025 |
| FITBURG | 9250397 | Finlandia sequestrata 31 Dic 2025 — sabotaggio cavo Helsinki-Tallinn |
| CAFFA | 9143611 | Svezia sequestrata 6 Mar 2026 — grano ucraino rubato, bandiera falsa |
| SEA OWL I | 9321172 | Svezia sequestrata 12 Mar 2026 — sanzionata UE, bandiera Comore falsa |
Gli MMSI sono corretti rispetto ai dati AIS correnti — le navi della flotta ombra cambiano frequentemente bandiera. Il file update_vessels_2026_03.sql documenta tutte le modifiche con le fonti.
La watchlist è intenzionalmente aperta. Aggiungi navi direttamente a Vessels1.db mentre il tracker è in esecuzione — verranno rilevate entro 5 minuti senza riavvio.
Linux / macOS:
sqlite3 Vessels1.db "INSERT OR IGNORE INTO vessels (mmsi, imo, name) VALUES ('123456789', '9999999', 'VESSEL NAME');"
Windows (nessuna CLI sqlite3 necessaria):
import sqlite3
conn = sqlite3.connect("Vessels1.db")
conn.execute("INSERT OR IGNORE INTO vessels (mmsi, imo, name) VALUES ('123456789', '9999999', 'VESSEL NAME')")
conn.commit()
conn.close()
Vessels1.db — watchlist
vessels(mmsi TEXT PK, imo TEXT, name TEXT, destination TEXT)
vessel_data_log.db — registro posizioni
vessel_data_log(timestamp, mmsi, name, imo, destination, speed, heading, latitude, longitude, cable_alert)
Solo append. Scritto a ogni ciclo di rendering della mappa.