init: extract paul-pflege-coach from qognio-bot-widget-template@d2c816f

Source files (src/) and rendered bundle (www/) extracted on 2026-04-29T01:35:48+02:00.
Adds nginx:alpine Dockerfile + docker-compose.yml (Caddy-labels) so the bot
runs stand-alone or as a per-customer template clone.

Parent monorepo commit: d2c816f3edbc9760802a11b29ff4151c7aad4b46
Bot version: 2026-04-25
This commit is contained in:
Qognio Bot Extract 2026-04-29 01:35:48 +02:00
commit 103b4d7bdd
16 changed files with 3514 additions and 0 deletions

7
.dockerignore Normal file
View file

@ -0,0 +1,7 @@
.git
.gitignore
README.md
bot.json
src/
docker-compose.yml
*.md

4
.gitignore vendored Normal file
View file

@ -0,0 +1,4 @@
.DS_Store
*.log
*.tmp
node_modules/

13
Dockerfile Normal file
View file

@ -0,0 +1,13 @@
# Static-bundle bot — nginx:alpine serves www/ on port 80.
FROM nginx:1.27-alpine
# nginx config: gzip + cache headers + index.html no-store
COPY nginx.conf /etc/nginx/conf.d/default.conf
# Static bundle
COPY www/ /usr/share/nginx/html/
# Run as non-root via nginx's built-in unprivileged image features
EXPOSE 80
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD wget -q --spider http://127.0.0.1/index.html || exit 1

67
README.md Normal file
View file

@ -0,0 +1,67 @@
# PAUL — Pflege-Datenschutz-Coach
PAUL — dein Datenschutz-Sparringspartner für Pflegedienste, Heime und Träger. SGB-XI-konform, MDK-tauglich, gamifiziert. Läuft im deutschen Bunker.
```
slug : paul-pflege-coach
version : 2026-04-25
accent : #16a34a
runtime : nginx:alpine (static bundle)
template : qognio-bot-template-core (former qognio-bot-widget-template)
```
## Layout
```
.
├── src/ source — config.yaml, welcome.html, curricula.json, etc.
├── www/ rendered, directly servable static bundle
├── Dockerfile nginx:alpine + www/ → port 80
├── docker-compose.yml bot-host pattern (Caddy-labels, restart unless-stopped)
├── nginx.conf gzip + cache + SPA fallback
└── bot.json metadata + parent_core_commit
```
## Run locally
```bash
docker compose up --build
# → http://localhost (you'll need to tweak ports for local-only use)
```
## Re-render after upstream core changes
This repo only stores src + rendered output; the rendering engine lives in
`qognio-bot-template-core`. To pull in core changes:
```bash
cd /path/to/qognio-bot-template-core
./scripts/render.sh paul-pflege-coach --bot-repo /path/to/this/repo
git -C /path/to/this/repo commit -am "render: refresh from core@<sha>"
```
## Per-customer copy (template usage)
This repo is a **template**. To clone for a customer:
```bash
git clone <this-repo> my-customer-paul-pflege-coach
cd my-customer-paul-pflege-coach
# tweak src/config.yaml (slug, bot_key_value, accent), src/welcome.html, src/curricula.json
docker compose -f docker-compose.yml up --build
```
## Deploy to qognio bot-host (.42 LXC pattern — legacy)
The bot-manager spawns LXC containers named after the slug. Push www/ via:
```bash
ssh fmh@46.243.203.42
sudo lxc file push /tmp/www/* paul-pflege-coach/var/www/html/
```
(Or run the docker-compose pattern on a Docker host — same network as Caddy.)
---
Generated by `qognio-bot-template-core/scripts/extract-to-repo.sh` on 2026-04-29T01:35:48+02:00.

14
bot.json Normal file
View file

@ -0,0 +1,14 @@
{
"slug": "paul-pflege-coach",
"name": "PAUL",
"title": "Pflege-Datenschutz-Coach",
"tagline": "Pflege-Datenschutz",
"description": "PAUL — dein Datenschutz-Sparringspartner für Pflegedienste, Heime und Träger. SGB-XI-konform, MDK-tauglich, gamifiziert. Läuft im deutschen Bunker.",
"version": "2026-04-25",
"accent": "#16a34a",
"extracted_from": "qognio-bot-widget-template",
"parent_core_commit": "d2c816f3edbc9760802a11b29ff4151c7aad4b46",
"extracted_at": "2026-04-29T01:35:48+02:00",
"runtime": "nginx:alpine",
"default_port": 80
}

20
docker-compose.yml Normal file
View file

@ -0,0 +1,20 @@
# Stand-alone bot container.
# Designed for the "caddy" external network on the bot host (qognio pattern).
# Override the hostname via SLUG env var if you reuse this template per customer.
services:
bot:
build: .
image: qognio/bot-paul-pflege-coach:${TAG:-latest}
container_name: bot-paul-pflege-coach
restart: unless-stopped
networks:
- caddy
labels:
caddy: "paul-pflege-coach.on.qognio.com"
caddy.reverse_proxy: "{{upstreams 80}}"
qognio.bot.slug: "paul-pflege-coach"
qognio.bot.version: "2026-04-25"
networks:
caddy:
external: true

27
nginx.conf Normal file
View file

@ -0,0 +1,27 @@
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.html;
# gzip
gzip on;
gzip_vary on;
gzip_types text/css application/javascript application/json image/svg+xml text/plain;
gzip_min_length 512;
# index.html: never cache (so welcome screen / wiring updates land instantly)
location = /index.html {
add_header Cache-Control "no-store, must-revalidate" always;
}
# static assets: cache 1h
location ~* \.(?:css|js|json|svg|png|jpe?g|webp|gif|ico|woff2?)$ {
add_header Cache-Control "public, max-age=3600" always;
try_files $uri =404;
}
location / {
try_files $uri $uri/ /index.html;
}
}

20
src/check-badges.js Normal file
View file

@ -0,0 +1,20 @@
// Erste Pflege-Frage — irgendein Quiz korrekt beantwortet (Core-Feld: correctAnswers)
if ((state.correctAnswers || 0) >= 1) unlockBadge('erste_pflege_frage');
// Einwilligungs-Profi — 5 korrekte Antworten im Modul "Einwilligungsfähigkeit prüfen"
if ((state.moduleCorrect && state.moduleCorrect['einwilligung-faehigkeit'] >= 5)) unlockBadge('einwilligungs_profi');
// Betreuer-Kenner — 5 korrekte Antworten im Modul "Betreuung & Vorsorgevollmacht"
if ((state.moduleCorrect && state.moduleCorrect['einwilligung-betreuung'] >= 5)) unlockBadge('betreuer_kenner');
// MDK-gerüstet — 5 korrekte Antworten im MDK-Grundlagen-Modul (operativ ausreichend)
if ((state.moduleCorrect && (state.moduleCorrect['mdk-grundlagen'] || 0) >= 5)) unlockBadge('mdk_geruestet');
// Panne-Responder — 72-Stunden-Workflow-Modul Quiz erfolgreich
if ((state.moduleCorrect && (state.moduleCorrect['panne-72h'] || 0) >= 3)) unlockBadge('panne_responder');
// Doku-Kenner — 5 korrekte Antworten in den Doku-Modulen (eines reicht — Sis ist das größte)
if ((state.moduleCorrect && (state.moduleCorrect['doku-sis'] || 0) >= 5)) unlockBadge('doku_kenner');
// PAUL-Meister — 12 von 15 Modulen mit ≥80% Quiz-Score abgeschlossen (80% Master-Coverage)
if ((state.completedCurricula || []).length >= 12) unlockBadge('paul_meister');
// Compliance-Disziplin — 30-Tage-Streak
if (state.maxStreak >= 30) unlockBadge('streak_30');
// Night Owl & Early Bird (für Spät-/Frühschicht — passt 1:1 in der Pflege)
const h = new Date().getHours();
if (h >= 22) unlockBadge('night_owl');
if (h < 7) unlockBadge('early_bird');

33
src/config.yaml Normal file
View file

@ -0,0 +1,33 @@
slug: paul-pflege-coach
bot_name: PAUL
bot_title: Pflege-Datenschutz-Coach
brand_letter: P
title: "PAUL · Pflege-Datenschutz-Coach"
tagline: Pflege-Datenschutz-Coach
tagline_short: Pflege-Datenschutz
meta_description: "PAUL — dein Datenschutz-Sparringspartner für Pflegedienste, Heime und Träger. SGB-XI-konform, MDK-tauglich, gamifiziert. Läuft im deutschen Bunker."
bot_key_var: __PAUL_KEY__
bot_key_value: qb_fbgostzwrud0
ls_prefix: paul
bot_version: "2026-04-25"
# Color theme — Pflege-Grün (etwas kühler als Cora, mehr richtung Forest)
accent: "#16a34a"
accent_2: "#22c55e"
accent_dark: "#15803d"
accent_rgb: "22, 163, 74"
accent_rgb_compact: "22,163,74"
success_color: "#22c55e"
msg_strong_color: "#bbf7d0"
# UI Labels
tab_flash_label: Karten
tab_curriculum_label: Module
curriculum_long_label: Modul-Library
# Bot-personality strings
quiz_intro_hint: "Wähle ein Modul — PAUL generiert Szenario-Fragen aus dem Pflegealltag (ambulant + stationär)."
quiz_verb: erstellt
quiz_noun: "Pflegealltag-Fragen"
flash_intro_hint: "PAUL erstellt Karteikarten zu einem Thema. Bewerte dein Erinnerungsvermögen — das System wiederholt schwere Karten öfter (SM-2)."
flash_verb: erstellt

181
src/curricula.json Normal file
View file

@ -0,0 +1,181 @@
{
"version": "2026-04-25",
"updated": "2026-04-25",
"curricula": [
{
"id": "grundlagen",
"title": "1 · Grundlagen Pflege & DSGVO",
"short": "Was ist personenbezogen, was Gesundheitsdatum (Art. 9), wann wer was darf",
"icon": "shield",
"color": "#16a34a",
"description": "Welche Daten in der Pflege sind besonders geschützt (Art. 9 DSGVO), wie greifen Schweigepflicht (§ 203 StGB) und SGB-XI/V ineinander, wer darf welche Daten sehen.",
"source_md": "00-grundlagen.md",
"modules": [
{
"id": "pflege-pb-daten",
"title": "Personenbezogen vs. Gesundheitsdatum",
"objectives": ["Art. 4 Nr. 1 vs. Art. 9 DSGVO sicher abgrenzen", "Pflegegrad als Gesundheitsdatum erkennen", "Foto, Pflegegrad, Diagnose, Medikation einordnen"],
"topics": ["Art. 4 Nr. 1", "Art. 9 Abs. 1", "Pflegegrad", "Diagnose"],
"difficulty": "einfach",
"source_heading": "Was ist ein Gesundheitsdatum"
},
{
"id": "pflege-rechtsgrundlagen",
"title": "Rechtsgrundlagen: SGB XI + Art. 9 Abs. 2 DSGVO",
"objectives": ["Art. 9 Abs. 2 lit. b/h sicher anwenden", "Wann reicht der Pflegevertrag, wann braucht's Einwilligung", "Verhältnis Pflegevertrag ↔ SGB XI ↔ DSGVO"],
"topics": ["Art. 9 Abs. 2", "Pflegevertrag", "SGB XI § 104"],
"difficulty": "mittel",
"source_heading": "Rechtsgrundlagen in der Pflege"
},
{
"id": "pflege-schweigepflicht",
"title": "Schweigepflicht (§ 203 StGB) im Pflegeteam",
"objectives": ["§ 203 StGB von DSGVO sauber trennen", "Wer im Team darf welche Info sehen", "Angehörigen-Anfragen sicher beantworten"],
"topics": ["§ 203 StGB", "Berufsgeheimnis", "Need-to-know"],
"difficulty": "mittel",
"source_heading": "Schweigepflicht im Team"
}
]
},
{
"id": "einwilligung",
"title": "2 · Einwilligung & Geschäftsfähigkeit",
"short": "Wer kann zustimmen — bei Demenz, Betreuung, Vorsorgevollmacht?",
"icon": "clipboard",
"color": "#16a34a",
"description": "Einwilligungsfähigkeit, Vorsorgevollmacht, gesetzliche Betreuung, Patientenverfügung — wer darf für wen DSGVO-Einwilligungen unterschreiben.",
"source_md": "01-einwilligung.md",
"modules": [
{
"id": "einwilligung-faehigkeit",
"title": "Einwilligungsfähigkeit prüfen",
"objectives": ["Einwilligungsfähigkeit von Geschäftsfähigkeit unterscheiden", "Anhaltspunkte für fehlende Einwilligungsfähigkeit erkennen", "Dokumentation der Prüfung"],
"topics": ["§ 104 BGB", "natürliche Einsichtsfähigkeit", "Demenz"],
"difficulty": "mittel",
"source_heading": "Einwilligungsfähigkeit"
},
{
"id": "einwilligung-betreuung",
"title": "Betreuung & Vorsorgevollmacht",
"objectives": ["Aufgabenkreis der Betreuung lesen", "Vorsorgevollmacht-Reichweite prüfen", "Dokumente in der Akte ablegen"],
"topics": ["§§ 1814 ff. BGB", "Betreuerausweis", "Vorsorgevollmacht"],
"difficulty": "schwer",
"source_heading": "Betreuung & Vorsorgevollmacht"
},
{
"id": "einwilligung-foto-medien",
"title": "Fotos, Sommerfest, Webseite",
"objectives": ["Foto-Einwilligung sauber einholen", "Widerruf umsetzen", "Bewohner-Wand & Webseite trennen"],
"topics": ["Bildnis", "KUG", "Widerrufsrecht"],
"difficulty": "mittel",
"source_heading": "Fotos & Medien"
}
]
},
{
"id": "doku",
"title": "3 · Pflegedokumentation",
"short": "Was muss/darf rein, wer sieht's, wie lange aufheben",
"icon": "book",
"color": "#16a34a",
"description": "SIS, Tagesstruktur, Berichteblatt, Wundprotokoll, MDS-Anforderungen vs. DSGVO-Datenminimierung. Aufbewahrung 30 Jahre vs. Löschpflicht.",
"source_md": "02-pflegedoku.md",
"modules": [
{
"id": "doku-sis",
"title": "SIS & Tagesstruktur",
"objectives": ["Was gehört in die SIS, was nicht", "Datenminimierung im Berichteblatt", "Persönliche Wertungen vermeiden"],
"topics": ["SIS", "Strukturmodell", "Berichteblatt"],
"difficulty": "mittel",
"source_heading": "SIS & Doku"
},
{
"id": "doku-aufbewahrung",
"title": "Aufbewahrungsfristen & Löschen",
"objectives": ["10 vs. 30 Jahre — wann was", "Verjährungsregeln (§ 199 BGB)", "Konflikt SGB XI ↔ DSGVO Art. 17 lösen"],
"topics": ["§ 113 SGB XI", "§ 199 BGB", "Art. 17 DSGVO"],
"difficulty": "schwer",
"source_heading": "Aufbewahrungsfristen"
},
{
"id": "doku-zugriff",
"title": "Zugriffe & Rollen im Doku-System",
"objectives": ["Need-to-know auf Wohnbereiche/Touren begrenzen", "Schreib-/Lesepfade trennen", "Audit-Log nutzen"],
"topics": ["Rollen-Modell", "Berechtigungen", "Audit"],
"difficulty": "mittel",
"source_heading": "Zugriffe"
}
]
},
{
"id": "mdk",
"title": "4 · MD/MDK-Prüfung",
"short": "Was darf der Medizinische Dienst sehen, was nicht",
"icon": "search",
"color": "#16a34a",
"description": "Vorbereitung auf MD-Prüfung (alt: MDK), Datenfreigabe-Umfang, Akteneinsicht, Schweigepflicht-Konflikte und wie Träger sich rechtssicher aufstellen.",
"source_md": "03-mdk.md",
"modules": [
{
"id": "mdk-grundlagen",
"title": "MD-Prüfung Grundlagen",
"objectives": ["Rechtsgrundlage MD-Prüfung kennen", "Pflichten vs. Rechte des Trägers", "Bewohner-Information vor Prüfung"],
"topics": ["§ 114 SGB XI", "QPR", "Anlassprüfung"],
"difficulty": "mittel",
"source_heading": "MD-Prüfung"
},
{
"id": "mdk-datenumfang",
"title": "Was sieht der MD",
"objectives": ["Akteneinsicht-Umfang", "Stichprobe vs. Vollerhebung", "Dritte-Daten in Akten schwärzen"],
"topics": ["Akteneinsicht", "Stichprobe", "Schwärzung"],
"difficulty": "schwer",
"source_heading": "Datenumfang MD"
},
{
"id": "mdk-pannen",
"title": "Wenn der MD Mängel feststellt",
"objectives": ["Prüfbericht-Folgen einordnen", "Bescheide & Widerspruch", "Datenschutz-Aspekte im Mängel-Maßnahmen-Plan"],
"topics": ["Prüfbericht", "Maßnahmen-Plan", "§ 115 SGB XI"],
"difficulty": "schwer",
"source_heading": "Mängel & Folgen"
}
]
},
{
"id": "datenpannen",
"title": "5 · Datenpannen & Meldepflicht",
"short": "Was zählt als Panne in der Pflege, 72-Stunden-Frist, was tun",
"icon": "alert",
"color": "#16a34a",
"description": "Verlorenes Smartphone mit Tour-App, falsch versendete Pflegeberichte, USB-Stick im Auto — Meldepflicht nach Art. 33/34 DSGVO konkret im Pflegealltag.",
"source_md": "04-datenpannen.md",
"modules": [
{
"id": "panne-erkennen",
"title": "Panne erkennen & Risiko bewerten",
"objectives": ["Schwellwerte für Meldung an Behörde", "Schwellwerte für Information der Betroffenen", "Risiko-Skala anwenden"],
"topics": ["Art. 33", "Art. 34", "Risikobewertung"],
"difficulty": "mittel",
"source_heading": "Panne erkennen"
},
{
"id": "panne-72h",
"title": "72-Stunden-Workflow",
"objectives": ["Wer informiert wen wann", "Eskalation an PDL/EL/Träger", "Doku & Meldeformular"],
"topics": ["72h-Frist", "Meldeformular ULD/LDA", "Eskalation"],
"difficulty": "mittel",
"source_heading": "72h-Workflow"
},
{
"id": "panne-pflege-typisch",
"title": "Typische Pflege-Pannen & Prävention",
"objectives": ["Top-5 Pannen-Quellen kennen", "Tour-App, Schlüsselmappe, Übergabe-Zettel sichern", "Prävention im Team verankern"],
"topics": ["Tour-Smartphone", "Übergabe", "Schichtbuch"],
"difficulty": "mittel",
"source_heading": "Typische Pannen"
}
]
}
]
}

4
src/levels-fallback.js Normal file
View file

@ -0,0 +1,4 @@
{ min: 0, title: 'Pflege-Azubi' }, { min: 50, title: 'Pflegehilfskraft' },
{ min: 200, title: 'Pflegefachkraft' }, { min: 500, title: 'PDL-Anwärter:in' },
{ min: 1250, title: 'Pflegedienstleitung' }, { min: 2500, title: 'Einrichtungsleitung' },
{ min: 5000, title: 'Träger-Compliance-Lead' }

29
src/welcome.html Normal file
View file

@ -0,0 +1,29 @@
<h2>Willkommen bei PAUL!</h2>
<p>Ich bin dein Datenschutz-Sparringspartner für die Pflege — pragmatisch, MDK-tauglich, ohne juristisches Bla-Bla. Warum das Ganze? <strong>Bußgelder vermeiden</strong>, <strong>Pflegekräfte schützen</strong>, <strong>Bewohner:innen-Würde wahren</strong>. Alles läuft im deutschen Bunker — keine Bewohner-Daten verlassen dein Haus.</p>
<div class="mode-grid">
<button class="mode-card" data-goto="chat">
<strong>Chat</strong>
<span>Frag mich alles zu Pflegedoku, Einwilligung, Schweigepflicht, MDK.</span>
</button>
<button class="mode-card" data-goto="quiz">
<strong>Quiz</strong>
<span>Szenario-Fragen aus dem Pflegealltag, mit XP.</span>
</button>
<button class="mode-card" data-goto="flash">
<strong>Flashcards</strong>
<span>Paragrafen, Begriffe, TOMs — mit Spaced-Repetition.</span>
</button>
<button class="mode-card" data-goto="progress">
<strong>Fortschritt</strong>
<span>XP, Streaks, Badges, Level vom Azubi bis Einrichtungsleitung.</span>
</button>
<button class="mode-card" data-goto="curriculum">
<strong>Module</strong>
<span>5 Curricula / 15 Module: von Grundlagen bis MDK-Prüfung.</span>
</button>
<button class="mode-card" data-prompt="PRIVACY_CHECK: [Szenario aus Pflegealltag] — z.B. Bewohner mit Demenz, Angehörige fordern Zugang zur Pflegedoku">
<strong>Datenschutz-Check</strong>
<span><code>PRIVACY_CHECK</code> + Szenario → Ampel + Rechtsgrundlage + Handlungsempfehlung als Karte.</span>
</button>
</div>
<p style="font-size:.82rem;color:var(--text-mute)">In 3 Sätzen: Chat zum Verstehen → Quiz zum Testen → Flashcards zum Merken. Fortschritt zeigt dir, wo du stehst; die Modul-Library gibt dir 10 kuratierte Pflege-Datenschutz-Module.</p>

1751
www/app.js Normal file

File diff suppressed because it is too large Load diff

181
www/curricula.json Normal file
View file

@ -0,0 +1,181 @@
{
"version": "2026-04-25",
"updated": "2026-04-25",
"curricula": [
{
"id": "grundlagen",
"title": "1 · Grundlagen Pflege & DSGVO",
"short": "Was ist personenbezogen, was Gesundheitsdatum (Art. 9), wann wer was darf",
"icon": "shield",
"color": "#16a34a",
"description": "Welche Daten in der Pflege sind besonders geschützt (Art. 9 DSGVO), wie greifen Schweigepflicht (§ 203 StGB) und SGB-XI/V ineinander, wer darf welche Daten sehen.",
"source_md": "00-grundlagen.md",
"modules": [
{
"id": "pflege-pb-daten",
"title": "Personenbezogen vs. Gesundheitsdatum",
"objectives": ["Art. 4 Nr. 1 vs. Art. 9 DSGVO sicher abgrenzen", "Pflegegrad als Gesundheitsdatum erkennen", "Foto, Pflegegrad, Diagnose, Medikation einordnen"],
"topics": ["Art. 4 Nr. 1", "Art. 9 Abs. 1", "Pflegegrad", "Diagnose"],
"difficulty": "einfach",
"source_heading": "Was ist ein Gesundheitsdatum"
},
{
"id": "pflege-rechtsgrundlagen",
"title": "Rechtsgrundlagen: SGB XI + Art. 9 Abs. 2 DSGVO",
"objectives": ["Art. 9 Abs. 2 lit. b/h sicher anwenden", "Wann reicht der Pflegevertrag, wann braucht's Einwilligung", "Verhältnis Pflegevertrag ↔ SGB XI ↔ DSGVO"],
"topics": ["Art. 9 Abs. 2", "Pflegevertrag", "SGB XI § 104"],
"difficulty": "mittel",
"source_heading": "Rechtsgrundlagen in der Pflege"
},
{
"id": "pflege-schweigepflicht",
"title": "Schweigepflicht (§ 203 StGB) im Pflegeteam",
"objectives": ["§ 203 StGB von DSGVO sauber trennen", "Wer im Team darf welche Info sehen", "Angehörigen-Anfragen sicher beantworten"],
"topics": ["§ 203 StGB", "Berufsgeheimnis", "Need-to-know"],
"difficulty": "mittel",
"source_heading": "Schweigepflicht im Team"
}
]
},
{
"id": "einwilligung",
"title": "2 · Einwilligung & Geschäftsfähigkeit",
"short": "Wer kann zustimmen — bei Demenz, Betreuung, Vorsorgevollmacht?",
"icon": "clipboard",
"color": "#16a34a",
"description": "Einwilligungsfähigkeit, Vorsorgevollmacht, gesetzliche Betreuung, Patientenverfügung — wer darf für wen DSGVO-Einwilligungen unterschreiben.",
"source_md": "01-einwilligung.md",
"modules": [
{
"id": "einwilligung-faehigkeit",
"title": "Einwilligungsfähigkeit prüfen",
"objectives": ["Einwilligungsfähigkeit von Geschäftsfähigkeit unterscheiden", "Anhaltspunkte für fehlende Einwilligungsfähigkeit erkennen", "Dokumentation der Prüfung"],
"topics": ["§ 104 BGB", "natürliche Einsichtsfähigkeit", "Demenz"],
"difficulty": "mittel",
"source_heading": "Einwilligungsfähigkeit"
},
{
"id": "einwilligung-betreuung",
"title": "Betreuung & Vorsorgevollmacht",
"objectives": ["Aufgabenkreis der Betreuung lesen", "Vorsorgevollmacht-Reichweite prüfen", "Dokumente in der Akte ablegen"],
"topics": ["§§ 1814 ff. BGB", "Betreuerausweis", "Vorsorgevollmacht"],
"difficulty": "schwer",
"source_heading": "Betreuung & Vorsorgevollmacht"
},
{
"id": "einwilligung-foto-medien",
"title": "Fotos, Sommerfest, Webseite",
"objectives": ["Foto-Einwilligung sauber einholen", "Widerruf umsetzen", "Bewohner-Wand & Webseite trennen"],
"topics": ["Bildnis", "KUG", "Widerrufsrecht"],
"difficulty": "mittel",
"source_heading": "Fotos & Medien"
}
]
},
{
"id": "doku",
"title": "3 · Pflegedokumentation",
"short": "Was muss/darf rein, wer sieht's, wie lange aufheben",
"icon": "book",
"color": "#16a34a",
"description": "SIS, Tagesstruktur, Berichteblatt, Wundprotokoll, MDS-Anforderungen vs. DSGVO-Datenminimierung. Aufbewahrung 30 Jahre vs. Löschpflicht.",
"source_md": "02-pflegedoku.md",
"modules": [
{
"id": "doku-sis",
"title": "SIS & Tagesstruktur",
"objectives": ["Was gehört in die SIS, was nicht", "Datenminimierung im Berichteblatt", "Persönliche Wertungen vermeiden"],
"topics": ["SIS", "Strukturmodell", "Berichteblatt"],
"difficulty": "mittel",
"source_heading": "SIS & Doku"
},
{
"id": "doku-aufbewahrung",
"title": "Aufbewahrungsfristen & Löschen",
"objectives": ["10 vs. 30 Jahre — wann was", "Verjährungsregeln (§ 199 BGB)", "Konflikt SGB XI ↔ DSGVO Art. 17 lösen"],
"topics": ["§ 113 SGB XI", "§ 199 BGB", "Art. 17 DSGVO"],
"difficulty": "schwer",
"source_heading": "Aufbewahrungsfristen"
},
{
"id": "doku-zugriff",
"title": "Zugriffe & Rollen im Doku-System",
"objectives": ["Need-to-know auf Wohnbereiche/Touren begrenzen", "Schreib-/Lesepfade trennen", "Audit-Log nutzen"],
"topics": ["Rollen-Modell", "Berechtigungen", "Audit"],
"difficulty": "mittel",
"source_heading": "Zugriffe"
}
]
},
{
"id": "mdk",
"title": "4 · MD/MDK-Prüfung",
"short": "Was darf der Medizinische Dienst sehen, was nicht",
"icon": "search",
"color": "#16a34a",
"description": "Vorbereitung auf MD-Prüfung (alt: MDK), Datenfreigabe-Umfang, Akteneinsicht, Schweigepflicht-Konflikte und wie Träger sich rechtssicher aufstellen.",
"source_md": "03-mdk.md",
"modules": [
{
"id": "mdk-grundlagen",
"title": "MD-Prüfung Grundlagen",
"objectives": ["Rechtsgrundlage MD-Prüfung kennen", "Pflichten vs. Rechte des Trägers", "Bewohner-Information vor Prüfung"],
"topics": ["§ 114 SGB XI", "QPR", "Anlassprüfung"],
"difficulty": "mittel",
"source_heading": "MD-Prüfung"
},
{
"id": "mdk-datenumfang",
"title": "Was sieht der MD",
"objectives": ["Akteneinsicht-Umfang", "Stichprobe vs. Vollerhebung", "Dritte-Daten in Akten schwärzen"],
"topics": ["Akteneinsicht", "Stichprobe", "Schwärzung"],
"difficulty": "schwer",
"source_heading": "Datenumfang MD"
},
{
"id": "mdk-pannen",
"title": "Wenn der MD Mängel feststellt",
"objectives": ["Prüfbericht-Folgen einordnen", "Bescheide & Widerspruch", "Datenschutz-Aspekte im Mängel-Maßnahmen-Plan"],
"topics": ["Prüfbericht", "Maßnahmen-Plan", "§ 115 SGB XI"],
"difficulty": "schwer",
"source_heading": "Mängel & Folgen"
}
]
},
{
"id": "datenpannen",
"title": "5 · Datenpannen & Meldepflicht",
"short": "Was zählt als Panne in der Pflege, 72-Stunden-Frist, was tun",
"icon": "alert",
"color": "#16a34a",
"description": "Verlorenes Smartphone mit Tour-App, falsch versendete Pflegeberichte, USB-Stick im Auto — Meldepflicht nach Art. 33/34 DSGVO konkret im Pflegealltag.",
"source_md": "04-datenpannen.md",
"modules": [
{
"id": "panne-erkennen",
"title": "Panne erkennen & Risiko bewerten",
"objectives": ["Schwellwerte für Meldung an Behörde", "Schwellwerte für Information der Betroffenen", "Risiko-Skala anwenden"],
"topics": ["Art. 33", "Art. 34", "Risikobewertung"],
"difficulty": "mittel",
"source_heading": "Panne erkennen"
},
{
"id": "panne-72h",
"title": "72-Stunden-Workflow",
"objectives": ["Wer informiert wen wann", "Eskalation an PDL/EL/Träger", "Doku & Meldeformular"],
"topics": ["72h-Frist", "Meldeformular ULD/LDA", "Eskalation"],
"difficulty": "mittel",
"source_heading": "72h-Workflow"
},
{
"id": "panne-pflege-typisch",
"title": "Typische Pflege-Pannen & Prävention",
"objectives": ["Top-5 Pannen-Quellen kennen", "Tour-App, Schlüsselmappe, Übergabe-Zettel sichern", "Prävention im Team verankern"],
"topics": ["Tour-Smartphone", "Übergabe", "Schichtbuch"],
"difficulty": "mittel",
"source_heading": "Typische Pannen"
}
]
}
]
}

125
www/index.html Normal file
View file

@ -0,0 +1,125 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>PAUL · Pflege-Datenschutz-Coach</title>
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
<meta name="theme-color" content="#0a0a0f">
<meta name="description" content="PAUL — dein Datenschutz-Sparringspartner für Pflegedienste, Heime und Träger. SGB-XI-konform, MDK-tauglich, gamifiziert. Läuft im deutschen Bunker.">
<link rel="stylesheet" href="styles.css">
<script>window.__PAUL_KEY__ = 'qb_fbgostzwrud0';</script>
</head>
<body>
<div class="app" role="application" aria-label="PAUL Pflege-Datenschutz-Coach">
<header class="topbar">
<div class="brand">
<span class="brand-icon" aria-hidden="true">P</span>
<span>PAUL <small>Pflege-Datenschutz</small></span>
</div>
<div class="spacer"></div>
<span class="status" role="status" aria-live="polite">Online</span>
</header>
<nav class="tabbar" role="tablist" aria-label="Modi">
<button class="tab" role="tab" aria-selected="true" aria-controls="view-chat" data-mode="chat">
Chat
<span class="tab-kbd">⌃1</span>
</button>
<button class="tab" role="tab" aria-selected="false" aria-controls="view-quiz" data-mode="quiz">
Quiz
<span class="tab-kbd">⌃2</span>
</button>
<button class="tab" role="tab" aria-selected="false" aria-controls="view-flash" data-mode="flash">
Karten
<span class="tab-kbd">⌃3</span>
</button>
<button class="tab" role="tab" aria-selected="false" aria-controls="view-progress" data-mode="progress">
Fortschritt
<span class="tab-kbd">⌃4</span>
</button>
<button class="tab" role="tab" aria-selected="false" aria-controls="view-curriculum" data-mode="curriculum">
Module
<span class="tab-kbd">⌃5</span>
</button>
</nav>
<main class="main">
<!-- CHAT -->
<section id="view-chat" class="view" role="tabpanel" aria-labelledby="tab-chat" data-active="true">
<div id="welcome-screen" class="welcome hidden" aria-hidden="true">
<h2>Willkommen bei PAUL!</h2>
<p>Ich bin dein Datenschutz-Sparringspartner für die Pflege — pragmatisch, MDK-tauglich, ohne juristisches Bla-Bla. Warum das Ganze? <strong>Bußgelder vermeiden</strong>, <strong>Pflegekräfte schützen</strong>, <strong>Bewohner:innen-Würde wahren</strong>. Alles läuft im deutschen Bunker — keine Bewohner-Daten verlassen dein Haus.</p>
<div class="mode-grid">
<button class="mode-card" data-goto="chat">
<strong>Chat</strong>
<span>Frag mich alles zu Pflegedoku, Einwilligung, Schweigepflicht, MDK.</span>
</button>
<button class="mode-card" data-goto="quiz">
<strong>Quiz</strong>
<span>Szenario-Fragen aus dem Pflegealltag, mit XP.</span>
</button>
<button class="mode-card" data-goto="flash">
<strong>Flashcards</strong>
<span>Paragrafen, Begriffe, TOMs — mit Spaced-Repetition.</span>
</button>
<button class="mode-card" data-goto="progress">
<strong>Fortschritt</strong>
<span>XP, Streaks, Badges, Level vom Azubi bis Einrichtungsleitung.</span>
</button>
<button class="mode-card" data-goto="curriculum">
<strong>Module</strong>
<span>5 Curricula / 15 Module: von Grundlagen bis MDK-Prüfung.</span>
</button>
<button class="mode-card" data-prompt="PRIVACY_CHECK: [Szenario aus Pflegealltag] — z.B. Bewohner mit Demenz, Angehörige fordern Zugang zur Pflegedoku">
<strong>Datenschutz-Check</strong>
<span><code>PRIVACY_CHECK</code> + Szenario → Ampel + Rechtsgrundlage + Handlungsempfehlung als Karte.</span>
</button>
</div>
<p style="font-size:.82rem;color:var(--text-mute)">In 3 Sätzen: Chat zum Verstehen → Quiz zum Testen → Flashcards zum Merken. Fortschritt zeigt dir, wo du stehst; die Modul-Library gibt dir 10 kuratierte Pflege-Datenschutz-Module.</p>
</div>
<div id="chat-box" class="chat-box" aria-live="polite" aria-label="Gespräch"></div>
</section>
<!-- QUIZ -->
<section id="view-quiz" class="view" role="tabpanel" aria-labelledby="tab-quiz">
<div id="quiz-host"></div>
</section>
<!-- FLASHCARDS -->
<section id="view-flash" class="view" role="tabpanel" aria-labelledby="tab-flash">
<div id="flash-host"></div>
</section>
<!-- PROGRESS -->
<section id="view-progress" class="view" role="tabpanel" aria-labelledby="tab-progress">
<div id="progress-host"></div>
</section>
<!-- CURRICULUM -->
<section id="view-curriculum" class="view" role="tabpanel" aria-labelledby="tab-curr">
<div id="curr-host"></div>
</section>
</main>
<form id="composer-form" class="composer" aria-label="Nachricht verfassen">
<div id="attach-strip" class="attach-strip" aria-live="polite"></div>
<div class="composer-row">
<button type="button" class="btn-attach" id="composer-attach" aria-label="Datei anhängen" title="Datei anhängen (PDF, Bild, Text — max 5 Dateien, 8 MB)">📎</button>
<input type="file" id="composer-file" multiple accept=".pdf,.txt,.md,.csv,.json,.xml,.yaml,.yml,.log,.png,.jpg,.jpeg,.webp,.gif" hidden>
<textarea id="composer" rows="1" placeholder="Frag PAUL — Enter zum Senden, Shift+Enter für Zeilenumbruch" aria-label="Nachricht"></textarea>
<button type="submit" class="btn-primary" id="composer-send">Senden</button>
</div>
</form>
<footer class="footer">
Sovereign AI · Deutscher Bunker · <a href="https://qognio.com">Qognio</a> &nbsp;·&nbsp; DSGVO-konform · Keine externen Fonts · Keine Cookies
</footer>
</div>
<div id="toast-stack" class="toast-stack" aria-live="polite"></div>
<script src="app.js"></script>
</body>
</html>

1038
www/styles.css Normal file

File diff suppressed because it is too large Load diff