
Open-Source-Tracker für Schattenflotten in der Ostsee. 1200+ Schiffe, Live-AIS, Kabelnähewarnungen. Keine Cloud, kein Abonnement, läuft lokal.
Überwachung der Schattenflotte in der Ostsee mittels Live-AIS-Daten. Beobachtet über 1.200 Schiffe aus dem ukrainischen GUR-Katalog für Krieg und Sanktionen über den AISStream-WebSocket-Feed, zeichnet Positionen auf einer sich selbst aktualisierenden Karte ein, markiert die Nähe zu Unterseekabeln und erkennt Russland↔Westen-Umschlagsmuster.
Kostenlos, Open Source, läuft lokal. Keine Cloud, kein Abonnement außer einem kostenlosen AISStream-API-Schlüssel.
Teil der Former Lab-Werkzeugkette für souveräne Aufklärung.
Shadow Fleet Tracker Light wird vom Former Lab-Team entwickelt und gewartet – souveränes Computing, das offene, datenschutzorientierte Werkzeuge auf alter Hardware ohne VC-Finanzierung baut.
Wenn dieses Werkzeug für Sie nützlich ist, unterstützen Sie uns auf Patreon. Eine kostenlose Stufe ist verfügbar, mit einer 7-tägigen Testphase auf den kostenpflichtigen Stufen. Unterstützen Sie immer die Ukraine!
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 # kostenlos bei aisstream.io
python shadow_tracker.py &
uvicorn webserver:app --host 0.0.0.0 --port 8000
Öffnen Sie http://localhost:8000 – die Karte ist unter /map erreichbar.
Windows-Benutzer: Siehe Abschnitt Setup für die Syntax der Umgebungsvariablen in PowerShell/cmd.
Linux-/macOS-Benutzer können start.sh verwenden. Windows-Benutzer können start.bat oder start.ps1 verwenden – beide öffnen Tracker und Dashboard in separaten Fenstern und starten den Browser automatisch.
Vessels1.db) stammenfiltered_cables.kml)Dunkle CartoDB-Karte mit eingezeichneten Kabelrouten in Grün. Schiffsmarkierungen aktualisieren sich alle 3 Minuten mit einem Live-Countdown bis zur nächsten Aktualisierung – die Seite lädt automatisch neu. Popups zeigen MMSI, IMO, Flagge, Geschwindigkeit, Kurs, Ziel und Deep-Links zu MarineTraffic, VesselFinder und War&Sanctions an. Offener Sanktionsstatus wird angezeigt, wenn ein API-Schlüssel konfiguriert ist.
Bekannte Schiffsnamen aus Vessels1.db werden sofort beim ersten Erscheinen angezeigt, ohne auf eine AIS-Statiknachricht zu warten.
Beim Start wird die Karte mit den letzten 24 Stunden des Positionsprotokolls vorbelegt. Schiffe, die in der aktuellen Sitzung noch nicht gesehen wurden, werden als graue Markierungen mit einem „zuletzt gesehen vor Xh“-Label angezeigt – sie wechseln zu Live-Farben, sobald neue Pings eintreffen.
shadow_tracker.py Hauptprozess – WS-Consumer, Kartenrenderer, DB-Schreiboperationen
loitering_module.py Trödelerkennung und Kartenannotation
transshipment_module.py Hafenanruferkennung und Markierung von Russland↔Westen-Umschlägen
webserver.py FastAPI-Dashboard
gur_scrape.py Einmaliger Scraper – erstellt IMO→GUR-ID-Mapping + vollständigen Schiffskatalog
check.py Vorabprüfungen – Python-Version, Abhängigkeiten, API-Schlüssel, Netzwerk
start.sh Startprogramm für Linux / macOS
start.bat Startprogramm für Windows (Eingabeaufforderung)
start.ps1 Startprogramm für Windows (PowerShell)
requirements.txt Abhängigkeiten
Vessels1.db Beobachtungsliste – über 1.200 Schiffe (MMSI + IMO + Name, wo bekannt)
vessel_data_log.db Positionsprotokoll – Laufzeit, nur Anhängen
vessel_static.db AIS-Statikdaten-Cache (Name, Ziel, Flaggenverlauf)
transshipment.db Hafenanrufprotokoll und Umschlagereignisse
loitering_events.db Trödelereignisse
filtered_cables.kml Geometrie der Ostsee-Unterseekabel
cables.kml Vollständiger Kabeldatensatz (Vorfilterquelle)
gur_mapping.json IMO→GUR-ID-Mapping (erzeugt von gur_scrape.py, optional)
gur_vessels_full.json Vollständiger GUR-Katalog – GUR-ID→{imo, mmsi, name, flag} (erzeugt von gur_scrape.py)
Vessels1.db ist die kanonische Liste der verfolgten Schiffe. Über 1.200 Einträge aus dem ukrainischen GUR-Katalog für Krieg und Sanktionen, die Tanker und Frachtschiffe abdecken, die als Teil der russischen Schattenflotte identifiziert oder an hybrider Aktivität in der Ostsee beteiligt sind.
Die Liste enthält kürzlich von den baltischen Behörden beschlagnahmte oder abgefangene Schiffe:
| Schiff | IMO | Ereignis |
|---|---|---|
| EAGLE S | 9329760 | Von Finnland beschlagnahmt Dez. 2024 – Sabotage des Estlink-2-Kabels, Spionageausrüstung gefunden |
| EVENTIN | 9308065 | Von Deutschland beschlagnahmt Jan.–Mär. 2025 – vor Rügen abgetrieben, 100.000 t russisches Rohöl konfisziert |
| KIWALA | 9332810 | Von Estland festgesetzt Apr. 2025 – flaggenlos, EU/UK sanktioniert |
| JAGUAR | 9293002 | Von Estland abgefangen Mai 2025 – Russland schickte Su-35 zur Eskorte |
| KIRA K | 9346720 | Wagner/GRU-Besatzung im Dez. 2025 bestätigt |
| QENDIL | 9310525 | Wagner/GRU-Besatzung Sep. 2025 – ukrainischer Drohnenangriff Dez. 2025 |
| FITBURG | 9250397 | Von Finnland beschlagnahmt 31. Dez. 2025 – Sabotage des Helsinki-Tallinn-Kabels |
| CAFFA | 9143611 | Von Schweden beschlagnahmt 6. Mär. 2026 – gestohlenes ukrainisches Getreide, falsche Flagge |
| SEA OWL I | 9321172 | Von Schweden beschlagnahmt 12. Mär. 2026 – EU-sanktioniert, falsche Flagge der Komoren |
MMSIs werden anhand aktueller AIS-Daten korrigiert – Schiffe der Schattenflotte wechseln häufig die Flagge. Die Datei update_vessels_2026_03.sql dokumentiert alle Änderungen mit Quellen.
Die Beobachtungsliste ist bewusst offen. Fügen Sie Schiffe direkt in Vessels1.db hinzu, während der Tracker läuft – sie werden innerhalb von 5 Minuten ohne Neustart übernommen.
Linux / macOS:
sqlite3 Vessels1.db "INSERT OR IGNORE INTO vessels (mmsi, imo, name) VALUES ('123456789', '9999999', 'SCHIFFSNAME');"
Windows (kein sqlite3-CLI erforderlich):
import sqlite3
conn = sqlite3.connect("Vessels1.db")
conn.execute("INSERT OR IGNORE INTO vessels (mmsi, imo, name) VALUES ('123456789', '9999999', 'SCHIFFSNAME')")
conn.commit()
conn.close()
Vessels1.db — Beobachtungsliste
vessels(mmsi TEXT PK, imo TEXT, name TEXT, destination TEXT)
vessel_data_log.db — Positionsprotokoll
vessel_data_log(timestamp, mmsi, name, imo, destination, speed, heading, latitude, longitude, cable_alert)
Nur Anhängen. Wird bei jedem Kartenrenderzyklus geschrieben.