Dateien
Website/CLAUDE.md
UserIsMH f874d1dee0 i18n: Aufraeumen und Doku-Update (Phase 5)
- lagebild.js: tote initLangToggle() und switchContent() entfernt;
  initTranslations()-Aufruf aus init() raus (translations.js gibt es
  nicht mehr). Kein neues Verhalten, nur Aufraeumen.
- CLAUDE.md aktualisiert: en/situations/-Struktur, Slug-Mapping,
  Daten-Freigabe-Konzept, Kontaktformular i18n-Hinweis,
  CHANGE_LOG erweitert.

Backend (contact-form.py) wurde live ausgerollt und ist nicht im
Repo (liegt unter /opt/v2-Docker/aegis-website/), Backup unter
contact-form.py.bak.<timestamp>.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 23:30:24 +02:00

11 KiB

CLAUDE.md - AegisSight Website

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)"

PROJECT: Website STATUS: PRODUCTION URL: https://aegis-sight.de CONTAINER: aegis-website-nginx

COMPANY: name: AegisSight UG (haftungsbeschraenkt) domain: aegis-sight.de email: info@aegis-sight.de

TECHNOLOGY: type: Static Website build_process: NONE deployment: Docker/nginx

frontend: - HTML5 - CSS3 (modular) - JavaScript ES6+ - SVG

features: - multi_language: [DE, EN] - responsive: mobile-first - video_backgrounds: true - cookie_consent: GDPR-compliant - security_headers: enabled

STRUCTURE: root_files: - index.html: Hauptseite (DE) - 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 <html lang> selbststaendig) - cookie-consent.css: Cookie-Banner Styles

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-Icons (SVG)
    flags: Laenderflaggen
    logos: "Logo+Schrift_Rechts.svg"
  videos: "~300MB - Hero-Videos, AFv6.mp4"

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)

js:
  - main.js: Einstiegspunkt
  - components.js: UI-Komponenten
  - animations.js: Animationssystem
  - app.js: Hero-Videos, 3D-Karussell, Leaflet-Karte, Live-Daten, Kontaktformular

docs: Rechtliche PDFs

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)

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

PAGES: homepage: sections: [Hero mit Video, Ueber uns, Loesungen, Kontakt] legal: - /impressum.html bzw. /en/legal-notice.html - /datenschutz.html bzw. /en/privacy.html product: - AccountForger Video-Demo lagen: url_struktur: de: /lagen/{thema}/ en: /en/situations/{slug}/ (slug ist die englische URL-Variante) 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 <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 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

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> selbststaendig lagen: lagebild.js liest <html lang> via curLang(); Daten-Pfad ueber 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/ (~300MB)" 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 an info@aegis-sight.de) rate_limit: 3 Anfragen pro IP / 10 Min

DEPLOYMENT: container: aegis-website-nginx server: nginx (static files) ssl: enabled security_headers: enabled rate_limiting: configured

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/" - "Aufraeumen: 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)"

Last-Updated: 2026-05-06

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">" - "Fuer 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: | cd /opt/v2-Docker/aegis-website-staging/html git checkout develop # Aenderung machen git add . && git commit -m ... git push origin develop 2_staging_aktualisieren_manuell: | ssh claude-dev@46.225.225.49 'cd /opt/v2-Docker/aegis-website-staging/html && git pull' # Kein Container-Reload noetig (statische Files) 3_in_browser_pruefen: https://staging.aegis-sight.de 4_promote_zu_live: | # Auf Gitea: Pull Request develop -> main, dann mergen # Danach auf Live-Server pullen: ssh claude-dev@46.225.225.49 'cd /opt/v2-Docker/aegis-website/html && git pull'

───────────────────────────────────────────────────────────────────

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 noetig.

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 ueber Gitea-Webhook)" "POST /__deploy/live": "live (HMAC ueber 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) Live-Stand 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.

WORKFLOW_KOMPLETT: 1_entwickeln: | git checkout develop # Aenderung 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/