# 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 <html lang> selbständig)
    - analytics-events.js: Umami-Custom-Events
    - favicon.svg, de.svg, en.svg, robots.txt, sitemap.xml, llms.txt
    - 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 CSS-Files am 2026-05-10 entfernt

    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 JS-Files am 2026-05-10 entfernt

    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 <html lang> 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 <html lang> selbständig
    lagen: lagebild.js liest <html lang> 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)
    ssr_patch: |
      Modul /opt/v2-Docker/aegis-website/ssr_patch.py (NICHT im Repo).
      Wird am Ende von sync_lage() aufgerufen und patcht die statischen
      Lagen-HTML-Files DE+EN mit aktuellen Live-Daten:
        - <p id="incident-title">: Topic + Stand-Datum (lokalisiert DE/EN)
        - <div id="hero-stats">: 3 Stat-Cards (Artikel/Quellen/Faktenchecks)
        - Schema.org dateModified: aktuelles Datum
      Patches sind ID-basiert und idempotent.
      WICHTIG: Auto-Deploy (git reset --hard) ueberschreibt die SSR-Patches
      im html-Verzeichnis. Nach jedem Promote dauert es bis zum naechsten
      5-min-Sync, bis Crawler wieder den SSR-Content sehen. Fuer Nutzer
      mit JavaScript ist das egal (lagebild.js rendert sowieso identisch).

  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 <html lang>, 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 Quick-Wins: Title-Konsistenz Iran-Konflikt; Meta-Hygiene auf 12 Seiten (robots index/follow + max-image-preview:large, theme-color, author)"
    - "SEO Stufe 2: SSR-Patches der Lagen-HTMLs alle 5 min (sync-lagebild.py + neues ssr_patch.py-Modul). Crawler sehen Topic + Stats + Stand-Datum im HTML statt JS-Shell"
    - "Tech: Self-Hosting Leaflet 1.9.4 + Markercluster 1.5.3 nach assets/vendor/leaflet/ (kein Third-Party-Call mehr); image-Sitemap mit og-image + Logo pro URL"
    - "Performance: Logo PNG -> SVG mit width/height (CLS), loading=lazy auf 25 unter-Fold-Bilder, preconnect zu unpkg (jetzt obsolet, durch Self-Hosting ersetzt)"
    - "3 Lagen-Descriptions auf <=160 Zeichen gekuerzt"
    - "Sitemap mit lastmod-Tag pro URL"
    - "Hauptseite Schema.org erweitert: WebSite + SoftwareApplication (mit featureList und offers)"
    - "Lagen-Seiten Schema.org BreadcrumbList ergänzt (Home -> Topic)"
    - "llms.txt angelegt (Site-Struktur für KI-Crawler)"
    - "Performance: Hero-Slides 2-5 preload=metadata -> none (Slide 1 bleibt auto)"
    - "Repo aufgeräumt: 5 tote CSS-Files in /css/, 7 tote JS-Files in /js/, robots-launch.txt + sitemap-launch.xml entfernt"
    - "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 <head> folgende Favicon-Tags enthalten:"
    - "<link rel=\"icon\" type=\"image/svg+xml\" href=\"/favicon.svg\">"
    - "<link rel=\"apple-touch-icon\" href=\"/assets/images/logos/AegisSightLogo_NavyGold.svg\">"
    - "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 <repo> /tmp/website-work && cd /tmp/website-work
    git checkout develop
    # Änderung machen
    git add . && git commit -m ...
    git push origin develop
  2_staging_aktualisieren_automatisch: |
    # Auto-Deploy pullt automatisch -> kein manueller git pull nötig
    # (Webhook -> /__deploy mit HMAC -> aegis-staging-deploy.service)
  3_in_browser_pruefen: https://staging.aegis-sight.de
  4_promote_zu_live: |
    # Auf deploy.aegis-sight.de "Promote -> Live" klicken
    # Erstellt PR develop->main, mergt ihn auto, triggert Live-Deploy via HMAC

# ───────────────────────────────────────────────────────────────────
# AUTO-DEPLOY + PROMOTE-UI
# ───────────────────────────────────────────────────────────────────

AUTO_DEPLOY:
  prinzip: |
    Gitea-Webhook bei Push auf develop -> Listener-Service auf dem Server pullt
    automatisch + restartet ggf. den Service. Kein manueller git pull mehr nötig.

  listener_service:
    pfad: /opt/v2-Docker/aegis-staging-deploy
    service: aegis-staging-deploy.service
    port: 127.0.0.1:8096
    deployments:
      staging: "develop -> /opt/v2-Docker/aegis-website-staging/html"
      live:    "main    -> /opt/v2-Docker/aegis-website/html"
    endpoints:
      "POST /__deploy":      "staging (HMAC über Gitea-Webhook)"
      "POST /__deploy/live": "live (HMAC über Promote-UI)"
    secrets: in /opt/v2-Docker/aegis-staging-deploy/.env (nicht im Repo)

  gitea_webhook:
    repo: AegisSight/Website
    url: https://staging.aegis-sight.de/__deploy
    branch_filter: develop

PROMOTE_UI:
  url: https://deploy.aegis-sight.de
  pfad: /opt/v2-Docker/aegis-promote
  service: aegis-promote.service
  port: 127.0.0.1:8097
  zugriff: Magic-Link-Login an info@aegis-sight.de (eigener Cookie deploy.aegis-sight.de)
  funktion: |
    Zeigt pro Service (Webseite + Monitor + Verwaltung + Tenders) Live- vs. Staging-Stand.
    Promote-Button erstellt Gitea-PR develop->main, mergt ihn auto, und triggert
    den Live-Deploy via HMAC-signed Webhook am Listener-Service.
    Release-Notes-Vorschlag (Sonnet) editierbar oder leer lassen.

WORKFLOW_KOMPLETT:
  1_entwickeln: |
    # NIE direkt im Live-Verzeichnis arbeiten!
    # Klon in /tmp/<service>-work/ oder lokal nutzen
    git checkout develop
    # Änderung
    git add . && git commit && git push origin develop
    # -> Auto-Deploy pullt in /opt/v2-Docker/aegis-website-staging/html
  2_pruefen_staging:    https://staging.aegis-sight.de/
  3_promoten:           https://deploy.aegis-sight.de/  (Promote-Knopf)
  4_pruefen_live:       https://aegis-sight.de/
