# CLAUDE.md - AegisSight Website RELATED_DOCS: COOKIE_CONSENT_IMPLEMENTATION.md: "Cookie-Banner Implementierung, GDPR, Testing" 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 (+ aegis-php-fpm für /insights/) COMPANY: name: AegisSight UG (haftungsbeschränkt) domain: aegis-sight.de email: info@aegis-sight.de TECHNOLOGY: type: Static Website (kein Build-Step) build_process: NONE deployment: Docker (nginx:alpine für statische Files, PHP-FPM für /insights/) frontend: - HTML5 - CSS3 (modular) - JavaScript ES6+ (kein Framework) - SVG - Leaflet 1.9.4 + MarkerCluster (CDN, für Lagebild-Karten) features: - multi_language: [DE, EN] - responsive: mobile-first - 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) - Hero-Slider, Features, Problem, Workflow, Demos, Kontakt, Trust - impressum.html: Impressum (DE) - datenschutz.html: Datenschutz (DE) - 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/: - index.html: Hauptseite (EN) - legal-notice.html: Impressum (EN, Hinweis "German version prevails") - privacy.html: Datenschutz (EN, Hinweis "German version prevails") 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-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 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 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 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 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 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: 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.html: AccountForger Video-Demo, Cookie-/Token-geschützt über Security-Dashboard lagen: url_struktur: de: /lagen/{thema}/ 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. 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 (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 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 Fehler-Texte in der jeweiligen Sprache. Backend (/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/AFv6.mp4 (~93 MB, Git LFS) - videos/hero-slide-{1..5}-monitoring.mp4 design: mobile-first responsive SERVICES: contact-form: script: /opt/v2-Docker/aegis-website/contact-form.py service: aegis-contact.service port: 127.0.0.1:8074 nginx: /api/contact -> 127.0.0.1:8074 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 (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: - "Rebrand: IntelSight -> AegisSight" - "Neues Logo: Logo+Schrift_Rechts.svg" - "Email: info@aegis-sight.de" - "Footer: Dynamisches Jahr, AGB entfernt" 2026-05-06: - "i18n: Sprachumschalter DE/EN, neue Seiten unter /en/" - "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" - "SEO Stufe 1: noindex/nofollow von 12 indexierbaren Seiten entfernt; robots.txt scharf geschaltet (Live-Search-AI-Bots erlaubt, Training-Bots geblockt); sitemap.xml deployt" - "Lagen-Seiten: description, canonical, Open Graph, Twitter Card, Schema.org Article ergänzt; Topic-Default in #incident-title als Crawler-Fallback" Last-Updated: 2026-05-10 RULES: neue_html_seiten: - "Jede neue HTML-Datei MUSS im
folgende Favicon-Tags enthalten:" - "" - "" - "Für Unterverzeichnisse relative Pfade anpassen, z.B. ../favicon.svg" # ─────────────────────────────────────────────────────────────────── # STAGING-UMGEBUNG # ─────────────────────────────────────────────────────────────────── STAGING: url: https://staging.aegis-sight.de server: 46.225.225.49 (gleicher Host wie Live) container: aegis-website-staging-nginx (eigener Docker-Container) pfad: /opt/v2-Docker/aegis-website-staging/html branch: develop netzwerk_ip: 172.18.0.7 (im v2_internal_net) zugriff: Magic-Link-Login an info@aegis-sight.de (Cookie 30 Tage) besonderheit_lagen_daten: erklaerung: | Die Live-Lagen-Daten (/lagen/*/data/*.json) werden vom sync-lagebild.py erzeugt und nicht ins Repo committed. Im Staging-Container ist das Live-/lagen/-Verzeichnis read-only gemountet, damit die Karten-Vorschau auch im Staging mit echten Daten funktioniert. mount_im_compose: /opt/v2-Docker/aegis-website/html/lagen:/usr/share/nginx/html/lagen:ro auth_service: pfad: /opt/v2-Docker/aegis-staging-auth service: aegis-staging-auth.service port: 127.0.0.1:8095 cookie_domain: staging.aegis-sight.de cookie_name: aegis_staging_auth WORKFLOW_STAGING_TO_LIVE: 1_aenderung_in_develop: | # NIE direkt im Live-Verzeichnis arbeiten -> tmp-Klon nutzen git clone