From a4fed8b04927e3c35546a37c049a6edd99b860c6 Mon Sep 17 00:00:00 2001 From: Claude Dev Date: Fri, 27 Mar 2026 23:19:42 +0100 Subject: [PATCH] docs: CLAUDE.md komplett aktualisiert (NASA GIBS, FIRMS, 3D-Gebaeude, VLM-Fixes, UI-Gruppen) Co-Authored-By: Claude Opus 4.6 (1M context) --- CLAUDE.md | 223 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 173 insertions(+), 50 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 32c49ec..09f6167 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -24,29 +24,160 @@ Inspiriert vom WorldView/God's Eye Konzept, komplett eigenentwickelt. - **Datenbank:** Geteilte SQLite /mnt/gitea/osint-data/osint.db (mit Monitor) - **Auth:** Magic Link Login (JWT, gleicher JWT_SECRET wie Monitor) +## Verzeichnisstruktur + +``` +AegisSight-Globe/ + .env # API-Keys (nicht in Git) + CLAUDE.md # Diese Datei + src/ + main.py # FastAPI-App, Router-Einbindung, Background-Tasks + config.py # DB-Pfad, JWT, SMTP, URLs + database.py # aiosqlite async DB-Dependency + auth.py # JWT create/decode, get_current_user, Cross-Service-Auth + auth_router.py # Magic Link Login (request-link, verify, me) + email_utils.py # Magic Link E-Mail-Versand + data_flights.py # Ziviler Flugverkehr (adsb.lol + adsb.one Fallback) + data_ships.py # Schiffsverkehr (AISStream WebSocket, Dark-Ship-Erkennung) + data_military.py # Militaerflugzeuge (adsb.lol /v2/mil) + data_quakes.py # Erdbeben (USGS GeoJSON) + data_disasters.py # Naturkatastrophen (NASA EONET v3) + data_satellites.py # Satelliten-Orbits (CelesTrak TLE) + data_gdelt.py # Geokodierte Nachrichten (GDELT GEO 2.0) + data_monitor.py # OSINT-Daten vom AegisSight Monitor + data_push.py # Auto-Push: EONET+USGS M4.5+ -> Monitor Lage 45 + data_infra.py # Seekabel, AKWs, Militaerbasen, ISS + data_geoint.py # EXIF-Extraktion, Sonnenstand, Hoehenprofil, Funkmasten + data_vlm.py # VLM-Bildanalyse (Claude Code headless -> Geolocation) + data_overpass.py # Overpass Turbo Queries + Template-Bibliothek + milship_db.py # Militaerschiff-DB (~200 MID-Codes, 17 Marinen) + static/ + index.html # Haupt-App (Auth, Header, Layer-Panel, Bottom Bar) + login.html # Magic-Link Login-Seite + favicon.svg # AegisSight Logo + css/ + globe.css # Taktisches Dark Theme, alle UI-Styles + js/ + app.js # Globe-Objekt: Viewer, Layer-Toggles, Gruppen, Stats + layers/ + flights.js # FlightsLayer (zoom-adaptiv, Grid-Cluster) + ships.js # ShipsLayer (Typfilter, Kurslinien, Dark-Ship) + military.js # MilitaryLayer (rote Punkte + Labels) + quakes.js # QuakesLayer (farbcodiert nach Alter) + disasters.js # DisastersLayer (EONET + USGS + Monitor-Kontext) + firms.js # FirmsLayer (NASA VIIRS Thermal Anomalies 375m) + buildings.js # BuildingsLayer (OSM 3D-Gebaeude, farbcodiert) + satellites.js # SatellitesLayer (Kreisbahnen, Orbitlinien) + gdelt.js # GdeltLayer (orangene News-Punkte) + monitor.js # MonitorLayer (OSINT-Artikel nach Lage) + cables.js # CablesLayer (Seekabel GeoJSON) + infra.js # InfraLayer (AKWs + Militaerbasen) + nightlights.js # NightlightsLayer (NASA VIIRS Black Marble NRT) + celltowers.js # CelltowersLayer (viewport-basiert, Overpass) + iss.js # ISSLayer (Echtzeit-Position) + weather.js # WeatherLayer (RainViewer Regenradar) + terminator.js # TerminatorLayer (Tag/Nacht-Grenze) + timezones.js # TimezonesLayer (24 UTC-Linien) + overpass.js # OverpassLayer (Renderer fuer VLM-Ergebnisse) + visualmodes.js # VisualModes (STD/NVG/FLIR/CRT) + ui/ + vlm.js # VlmUI (Drag&Drop Upload, Analyse, Overpass-Kopplung) + geoint.js # GeointTools (Sonnenstand, Hoehenprofil) + imagery.js # ImagerySwitch (13 Quellen inkl. NASA GIBS) + sidebar.js # Sidebar (rechts, Datenpunkt-Uebersicht) + search.js # SearchUI (Nominatim + City Quick-Links) + crosshairs.js # CrosshairsUI (Fadenkreuz-Overlay) +``` + ## Datenquellen & Layer -| Layer | Quelle | API | Refresh | Menge | -|-------|--------|-----|---------|-------| -| Flugverkehr | adsb.lol | /v2/point/30/0/10000 | 15s | ~10.800 | -| | adsb.one (Fallback) | /v2/point/30/0/10000 | - | ~7.000 | -| Schiffsverkehr | AISStream.io | WebSocket wss://stream.aisstream.io | Echtzeit | ~15.000+ | -| Erdbeben | USGS | earthquake.usgs.gov GeoJSON | 5min | ~50/Tag | -| Katastrophen | NASA EONET | eonet.gsfc.nasa.gov/api/v3 | 10min | ~30-80 aktiv | -| Nachrichten | GDELT | api.gdeltproject.org/v2/geo | 10min | ~200 | -| Satelliten | CelesTrak | celestrak.org TLE JSON | 1h | ~500 | -| Regenradar | RainViewer | api.rainviewer.com | 5min | Radar-Overlay | -| Monitor OSINT | AegisSight Monitor | monitor.aegis-sight.de/api/public | 2min | variabel | +| Layer | Quelle | Refresh | Menge | +|-------|--------|---------|-------| +| Flugverkehr | adsb.lol (Fallback: adsb.one) | 12s | ~10.000+ | +| Militaerflug | adsb.lol /v2/mil | 15s | ~190 | +| Schiffsverkehr | AISStream.io WebSocket | Echtzeit | ~15.000+ | +| Nachrichten | GDELT GEO 2.0 | 60s | ~200 | +| Katastrophen | NASA EONET v3 + USGS | 10min | ~50-100 | +| Feuer (VIIRS) | NASA GIBS WMTS (Thermal Anomalies 375m) | Taeglich | Overlay | +| 3D-Gebaeude | Cesium Ion OSM Buildings | Statisch | Weltweit | +| Satelliten | CelesTrak TLE | 1h | ~500 | +| Seekabel | submarinecablemap.com | 24h | GeoJSON | +| AKWs/Basen | Overpass API | 24h | Punkte | +| ISS | open-notify.org | 5s | 1 | +| Nachtlichter | NASA VIIRS Black Marble NRT | Taeglich | Overlay | +| Funkmasten | Overpass API (viewport-basiert) | On-Demand | Variabel | +| Regenradar | RainViewer | 5min | Overlay | +| Monitor OSINT | AegisSight Monitor API | 2-5min | Nach Lage | ## Satellitenbilder (Imagery Switcher) -| Quelle | URL-Template | Lizenz | -|--------|-------------|--------| -| Cesium Ion | (Default via Ion Token) | Free-Tier / Commercial | -| Esri World Imagery | server.arcgisonline.com/.../tile/{z}/{y}/{x} | Frei fuer Display | -| Sentinel-2 2018-2024 | tiles.maps.eox.at/wmts/.../s2cloudless-{YEAR} | CC-BY (ESA Copernicus) | -| OpenTopoMap | tile.opentopomap.org/{z}/{x}/{y}.png | ODbL | -| OpenStreetMap | a.tile.openstreetmap.org/{z}/{x}/{y}.png | ODbL | +| Quelle | Typ | Update | Auth | +|--------|-----|--------|------| +| Cesium Ion (Standard) | Default Base Layer | - | Ion Token | +| Esri World Imagery | URL-Template | Statisch | Keine | +| NASA MODIS Terra (Heute) | GIBS WMTS REST | Taeglich ~3h | Keine | +| NASA VIIRS SNPP (Heute) | GIBS WMTS REST | Taeglich ~3h | Keine | +| NASA GOES East (Live) | GIBS WMTS REST | ~10-15 Min | Keine | +| NASA GOES West (Live) | GIBS WMTS REST | ~10-15 Min | Keine | +| Sentinel-2 (2018-2024) | EOX WMTS | Jaehrlich | Keine | +| OpenTopoMap | URL-Template | Statisch | Keine | +| OpenStreetMap | URL-Template | Laufend | Keine | + +NASA GIBS Layer nutzen REST-URL mit Datum im Pfad (wie nightlights.js): +`https://gibs.earthdata.nasa.gov/wmts/epsg4326/best/{Layer}/default/{Date}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.{ext}` + +## UI-Architektur + +### Layer-Panel (links, einklappbar) +5 Gruppen mit Auf-/Zuklapp-Funktion und Aktiv-Zaehler: +- **ECHTZEIT** (gruen): Flugverkehr, Militaerflug, Schiffsverkehr +- **INTELLIGENCE** (orange): Nachrichten, Katastrophen, Feuer (VIIRS) +- **GEOINT** (lila): Bildanalyse, Nachtlichter, Funkmasten, Sonne/Hoehe +- **INFRASTRUKTUR** (gelb): Satelliten, Seekabel, AKWs/Basen, ISS, 3D-Gebaeude +- **UMGEBUNG** (blau): Regenradar, Tag/Nacht, Terminatur, Zeitzonen + +Immer sichtbar: Satellitenbilder-Dropdown (oben), Fadenkreuz + Ortsnamen (unten), Koordinaten + +### Bottom Bar +Visual Modes (STD/NVG/FLIR/CRT) links, Stats rechts + +### Rechte Sidebar +Datenpunkt-Uebersicht mit Sections, FlyTo bei Klick, 5s Auto-Update + +## VLM-Bildanalyse + +### Workflow +1. Bild hochladen (Drag&Drop, PNG/JPG/WEBP, max 10MB) +2. Claude Code headless (Sonnet, --json-schema) analysiert das Bild +3. Ergebnis: Szene, Objekte, Terrain, geschaetzte Koordinaten, Landschaftsmerkmale +4. User waehlt Objekte aus -> Overpass-Queries werden generiert +5. OSM-Treffer werden auf dem Globe gerendert + Suchbereich visualisiert + +### Prompt-Regeln +- objects-Array: NUR OSINT-relevante Infrastruktur (Flughaefen, Militaer, Haefen, etc.) +- Generische Natur (forest, mountain, farmland) gehoert in terrain/landscape_clues +- Bei reinen Landschaftsfotos: objects = [] (leeres Array) +- Frontend zeigt "Keine OSINT-relevante Infrastruktur erkannt" und graut Button aus + +### BBox-Aufloesung (Prioritaet) +1. EXIF-GPS (verifiziert) +2. estimated_coordinates mit confidence_radius_km +3. identified_features (Gewaesser, Region -> _REGION_BBOX) +4. estimated_location_type (Kontinent/Region) +5. Weltweit (kein BBox) + +### Overpass-Integration +- Nur ueber VLM erreichbar (kein standalone) +- 30+ OSINT-Templates in 6 Kategorien +- _OBJECT_TO_OVERPASS: ~35 Objekttypen -> OverpassQL-Tags +- Generische Tags (building, highway, landuse) werden gefiltert +- Rate-Limit 10s, Cache 5min, Fallback-Server + +## 3D-Gebaeude + +- Cesium Ion OSM Buildings Tileset (createOsmBuildingsAsync) +- Farbcodiert: Militaer (rot), Industrie (orange), Regierung/Oeffentlich (blau), Rest (grau) +- Toggle in Gruppe INFRASTRUKTUR ## API-Keys & Credentials @@ -58,36 +189,22 @@ Alle in ~/AegisSight-Globe/.env (nicht in Git): - MONITOR_API_KEY — Public API Key des Monitors - DISASTER_INCIDENT_ID=45 — Naturkatastrophen-Lage fuer Auto-Push -## Verzeichnisstruktur - - - ## Bidirektionale Monitor-Verbindung ### Globe -> Monitor (Auto-Push) - data_push.py sendet alle 10min NASA EONET + USGS M4.5+ an Monitor - Ziel-Lage: ID 45 (Naturkatastrophen international) - Duplikat-Check per Headline im Monitor -- Monitor verifiziert und erstellt Zusammenfassung ### Monitor -> Globe (Feed) - /api/public/globe-feed?incident_id=X liefert GeoJSON -- Pro Standort: Ortsspezifische Artikel (Headline, Quelle, Auszug, Datum) - Lage-Auswahl im Globe-Header bestimmt welche Daten angezeigt werden -- Nur aktive Live-Monitorings in der Auswahl - -### Klick-Flow -1. User waehlt Lage im Header (z.B. Naturkatastrophen) -2. Monitor-Standorte erscheinen als rote Punkte auf dem Globus -3. Klick auf Katastrophe zeigt: NASA-Daten + passende Monitor-Artikel -4. Artikel sind ortsspezifisch (Kenia-Klick = Kenia-Artikel, nicht global) ## Auth-System -- Magic Link Login: E-Mail -> 6-stelliger Code per Mail -> JWT +- Magic Link Login: E-Mail -> Link per Mail -> JWT - Prueft: users.is_active=1 UND users.globe_access=1 -- Globe-Zugang wird im Verwaltungsportal per An/Aus-Button gesteuert -- JWT-Tokens: 24h Gueltigkeit, akzeptiert auch Monitor-Tokens +- JWT-Tokens: 24h Gueltigkeit, akzeptiert auch Monitor-Tokens (Cross-Service) - Alle Daten-APIs hinter Auth-Middleware ## Rendering-Architektur @@ -95,10 +212,8 @@ Alle in ~/AegisSight-Globe/.env (nicht in Git): ### Performance - Flugzeuge/Schiffe: PointPrimitiveCollection (GPU-beschleunigt) - Zoom-adaptiv: Cluster bei Uebersicht, Einzelpunkte bei Detail -- Weit (>5.000km): 5-Grad-Raster mit Count-Labels -- Mittel (1.000-5.000km): 2-Grad-Raster -- Nah (<1.000km): Einzelne Punkte - Katastrophen/Satelliten: Entity API (kleinere Mengen) +- 3D-Gebaeude: Cesium3DTileset (Streaming, LOD) ### Visual Modes - STD: Photorealistisch @@ -106,21 +221,29 @@ Alle in ~/AegisSight-Globe/.env (nicht in Git): - FLIR: Thermal (invertiert, Infrarot-Look) - CRT: Retro-Monitor (Scanlines, Vignette) +## Services neustarten + +```bash +sudo systemctl restart globe.service +systemctl status globe.service --no-pager +journalctl -u globe -f # Live-Logs +``` + +## Entwicklungshinweise + +- **CLAUDE.md aktuell halten:** Nach JEDER Aenderung (neue Dateien, Layer, Features, Strukturaenderungen) diese Datei aktualisieren. Sie ist die zentrale Referenz fuer alle Sessions. +- Alle JS-Dateien werden als statische Dateien ausgeliefert (kein Build-Step) +- Cache-Busting: Browser-Cache manuell mit Ctrl+Shift+R leeren +- JS-Syntax pruefen: node --check ~/AegisSight-Globe/static/js/layers/DATEI.js +- Python-Syntax: ~/.venvs/globe/bin/python -c 'import py_compile; py_compile.compile("src/DATEI.py", doraise=True)' +- Inkrementelle Patches vermeiden — bei groesseren Aenderungen Datei komplett neu schreiben +- .env Aenderungen erfordern Service-Restart +- NASA GIBS WMTS: Kostenlos, kein API-Key, kein Rate-Limit, CORS offen + ## Bekannte Limitierungen - Cesium Ion Free-Tier: Nicht fuer kommerziellen Vertrieb (Commercial License noetig) - Satelliten-Positionen: Vereinfachte Kepler-Berechnung (nicht SGP4-exakt) - AISStream: Schiffsdaten brauchen ~1-2min bis globale Abdeckung nach Restart -- OpenSky als Flug-Fallback: Aggressive Rate-Limits (429), daher adsb.lol als Primary - -## Services neustarten - - - -## Entwicklungshinweise - -- Alle JS-Dateien werden als statische Dateien ausgeliefert (kein Build-Step) -- Cache-Busting: Browser-Cache manuell mit Ctrl+Shift+R leeren -- JS-Syntax pruefen: node --check ~/AegisSight-Globe/static/js/layers/DATEI.js -- Inkrementelle Patches vermeiden — bei groesseren Aenderungen Datei komplett neu schreiben -- .env Aenderungen erfordern Service-Restart +- NASA GIBS NRT-Layer: Tagesaktuelle Bilder haben ~3-12h Verzoegerung +- VLM-Bildanalyse: Max 1 gleichzeitig (Semaphore), Timeout 90s