diff --git a/CLAUDE.md b/CLAUDE.md index 78de637..f256938 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -2,142 +2,152 @@ RELATED_DOCS: COOKIE_CONSENT_IMPLEMENTATION.md: "Cookie-Banner Implementierung, GDPR, Testing" - DATENSCHUTZ_ANALYTICS.md: "Textbausteine fuer Datenschutzerklaerung" - PROFESSIONAL_TOOLBOX_CONTENT.md: "Backup-HTML fuer entfernte Produktkarte" - VIDEO_UPLOAD_INSTRUCTIONS.md: "Anleitung fuer manuelle Video-Uploads (Git-Limit)" + DATENSCHUTZ_ANALYTICS.md: "Textbausteine für Datenschutzerklärung" + PROFESSIONAL_TOOLBOX_CONTENT.md: "Backup-HTML für entfernte Produktkarte" + VIDEO_UPLOAD_INSTRUCTIONS.md: "Anleitung für manuelle Video-Uploads (Git-Limit)" + LAUNCH-CHECKLIST.md: "Checkliste für den Launch der überarbeiteten Hauptseite" PROJECT: Website STATUS: PRODUCTION URL: https://aegis-sight.de -CONTAINER: aegis-website-nginx +CONTAINER: aegis-website-nginx (+ aegis-php-fpm für /insights/) COMPANY: - name: AegisSight UG (haftungsbeschraenkt) + name: AegisSight UG (haftungsbeschränkt) domain: aegis-sight.de email: info@aegis-sight.de TECHNOLOGY: - type: Static Website + type: Static Website (kein Build-Step) build_process: NONE - deployment: Docker/nginx + deployment: Docker (nginx:alpine für statische Files, PHP-FPM für /insights/) frontend: - HTML5 - CSS3 (modular) - - JavaScript ES6+ + - JavaScript ES6+ (kein Framework) - SVG + - Leaflet 1.9.4 + MarkerCluster (CDN, für Lagebild-Karten) features: - multi_language: [DE, EN] - responsive: mobile-first - - video_backgrounds: true - - cookie_consent: GDPR-compliant + - hero_video_slider: 5 Slides auf der Startseite (Auto-Play mit Endcard, manuelle Navigation) + - 3d_carousel: Lagen-Showcase auf der Hauptseite, gekoppelt an Leaflet-Karte + - live_data: /lagen/{thema}/data/current.json (alle 5 min synchronisiert) + - cookie_consent: GDPR-konform - security_headers: enabled STRUCTURE: root_files: - - index.html: Hauptseite (DE) + - index.html: Hauptseite (DE) - Hero-Slider, Features, Problem, Workflow, Demos, Kontakt, Trust - impressum.html: Impressum (DE) - datenschutz.html: Datenschutz (DE) - - accountforger-video.html: Produkt-Demo - - robots.txt: SEO-Konfiguration - - sitemap-launch.xml: Sitemap mit hreflang-Alternativen - - cookie-consent.js: GDPR Cookie-System (liest selbststaendig) - - cookie-consent.css: Cookie-Banner Styles + - accountforger-video.html: Geschützte Produkt-Demo (auth_request gegen Security-Dashboard) + - cookie-consent.js, cookie-consent.css: GDPR Cookie-System (liest selbständig) + - analytics-events.js: Umami-Custom-Events + - favicon.svg, de.svg, en.svg, robots.txt, robots-launch.txt, sitemap-launch.xml + - LAUNCH-CHECKLIST.md, DATENSCHUTZ_ANALYTICS.md, COOKIE_CONSENT_IMPLEMENTATION.md, PROFESSIONAL_TOOLBOX_CONTENT.md, VIDEO_UPLOAD_INSTRUCTIONS.md: interne Doku directories: - en: + en/: - index.html: Hauptseite (EN) - legal-notice.html: Impressum (EN, Hinweis "German version prevails") - privacy.html: Datenschutz (EN, Hinweis "German version prevails") - situations: + situations/: - iran-conflict/index.html: Lagebild Iran (EN-Mirror, teilt /lagen/iran-konflikt/data) - cyber-attacks/index.html: Lagebild Cyberangriffe (EN-Mirror, teilt /lagen/cyberangriffe/data) - deepfakes/index.html: Recherche Deepfakes (EN-Mirror, teilt /lagen/deepfakes/data) - assets: - fonts: [Inter, Bebas Neue] - images: - icons: UI-Icons (SVG) - flags: Laenderflaggen - logos: "Logo+Schrift_Rechts.svg" - videos: "~300MB - Hero-Videos, AFv6.mp4" + assets/: + fonts/: Inter, Bebas Neue + images/: icons (UI-SVG), flags (Länderflaggen), logos (Logo+Schrift_Rechts.svg, AegisSightLogo_NavyGold.svg, og-image.png) + videos/AFv6.mp4: AccountForger-Demo, ~93 MB, Git LFS + handshake.svg - css: - - main.css: Kern-Styles - - animations-enhanced.css: Animationen - - mobile.css: Mobile Responsive - - fonts.css: Typografie - - style.css: Light-Mode Styles (index, legal pages, /en/) - - lang-switcher.css: Sprachumschalter-Komponente (DE/EN) + videos/: Hero-Slider-Videos der Startseite + - hero-slide-1-monitoring.mp4: Echtzeit-Monitoring + - hero-slide-2-monitoring.mp4: Faktenprüfung + - hero-slide-3-monitoring.mp4: KI-gestützte Recherche + - hero-slide-4-monitoring.mp4: Globale Quellenabdeckung + - hero-slide-5-monitoring.mp4: Flexibel einsetzbar - js: - - main.js: Einstiegspunkt - - components.js: UI-Komponenten - - animations.js: Animationssystem - - app.js: Hero-Videos, 3D-Karussell, Leaflet-Karte, Live-Daten, Kontaktformular + css/: + aktiv_eingebunden: + - main.css: Kern-Styles + - style.css: Light-Mode Styles (index, legal pages, /en/) + - mobile.css: Mobile Responsive + - fonts.css: Typografie + - lang-switcher.css: Sprachumschalter-Komponente (DE/EN) + legacy_nicht_eingebunden: + - about-modern.css, animations.css, animations-enhanced.css, products-modern.css, section-transitions.css - docs: Rechtliche PDFs + js/: + aktiv_eingebunden: + - app.js: Hero-Slider, Smooth-Scroll, Mobile-Menü, 3D-Karussell, Leaflet-Karte, Live-Daten, Kontaktformular + - config.js: globale Konfiguration + - mobile-nav.js: Mobile-Menü-Helfer + legacy_nicht_eingebunden: + - main.js, components.js, animations.js, animations-enhanced.js, hero-videos.js, legal-pages.js, section-transitions.js - lagen: - iran-konflikt: - - index.html: Lagebild-Seite (Leaflet, Tabs, Timeline) - - lagebild.js: Datenladung, Rendering, Interaktionen - - lagebild.css: Dark-Theme Styling - - data/: current.json + Snapshots (sync alle 5min) + docs/: Legacy-PDFs aus IntelSight-Zeit, von der aktuellen Seite nicht mehr verlinkt + - datenschutzerklaerung_intelsight_de_de.pdf, impressum_intelsight_de_de.pdf, Sitemap_IntelSight_UG.docx - vorschau: - - index.html: Produktseite AegisSight Monitor (Passwort-Gate) - css: - - style.css: Light-Mode Design (Navy/Gold Akzente) - js: - - app.js: Hero-Videos, 3D-Karussell, Leaflet-Karte, Live-Daten, Kontaktformular + downloads/: + af-updates/: AccountForger-Update-Pakete (per Token zugänglich) + + insights/: PHP-Skripte für /insights/ (Container aegis-php-fpm), Datenablage in insights/data/ + + lagen/: + iran-konflikt/: + - index.html, lagebild.css, lagebild.js, data/{current.json, current_en.json, snapshot-N.json} + - HOST der Lagebild-Assets: cyberangriffe und deepfakes binden /lagen/iran-konflikt/lagebild.{css,js} ein + cyberangriffe/: + - index.html (referenziert /lagen/iran-konflikt/lagebild.{js,css}), data/... + deepfakes/: + - index.html (referenziert /lagen/iran-konflikt/lagebild.{js,css}), data/... PAGES: homepage: - sections: [Hero mit Video, Ueber uns, Loesungen, Kontakt] + sections: + - "Hero: 5-Video-Slider mit Auto-Play, Endcard und manueller Navigation (Pfeile + Dots)" + - "Features: Was der Monitor leistet (Echtzeit-Monitoring, Quellenanalyse, Geo, Mehrsprachigkeit, Lagebilder)" + - "Problem: Warum manuelle OSINT-Auswertung nicht skaliert" + - "Solution/Workflow: 3 Schritte (Erfassen, Analysieren, Berichten)" + - "Demos: Live-Stats-Bar + 3D-Karussell (Iran/Cyber/Deepfakes-Cards) + gekoppelte Leaflet-Karte" + - "Kontakt-CTA: öffnet Modal mit Kontaktformular" + - "Trust: Unser Versprechen (Zusammenarbeit, Made in Germany, Partnerschaft, Nachhaltigkeit)" legal: - /impressum.html bzw. /en/legal-notice.html - /datenschutz.html bzw. /en/privacy.html product: - - AccountForger Video-Demo + - /accountforger-video.html: AccountForger Video-Demo, Cookie-/Token-geschützt über Security-Dashboard lagen: url_struktur: de: /lagen/{thema}/ - en: /en/situations/{slug}/ (slug ist die englische URL-Variante) + en: /en/situations/{slug}/ slug_mapping: iran-konflikt: iran-conflict cyberangriffe: cyber-attacks deepfakes: deepfakes daten_freigabe: | EN-Mirror-Seiten setzen window.LAGEBILD_DATA_BASE auf den DE-Pfad, - damit beide Sprachvarianten die gleichen JSON-Daten laden. Das - lagebild.js liest curLang() aus und schaltet UI-Strings - automatisch um (lang.de / lang.en Dictionary). + damit beide Sprachvarianten die gleichen JSON-Daten laden. lagebild.js + liest curLang() aus und schaltet UI-Strings automatisch um + (lang.de / lang.en Dictionary). redirect: /lagebild/ -> 301 -> /lagen/iran-konflikt/ aktiv: - iran-konflikt / iran-conflict: Live-Lagebild Irankonflikt - cyberangriffe / cyber-attacks: Live-Lagebild Cyberangriffe - - deepfakes / deepfakes: Recherche-Briefing Deepfakes - vorschau: - url: /vorschau/ - zweck: Produktseite AegisSight Monitor (ersetzt spaeter die Hauptseite) - auth: JavaScript SHA-256 Passwort-Gate (kein Benutzername) - design: Light-Mode, Navy/Gold Akzente, SVG-Wellen/Diagonale Divider - sections: [Hero mit Video (clip-path Chevron), Problem (dark), Workflow 3-Schritte, Live-Stats, 3D-Karussell mit Lagebild-Text, Leaflet-Karte (gekoppelt an Karussell), Faktenprüfung-Statement, Features (5 Cards zentriert), CTA, Unser Versprechen] - daten: Fetcht /lagen/iran-konflikt/data/summary.json (~116 KB) - karussell: 3D-Perspektive, 3 Cards (Iran live + 2 Platzhalter), Karte wechselt mit - karte: Leaflet mit Pulse-Markern, Dark Popups/Legende, gekoppelt an aktive Lage - kontaktformular: Popup-Modal (Name, Organisation, E-Mail, Nachricht) -> /api/contact -> SMTP - icons: monitor.svg + languages.svg (Lucide) hinzugefuegt + - deepfakes / deepfakes: Recherche-Briefing Deepfakes (rechtliche Lage in DE) DEVELOPMENT: i18n: ansatz: statische Duplikate (DE unter /, EN unter /en/) sprachumschalter: css/lang-switcher.css pendant_urls: in jeder Seite hardcoded (funktioniert ohne JS) - cookie_banner: cookie-consent.js liest selbststaendig - lagen: lagebild.js liest via curLang(); Daten-Pfad ueber + cookie_banner: cookie-consent.js liest selbständig + lagen: lagebild.js liest via curLang(); Daten-Pfad über window.LAGEBILD_DATA_BASE pro EN-Mirror-Seite kontaktformular: | Frontend (js/app.js) sendet lang im POST-Body, zeigt Sende- und @@ -145,7 +155,9 @@ DEVELOPMENT: (/opt/v2-Docker/aegis-website/contact-form.py, NICHT im Repo) liest lang und antwortet entsprechend; E-Mail an info@aegis-sight.de bleibt deutsch, mit Hinweis "[EN]" im Betreff bei EN-Anfragen. - large_files: "assets/videos/ (~300MB)" + large_files: + - assets/videos/AFv6.mp4 (~93 MB, Git LFS) + - videos/hero-slide-{1..5}-monitoring.mp4 design: mobile-first responsive SERVICES: @@ -154,15 +166,34 @@ SERVICES: service: aegis-contact.service port: 127.0.0.1:8074 nginx: /api/contact -> 127.0.0.1:8074 - zweck: Kontaktformular-Handler (SMTP an info@aegis-sight.de) + zweck: Kontaktformular-Handler (SMTP via IONOS an info@aegis-sight.de) rate_limit: 3 Anfragen pro IP / 10 Min + i18n: lang im POST-Body steuert Fehler-/Erfolgsmeldungen, [EN]-Tag im Betreff + + sync-lagebild: + script: /opt/v2-Docker/aegis-website/sync-lagebild.py + cron: alle 5 Minuten via /home/claude-dev/run-sync-lagebild.sh + quelle: https://monitor.aegis-sight.de/api/public (X-API-Key) + ziel: /opt/v2-Docker/aegis-website/html/lagen/{slug}/data/ + übersetzung: claude-haiku-4-5 (Title, Description, Summary, Latest-Developments, Faktenchecks Batches à 30) + cache: data/{slug}/translation_cache.json (md5(text) als key) + lagen_konfiguriert: iran-konflikt (incident_id 6, legacy_endpoint), deepfakes (55), cyberangriffe (58) + + insights: + container: aegis-php-fpm (172.18.0.6) + zweck: PHP-Backend für /insights/ (Analytics-Datenablage) + volumes: ./insights:/var/www/insights:ro, ./insights/data:/var/www/insights/data:rw DEPLOYMENT: - container: aegis-website-nginx - server: nginx (static files) - ssl: enabled - security_headers: enabled - rate_limiting: configured + container: aegis-website-nginx (172.18.0.5) + server: nginx:alpine, read-only Filesystem, no-new-privileges, cap_drop ALL + ssl: Host-nginx mit Let's Encrypt (Reverse-Proxy auf den Container) + security_headers: /etc/nginx/snippets/security-headers.conf + rate_limiting: konfiguriert für Kontaktformular und /usage/api/widget/ + besonderheiten: + - "Lagen-JSON: 60 s Browser-Cache mit must-revalidate (ETag-Validierung)" + - "/accountforger-video.html + assets/videos/AFv6.mp4: auth_request gegen Security-Dashboard (8050), bei Ablehnung 302 zu /?showAuth=1" + - "/analytics-und-so/datenblick.js: verschleierter Pfad gegen Adblocker (proxied auf Umami)" CHANGE_LOG: 2026-01-08: @@ -172,20 +203,25 @@ CHANGE_LOG: - "Footer: Dynamisches Jahr, AGB entfernt" 2026-05-06: - "i18n: Sprachumschalter DE/EN, neue Seiten unter /en/" - - "Aufraeumen: js/translations.js, impressum-en.html, datenschutz-en.html entfernt" + - "Aufräumen: js/translations.js, impressum-en.html, datenschutz-en.html entfernt" - "data-translate Attribute aus Lagen-Seiten entfernt" - "EN-Lagen-Seiten unter /en/situations/{slug}/, teilen DE-Datenfiles" - "lagebild.js: curLang() liest , dataBase()-Helper neu, tote initLangToggle/switchContent entfernt" - "Kontaktformular zweisprachig (Frontend + Backend)" + 2026-05-10: + - "Doku-Cleanup: /vorschau/ entfernt (alte Vorab-Produktseite, längst durch index.html mit Hero-Slider und Live-Demos ersetzt)" + - "STRUCTURE: aktive vs. legacy CSS/JS getrennt, videos/, downloads/, insights/, accountforger-video.html, weitere Top-Level-Files ergänzt" + - "Lagen-Layout: cyberangriffe und deepfakes binden Lagebild-CSS/JS aus iran-konflikt ein (zentrale Assets)" + - "SERVICES: sync-lagebild und insights ergänzt" -Last-Updated: 2026-05-06 +Last-Updated: 2026-05-10 RULES: neue_html_seiten: - "Jede neue HTML-Datei MUSS im
folgende Favicon-Tags enthalten:" - "" - "" - - "Fuer Unterverzeichnisse relative Pfade anpassen, z.B. ../favicon.svg" + - "Für Unterverzeichnisse relative Pfade anpassen, z.B. ../favicon.svg" # ─────────────────────────────────────────────────────────────────── # STAGING-UMGEBUNG @@ -217,19 +253,19 @@ STAGING: WORKFLOW_STAGING_TO_LIVE: 1_aenderung_in_develop: | - cd /opt/v2-Docker/aegis-website-staging/html + # NIE direkt im Live-Verzeichnis arbeiten -> tmp-Klon nutzen + git clone