llama-server (kein Ollama) · via LiteLLM :4444 + SSH-Tunnel · llama-swap :9090 lädt on-demand- 001 Qwen3-Coder-Next 80B-A3B ★
- 002 Qwen3.8-27B Q6 (Vision, no-think)
- 003 Mistral Small 4 · 004 Gemma 4 26B
- 006 Muse Glimmer 30B (Vision) ★
- 101 Sonnet 4.6 ↵ · 102 Sonnet 5.0 · 103 Opus 4.8 · 104 Haiku 4.5
- 105/106 DeepSeek V4 Flash/Pro (Fallback)
- 107 GPT-5.5 (OpenAI API)
- 108-112 NVIDIA NIM (DeepSeek ★, Nemotron 120B/49B, GLM-5.2, MiniMax M3)
- 201 Sonnet 4.6 (komplex)
- 202 Haiku 4.5 (schnell, günstig)
- 203 Qwen3 235B (Boilerplate)
- 204 DeepSeek V4 Flash · hostyourai.com EU (Anthropic-API)
Aktive Projekte
cld (claude-start.sh).
Tier 1 (DEV): automatischer Fallback DeepSeek V4 bei Pro-Contingent-Erschöpfung.
| Tier | Umgebung | cld-Option | Provider | Kosten |
|---|---|---|---|---|
| Tier 0a | Lokal Mac (Offline) | VS Code direkt | Ollama lokal | €0 |
| Tier 0 | EVO-X2 / NucBox (on-prem) | 001-004, 006 | llama-server (NucBox) via LiteLLM :4444 | €0 (Strom) |
| Tier 1 | DEV (Max Sub · Fake-Daten) | 101 ↵ (Default) | Max OAuth → Fallback DeepSeek | ~$20/Monat |
| Tier 1 · NVIDIA | DEV · Cloud GPU (Fake-Daten) | 107-112 | OpenAI GPT-5.5 / NVIDIA NIM (nvapi-Key) | Token-Kontingent |
| Tier 2 | PROD (Bedrock, echte Daten) | 201-203 | AWS Bedrock Frankfurt (eu-central-1) | ~$3/$15 pro 1M |
VS Code + Continue.dev + Ollama. Kein Internet benötigt. 100% privat.
| Modell | Größe | Einsatz |
|---|---|---|
| qwen3-coder:30b | 18 GB | Code, Chat, Apply |
| deepseek-coder-v2:16b | 8.9 GB | Code, Chat, Apply |
| gemma4:12b | 7.6 GB | Chat, Zusammenfassungen |
| devstral:24b | 14 GB | Code-Generierung |
| qwen2.5-coder:14b | 9 GB | Tab-Autocomplete |
NucBox EVO-X2 als lokaler LLM-Host · Zugriff via cld → 001-004, 006. Bei Fremdnetz automatisch Jump über Hetzner (Reverse-Tunnel :2223, s. Lokales Setup). On-prem EU → GDPR-gleichgestellt mit Bedrock. Seit 18.08.: alle lokalen Modelle laufen über einen Endpunkt llama-swap :9090 (ein SSH-Tunnel statt einer pro Modell). llama-swap lädt/swappt on-demand GTT-sicher via Groups: primary (Coder/Qwen3.8/Mistral/Muse — genau ein Hauptmodell resident, swap) + companion (Gemma-Safety-Klassifikator, persistent → koexistiert mit jedem Hauptmodell). Ersetzt das frühere Default-Duo + systemd-Conflicts=. claude-start.sh = ein local-Block (620→410 Zeilen); qwen38(002)/mistral(003) weiter über grammar-fix-proxy (Tool-Schema-Patch) → :9090. Denselben :9090-Endpunkt nutzen Open WebUI (mobil via WireGuard-VPN) und der local-vision-Skill. Seit 15.08.: DeepSeek V4 lokal entfernt (GPU-Crash ab ~40k ctx), Option 002 = Qwen3.8-27B Q6 (no-think, Vision). voice-qwen.service läuft separat (nicht Teil von llama-swap).
| cld | Modell | Port | Einsatz |
|---|---|---|---|
| 001 ★ | Qwen3-Coder-Next 80B-A3B | llama-swap :9090 | Schwere Code-Tasks · Group primary (ctx 180k) |
| 002 | Qwen3.8-27B Q6 | llama-swap :9090 (via grammar-fix-proxy) | Reasoning + Vision (no-think, ctx 64k, ~16 Tok/s, ~26 GB) · ersetzt DeepSeek V4 lokal (15.08.) |
| 003 | Mistral Small 4 119B-A6B | llama-swap :9090 (via grammar-fix-proxy) | Coaching / Text · Group primary (verdrängt anderes Hauptmodell, ctx 131k) |
| 004 | Gemma 4 26B MoE | llama-swap :9090 | Group companion (persistent) · Safety-Klassifikator, koexistiert mit jedem Hauptmodell |
| 006 ★ | Muse Glimmer 30B | llama-swap :9090 | 131k Kontext, Vision+Speculative Decoding · Group primary |
Läuft direkt via Claude Max Subscription (OAuth) — kein Proxy. Der DEV-Modus unsetet alle ANTHROPIC_* und beendet einen etwaigen LiteLLM auf :4445.
Codes: 101 Sonnet 4.6 ↵ · 102-104 Sonnet 5.0/Opus 4.8/Haiku 4.5 (--model $DEV_MODEL) · 105/106 DeepSeek-Fallback · 107 GPT-5.5 · 108-112 NVIDIA NIM. Fallback DeepSeek via settings.json fallbackModel. Nur Fake-Daten!
unset ANTHROPIC_* · Fallback: DeepSeek V4 (settings.json)
Claude über AWS Bedrock Frankfurt (eu-central-1). Drei Modell-Optionen im cld-Menü. DSGVO-konform, volle Tool-Nutzung (SSH, Playwright).
| cld-Option | Modell | Provider | Einsatz |
|---|---|---|---|
| 201 | Claude Sonnet 4.6 | Bedrock (eu.anthropic.claude-sonnet-4-6) | Standard, komplexe Tasks |
| 202 | Claude Haiku 4.5 | Bedrock (eu.anthropic.claude-haiku-4-5) | Schnell, günstig |
| 203 | Qwen3 235B | Bedrock via LiteLLM (:4444) | Boilerplate, günstig |
| 204 | DeepSeek V4 Flash | hostyourai.com (EU, Anthropic-API · deepseek-ai/DeepSeek-V4-Flash) | Coding · EU-Hosting, AVV nach Art. 28 nötig |
CLAUDE_CODE_USE_BEDROCK=1 muss über claude-start.sh gesetzt werden,
nicht in settings.json — sonst überschreibt es ANTHROPIC_BASE_URL (LiteLLM-Konflikt).
NVIDIA NIM API via config-nvidia.yaml · Optionen 108-112 in claude-start.sh · nvapi-Key erforderlich
config-museglimmer.yaml. config-nvidia.yaml selbst zeigt (Stand dieser Doku) noch nicht korrigiert auf dieses Modell: Option 108 und der 110-Alias (GLM-5.2, der als Platzhalter auf DeepSeek-Flash zeigt) sind damit vermutlich funktionsunfähig. Ungeprüft, ob korrigiert — vor Nutzung curl-Test gegen 108, sonst 109 Nemotron-120B nehmen (bestätigt funktionsfähig).
| cld-Option | Modell | Einsatz |
|---|---|---|
| 108 | DeepSeek V4 Flash | Coding, schnell · ⚠️ Backend evtl. EOL (410), prüfen |
| 109 ★ | Nemotron-120B | Reasoning / große Aufgaben — verifiziert funktionsfähig |
| 110 | GLM-5.2 | ZhipuAI-Endpoint timeoutet auf NIM · Alias-Platzhalter zeigt auf DeepSeek-Flash (⚠️ evtl. EOL, s.o.) |
| 111 | MiniMax-M3 | Multimodal |
| 112 | Nemotron-49B | Balanced Performance |
GMKTEC NucBox EVO-X2 als on-prem GPU-Host für die lokalen Tier-0-Modelle (Qwen3-Coder, Qwen3.8, Mistral, Gemma, Muse — via llama-swap :9090) und das PII-Tooling (GDPR Data Cleaner). On-prem EU → datenschutzrechtlich mit Bedrock gleichgestellt, kein Netztransfer.
Steht die NucBox in einem Fremdnetz (kein direkter Route zum LAN, Port 22 tot), läuft der Zugriff über einen Reverse-Tunnel, den die Box zum Hetzner-Server offen hält. SSH-Alias in ~/.ssh/config:
Ablauf: Mac → SSH auf Hetzner (n8n.c-stone-dev.com) → Hetzner leitet auf 127.0.0.1:2223 (Reverse-Tunnel-Endpunkt der Box) → NucBox-SSH.
claude-start.sh testet beim Start erst direkt 192.168.50.124 (4 s); scheitert das, fällt es automatisch auf den Alias nucbox (Jump via Hetzner, 8 s) zurück und setzt NUCBOX_IP=nucbox — alle nachfolgenden -L-Tunnel (llama-swap :9090, SearXNG :8080, grammar-fix-Ziel :8082 …) laufen dann über den Jump.
| Extension | Funktion | Tier |
|---|---|---|
| Continue.dev | Chat, Code-Vervollständigung, Tab-Autocomplete — verbindet Ollama + Bedrock | Tier 0+1 |
| Cline (saoudrizwan) | Autonomer KI-Agent in VS Code, Tool-Nutzung | Tier 1+2 |
| GitHub Copilot Chat | GitHub-integrierter KI-Assistent | Optional |
Entwicklung
- ✓ Python 3 (inkl. venv)
- ✓ Node.js + npm
- ✓ Git
- ✓ Docker Desktop
- ✓ Playwright Python (Chromium)
KI & Automatisierung
- ✓ Ollama (lokale Modelle)
- ✓ Claude Code CLI
- ✓ AWS CLI (Bedrock-Zugriff)
- ✓ SSH-Schlüssel (Hetzner)
- ✓ Nextcloud Desktop Client
├── projekte/ ← Alle aktiven Projekte
│ ├── AI-Executive-Navigator/
│ ├── C-Stone-CRM/
│ ├── Royal-Rangers-Camp-Manager/
│ ├── dasprogramm-lead-manager/
│ ├── AZAV-Karrierecoaching/ (lokal, kein Sync)
│ ├── C-Stone-KI-Check/
│ ├── AVGS-Homepage/
│ └── Base Project/
├── vorlagen/ ← Wiederverwendbare Templates
├── dokumentation/ ← Systemdokumente
└── .claude/ ← Claude Code + Clowdex Config
Verwaltet alle Modelle (lokal + Cloud) zentral in ~/.continue/config.yaml
local-ai-context.md
development-rules.md
Systemarchitektur
Ollama · Docker Desktop
Playwright (Chromium)
Hetzner Deutschland
Sync via Desktop Client
Claude Haiku 4.5
Qwen3 235B
Devstral 123B
DeepSeek V3 (Stockholm)
CRM-Daten, Leads
API Token-Zugriff
Self-hosted · Hetzner
17 Repos · SSH-Auth · Backup tägl.
Redis (Caching)
Alembic Migrations
- Docker Container: n8n_n8n_1
- Gateway IP: 172.18.0.1
- File Access: /home/node/.n8n-files/
- Verbindung zu SeaTable über Flask-Service
- ✅ 100% DSGVO-konform
- ✅ AWS Bedrock Frankfurt (EU)
- ✅ Hetzner Deutschland
- ✅ Keine Datenweitergabe an US-Server
- ✅ Nextcloud self-hosted (EU)
- ✅ SeaTable EU-hosted
Für deprecated/problematische APIs: Python Flask Service als Wrapper zwischen n8n und externen APIs
Services laufen als Systemd-Services mit Auto-Restart · Zugriff von n8n über Gateway IP 172.18.0.1
Jedes Projekt hat zwei Docker-Compose-Dateien — eine für lokale Entwicklung, eine für Produktion auf dem Hetzner-Server.
DEV — docker-compose.yml
- ✓ Ports direkt exponiert (8000, 3000, 5432)
- ✓ Hot Reload (--reload / Vite Dev Server)
- ✓ Volume-Mount für Live-Code-Änderungen
- ✓ Lokale PostgreSQL/Redis ohne Netzwerk-Isolation
PROD — docker-compose.prod.yml
- ✓ Caddy/Traefik Reverse Proxy (SSL)
- ✓ Keine Ports nach außen exponiert
- ✓ Health Checks · Auto-Restart
- ✓ Isolierte Docker-Netzwerke
Deploy via deploy.sh (rsync → docker build --no-cache → Container-Neustart) · Planungs-Gate vor PROD-Änderungen beachten
Dateien
- memory.md → Aktiver Kontext (zuerst lesen)
- knowledge-base.md → Systemregeln
- Task Board.md → Aufgaben
- Scratchpad.md → Schnellnotizen
Session-Verhalten
- ✓ Automatischer /start bei neuer Session
- ✓ Memory bleibt über Sessions erhalten
- ✓ Knowledge Base wird bei Regeln angewandt
- ✓ Glob-Check:
findstatt*/SKILL.md
Liegt unter .claude/.claude/ im jeweiligen Projekt-Ordner, wird per /start//sync//end-day-Skills gepflegt, syncet über Nextcloud mit.
Zusätzlich zu Clowdex führt Claude Code selbst ein zweites, unabhängiges Gedächtnis — nicht projekt-lokal, sondern an den Ordnerpfad des Arbeitsverzeichnisses gebunden. Claude legt es selbstständig an und pflegt es, ohne dass ein Skill es aufruft.
Ort & Struktur
~/.claude/projects/<pfad-hash>/memory/- MEMORY.md → Index, immer geladen
- Eine Datei pro Thema,
name:/description:/type:-Frontmatter - 4 Typen: user / feedback / project / reference
Verhalten
- ✓ Claude schreibt/liest selbstständig, kein Skill-Aufruf nötig
- ✓ Läuft parallel zu Clowdex, nicht als Ersatz gedacht
- ✓ Punktuelle Momentaufnahmen — Datei-Alter wird beim Lesen markiert
- ✓ Stand 12.08.: 24 Dateien, aktivste Themen NucBox/LLM & Setup-Doku
Beide Systeme sind derzeit parallel aktiv und überschneiden sich inhaltlich teilweise (z. B. NucBox-Setup, NVIDIA-Modelle) — bislang keine Abstimmung, welches System führend ist. Offen zu klären mit Markus.
Betriebsplanung, Anbaumanagement
KI-Implementierung, Prompt Engineering
Projektkalkulation, Arbeitssicherheit
Strategie, Marktanalyse
Texterstellung, Blog, Landingpages
Onboarding, Retention
Pen-Tests, Security-Architektur
Analyse, Visualisierung, BI
Markenidentität, UX/UI
Code-Qualität, Testing, CI/CD
Shop, Conversion-Optimierung
Kurse, Workshops
Kampagnen, Automatisierung
Energiemanagement, Nachhaltigkeit
Modellierung, Budgetierung
Coaching, Operations
Gastronomie, Lebensmittel
Patientenkommunikation
Recruiting, Performance
Verträge, Compliance
Kampagnen, Zielgruppen
Publishing, Redaktion
Fundraising, Förderanträge
Prozesse, Projektplanung
Produktstrategie, Roadmaps
Zeitmanagement, Entscheidungen
Immobilien, Marktanalyse
Vertrieb, Pipeline
Keyword-Recherche, On-Page
Plattform-Inhalte
Businessplan, Fundraising
Reiseplanung, Hotellerie
cld (Alias für ~/claude-start.sh).
Das Skript fragt Modell, startet ggf. LiteLLM (nur Qwen3), dann Projekt-Auswahl, dann Claude Code.
Default (Enter) = DEV Stack — Max Subscription (OAuth), kein Proxy.
| Code | Modell | Backend / Port | Env / Commit-Tag |
|---|---|---|---|
| ── Tier 0: Lokal (EVO-X2 / NucBox, on-prem EU) — via LiteLLM :4444 ── | |||
| 001 ★ | Qwen3-Coder-Next 80B-A3B (MoE) | NucBox llama-swap :9090 | BASE_URL=localhost:4444 · config-local.yaml · [local-qwen] |
| 002 | Qwen3.8-27B Q6 (~26 GB, no-think, Vision) | NucBox :9090 (grammar-fix-proxy) | LiteLLM :4444 · [local-qwen38] |
| 003 | Mistral Small 4 119B-A6B | NucBox :9090 (grammar-fix-proxy) | LiteLLM :4444 · [local-mistral] |
| 004 | Gemma 4 26B MoE (QAT) | NucBox llama-swap :9090 | LiteLLM :4444 · [local-gemma] |
| 006 ★ | Muse Glimmer 30B (Vision+Speculative) | NucBox llama-swap :9090 | LiteLLM :4444 · [local-museglimmer] |
| ── Tier 1: DEV — Max Subscription (nur Fake-Daten!) ── | |||
| 101 ↵ | Claude Sonnet 4.6 (Standard, Default) | Max OAuth | ANTHROPIC_* unset · [dev-s46] |
| 102 / 103 / 104 | Sonnet 5.0 / Opus 4.8 / Haiku 4.5 | Max OAuth | --model $DEV_MODEL (claude-sonnet-5 / claude-opus-4-8 / claude-haiku-4-5) |
| 105 / 106 | DeepSeek V4 Flash / Pro (Fallback) | Max OAuth · settings.json | [dev-dsf] / [dev-dsp] |
| 107 | ChatGPT GPT-5.5 | OpenAI API · LiteLLM :4444 | [dev-gpt5] |
| 108 | DeepSeek V4 Flash (Coding) | NVIDIA NIM (Cloud) | Fake-Daten · [dev-nim-ds] · ⚠️ Backend evtl. EOL seit 07.08. (410), prüfen |
| 109 ★ | Nemotron 120B | NVIDIA NIM (Cloud) | Fake-Daten · [dev-nim-n120] — verifiziert funktionsfähig |
| 110-112 | GLM-5.2 / MiniMax M3 / Nemotron 49B | NVIDIA NIM (Cloud) | Fake-Daten · [dev-nim-*] |
| ── Tier 2: PROD — AWS Bedrock Frankfurt (eu-central-1) ── | |||
| 201 | Sonnet 4.6 (komplex) | Bedrock · eu.anthropic.claude-sonnet-4-6 | CLAUDE_CODE_USE_BEDROCK=1 · [prod-s46] |
| 202 | Haiku 4.5 (schnell, günstig) | Bedrock · eu.anthropic.claude-haiku-4-5 | CLAUDE_CODE_USE_BEDROCK=1 · [prod-h45] |
| 203 | Qwen3 235B (günstig) | Bedrock · qwen.qwen3-235b | bedrock/converse · [prod-qwen] |
| 204 | DeepSeek V4 Flash (Coding) | hostyourai.com · EU · deepseek-ai/DeepSeek-V4-Flash | Anthropic-API direkt · [prod-hyai-dsf] · AVV Art. 28 nötig |
CSTONE_VAULT_DIR, SOPS_AGE_KEY_FILE, PATH-Prefix — keine Secret-Werte in die Session. Tier 0 & Tier 1 zeigen „NUR Fake-Daten"-Warnung. Nur Tier 2 PROD (201-203) und die lokale Tier-0-Lane (on-prem, kein Netztransfer) dürfen echte/personenbezogene Daten verarbeiten.
VS Code + Continue.dev + Ollama.
Kein Internet nötig.
100% privat, €0.
Nicht über cld.
Modelle: qwen3-coder:30b,
deepseek-coder-v2:16b, gemma4:12b
Max Subscription (OAuth).
Kein Proxy — direkte Verbindung.
101 Sonnet 4.6 (↵) · 103 Opus 4.8.
Fallback: DeepSeek (settings.json).
Nur für Fake-/DEV-Daten!
cld → Enter (Default = 101)
AWS Bedrock Frankfurt.
201: Sonnet 4.6 (Standard).
202: Haiku 4.5 (schnell).
203: Qwen3 235B (Bedrock).
GDPR-konform · echte Daten erlaubt.
cld → Option 201-203
- ✓ Apps laufen in der Cloud — NIE lokal starten (außer DEV Stack)
- ✓ Planungs-Gate — vor Edit/Write in Produktiv-Projekten Token setzen
- ✓ DSGVO — keine personenbezogenen Daten über GitHub (US-Server)
- ✓ Git commit — nach jeder inhaltlichen Änderung
- ✓ Context-Hygiene — /flush bei Überlast, neue Session bei Messages > 50%
192.168.50.124), sonst Jump über den persistenten Hetzner-Reverse-Tunnel (hetzner-tunnel.service, systemd, Restart=always). Fremdnetz-tauglich.127.0.0.1 gebunden (kein LAN-Zugriff, CSA-08).dsgvo-guard (fail-closed): blockt im DEV-Modus jeden Pfad-Zugriff mit „DSGVO" im Namen; erlaubt nur bei CLAUDE_CODE_USE_BEDROCK=1 (PROD eu-central-1).CSTONE_VAULT_DIR + PATH gesetzt — keine Secret-Werte in der Session. secrets-guard.sh blockt sops -d/env-Dumps/echo $SECRET.restart: unless-stopped (Projekt-Steckbriefe Punkt 5 zeigen Ausnahmen).cstone-core-link/.cstone-ai via LiteLLM (Haiku/Sonnet) · Nextcloud · n8n-Netz.restart: unless-stopped alle 4 Services · healthcheck für database+cstone-ai · Named Volumes generisch (kein Projekt-Präfix) · kein /health.3000 + frontend 8090 auf 0.0.0.0 · DB/Cache nicht exponiert (ok) · Auth JWT+bcrypt · Secrets .env.- ☐ Ports 3000/8090 hinter Reverse-Proxy legen
- ☐ Volume-Naming mit Projekt-Präfix
- ☐ PDF-Generierung umsetzen (geplant)
FIELD_ENCRYPTION_KEY (Fernet), Redis requirepass, DB/Redis ohne Host-Port (prod), CORS eng, TLS via Caddy, DSGVO-Retention./health · restart: unless-stopped alle · healthchecks prod vollständig (pg/redis/backend/frontend). ⚠️ Redis prod ohne Volume (JWT-Blacklist flüchtig bei Recreate).- ☐ Redis-Persistenz (Named Volume) in prod
- ☐ Default-Admin-Passwort rotieren
- ☐ Domain-Bezeichnung README vs. Compose vereinheitlichen
- ☐ n8n-Workflow-Import / Go-Live-Verifikation
- ☐ Backend-Feinschliff
chatbot-proxy.php) · Apache (.htaccess) · FTPS-Deploy · Logik via n8n + SeaTable.<link> (US) → abmahnbar; nicht self-hosted. Cookie-Banner + Datenschutz vorhanden. AI-Calls Bedrock eu-central-1, Formulardaten SeaTable/n8n (EU)..htaccess: HTTPS-Redirect, X-Frame-Options, X-Content-Type, Referrer-Policy · HSTS auskommentiert · Formular ohne sichtbaren CSRF/Spam-Schutz.- ☐ Google Fonts self-hosten
- ☐ n8n-Workflows aktivieren
- ☐ HSTS scharf schalten
markus/c-stone-homepages gelöscht (API-Delete verifiziert, HTTP 204/404).fte_mapping_log.json + Output-Excel..env.example) · AWS-Zugang über bestehendes Profil · minimale Angriffsfläche.COL_MAP/SOURCES im Script anpassen.- ☐ Bedienhinweis: pro neuer Datei COL_MAP/SOURCES im Script anpassen (kein Bug)
ENCRYPTION_KEY). Hinweis: Images von ghcr.io (US) — ohne Personenbezug, aber gegen „kein GitHub“-Regel.restart: unless-stopped alle 4 Services · healthchecks für alle (via override) · Named Volumes vorhanden.changeme, AWS-Keys als Env statt Vault..claude/production-Marker (Plan-Gate inaktiv), leere README, ghcr→EU migrieren.- ☐ .claude/production-Marker setzen
- ☐ README füllen
- ☐ ghcr.io → EU-Registry migrieren
- ☐ DB-Default changeme ersetzen
- ☐ AWS-Keys in Vault
restart: unless-stopped alle · healthcheck nur postgres · Named Volumes ohne Projekt-Präfix (weicht von Regel ab)..env.- ☐ Monitoring/Logging ergänzen
- ☐ CV-Template-Editor
- ☐ Bewerbungshistorie/Versionierung
- ☐ GitHub-Actions-CI → Forgejo migrieren
- ☐ Secrets in Vault
- ☐ Volume-Naming mit Präfix
n8n_default-Netz · analyser.c-stone-dev.com.restart: always alle · healthcheck nur db (pg_isready), backend/frontend ohne · Named Volume vorhanden.- ☐ Echten Web-Scraper statt Simulation
- ☐ HTML-/PDF-Export
- ☐ Tests
- ☐ AWS-Keys aus Klartext-Env in Vault
/api/usage + Kosten-Seite).restart: unless-stopped alle · healthcheck pg+redis + depends_on: service_healthy · Named Volumes mit name: vorhanden.changeme als Compose-Fallback · Auth aktuell deaktiviert (MVP).research.c-stone-nx.com). Modell real = eu.anthropic.claude-sonnet-4-6 (Sonnet 5 = AccessDenied, IAM-User ohne Model-Access). 5 Root-Cause-Fixes: lifespan/DB-Tabellen, Modell-Switch, top_p raus, boto read_timeout 600s, nginx /api 600s. Offen: Sonnet 5 in Bedrock-Console freischalten → Rückwechsel + Preise 2/10; Auth aktivieren (deferred), SearXNG-Web-Recherche (deferred).- ☐ AWS-Creds + Bedrock-Model-Access (sonnet-5, eu-central-1), dann Deploy
- ☐ Repo auf Forgejo anlegen + Push
- ☐ Auth aktivieren (MVP-Login aus)
- ☐ Default-Secrets changeme ersetzen
.env-Secrets und Graph-API-Zugriff auf Mandanten-Daten; keine explizite Bedrock/Regionsangabe, kein dokumentierter DSGVO-Vermerk.restart: always statt unless-stopped alle 5 · healthcheck pg/redis/backend, nicht frontend/mesh · Named Volumes vorhanden.rmm_user/rmm_pass · Deploy nach /root · MeshCentral ohne Healthcheck.unless-stopped, DB-Creds härten, kein Marker, leere README.- ☐ restart: always → unless-stopped
- ☐ DB-Default-Creds (rmm_user/rmm_pass) härten
- ☐ .claude/production-Marker setzen
- ☐ README füllen
- ☐ Healthcheck für Frontend + MeshCentral
- ☐ Content-Feinschliff (SPF-Thema gelöst)
restart-Policy bei irgendeinem Service (Regel verletzt) · kein healthcheck · Named Volume vorhanden · manueller docker network connect nach Neustart nötig.postgres/postgres, dasprogramm-Login im Klartext in .env.- ☐ restart-Policy + Healthchecks ergänzen (Regel-Verstoß)
- ☐ Manuellen docker-network-Reconnect automatisieren
- ☐ projectManagerId-API-Bug (Playwright-Workaround bleibt)
- ☐ .claude/production-Marker
data/results.json, keine DB) · Port nur an 127.0.0.1.restart: unless-stopped (1 Service) · kein healthcheck · Bind-Mount ./data (keine DB — unkritisch)..env · HTML-Escaping gescrapter Felder gegen Injection (behoben).- ☐ Healthcheck ergänzen
- ☐ Deployment-Domain klären
- ☐ .claude/production-Marker
restart: unless-stopped nur Frontend — backend + db OHNE (Reboot-Risiko) · kein healthcheck · Named Volumes (postgres-data + invoice-storage).postgres/postgres hardcodiert.- ☐ backend + db restart-Policy ergänzen (Reboot-Risiko)
- ☐ DB-Passwort postgres/postgres härten
- ☐ IMAP mit echten Credentials live testen
localhost:4444/v1 (Qwen3) · kein docker-compose..claudeignore sperrt output/archive/failed/json..env nur LLM-Parameter, keine echten Secrets · keine Auth (Single-User).pip install, Docling-OCR-Test, NucBox-LLM-Test, E2E, Docker-Deploy, Git-Push (Permission-Blocker).- ☐ pip install -r requirements.txt
- ☐ Docling-OCR-Test (echte Dokumente)
- ☐ NucBox-LLM-Test (Port 4444)
- ☐ E2E (PDF/DOC/XLS → JSON → Export)
- ☐ Docker-Setup fürs Deployment
- ☐ Git-Push (Permission-Blocker)
Persistent=true (verpasste Läufe nachgeholt) · degradiert still auf Regex/spaCy wenn LLM weg (kein harter Ausfall) · Fehler → failed/.- ☐ LangExtract-Timeout-Bug (presidio #1942) Workaround/Monkeypatch
- ☐ Modell-/IP-/Scheduler-Divergenz memory vs. Repo verifizieren
.gitignore mitigiert.- ☐ Laufende Session-Vorbereitung (kein Code-Backlog)
/ schreibbar) · self-hosted Fonts (Hauptseite) · kein Framework/Backend. Seit 16.08.: eigenes Forgejo-Repo c-stone-bhw-schwesig-homepage, lokale Struktur bereinigt (Rohfoto-Dump + Alt-Entwürfe git-historisiert statt lose im Ordner).datenschutz.html+impressum.html laden noch Google Fonts → Rest-Risiko. Cookie-Banner vorhanden, Formular via n8n (EU).pwd geleakt → rotieren · FTPS-Deploy (verschlüsselt) · Formular → n8n-Webhook · Cache-Control gesetzt. 16.08.: Legacy-zp-server/-Backend mit hartcodiertem API-Key (gitleaks-Fund beim Repo-Setup) aus Git ausgeschlossen — Key-Rotation-Status noch zu klären, nur gitignored bisher.index.html war vor Session-Start auf alte Vorumbau-Version zurückgefallen (Quelle: falscher lokaler Ordner) — aus Upload Homepage aktuell/ wiederhergestellt + deployed. Offen: FTP-PW rotieren, SSL-Cert erneuern (dringend), danach Sitemap in Search Console.- ☐ FTP-Passwort rotieren (14.08. geleakt) → Vault bhw-schwesig updaten
- ☐ SSL-Zertifikat erneuern (DRINGEND — abgelaufen)
- ☐ Google Fonts auf datenschutz.html + impressum.html lokalisieren
- ☐ Sitemap in Google Search Console einreichen
- ☐ FTZ-Bildauswahl kuratieren
.htaccess (www→non-www 301, HTTPS) · Deploy via Strato WebFTP..htaccess erzwingt HTTPS + www-Redirect · tote Links vor Deploy bereinigt · TLS-Status live unbekannt.- ☐ Echte Ziel-URLs + Karriere-Fotos ergänzen
- ☐ Vita-Zahlen final prüfen
@media print für PDF-Export · Logo freigestellt (Weiß→transparent).presentation.c-stone.info per DNS-A-Record direkt auf Hetzner (178.105.81.60), ausgeliefert über bestehenden Caddy-Reverse-Proxy (/root/n8n/docker-compose.yml, Mount /root/presentation:/srv/presentation).n8n-caddy-1 (restart: always). Statische Datei, kein Health-Endpoint nötig.- ☐ Markus: Firmenpräsentation final freigeben
- ☐ Optional: Forgejo-Remote einrichten
n8n_default · presentation-maker.c-stone-nx.com..env nur auf EU-Server (Hetzner).restart: unless-stopped alle 4 · ❌ keine healthcheck-Blöcke · Named Volumes (presentation-maker-pgdata+uploads), Redis ohne Volume.ALLOW_REGISTRATION=false → 403) · Rate-Limit 5/min auf /token+/register · HSTS aktiv · nginx proxyt auf eindeutigen presentation-maker-backend (Namenskollision im shared Netz vermieden) · .env Klartext auf Server.- ☐ Prod: Mandanten + Vorlagen anlegen, Bedrock-Generierung end-to-end testen
- ☐ Dediziertes Nextcloud-App-Passwort in Vault (statt Admin-Cred in .env)
- ☐ Healthchecks ergänzen
- ☐ README füllen · Redis-Persistenz klären
generate.py) erzeugt data.json · statisches index.html via python3 -m http.server 8765 · kein Backend/Docker..env mit Hetzner-Robot-Creds · main per Pre-Push-Hook geschützt (Feature-Branch + PR).- ☐ Keine echten Blocker (laufende Datenquellen-Erweiterung)
memory-curator-Skill global installiert · /curate Command · /end-day Step 6b gepatcht · /memories/search Semantic-Search-Endpoint · 20 Infra-Facts ingested.restart: unless-stopped auf allen Containern (qdrant, mem0-stack-mem0-1). GET /health → {"status":"ok"}.- ☐ Ollama-LAN-Bind absichern (Firewall auf 172.18.0.1, optional)
.gitignore ausgeschlossen.- ☐ Quelldokumente ablegen
- ☐ Analyse in PROD-Bedrock durchführen
- ☐ Phase 3: Priorisierung / Owner / Deadlines
- ☐ Bei Web-Veröffentlichung: Hosting/Domain/DSGVO-Formularprüfung
audit/initial-audit.md · Standards DSGVO, OWASP Top 10 · Tools gitleaks, pip-audit, pre-commit.- ☐ checklists/ und docs/ befüllen (aktuell leer)
/project-start Schritt 3 (cp -r) Startpunkt für JEDES neue Projekt. Am 13.08.2026 additiv um den bis dahin ungenutzten _TEMPLATE-Inhalt angereichert..gitignore mit DSGVO-Sperrzone-Block · .env.example mit Secret-Vault-Verweis · generate-fake-data.py/seed-db.py (DEV-Fake-Data-Pattern) · fake-data/..gitignore blockt DSGVO-Sperrzone/data-real/kundendaten explizit, .env.example verweist auf with-secrets.sh/Vault statt Klartext-Secrets.project-start.md Schritt 5 wurde 13.08. angepasst, damit es die mitkopierten .gitignore/.env.example nicht mehr mit einer älteren Variante überschreibt..bak-Backups vor jedem größeren Update./end-day aktualisiert.google_ads_client.py (GAQL, Manager-Skip) · analyzer.py (Bedrock Sonnet 4.5, plattform-agnostisch) · main.py (Orchestrierung) · creative_generator.py (RSA-Anzeigentexte für 5 Academy-Kurse, Zeichenlimits geprüft) · meta_ads_client.py (geplant) · Markdown-Reports unter proposals/ · Modus PROPOSE.google-ads + boto3) · AWS Bedrock eu-central-1 (Sonnet 4.5) · Cron auf Hetzner täglich 06:30 → Report → Mail via msmtp. Deploy unter /root/c-stone-marketing/ (src + venv + .env)..env(600) auf Server, nie im Klartext/Chat.30 6 * * * → run.sh (kein Docker). Log: /root/c-stone-marketing/cron.log. End-to-End auf Server verifiziert (Report + Mail zugestellt 12.08.).with-secrets.sh c-stone-marketing (Modus A). Server: root-only .env(chmod 600) mit 7 Whitelist-Keys, befüllt via scripts/deploy_env.sh — kein Master-age-Key auf Server (Blast-Radius klein).- ☑ Google Ads Basic Access + End-to-End-Report (live)
- ☑ Cron-Deployment Hetzner + Mail-Zustellung (msmtp)
- ☑ RSA-Creative-Generator (5 Academy-Kurse)
- ☑ 2 KI-Search-Kampagnen (Arbeitsalltag + führen) via API angelegt + live
- ☑ Conversion-Tag-Fix AVGS-Landingpage (deployt via STRATO)
- ☐ KI-Workflows-Kampagne anlegen (wartet auf Landingpage von Markus)
- ☐ Meta: Dev-Konto-Verify (Markus, „Rechner nicht bekannt") → App + System-User-Token → meta_ads_client.py
docker compose (restart:unless-stopped), whisper/piper/agent via nohup (kein Auto-Restart). Systemd-Services stehen auf Todo-Liste.- Forgejo-Repo
voice-agent-cstoneanlegen + git push - Browser WebRTC Test (LiveKit Playground lokal)
- systemd Services für whisper_server, piper_server, agent (NucBox)
- Vault-Stand prüfen: Secrets 08-10→08-11 evtl. verloren
- Phase 2: WireGuard NucBox↔Hetzner + Caddy TURN
- Phase 3: sipgate SIP-Trunk + AVV
Ursache (belegt): RAM-Starvation durch On-Server-Build — nicht Caddy.
Ergebnis: 222 MB → 5.3 GB verfügbarer RAM. OOM-Risiko eliminiert. CI/CD verlagert Builds vom Server.
| Metrik | Vorher | Nachher |
|---|---|---|
| Server-Typ | CPX22 2 CPU · 4 GB RAM | CPX32 4 CPU · 8 GB RAM |
| RAM belegt | 3.5 / 3.7 GiB (95%) | 2.3 / 7.6 GiB (30%) |
| RAM available | 222 MiB | 5.3 GiB |
| Swap | 0 B | 2 GiB (0 B aktiv) |
| OOM-Kills (24h) | 2 (OpenWebUI python3) | 0 |
| Memory Limits | Keine (28 Container unbegrenzt) | Alle Container limitiert |
| Plattenbelegung | 61 GB / 75 GB (85%) | 25 GB / 75 GB (35%) |
| OpenWebUI | 649 MB RAM (nicht mehr genutzt) | Entfernt |
| Laufende Container | 28 | 27 |
fallocate -l 2G /swapfile → mkswap → swapon → /etc/fstab
| Container | Limit | Reservation | Tatsächlicher Verbrauch |
|---|---|---|---|
| litellm | 768 MB | 384 MB | 576 MB |
| n8n | 512 MB | 256 MB | 130 MB |
| Backend-Container (je) | 256 MB | 128 MB | 50-112 MB |
| PostgreSQL-Container (je) | 512 MB | 256 MB | 15-110 MB |
| Redis / Frontend | — (minimal) | — | <15 MB |
docker update --memory <limit> --memory-swap <limit> --memory-reservation <reserv> <container>Dauerhaft in docker-compose:
deploy: resources: limits: memory: 256M in jeden Service.
docker build --no-cache bei Deploys alterte der Cache schnell.
docker builder prune -a -f
change_server_type Action durchgeführt.
Automatischer Stop → Typ-Wechsel → Start.
| Ressource | CPX22 (Alt) | CPX32 (Neu) | Delta |
|---|---|---|---|
| CPU Kerne | 2 | 4 | +2 |
| RAM | 4 GB | 8 GB | +4 GB |
| Festplatte | 75 GB | 75 GB | — |
| Kosten | ~5 €/Monat | ~8 €/Monat | +3 €/Monat |
restart: unless-stopped.
docker compose up -d --build auf dem Server baute Images lokal.
Der Build-Prozess saturierte CPU/RAM/IO → OOM-Killer tötete benachbarte Container während des Builds.
↓
GitHub Actions Workflow
├─ docker build → ghcr.io/cstone-mkr/*:latest
├─ docker push (Registry)
└─ SSH: docker compose pull + up -d --no-deps
↓
Server: Nur Pull + Restart, kein Build mehr
| Projekt | GitHub Repo | Workflow | Images (ghcr.io) |
|---|---|---|---|
| AI-Office-Manager | cstone-mkr/c-stone-ai-office-manager | .github/workflows/deploy.yml | c-stone-ai-office-manager-{backend,frontend} |
| Bewerbungsmanager | cstone-mkr/c-stone-bewerbungsmanager | .github/workflows/deploy.yml | c-stone-bewerbungsmanager-backend |
| Royal Rangers | cstone-mkr/royal-rangers-camp-manager | .github/workflows/deploy.yml | royal-rangers-camp-manager-{backend,frontend} |
--build auf pull + up -d --no-deps umgestellt.
Caddy reload bleibt erhalten (kein Restart).
| Projekt | Alte Zeile | Neue Zeile |
|---|---|---|
| AI-Office-Manager | docker compose up -d --build |
docker compose pull && docker compose up -d --no-deps |
| Bewerbungsmanager | docker compose up -d --build |
docker compose pull && docker compose up -d --no-deps backend |
| Royal Rangers | docker build --no-cache ... && docker run ... |
Via CI/CD: docker pull ghcr.io/... && docker tag && docker run |
image: existiert, fällt compose bei fehlendem Build-Kontext auf Pull zurück.
curl-API.
VIgXOaAZkzrB09pDTHZC38Qsfw1bZeBzrMIhqrmAHSPwP6Qokqcw39Ty2OtL0S82
https://api.hetzner.cloud/v1/servers⚠️ Dieser Token gewährt vollen API-Zugriff (Read/Write) auf alle Ressourcen des Hetzner-Projekts.
⚠️ Gespeichert als GitHub Secret
SSH_PRIVATE_KEY ist der SSH-Deploy-Key, nicht dieser API-Token.
| # | Maßnahme | Status | Wirkung |
|---|---|---|---|
| 1 | Swap 2 GB | Aktiv | OOM-Puffer bei RAM-Spitzen |
| 2 | OpenWebUI entfernt | Erledigt | -649 MB RAM |
| 3 | Memory Limits | Aktiv | Kein Container killt Nachbarn |
| 4 | Build Cache geleert | Erledigt | +22 GB Platte |
| 5 | Server CPX22 → CPX32 | Aktiv | +4 GB RAM + 2 CPU |
| 6 | CI/CD GitHub Actions | 3/7 Projekte | Build verlagert → kein Server-Load |
| 7 | Deploy-Scripts umgestellt | 3/3 | Pull statt Build auf Server |
- Offen CI/CD für AI-Executive-Navigator, C-Stone Business Analyser, C-Stone-CRM, C-Stone-Presentation-Maker
-
Offen Memory Limits dauerhaft in docker-compose.yml verankern (
deploy.resources.limits) - Offen rr-camp-frontend "unhealthy" untersuchen (bereits vor Optimierung)
- Offen Caddy-cron für automatischen Cert-Renewal prüfen (Caddy macht das selbst via ACME)
Microsofts quelloffener Code-Editor. Läuft lokal auf dem Mac. Basis für alle KI-Erweiterungen (Continue, Cline). Der zentrale Arbeitsplatz für Code schreiben, testen und debuggen.
- Code schreiben & bearbeiten
- Integriertes Terminal
- Git-Integration (Diff, Commit)
- Erweiterungen (Continue, Cline)
- Debugging (Breakpoints, Inspector)
- Multi-Root Workspaces
Open-Source VS Code Extension, die als einheitliche Oberfläche für verschiedene KI-Modelle dient.
Konfiguriert in ~/.continue/config.yaml.
Verbindet Ollama (lokal) und AWS Bedrock (Cloud) gleichzeitig.
- Chat mit KI direkt im Editor
- Tab-Autocomplete (qwen2.5-coder:14b)
- Code-Edit & Apply (inline)
- Modell-Wechsel per Klick
- Globale Context-Dateien einlesen
- Prompt-Caching (Bedrock)
VS Code Extension (saoudrizwan.claude-dev), die einen vollständig autonomen KI-Agenten im Editor bereitstellt. Kann Dateien lesen/schreiben, Terminal-Befehle ausführen und Browser öffnen — alles mit Bestätigung.
- Multi-Step-Aufgaben autonom
- Dateien lesen, schreiben, erstellen
- Terminal-Befehle ausführen
- Browser-Automatisierung
- MCP-Server einbinden
- Codebase durchsuchen & verstehen
Anthropics offizielles Terminal-Tool. Läuft im zsh-Terminal, nutzt Claude Sonnet 4.6 via AWS Bedrock. Hat Zugriff auf das gesamte Dateisystem, Terminal, SSH und MCP-Tools. Das mächtigste Tier des Setups — verwaltet auch den Hetzner-Server direkt.
- Vollständige Projekte entwickeln
- SSH auf Hetzner-Server
- Docker-Container verwalten
- Playwright-Browser steuern
- Git-Commits & Deployments
- Clowdex-Skills ausführen
- Autonome Multi-Step-Workflows
Tool zum lokalen Betreiben von Open-Source-KI-Modellen. Läuft als Dienst im Hintergrund auf dem Mac, stellt eine REST-API bereit. Keine Internetverbindung nötig, keine Cloud-Kosten, vollständige Datenprivatsphäre.
- devstral:24b (14 GB) — Code
- qwen3-coder:30b (18 GB) — Code
- qwen2.5-coder:14b (9 GB) — Autocomplete
- deepseek-coder-v2:16b (8.9 GB)
- gemma4:12b (7.6 GB) — Chat
Amazon Web Services-Dienst, der den API-Zugriff auf verschiedene große KI-Modelle bereitstellt. Genutzte Region: Frankfurt (eu-central-1) für DSGVO-Konformität. Alle KI-Anfragen laufen über Bedrock — sowohl Claude Code als auch Continue.dev.
- Claude Sonnet 4.6 (Haupt-Modell)
- Claude Haiku 4.5 (schnell/günstig)
- Qwen3 235B (Alibaba)
- Devstral 123B (Mistral)
- DeepSeek V3 (Stockholm)
Erweiterungsschicht für Claude Code: strukturiertes Memory (was wurde wann entschieden),
eine Wissensdatenbank mit gelernten Regeln, und 1.792 vorgefertigte Skills in 32 Kategorien.
Installiert global unter .claude/.claude/,
Skills verlinkt via Symlink.
- Session-Memory über Neustarts
- Knowledge Base (Regeln & Patterns)
- Workflow-Befehle (/start, /sync ...)
- 1792 fertige Skills laden
- Projektkontext speichern
- Task Board verwalten
Gemieteter virtueller Server bei Hetzner in Deutschland (IP: 178.105.81.60). Darauf laufen alle produktiven Apps als Docker-Container. Claude Code verwaltet diesen Server direkt per SSH — kein manuelles Eingreifen nötig.
- n8n (Workflow-Automation)
- Traefik (SSL + Routing)
- AI Executive Navigator
- Royal Rangers Camp Manager
- PostgreSQL (je Projekt)
- Redis (Caching)
- Flask Microservices
Technologie, die Anwendungen als isolierte "Container" verpackt.
Lokal läuft Docker Desktop (Mac) für Entwicklung und Tests.
Auf dem Hetzner-Server läuft Docker als Produktionsumgebung für alle Live-Apps.
Gesteuert über docker-compose.yml.
- Apps in Containern isolieren
- Datenbanken (PostgreSQL, Redis)
- Einheitliche Umgebungen
- Automatischer Neustart
- Netzwerk-Isolation
- Volume-Persistenz
Moderner Reverse-Proxy-Server, der als "Türsteher" vor allen Apps sitzt. Empfängt HTTPS-Anfragen von außen und leitet sie an den richtigen Docker-Container weiter. Übernimmt automatisch SSL-Zertifikate (Let's Encrypt).
- HTTPS-Terminierung (SSL)
- Automatische Zertifikate
- Domain → Container Routing
- Load Balancing
- Health Checks
Datenspeicher-Dienst auf Hetzner-Infrastruktur (nx97828.your-storageshare.de).
Der Nextcloud Desktop Client synchronisiert automatisch den lokalen Ordner
C-Stone Cloud/Claude Code/
mit dem Server — ohne US-Cloud-Zwischenschritt.
- Automatische Datei-Synchronisation
- Backup aller Projektdateien
- Multi-Gerät-Zugriff
- Versionierung von Dateien
- .nextcloudignore verhindert Sync von node_modules
Plattform zur Versionsverwaltung mit Git. Jedes Projekt hat ein eigenes Repository. Claude Code arbeitet direkt mit Git — Commits, Branches, Diffs. SSH-Key-Authentifizierung (kein Passwort).
- Code-Versionshistorie
- Branch-basierte Entwicklung
- Code-Backup (extern)
- CI/CD Pipelines (teilweise)
- Deployment-Trigger
Self-hosted Workflow-Tool (wie Zapier, aber auf eigenem Server).
Läuft im Docker-Container n8n_n8n_1 auf dem Hetzner-Server.
Verbindet KI-Modelle, Formulare, E-Mail, SeaTable und Social-Media-APIs in visuellen Workflows.
- Webhook-Empfang (Formulare)
- KI-Anfragen zu AWS Bedrock
- Daten in SeaTable speichern
- E-Mails versenden
- Social Media Posts verteilen
- Lead-Qualifizierung automatisieren
Kleine Python-Webserver (Flask), die als Adapter zwischen n8n und problematischen APIs laufen. Pattern entstand, weil der native n8n SeaTable-Node veraltet ist und 404-Fehler wirft. Laufen als systemd-Services mit automatischem Neustart auf dem Hetzner-Server.
- SeaTable-Zugriff (seatable-api SDK)
- HTTP-Endpoints für n8n
- API-Fehler abfangen & loggen
- Format-Konvertierung
- Detailliertes Debugging-Logging
Tabellenbasiertes Datenbank-Tool (ähnlich Airtable), self-hosted auf EU-Servern. Dient als CRM-Backend, Lead-Speicher und strukturiertes Datenlager. Zugriff nur über Python Flask Service — der native n8n-Node ist veraltet.
- Lead-Daten speichern
- CRM-Funktionen (Anfragen)
- Strukturierte Tabellendaten
- REST-API-Zugriff
Microsoft-Tool zur Browser-Automatisierung. Python-Paket lokal installiert mit Chromium. Eingebunden als MCP-Server in Claude Code — damit kann Claude Code einen Browser direkt steuern: Seiten öffnen, Formulare ausfüllen, Screenshots machen, Daten extrahieren.
- Webseiten öffnen & navigieren
- Formulare ausfüllen & absenden
- Screenshots erstellen
- Web Scraping (Daten extrahieren)
- Login-Prozesse automatisieren
- UI-Tests durchführen
PostgreSQL ist die relationale Hauptdatenbank — jedes Projekt bekommt eine eigene Instanz im Docker. Redis ist ein schneller Zwischenspeicher für Session-Tokens und temporäre Daten. Beide laufen als Docker-Container, verwaltet per Alembic (Datenbank-Migrationen).
- Daten dauerhaft speichern (PostgreSQL)
- Benutzer, Projekte, Einträge
- Token-Blacklist (Redis)
- Session-Caching (Redis)
- Alembic: Schema-Migrationen
Die globalen Claude-Regeln in ~/.claude/CLAUDE.md erzwingen extrem verdichtete Antworten:
Keine Präambel, Telegrammstil (Fragmente), max 3 Sätze Prosa, keine Selbst-Erklärung.
Geschätzte Reduktion: ~65-75% Output-Tokens.
~/.claude/CLAUDE.md — Sektion „Kommunikationsstil (Caveman, strikt)"
Plugin DietrichGebert/ponytail (v4.8.1) — Standard ultra. Erzwingt YAGNI, Stdlib zuerst, keine ungefragten Abstraktionen, kürzeste Lösung. Gemessene Einsparung: −54% LOC, −22% Tokens, −20% Kosten, −27% Zeit.
Siehe Plugins-Sektion.
- Dateien > 100 Zeilen:
offset+limitstatt komplett lesen - Gezielte
grep-Suche statt Datei-Scan - RAG (
rag_query) statt Web-Suche für Projektwissen - Thema erledigt → neue Session (Messages > 50% = neue Session)
| Befehl | Wann | Effekt |
|---|---|---|
/flush | ~30+ Tool-Calls oder Qualitätsabfall | Context komprimieren, Speicher sichern |
/sync | alle 3-4h | Memory + Knowledge Base auffrischen |
/end-day | Arbeitstag Ende | Learnings sichern, Audit, nächst. Tag prep |
Stop-Hook in ~/.claude/settings.json. Zeigt nach jeder Antwort Token-Verbrauch und
geschätzte Kosten. Erzeugt Kostenbewusstsein.
| Modell | Input/M | Output/M | Einsatz |
|---|---|---|---|
| Sonnet 4.6 | $3.00 | $15.00 | Komplexe Tasks |
| Haiku 4.5 | $0.25 | $1.25 | Schnelle Tasks |
| Qwen3 235B | ~$0.80 | ~$2.40 | Boilerplate |
| DEV Stack | €0 | €0 | Fake-Daten |
Die folgenden Konfigurationsdateien definieren das komplette Setup. Klicke zum Aufklappen.
~/.claude/settings.json (global)
{
"env": {
"AWS_REGION": "eu-central-1"
},
"permissions": {
"allow": [
"Bash(python3 -c ' *)",
"Bash(python3)",
"Bash(git *)",
"Bash(git commit *)",
"Bash(git push *)"
]
},
"hooks": {
"PreToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "bash '/Users/cstone/.claude/hooks/guard-planning-gate.sh'",
"timeout": 5000,
"statusMessage": "Prüfe Planungs-Gate..."
}
]
}
],
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "python3 ~/.claude/hooks/token-cost.py",
"timeout": 10
}
]
}
]
},
"extraKnownMarketplaces": {
"ponytail": {
"source": {
"source": "github",
"repo": "DietrichGebert/ponytail"
}
}
},
"skipWorkflowUsageWarning": true,
"theme": "dark",
"enabledPlugins": {
"ponytail@ponytail": true
},
"model": "claude-sonnet-4-6"
}
Projekt .claude/settings.json
{
"autoUpdatesChannel": "latest",
"theme": "dark",
"permissions": {
"allow": [
"Read(*)",
"Write(*)",
"Edit(*)",
"Grep(*)",
"Glob(*)"
]
},
"env": {
"AWS_REGION": "eu-central-1"
},
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "~/.claude/startup-check.sh",
"timeout": 10,
"statusMessage": "Pr\u00fcfe Entwicklungsumgebung..."
}
]
}
]
}
}
~/.claude/hooks/guard-planning-gate.sh
#!/bin/bash
# preToolCall-Hook: blockiert Edit/Write in Produktiv-Projekten ohne Freigabe
# Aktiv wenn .claude/production im Projekt existiert
TOOL="$CLAUDE_TOOL_NAME"
[ "$TOOL" != "Edit" ] && [ "$TOOL" != "Write" ] && exit 0
# Projekt-Root finden
PROJECT="$PWD"
while [ ! -f "$PROJECT/.claude/production" ] && [ "$PROJECT" != "/" ]; do
PROJECT=$(dirname "$PROJECT")
done
[ ! -f "$PROJECT/.claude/production" ] && exit 0
# Gate-Verzeichnis ist immer erlaubt
echo "$CLAUDE_TOOL_INPUT" | grep -q 'plan-gate' && exit 0
# Freigabe-Token prüfen
APPROVED="$PROJECT/.claude/plan-gate/approved"
if [ -f "$APPROVED" ]; then
NOW=$(date +%s)
OK=$(( $(cat "$APPROVED") + 1800 )) # 30 Min gültig
[ "$NOW" -lt "$OK" ] && exit 0
rm -f "$APPROVED"
fi
cat <<'MSG'
╔════════════════════════════════════════════╗
║ PRODUKTIV-SYSTEM: Code-Änderung gesperrt ║
╠════════════════════════════════════════════╣
║ .claude/production erkannt. ║
║ Änderungen nur mit genehmigtem Plan. ║
║ ║
║ 1. Plan präsentieren (WAS/WO/WARUM/ ║
║ RISIKO/SEITENEFFEKTE) ║
║ 2. Genehmigung abwarten ║
║ 3. Nach "Ja" setzt Claude das Token ║
║ ║
║ Emergency: echo $(date +%s) > ║
║ .claude/plan-gate/approved ║
╚════════════════════════════════════════════╝
MSG
exit 1
~/.claude/hooks/token-cost.py
#!/usr/bin/env python3
"""
Zeigt Token-Verbrauch und geschätzte Kosten der aktuellen Session nach jeder Antwort.
AWS Bedrock Preise für eu.anthropic.claude-sonnet-4-6 (eu-central-1, per 1M Tokens):
- Input: $3.00
- Cache write: $3.75
- Cache read: $0.30
- Output: $15.00
"""
import json
import os
import sys
import glob
def find_current_transcript(session_id):
base = os.path.expanduser("~/.claude/projects")
pattern = os.path.join(base, "**", f"{session_id}.jsonl")
files = glob.glob(pattern, recursive=True)
return files[0] if files else None
def aggregate_tokens(transcript_path):
totals = {
"input": 0,
"cache_write": 0,
"cache_read": 0,
"output": 0,
}
try:
with open(transcript_path, "r", encoding="utf-8") as f:
for line in f:
line = line.strip()
if not line:
continue
try:
entry = json.loads(line)
except json.JSONDecodeError:
continue
usage = (entry.get("message") or {}).get("usage")
if not usage:
continue
totals["input"] += usage.get("input_tokens", 0)
totals["cache_write"] += usage.get("cache_creation_input_tokens", 0)
totals["cache_read"] += usage.get("cache_read_input_tokens", 0)
totals["output"] += usage.get("output_tokens", 0)
except FileNotFoundError:
pass
return totals
def calculate_cost(totals):
# Bedrock Frankfurt Preise (USD per 1M tokens)
INPUT_PRICE = 3.00
CACHE_WRITE = 3.75
CACHE_READ = 0.30
OUTPUT_PRICE = 15.00
cost = (
totals["input"] / 1_000_000 * INPUT_PRICE +
totals["cache_write"]/ 1_000_000 * CACHE_WRITE +
totals["cache_read"] / 1_000_000 * CACHE_READ +
totals["output"] / 1_000_000 * OUTPUT_PRICE
)
return cost
def format_k(n):
if n >= 1000:
return f"{n/1000:.1f}k"
return str(n)
def main():
try:
data = json.load(sys.stdin)
except Exception:
data = {}
session_id = data.get("session_id", "")
transcript = find_current_transcript(session_id) if session_id else None
if not transcript:
return
totals = aggregate_tokens(transcript)
total_tokens = sum(totals.values())
if total_tokens == 0:
return
cost = calculate_cost(totals)
lines = [
f"┄ Tokens: {format_k(totals['input'])} in · {format_k(totals['output'])} out · {format_k(totals['cache_read'])} cache-hit · {format_k(totals['cache_write'])} cache-write",
f"┄ Session-Kosten (est.): ${cost:.4f} USD"
]
print(json.dumps({
"systemMessage": "\n".join(lines)
}))
if __name__ == "__main__":
main()
~/.claude/CLAUDE.md (global — Caveman + DSGVO)
## Kommunikationsstil (Caveman, strikt)
- Null Präambel, null Höflichkeit, null Meta-Kommentar
- Frage nie wiederholen, Aufgabe nie zusammenfassen
- Antwort startet mit Ergebnis: Code/Befehl in Zeile 1
- Telegrammstil, max 3 Sätze Prosa
- Keine Selbst-Erklärung außer gefragt
- Ausnahmen: Sicherheit, DSGVO, irreversible Aktionen
## Arbeitsregeln
- DB: erst SELECT auf Schema, dann Code
- Git: nach jeder Änderung committen
## Context-Optimierung
- Read-Optimierung: Files > 100 Zeilen mit offset+limit
- Session-Hygiene: neue Session bei Messages > 50%
## DSGVO-REGEL (Nicht verhandelbar)
GitHub NIEMALS für: Kundennamen, E-Mails, Personenbezug.
Nur technische Inhalte. US-Server (Microsoft).
## PLANUNGS-GATE
Vor Edit/Write in Produktiv-Projekten: Plan präsentieren,
Genehmigung abwarten, Token setzen.
.claude/CLAUDE.md (Projekt — Clowdex + Cloud-Regeln)
# Globale Richtlinien für Claude Code
@context/c-stone.md
## Clowdex Integration
- /start bei Session-Beginn (automatisch)
- Memory: .claude/.claude/memory.md
- Knowledge Base: .claude/.claude/knowledge-base.md
## Startroutine
- Python, Docker, Git, Playwright verf.
- Apps laufen in der Cloud (Hetzner)
- NIEMALS lokal starten
## Cloud-Services
- Claude: AWS Bedrock Frankfurt (eu-central-1)
- n8n: n8n.c-stone-dev.com (Hetzner)
- Nextcloud: nx97828.your-storageshare.de
## Autonomie & Proaktivität
- Selbstständig arbeiten, kein manuelles Eingreifen
- Minimaler Aufwand für Nutzer
- Bestmögliche Lösung, nicht angenehmste
## n8n Patterns
- Expressions: {{ $('Node').item.json.path }}
- Flask Microservice Pattern für deprecated APIs
- SeaTable: Flask + SDK statt native n8n Node
Datei in ~/cstone-rag/inbox/ legen — automatische Konvertierung (PDF, DOCX, PPTX, XLSX, TXT, MD, HTML, CSV).
rag_query MCP Tool für semantische Suche, skill_search für Clowdex-Skill-Suche.
LaunchAgent startet nach jedem Login. Kein manueller Start nötig.
/plugin marketplace add aus GitHub-Repositories installiert.
Sie injizieren Regeln und Skills automatisch in jede Session.
„He says nothing. He writes one line. It works.“
Erzwingt minimalen, pragmatischen Code — kein Over-Engineering.
Standard-Modus: ultra.
Die 7-Stufen-Leiter (vor jedem Code)
- Muss das überhaupt existieren? → nein: weglassen (YAGNI)
- Gibt es das schon in der Codebase? → wiederverwenden
- Kann die Stdlib es? → nutzen
- Kann die Plattform (Browser/OS) es? → nutzen
- Gibt es eine installierte Dependency? → nutzen
- Geht es in einer Zeile? → eine Zeile
- Sonst: das absolute Minimum
Messbarer Effekt (Benchmark)
| Metrik | Einsparung |
|---|---|
| Code-Zeilen (LOC) | −54% |
| Token-Verbrauch | −22% |
| Kosten | −20% |
| Zeit | −27% |
.claude/.claude/agents/| Agent | Zweck |
|---|---|
| compass | Scope-Wächter — erkennt Drift vom ursprünglichen Ziel |
| decoder | Fehler-Interpreter — Stacktraces → Copy-Paste-Fix |
| historian | Code-History — „warum so geschrieben?" via git blame/log |
| ledger | Tech-Debt-Tracker — gerankte Inventur (Aufwand/Impact) |
| mirror | Denk-Partner — sokratisch, deckt Annahmen auf |
| pathfinder | Root-Cause / First-Principles-Unblocking |
| scout | Codebase-Guide — mappt Architektur/Patterns |
| scribe | Doku-Autor — PR/Commit/Changelog aus Diffs |
| sentinel | Selbstlernendes Quality-Gate (/audit + Stop-Kette) — schreibt knowledge-base.md |
agent-memory/{ledger,scout,sentinel}. Zusätzlich Built-in-Harness-Agents (Explore, Plan, general-purpose …).Global — Design-Suite
Projekt — 31 Branchen-Skills
cstone-audit, cstone-dev-loop), 22 gespiegelt im Projekt (command-index.md)./cstone-dev-loop "Task" [test-command].
Ab dem 2. Durchlauf nutzt der Loop claude -c (continue previous session).
Der Prompt enthält den letzten Test-Output (tail -60). Claude analysiert die Fehler gezielt,
statt den Task von Grund auf neu zu bearbeiten. Spart Turns und Budget.
- ✓ Tests grün — erfolgreich, Review nötig
- ✓ MAX_ITER — ohne grüne Tests, manueller Eingriff
- ✓ Kein Fortschritt — kein Commit, kein Diff
- ✓ Budget erschöpft — $10.00 Gesamtlimit
- ✓ Claude-Fehler — Exit-Code ≠ 0
- ✓ pre-push Hook blockiert Push auf main/prod
- ✓ Deny-Regeln in Claude Code gegen main/prod
- ✓ Loop läuft nicht auf main/prod (Preflight)
- ✓ Nur erlaubte Tools: git-Befehle (kein SSH/DB-Zugriff)
- ✓ Logs in .dev-loop-logs/ (in .gitignore)
| Server | Aufgabe | Tools |
|---|---|---|
| playwright gesperrt | Browser-Automatisierung | navigate, click, type, screenshot, evaluate Gesperrt per CLAUDE.md — nur CLI: python3 -m playwright |
| cstone-rag | Wissensabfrage | rag_query, rag_add, rag_list, skill_search |
| sequential-thinking | Strukturierte Problemanalyse | sequentialthinking |
| searxng DEV-Lane | Web-Suche | searxng_web_search, searxng_search_suggestions, web_url_read mcp-searxng@1.11.1 · SSH-Tunnel :8080 → localhost · für DEV-Lane (Qwen3/EVO-X2) |
| claude-in-chrome | Browser-Automatisierung (Chrome) | navigate, click, read_page, tabs, javascript_tool Interagiert mit bestehendem Chrome · Site-Permissions erforderlich |
| codegraph opt-in | Code-Graph-Index (Repo-lokal) | graph traversal, code navigation Local scope in ~/.claude.json — kein .mcp.json im Repo, kein globales Install |
| Tool | Version | Einsatz |
|---|---|---|
| gh | 2.95.0 | GitHub CLI (lokal noch installiert · Git-Hosting auf Forgejo migriert) |
| gitleaks | latest | Secret-Scanning vor Commits |
| pip-audit | latest | Dependency-Sicherheitsprüfung |
| pre-commit | latest | Git-Hook-Framework |
| codegraph | 1.4.1 | Code-Graph MCP Server — npm i -g @colbymchenry/codegraph |
Eintrittskriterium: Kunde oder eigener Bedarf identifiziert. Werkzeuge: RAG-Abfrage (rag_query) ähnlicher Projekte, Task Board, ggf. Gamma/Canva für Präsentation. Austrittskriterium: Ein-Satz-Scope und Zielplattform definiert.
Eintrittskriterium: Scope klar. Werkzeuge: Claude Code (Plan-Modus), ggf. Klassendiagramm im Prompt. Entscheidungen: Tech-Stack, DSGVO-Prüfung (Bedrock/Europe), DB-Schema, Deployment-Ziel (lokal/Hetzner/Serverlos). Austrittskriterium: Stack-Entscheidung gefallen, RAG auf ähnliche Projekte durchgeführt.
Eintrittskriterium: Architektur steht. Werkzeuge: Claude Code, dev-loop bei Bedarf. Methode: Plan-Gate für Produktion, Ponytail-Code-Stil, Git-Commit nach jeder Änderung. Austrittskriterium: Implementierung vollständig.
Eintrittskriterium: Implementierung steht. Werkzeuge: Playwright für Browser-Tests, manuelle Tests, verify-Skill. Austrittskriterium: Kern-Flow getestet, keine Regressions-Bugs.
Eintrittskriterium: QA bestanden. Prüfungen: Secrets aus .env/gitignore? Rate-Limiting gesetzt? Input-Validierung serverseitig? CORS konfiguriert? Austrittskriterium: Security-Checkliste abgehakt.
Eintrittskriterium: Sicherheit geprüft. Werkzeuge: rsync/scp auf Hetzner, Docker Compose, n8n, Caddy/Traefik. Austrittskriterium: Live-URL erreichbar, System neustartfest.
Eintrittskriterium: Deployment abgeschlossen. Werkzeuge: /end-day, memory.md aktualisieren, knowledge-base erweitern. Austrittskriterium: Projekt in memory.md eingetragen, Credentials in verschlüsseltem HTML.
- Prozess-Env —
AWS_REGION=eu-central-1hart gesetzt, KI bleibt in der EU - PreToolUse-Hooks — GDPR-Guard, Secrets-Guard, Destructive-Guard, Planning-Gate
- .claudeignore — Sperrzone doppelt abgesichert
- Betriebsmodus-Schalter —
CLAUDE_CODE_USE_BEDROCK=1trennt DEV/PROD - Git-Ziel Forgejo/EU — kein US-Drittlandtransfer
- Secret Vault — sops+age, Secrets nie in der Session
guard-planning-gate.sh — Write/Edit in Prod-Projekten nur mit Freigabe-Tokensecrets-guard.sh — blockt Vault-Entschlüsselung & Env-Dumpsdestructive-guard.sh — blockt rm -rf, force-push, DROP/TRUNCATE …pdf-local-to-text.sh — PDF→Text-Sidecar nur in lokaler LLM-Lanetoken-cost.py — Kosten-/Modus-Log nach jeder Antwort (Stop)| Befund | Ort | Priorität |
|---|---|---|
| Klartext-GitHub-Token in Config (Vault- & Forgejo-only-Regel verletzt) | ~/.claude/settings.local.json (gh-Allow-Regeln) | Kritisch — rotieren + entfernen |
Keine restart: unless-stopped-Policy | forgejo-git, dasprogramm-lead-manager | Hoch — Reboot-Risiko |
Bug: new-secret.sh shared zeigt auf nicht existente global.enc.env | ~/cstone-secrets/bin/ | Mittel |
| Kein origin-Remote (nur lokal, ungesichert) | Invoice Check, c-stone.info | Mittel |
| Verwaiste Projekt-Hooks (nicht registriert) | guard-bash, completeness-gate, backup-before-write … | Niedrig — aktivieren o. entfernen |
| 488 allow-Regeln, 0 deny/ask | settings.local.json | Niedrig — Deny-Regeln erwägen |
- ✓ 17 Repos migriert (16 von GitHub + AZAV-Coaching)
- ✓ GitHub-Org
cstone-mkrleer/entkoppelt - ✓ Backup täglich 03:00 (
forgejo dump, 14-Tage-Rotation) - ✓ Kein github.com-Remote in Haupt-Repo oder Projekten
- ⚠
restart:-Policy fehlt — nachzutragen - ⚠ Volumes generisch benannt (kein
name:-Präfix)
Kein Personenbezug in Commit-Messages, Issues oder PR-Titeln: keine Kunden-/Firmennamen von Endkunden, keine E-Mail/Telefon/Adressen realer Personen, keine Inhalte aus Kundengesprächen, keine SeaTable-CRM-Daten. Bei Treffer greift der GDPR-CHECK-Block mit anonymisierten Alternativen. (Forgejo liegt zwar in der EU — Klartext-Secrets gehören trotzdem nie ins Git, dafür ist der Vault da.)
~/cstone-secrets/ als sops+age-verschlüsselte .enc.env-Dateien. Werte kommen zur Laufzeit nur in den einzelnen Kindprozess, nie in Claudes Umgebung, stdout oder Chat.
<projekt>/secrets.enc.envshared/secrets.enc.env (AWS, LiteLLM, Nextcloud, OpenAI, NVIDIA)~/cstone-secrets/README.md.sops.yaml (matcht *.enc/.dec.env)~/.config/sops/age/keys.txt (chmod 600)Private/credentials/lädt shared+Projekt nur in den Kindprozess
erzeugt Zufallswert (openssl) direkt im Tresor
process.env.NAME / os.environ[...]
new-secret.sh shared … schreibt nach shared/global.enc.env — diese Datei existiert nicht (real: shared/secrets.enc.env). Der Datei-Check schlägt fehl → shared-Secrets-Erzeugung ist funktionsunfähig. Skript/Doku angleichen oder Datei umbenennen.
~/.claude/hooks/ (in settings.json registriert, aktiv)| Hook | Trigger | Zweck |
|---|---|---|
| guard-planning-gate.sh | PreToolUse Write|Edit | Blockt Änderungen in Prod-Projekten (.claude/production) ohne gültiges Freigabe-Token (30 Min) |
| secrets-guard.sh | PreToolUse Bash | Blockt Vault-Entschlüsselung & Env-Dumps; erlaubt with-/new-secret |
| destructive-guard.sh | PreToolUse Bash | Blockt rm -rf /, force-push, reset --hard, DROP/TRUNCATE/DELETE WHERE 1=, mkfs; loggt |
| GDPR-Guard upd 05.08. | PreToolUse Read|Edit|Write|Glob|Grep|Notebook|Bash | Blockt GDPR-benannte Tokens in Tool-Inputs im DEV-Modus (case-insensitive, fail-closed). Durchlass bei PROD-Bedrock (CLAUDE_CODE_USE_BEDROCK=1) oder lokaler NucBox-Lane (:4444 / qwen3-coder-next-local). Heute erweitert: greift jetzt auch bei zusammengesetzten Wort-Tokens (z.B. GDPR-Konformität), nicht mehr nur bei Pfad-Tokens mit / oder Dateiendung; freistehendes Wort bleibt frei. Vorversion: guard.prev.bak |
| pdf-local-to-text.sh | PreToolUse Read | Erzeugt PDF→Text-Sidecar in lokaler LLM-Lane (Bedrock liest PDF nativ) |
| token-cost.py | Stop | Zeigt Token-Verbrauch + Bedrock-Kosten, loggt PROD/DEV-Modus |
.claude/.claude/hooks/| Hook | Trigger | Zweck |
|---|---|---|
| guard-bash.sh | PreToolUse Bash | Command-Safety (Hard/Soft/Log), strukturiertes JSON |
| backup-before-write.sh | PreToolUse Write/Edit (async) | Timestamped Backups, 7-Tage-Retention |
| completeness-gate.sh | PreToolUse Write/Edit | Validiert Content-Vollständigkeit |
| log-changes.sh / log-failures.sh | PostToolUse / -Failure | Audit-Trail + Fehler-Kategorisierung |
| pre-compact-handoff.sh | PreCompact auto | Blockt Auto-Kompaktierung, setzt STATUS.md-Marker |
| session-reset.sh / post-compact-resume.sh | SessionStart | Gate-Cleanup / Kontext-Wiederherstellung nach Compact |
| log-stop-verdict.sh / status-snapshot-gate.sh | Stop | Quality-Verdict (JSONL) + Snapshot-Prüfung; Quality-Gate ab ≥2 Blocks |
Regel: Produktive KI-Calls nur über AWS Bedrock EU — erlaubt eu-central-1 (Frankfurt), eu-north-1 (Stockholm); verboten us-east-1/us-west-2 & jede Nicht-EU-Region; keine direkten Calls an api.anthropic.com. Durchsetzung: AWS_REGION=eu-central-1 hart in settings.json — prozessweit vererbt, zur Laufzeit nicht umbiegbar. DEV = Claude.ai/MAX-OAuth, kein Bedrock, ausschließlich Fake-Daten; PROD = CLAUDE_CODE_USE_BEDROCK=1, echte Daten erlaubt. Dieser Schalter ist der einzige, der PROD (und den Zugriff auf geschützte Bereiche) freigibt.
Regel: Im DEV-Modus dürfen alle Ordner/Dateien mit „GDPR"/„DSGVO" im Namen (case-insensitive) weder geöffnet, gelesen, editiert noch per Bash angefasst werden. Durchlass nur bei: PROD-Bedrock (CLAUDE_CODE_USE_BEDROCK=1) oder lokaler NucBox-Lane (ANTHROPIC_BASE_URL :4444 bzw. qwen3-coder-next-local — on-prem EU, gleichgestellt mit Bedrock). Durchsetzung: PreToolUse-Guard über 7 Tool-Typen (Read/Edit/Write/Glob/Grep/Notebook/Bash), prüft die Tool-Inputs auf Token, bricht bei Treffer im DEV-Modus mit Exit-Code ab. Anpassung 05.08.2026: Match von reinen Pfad-Tokens (mit / oder Dateiendung) auf alle zusammengesetzten Wort-Tokens erweitert (z.B. GDPR-Konformität wird jetzt geblockt); freistehendes Einzelwort mit Leerzeichen bleibt erlaubt. Vorversion gesichert als guard.prev.bak. Live verifiziert: Der Guard blockte während dieser Analyse mehrfach eigene Schreibzugriffe — Beweis, dass er greift.
Der Sperrzonen-Ordner wird im DEV-Modus nie gelesen/beschrieben — doppelt geschützt: (a) .claudeignore schließt den Pfad aus, (b) der Namensregel-Hook fängt jeden Tool-Zugriff zusätzlich ab. Zugriff nur im PROD-Bedrock-Modus (von Markus explizit freigegeben).
GitHub = US-Server → Drittlandtransfer nach Art. 44 ff. GDPR. Alles auf Forgejo (Hetzner/EU). Aktive Prüfpflicht vor jeder Git-Aktion: kein Personenbezug in Commits/Issues/PRs; bei Treffer GDPR-CHECK-Block mit anonymisierten Alternativen. Details siehe Forgejo-Sektion.
Keine Klartext-Secrets in CLAUDE.md, Prompts oder Kontext. Vault sops+age, Modus A (Secrets nie in Session). Keine PII/Passwörter/Secrets in Logs. Durchsetzung: secrets-guard.sh. Details siehe Secret-Vault-Sektion.
KI: AWS Bedrock Frankfurt. Compute/Automation: Hetzner Deutschland (178.105.81.60). Speicher: Nextcloud EU. Git: Forgejo (Hetzner). Lokale LLM-Alternative: NucBox EVO-X2 / llama.cpp on-prem (kein Netztransfer). Klientendaten ausschließlich EU-Server.
DEV arbeitet ausschließlich mit Fake-Daten. Personenbezogene Daten verschlüsselt at rest; TLS/HTTPS überall; Passwörter nur bcrypt/argon2; Broken-Access-Control-Prüfung bei jedem Datenzugriff; CORS restriktiv (nie * mit Credentials); Security-Header (CSP, X-Frame-Options, X-Content-Type-Options); keine Stack-Traces an den Client; Container ohne root, nur nötige Ports; DB-Ports (5432/6379/…) nie auf Host exponiert (BSI 2026-07-01).
Schlüssel wird aus deinem Passwort abgeleitet (PBKDF2, 310.000 Runden).
Die Entschlüsselung findet vollständig lokal im Browser statt. Kein Server-Kontakt.