Compare commits

...
22 Commits
Author SHA1 Message Date
JUSNandClaude Opus 5.5 8cbb165c0a STAND: neue Funktionen live
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 13:50:09 +01:00
JUSNandClaude Opus 5.5 6055cf1f57 Demo: Drucken, 'Fertig, naechste Person' und Hinweis auf die Beratungsstelle
- PC: Knopf 'Drucken oder als PDF' mit eigener Druckansicht (nur die
  Erklaerung, Fachbegriffe aufgeklappt, Datum und Name der Stelle)
- PC: Knopf 'Fertig, naechste Person' (Sprache zurueck auf Deutsch,
  Haekchen und E-Mail leer, Seite ohne ?sprache= neu, oben)
- Handy: 'Noch Fragen zu diesem Brief? Ihre Beratungsstelle {name} hilft
  Ihnen gern weiter.' in 28 Sprachen, auch beim Mitnehmen (Feld e im
  verschluesselten Paket), Name auf 80 Zeichen begrenzt
- Skripte mit ?v= gegen alten Browser-Speicher
- Material: Kurzanleitung, Datenschutz-Blatt, Handzettel, Spickzettel,
  Pitch zum Ueben angepasst; doppelte Saetze im Uebungsblatt bereinigt

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 13:47:15 +01:00
JUSNandClaude Opus 5.5 fd75845881 Preise fuer Beratungsstellen: Jahrespaket statt Kleinpakete
- preise-einrichtungen.md: Klein 190 / Standard 290 / Gross 450 EUR im Jahr,
  Pilot-Angebot fuer den 26.11., Restertrag, To-dos vor dem ersten Verkauf
- Spickzettel und Pitch zum Ueben: Antwort '290 EUR im Jahr, Richtpreis'
- outreach-september.md: alte Preistabelle als ueberholt markiert

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 13:16:03 +01:00
JUSNandClaude Opus 5.5 724a8f0912 STAND: neuer Pitch, Spickzettel, Traeger FID
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 12:46:19 +01:00
JUSNandClaude Opus 5.5 9826c62e83 Praesentation MBE: neuer Spickzettel und Pitch zum Ueben
- ablaufplan: 13-Minuten-Ablauf 'Hilfe zur Selbsthilfe', Plan B, Einwaende,
  Hintergrund zum Traeger (FID, Paritaetischer, DSGVO)
- pitch-zum-ueben: voller Wortlaut aus dem Pitch-Workflow, 32 Korrekturen
  aus dem Faktencheck eingearbeitet
- demo.html: Metadaten ohne 'WCAG 2.1 AA, Vorlesen' (noch nicht deployt)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 12:46:03 +01:00
JUSNandClaude Opus 5.5 398d4b300f Handzettel/Datenschutz-Blatt: Saetze aus dem Pitch-Faktencheck korrigiert
- keine Effizienz-Versprechen, 'So denkt man leichter an Frist und Termin'
- 'Ueber Ihren Code zahlen Ihre Ratsuchenden nichts'
- ChatGPT-Vergleich ohne 'Brief vergessen'
- Datenschutz-Blatt: Uebersetzung von KI, keine Sprache muttersprachlich geprueft

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 12:38:08 +01:00
JUSNandClaude Opus 5.5 ec8eb8cbcd STAND: Druckliste (Kurzanleitung beidseitig)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 12:34:02 +01:00
JUSNandClaude Opus 5.5 9b315053c4 Kurzanleitung: aufgeraeumt, vorne Ablauf in 6 Schritten, hinten 'Wenn etwas hakt'
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 12:09:39 +01:00
JUSNandClaude Opus 5.5 ef949716c8 Praesentation MBE: Datenschutz-Blatt, Kurzanleitung, Handzettel nach Pruefung korrigiert
- Datenschutz-Blatt: Einwilligung in der Sprache der Person, Freiwilligkeit
- Kurzanleitung: nur uebers Handy im Test, Frist am Original pruefen,
  Sprache vor dem Klick, 3-Minuten-Warnung, IT-Adressen, ohne www
- Handzettel: nur fuer Mitarbeitende, Test bis 29.11.2026, neue Ueberschrift
- STAND: Entscheidungen (Handzettel intern, Schluesseltausch Fr 30.10.)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 12:06:09 +01:00
JUSNandClaude Opus 5.5 334173fbd3 STAND: Testzeitraum bis 29.11. entschieden
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 11:51:40 +01:00
JUSNandClaude Opus 5.5 5e7d5f7a62 Generalprobe 1 bestanden (Arabisch, echte KI); Code-Werkzeug: 1 Brief
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 11:50:49 +01:00
JUSNandClaude Opus 5.5 5dfccf3fa6 einrichtungs-code: Netzfehler nicht als 'Code gibt es nicht' werten
lies() hat jeden wrangler-Fehler verschluckt. Ein Wackler im Netz
meldete dann 'gibt es nicht'; aufladen/verlaengern haetten Guthaben
bzw. Namen der Einrichtung ueberschrieben. Jetzt gilt nur 404 als
'fehlt', alles andere bricht ab, ohne zu schreiben.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 11:35:32 +01:00
JUSNandClaude Opus 5.5 a5d237eca5 STAND: Sprach-Durchlauf aller 27 Sprachen dokumentiert
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 22:36:54 +02:00
JUSNandClaude Opus 5.5 808d0dbbfe STAND: zweiter Deploy live
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 22:32:04 +02:00
JUSNandClaude Opus 5.5 f5eea8ca66 Praesentation MBE: Datenschutz-Blatt (Traeger), Kurzanleitung Beratungs-PC, Spickzettel, STAND
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 22:30:33 +02:00
JUSNandClaude Opus 5.5 82235dc529 Handy-Bedienung in 27 Sprachen, Kopf im Einrichtungs-Modus, schmale Handys
- ui-texte.js: 74 Bedientexte je Sprache (uebersetzt + lektoriert), t() in
  demo.html; am PC bleibt alles deutsch, am Handy Sprache der Person,
  RTL fuer ar/fa/ur/ps, verbundene Schriften ohne Sperrsatz
- Servermeldungen am Handy nach Code in der Bediensprache
- Seitenkopf "Fuer Sie kostenlos ueber ..." statt "2 Analysen gratis"
- Turnstile passt auf schmale Handys (Abstaende, compact unter 350 px)
- Knopf fuer Mitarbeitende eindeutig: "Zugang dauerhaft auf ein Handy geben"

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 22:30:33 +02:00
JUSNandClaude Opus 5.5 6dc0207716 Praesentation MBE: STAND.md, Handzettel/Spickzettel/Musterbrief aktualisiert
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 20:34:15 +02:00
JUSNandClaude Opus 5.5 220e54b815 Startseite, 27 Sprachseiten, App: "in der Regel nach 30 Tagen geloescht" statt "spaetestens"
Je Sprache nur der eine Satzteil umformuliert (Uebersetzer + Gegenpruefung),
Sprachseiten mit tools/sprachseiten/build.js neu erzeugt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 20:34:15 +02:00
JUSNandClaude Opus 5.5 2af4b7ed41 Korrekturen aus zwei Pruefrunden vor der MBE-Vorfuehrung
Demo-Seite:
- Ampel in Kalendertagen, naechstes kommendes Datum, "Termin am"/"Frist bis"
- nie "Deutsch | Deutsch"; Beraterin bekommt immer Deutsch (d=1), das Handy
  erkennt seine Sprache selbst und speichert die PC-Vorgabe nicht dauerhaft
- Code-Feld ausserhalb von #eingabe; tolerante Code-Eingabe; Ablaufdatum
  im Banner; leeres/abgelaufenes Einrichtungs-Kontingent ohne Kaufangebot,
  mit Telefonnummer; nach Aufladen reicht ein Neuladen
- Handy-Modus: endet nach dem ersten Brief, uebersteht ein Neuladen
  (sessionStorage), keine Sackgasse ohne Zugang, ehrlicher Hinweis +
  "Noch einmal senden", wenn das Ergebnis den PC nicht erreicht
- PC wartet geduldig, solange verbunden; meldet langsame Analysen, fehlende
  Verbindung, fehlenden Zugang; Warnung beim Verlassen
- Einwilligung pro Brief, nennt Gesundheit/Herkunft/Aufenthalt
- localStorage nur ueber abgesicherten Helfer; Dateifeld wird geleert
- RTL (bdi, dir=auto), Sprachliste mit deutschem Zusatz, groesserer QR

Worker: KI-Aufruf und Router-catch liefern immer JSON mit CORS; Logs ohne
Briefinhalt; [observability]; Nutzungszaehler je Analyse (Datum, Sprache,
390 Tage); normCode + 30 Fehlversuche; Uebergabe-TTL gleitend.
Werkzeug: Auswertung pro Woche/Sprache, Eingabepruefung, --bis in der Hilfe.
Datenschutz: SCC statt DPF, "in der Regel 30 Tage", Server-Protokolle,
Nutzungszaehler.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 20:34:15 +02:00
JUSNandClaude Opus 5.5 91437d37b4 Praesentation MBE: gepruefter Plan bis 29.10. (6 Perspektiven, 61 Funde)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 19:53:59 +02:00
JUSNandClaude Opus 5.5 a2748957ac Praesentation MBE: Ablaufplan / Spickzettel (2 Seiten A4)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 19:27:02 +02:00
JUSNandClaude Opus 5.5 0571fc01eb App-Design wie die Webseite: Papier, Tinte, Amtsblau, Textmarker, Georgia
- theme.ts nimmt die Werte der Webseite (--papier, --tinte, --amtsblau,
  --marker, --stempelrot) statt Gold/Bronze; neue Bausteine schriftart
  (Georgia / Courier), ecke, kartenSchatten, formularRahmen, etikett
- alle Texte in Georgia, Versal-Etiketten in Schreibmaschinenschrift (grau
  wie "BETREFF"), Karten als Papierblaetter mit feiner Linie + flachem Schatten
- Knoepfe wie .cta: Amtsblau bzw. weisses Blatt, Tinten-Rahmen, harter
  Versatz-Schatten, beim Druecken rutscht der Knopf in den Schatten
- Startseite: Briefkopf "BehoerdenKlar by Webklar" mit Tinten-Linie,
  Textmarker auf "Fristen", dringendste Frist als Formular
- Tab-Leiste: Papier mit Tinten-Linie, Scan-Knopf mit hartem Schatten

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 19:27:02 +02:00
69 changed files with 4764 additions and 486 deletions

No files matched your search

+10 -12
View File
@@ -18,7 +18,7 @@ import { initialisiereBenachrichtigungen } from './src/services/erinnerungen';
import { holeConsent } from './src/services/storage'; import { holeConsent } from './src/services/storage';
import { AppSchutz } from './src/components/AppSchutz'; import { AppSchutz } from './src/components/AppSchutz';
import { Ikone } from './src/components/Ikone'; import { Ikone } from './src/components/Ikone';
import { farben, schrift } from './src/theme'; import { farben, schrift, schriftart } from './src/theme';
import { FristenScreen } from './src/screens/FristenScreen'; import { FristenScreen } from './src/screens/FristenScreen';
import { ArchivScreen } from './src/screens/ArchivScreen'; import { ArchivScreen } from './src/screens/ArchivScreen';
import { ConsentScreen } from './src/screens/ConsentScreen'; import { ConsentScreen } from './src/screens/ConsentScreen';
@@ -67,10 +67,11 @@ function HauptTabs() {
headerShown: false, headerShown: false,
tabBarActiveTintColor: farben.primaer, tabBarActiveTintColor: farben.primaer,
tabBarInactiveTintColor: farben.textTertiaer, tabBarInactiveTintColor: farben.textTertiaer,
tabBarLabelStyle: { fontSize: 11, fontWeight: '600' }, tabBarLabelStyle: { fontFamily: schriftart.serif, fontSize: 12, fontWeight: '700' },
tabBarStyle: { tabBarStyle: {
backgroundColor: farben.flaeche, backgroundColor: farben.hintergrund,
borderTopColor: farben.rand, borderTopColor: farben.tinte,
borderTopWidth: 2,
height: 56 + insets.bottom, height: 56 + insets.bottom,
paddingTop: 6, paddingTop: 6,
paddingBottom: insets.bottom, paddingBottom: insets.bottom,
@@ -120,7 +121,7 @@ export default function App() {
headerStyle: { backgroundColor: farben.hintergrund }, headerStyle: { backgroundColor: farben.hintergrund },
headerShadowVisible: false, headerShadowVisible: false,
headerTintColor: farben.primaer, headerTintColor: farben.primaer,
headerTitleStyle: { fontSize: schrift.gross, fontWeight: '700', color: farben.text }, headerTitleStyle: { fontFamily: schriftart.serif, fontSize: schrift.gross, fontWeight: '700', color: farben.text },
headerBackTitle: 'Zurück', headerBackTitle: 'Zurück',
contentStyle: { backgroundColor: farben.hintergrund }, contentStyle: { backgroundColor: farben.hintergrund },
}} }}
@@ -149,12 +150,9 @@ const styles = StyleSheet.create({
backgroundColor: farben.primaerFuellung, backgroundColor: farben.primaerFuellung,
alignItems: 'center', alignItems: 'center',
justifyContent: 'center', justifyContent: 'center',
borderWidth: 3, // Wie die Knöpfe der Webseite: Amtsblau, Tinten-Rahmen, harter Schatten
borderColor: farben.flaeche, borderWidth: 2,
shadowColor: '#000', borderColor: farben.tinte,
shadowOffset: { width: 0, height: 3 }, boxShadow: '3px 4px 0px #21211D',
shadowOpacity: 0.2,
shadowRadius: 5,
elevation: 5,
}, },
}); });
+3
View File
@@ -317,6 +317,9 @@ fehlt noch" ist für dich schon ein Erfolg.
Einrichtung kauft vorher ein **Briefkontingent** — jeder Brief ist bezahlt, bevor er Einrichtung kauft vorher ein **Briefkontingent** — jeder Brief ist bezahlt, bevor er
genutzt wird. Mehr Nutzer heißt mehr Einnahmen, nie mehr Verlust. genutzt wird. Mehr Nutzer heißt mehr Einnahmen, nie mehr Verlust.
> ⚠️ **Überholt am 25.10.2026:** Die Pakete unten (20 € / 75 €) sind zu billig. Neue Preise:
> [preise-einrichtungen.md](preise-einrichtungen.md) (Jahrespaket, Standard 290 € für 1.200 Briefe).
| | Preis | pro Brief | | | Preis | pro Brief |
|---|---|---| |---|---|---|
| Deine Kosten (eigene Rechnung ~2,5 ct, mit Puffer für fremde Sprachen) | — | ~5 ct | | Deine Kosten (eigene Rechnung ~2,5 ct, mit Puffer für fremde Sprachen) | — | ~5 ct |
+172
View File
@@ -0,0 +1,172 @@
# Stand: Präsentation MBE Kirchheimbolanden (Do 29.10.2026)
> Diese Datei halte ich (Claude) bei jedem Schritt aktuell.
> Zeichen: ✅ erledigt · 🔄 läuft gerade · ⏳ als Nächstes · 👤 **machst du** · 💤 nach dem Termin
>
> Ausführlicher Prüfbericht mit allen 61 Funden: [plan-bis-29-10.md](plan-bis-29-10.md)
**Zuletzt aktualisiert:** So 25.10.2026: **Generalprobe 1 bestanden** (Laptop Deutsch + Handy Arabisch, echte KI, keine Fehler). Als Nächstes: Plan für So–Mi und neuer Pitch.
---
## Wo wir stehen (in einem Satz)
**Live auf behoerdenklar.de** (Gesundheits-Check 10/10 grün). Dein Vorführ-Code: **`VORF-2EDF`**
(30 Briefe, bis 30.11.; 2 davon in der Generalprobe verbraucht).
---
## 1. Fertig gebaut (heute, 22.10.)
### Für die Beratungsstellen
- ✅ **Einrichtungs-Code:** Die MBE bekommt einen Code wie `MBE-K7QX`, damit ist es für ihre Ratsuchenden kostenlos.
Das Einlösen geht per QR-Code oder über ein Eingabefeld, auch mit Tippfehlern wie „mbe k7qx“.
- ✅ **Werkzeug für Codes:** anlegen, Stand abfragen, aufladen, verlängern. Der Stand zeigt auch, **wie viele Briefe pro Woche und in welcher Sprache** genutzt wurden (für das Auswertungsgespräch).
- ✅ **Kontingent leer oder abgelaufen:** kein Kaufangebot, stattdessen ein Hinweis mit deiner Telefonnummer.
### Handy ↔ PC (verschlüsselt per QR-Code)
- ✅ **Handy als Kamera für den PC:** Die Erklärung erscheint am PC auf **Deutsch** und am Handy in der **Muttersprache**.
- ✅ **Ergebnis aufs Handy mitnehmen** (QR-Code vom PC).
- ✅ **Guthaben/Zugang aufs Handy holen** (QR-Code vom PC).
- ✅ **App:** „Am Computer zeigen“ und „Vom Computer übernehmen“, im iPhone-Simulator getestet.
### Korrekturen aus der großen Prüfung (6 Blickwinkel)
- ✅ Die Ampel zeigt am 29.10. **Rot** statt Gelb (sie rechnet jetzt in Kalendertagen).
- ✅ Kein „Deutsch | Deutsch“ mehr, wenn die Übersetzung scheitert.
- ✅ Die Beraterin bekommt **immer** eine deutsche Fassung.
- ✅ Das Code-Feld bleibt sichtbar, auch nach den 2 Gratis-Analysen.
- ✅ Das Handy sagt nach dem ersten Brief klar, wie es weitergeht.
- ✅ Die Einwilligung gilt **pro Brief** und nennt Gesundheit, Herkunft und Aufenthalt.
- ✅ Arabisch und Farsi werden richtig herum angezeigt (rechts nach links).
- ✅ Der PC meldet Probleme („dauert ungewöhnlich lange“, „keine Verbindung“), statt endlos zu warten.
- ✅ Die Seite funktioniert auch in Browsern, die das Speichern verbieten.
- ✅ Größerer QR-Code und eine Sprachliste mit deutschem Zusatz („العربية – Arabisch“).
### Material
- ✅ [Handzettel](handzettel.pdf) (A4 zum Dalassen). Der **QR-Code zeigt noch nicht auf den MBE-Code**, siehe Di 27.10.
- ✅ [Musterbrief Ausländerbehörde](musterbrief-auslaenderbehoerde.pdf) (Termin 03.11., damit die Ampel rot ist)
- ✅ [Ablaufplan / Spickzettel](ablaufplan.pdf) (2 Seiten, nur für dich)
- ✅ Datenschutzerklärung ergänzt (Einrichtungs-Code, Übergabe, Nutzungszähler, „in der Regel 30 Tage“)
### Design
- ✅ Die App sieht jetzt aus wie die Webseite (Papier, Amtsblau, Textmarker, Georgia-Schrift).
---
## 2. Gegenprüfung erledigt
- ✅ **Zweite Prüfung der Korrekturen:** 17 Funde, alle behoben und lokal getestet:
- Bei der allerletzten Analyse einer Beratungsstelle erscheint kein Kaufangebot mehr, sondern dein Hinweis mit Telefonnummer.
- Nach dem Aufladen oder Verlängern reicht ein Neuladen der Seite.
- Das Handy erkennt seine eigene Sprache, wenn am PC „Deutsch“ steht, und speichert auf dem Handy der Person nichts dauerhaft.
- Handy ohne Zugang: klarer Hinweis auf beiden Geräten statt einer Sackgasse.
- Ein Neuladen am Handy beendet die Verbindung zum PC nicht mehr.
- Kommt das Ergebnis nicht beim PC an, sagt das Handy das ehrlich und bietet „Noch einmal an den Computer senden“.
- Der PC wartet geduldig, solange das Handy verbunden ist (z. B. wenn erst noch geredet wird).
- Die Ampel nimmt das nächste kommende Datum, nicht ein schon vergangenes.
- Der Worker antwortet bei jedem Fehler mit einer verständlichen Meldung, und die Protokolle enthalten keinen Briefinhalt.
- Datenschutzerklärung: Server-Protokolle (max. 7 Tage) ergänzt, Nutzungszähler max. 13 Monate.
- Startseite, **alle 27 Sprachseiten** und App: „in der Regel nach 30 Tagen gelöscht“ statt „spätestens“ (von Übersetzern umformuliert und gegengeprüft).
- ✅ Alle Prüfungen grün: Webseite, Worker, App, 43 Tests.
> ⚠️ **Hinweis für die Generalproben:** Beim Musterbrief zeigt die Ampel **am Sa 24.10. Gelb** („Noch 10 Tage“) und am Mo 26.10. ebenfalls Gelb. Das ist richtig so. **Ab Di 27.10. ist sie rot.** Bildschirmfotos für den Notfall deshalb erst am Mi 28.10. machen.
## 2b. Zweiter Deploy (Do 22.10., nachts): live ✅
- ✅ **Bedienung am Handy in 27 Sprachen.** Einwilligung, Knöpfe, Hinweise, Fehlermeldungen, Ergebnis-Überschriften, Ampel, Kalender und Anruf-Hilfe kommen in der Sprache der Person, Arabisch/Farsi/Urdu/Paschtu von rechts nach links. **Am PC bleibt alles deutsch.** Je Sprache übersetzt und von einem Lektor geprüft, maschinell auf Vollständigkeit geprüft (0 Fehler).
- ✅ Cloudflare-Kästchen passt auf schmale Handys. Oben steht „Für Sie kostenlos über …“ statt „2 Analysen gratis“.
- ✅ Knopf für die Beratung umbenannt: „🔑 Zugang dauerhaft auf ein Handy geben (nur für Mitarbeitende)“, damit man ihn nicht mit „Lieber mit dem Handy fotografieren“ verwechselt.
- ✅ **[Datenschutz-Blatt](datenschutz-blatt.pdf)** für die Datenschutzbeauftragte des Trägers (2 Seiten, gegen den Code geprüft).
- ✅ **[Kurzanleitung](kurzanleitung-beratung.pdf)** für Beraterinnen (1 Seite). Der Code wird am Di 27.10. eingetragen.
- ✅ **Webseite veröffentlicht**, Gesundheits-Check 12/12 grün.
- ✅ **Code-Werkzeug repariert (25.10.):** Ein kurzer Netzwerkfehler meldete fälschlich „Code gibt es nicht“; „aufladen“/„verlaengern“ hätten dabei Guthaben oder Namen überschreiben können. Jetzt bricht es ab, ohne etwas zu ändern.
- ✅ **Material korrigiert (So 25.10.)** nach der Prüfung der Vorbereitung (68 Funde, 28 bestätigt):
- **Datenschutz-Blatt:** Einwilligung steht jetzt richtig „in der Sprache der Person“ (vorher fälschlich „nur Deutsch“), dazu „Freiwillig: Wer nicht einwilligt, wird ganz normal beraten“.
- **Kurzanleitung** (danach auf Wunsch aufgeräumt: vorne Ablauf in 6 Schritten + 3 Regeln, hinten „Wenn etwas hakt“, ein Blatt beidseitig): im Test nur übers Handy der Person; Frist immer am Originalbrief prüfen; Sprache *vor* dem Klick wählen (Dari = Farsi); keine Ausweise fotografieren; „etwa eine Minute“; Handy-Bildschirm anlassen; was bei der 3-Minuten-Warnung zu tun ist; Adressen für die IT; „ohne www“.
- **Handzettel:** neue Überschrift „… verstehen ihren Brief, in ihrer eigenen Sprache“; „nur für Mitarbeitende, bitte nicht aushängen“; Test endet am 29.11.2026; „Rät nicht“ statt „Erfindet nichts“; ChatGPT-Vergleich ohne das wackelige Konto-Argument.
- ✅ **Neuer Pitch (So 25.10.)**: Recherche (MBE bundesweit, Träger vor Ort), 3 Entwürfe, bewertet aus Sicht einer Beraterin, einer Träger-Leitung und eines Pitch-Coachs, Faktencheck mit 22 Korrekturen.
- **[Spickzettel](ablaufplan.pdf)** (2 Seiten, zum Mitnehmen): 13-Minuten-Ablauf, Plan B, Einwände, Hintergrund.
- **[Pitch zum Üben](pitch-zum-ueben.pdf)** (voller Wortlaut, nur zu Hause).
- Leitbild **„Hilfe zur Selbsthilfe“**. Nie „Zeit sparen“ oder „effizient“, weil um die MBE gerade eine Kürzungsdebatte läuft.
- **Träger ist die Förderinitiative Donnersberg e.V. (FID):** nicht kirchlich, im Paritätischen, also DSGVO, mit eigener Datenschutzbeauftragung. Kontakt MBE laut FID-Seite: Herr v. Bose, also „Beraterinnen und Berater“ sagen.
- Der Weg zu weiteren Stellen geht über Empfehlungen: FID Alzey → MBE-Stellen des Paritätischen in RLP → Referat Migration in Mainz → Paritätischer Gesamtverband. **Am 29.10. noch nicht ansprechen.**
- Handzettel und Datenschutz-Blatt an den Faktencheck angepasst (keine Effizienz-Versprechen, „über Ihren Code“, keine Sprache muttersprachlich geprüft).
- ✅ **Preis entschieden (So 25.10.):** Auf Nachfrage sagst du **„voraussichtlich 290 € im Jahr für bis zu 1.200 Briefe, Endpreis, Richtpreis, Angebot am 26.11.“**. Die alten Pakete (20 € / 75 €) sind zu billig und gestrichen. Bleibt übrig: ca. 160–260 € im Jahr pro Stelle, vor Steuern (geschätzt, noch nicht gemessen). Alles Weitere, auch das Pilot-Angebot für den 26.11. (190 € für 2027, Preisgarantie bis 2029, kostenlose Brücke bis Ende Dezember): **[preise-einrichtungen.md](../preise-einrichtungen.md)**.
- ✅ **Drei neue Funktionen für die Beratung (So 25.10., live, Gesundheits-Check grün):**
- **🖨️ Drucken oder als PDF** am PC: nur die Erklärung, mit Name der Stelle und Datum, Fachbegriffe aufgeklappt. Auf Arabisch umgeschaltet druckt man die Fassung für die Person.
- **✅ Fertig, nächste Person** am PC: Erklärung weg, Sprache zurück auf Deutsch, Häkchen leer, Seite oben. Der Zugang der Stelle bleibt.
- **🤝 „Noch Fragen zu diesem Brief? Ihre Beratungsstelle … hilft Ihnen gern weiter.“** am Handy unter jeder Erklärung, in 27 Sprachen (übersetzt und gegengelesen). Kommt auch beim „Mitnehmen“ mit. Botschaft für den Pitch: *BehördenKlar schickt die Leute zu Ihnen, nicht weg.*
- Lokal getestet (PC, Druckansicht, Fertig, Handy Arabisch, Mitnehmen). Gegenprüfung: 19 mögliche Probleme untersucht, alle harmlos. Drei trotzdem abgesichert (Firefox-Häkchen, ?sprache= in der Adresse, Namenslänge). Skripte haben jetzt eine Versionsnummer gegen alten Browser-Speicher.
- Material angepasst: Kurzanleitung (Schritt 6), Datenschutz-Blatt, Handzettel, Spickzettel, Übungsblatt.
- ✅ **Webseite:** Metadaten der Demo-Seite ohne „WCAG 2.1 AA, Vorlesen“, live seit So 25.10.
- ✅ **Entscheidungen (So 25.10.):** Handzettel-Code nur für Mitarbeitende. Anthropic-Schlüssel wird **erst am Fr 30.10.** getauscht (kein Risiko vor dem Termin).
- ℹ️ Der Live-Test im automatisierten Browser ging nicht, weil Cloudflare ferngesteuerte Browser blockt. Deshalb ist der echte Test die **Generalprobe morgen mit deinen Geräten**.
- ✅ **Sprach-Durchlauf (lokal, Handy-Größe 375 px):** alle 27 Sprachen nacheinander eingestellt. In jeder Sprache ist **kein deutscher Text mehr übrig**, **nichts ragt über den Rand**, die Schreibrichtung stimmt (Arabisch, Farsi, Urdu und Paschtu von rechts). Tigrinya und Hindi zusätzlich mit Bildschirmfoto angeschaut: Schrift sauber.
- Noch offen: die **echte KI-Erklärung** in den Sprachen (kommt erst mit der Generalprobe) und eine Prüfung durch Muttersprachler für Tigrinya, Somali, Paschtu und Kurdisch (nach dem Termin).
## 3. Was du tun musst
- ✅ ~~„deploy“ schreiben~~: erledigt, live seit Do 22.10. abends.
- ✅ **Generalprobe 1** (So 25.10., statt Fr 23.10.) mit Laptop und Handy, Musterbrief:
- Durchgang Deutsch: 27 Sekunden, Ergebnis am PC.
- Durchgang **Arabisch** (Laptop Deutsch, Handy Arabisch): **50 Sekunden**, Übersetzung ohne Fehler. Damit ist der zweisprachige Weg zum ersten Mal live mit echter KI getestet.
- Laut dir passt alles: Umschalten Deutsch/Arabisch, Telefon-Sätze deutsch mit arabischer Bedeutung, Fachbegriff bleibt deutsch, Ampel gelb (richtig bis Mo), Kalender, Mitnehmen.
- Merke: **Arabisch muss am Laptop eingestellt sein, bevor** du auf „Lieber mit dem Handy fotografieren“ klickst.
- Für den Spickzettel: „Das dauert etwa eine Minute“ (statt ein bis zwei).
- ✅ ~~Mo 26.10. MBE anrufen~~: Entscheidung vom 22.10.: Träger und AVV klärst du **erst, wenn die MBE Interesse hat**, also im Termin oder danach. Den Satz dafür findest du im Spickzettel.
- ✅ **Testzeitraum entschieden (25.10.):** genau 1 Monat, der Code gilt **bis So 29.11.2026**. Will die MBE weitermachen, verlängere ich ihn mit einem Befehl.
Befehl für Di 27.10.: `node tools/einrichtungs-code.js neu "MBE Donnersberg" MBE --briefe 100 --bis 2026-11-29`
- 👤 **Generalproben mitmachen** (mit deinem Handy und Laptop, siehe unten).
- 👤 🔴 **Alten Anthropic-Schlüssel tauschen: Fr 30.10.** (nach dem Termin). console.anthropic.com → neuen Schlüssel → selbst `cd proxy && npx wrangler secret put ANTHROPIC_API_KEY` → `npm run pruefung` + echte Probe mit Foto → erst dann alten Schlüssel löschen. Dabei Monatslimit im Konto setzen.
---
## 4. Wochenplan
| Tag | Was | Wer |
|---|---|---|
| **Do 22.** | Korrekturen ✅, Gegenprüfung ✅, alles gesichert ✅ | Claude |
| **Do 22.** | **Deploy** ✅, Vorführ-Code `VORF-2EDF` ✅, `npm run pruefung` ✅ | Claude |
| **Fr 23. / Sa 24.** | **Generalprobe 1 mit echter KI:** Musterbrief, Arabisch **und** Farsi, mit Stoppuhr, Bildschirmfotos für den Notfall | du und Claude |
| **So 25.** | Fehler aus der Probe beheben. (Datenschutz-Blatt und Kurzanleitung sind schon fertig ✅) | Claude |
| **Mo 26.** | **Generalprobe 2.** Spätester Tag für Code-Änderungen am Worker. | du und Claude |
| **Di 27.** | **MBE-Code anlegen**, in den Handzettel eintragen, gedruckten QR mit dem Handy testen, alles drucken (Handzettel 5×, Musterbrief 2×, Kurzanleitung 5× **beidseitig**, Datenschutz-Blatt 2× beidseitig, Spickzettel 1×). Ab abends **nichts mehr am Code ändern.** | du und Claude |
| **Mi 28.** | **Generalprobe 3**, genau wie am Termin. Geräte laden, Checkliste vom Spickzettel. | du |
| **Do 29.** | **Termin.** Ziel: Code übergeben und Auswertungstermin am 26.11. ausmachen. | du |
---
## 5. Wenn noch Zeit ist (vor dem Termin)
- ✅ ~~Arabische Bedienung~~: erledigt, sogar in allen 27 Sprachen.
- ✅ ~~„Kostenlos über …“ im Seitenkopf~~: erledigt.
---
## 6. Nach dem Termin
- 💤 **AVV-Entwurf**, TOMs und Eintrag für das Verarbeitungsverzeichnis, bevor die MBE echte Briefe hochlädt.
- 💤 **Mehrere Fotos pro Brief** (mehrseitige Briefe).
- 💤 Verbindung PC ↔ Handy übersteht ein Neuladen der Seite.
- 💤 **Empfehlungsprogramm für Privatleute:** „Empfiehl BehördenKlar weiter, ihr bekommt beide 2 Gratis-Briefe“ (persönlicher Link, ohne Konto). Nicht über den MBE-Code und nicht am 29.10. ansprechen.
- 💤 Wöchentliche Stand-Mail an die MBE, Erinnerung 7 Tage vor Testende.
- 💤 Angebot und Rechnung (§ 19 UStG) bis zum 26.11.: echte KI-Kosten messen, Angebots- und Rechnungsvorlage, Bedingungen für Einrichtungen, Steuerberater (25.000-€-Grenze der ganzen GbR). Liste in [preise-einrichtungen.md](../preise-einrichtungen.md).
- 💤 App: Haiku 5.5 statt 4.5 prüfen (laut Preisliste ca. 10× günstiger).
---
## 7. Befehle, falls du selbst etwas machen willst
```bash
# Stand eines Codes (inkl. Nutzung pro Woche und Sprache)
node tools/einrichtungs-code.js stand MBE-XXXX
# Code verlängern
node tools/einrichtungs-code.js verlaengern MBE-XXXX 2026-12-31
# Gesundheits-Check der Live-Seite (nach jedem Deploy)
npm run pruefung
# Live-Logs des Workers ansehen (wenn bei der Probe etwas hakt)
cd proxy && npx wrangler tail
```
+202
View File
@@ -0,0 +1,202 @@
<!DOCTYPE html>
<!--
Spickzettel für die Präsentation bei der MBE Kirchheimbolanden (Do 29.10.2026).
Nur für Justin, nicht zum Dalassen. 2 Seiten A4.
Grundlage: Pitch-Workflow vom 25.10. (3 Entwürfe, 3 Bewertungen, Faktencheck mit 22 Korrekturen).
Den vollen Wortlaut zum Üben enthält pitch-zum-ueben.html.
PDF (im Ordner marketing/praesentation-mbe):
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless=new --disable-gpu \
--no-pdf-header-footer --print-to-pdf=ablaufplan.pdf "file://$PWD/ablaufplan.html"
-->
<html lang="de">
<head>
<meta charset="UTF-8">
<title>Spickzettel Präsentation MBE</title>
<style>
@page { size: A4; margin: 0; }
:root { --papier: #faf7f0; --tinte: #21211d; --grau: #6b675e; --amtsblau: #1d4e89; --rot: #b3372b; --marker: #ffe66b; }
* { margin: 0; padding: 0; box-sizing: border-box; -webkit-print-color-adjust: exact; print-color-adjust: exact; }
body { font-family: Georgia, 'Times New Roman', serif; color: var(--tinte); }
.seite { width: 210mm; height: 297mm; padding: 8.5mm 13mm; background: var(--papier); overflow: hidden; position: relative;
page-break-after: always; font-size: 8.6pt; line-height: 1.28; }
.seite:last-child { page-break-after: auto; }
.kopf { display: flex; justify-content: space-between; align-items: baseline; border-bottom: 0.6mm solid var(--tinte); padding-bottom: 1.8mm; }
.kopf b { font-size: 12pt; }
.kopf span { font-family: 'Courier New', monospace; font-size: 7.8pt; color: var(--grau); }
h1 { font-size: 16.5pt; line-height: 1.15; margin-top: 2.6mm; }
.markiert { background: linear-gradient(104deg, transparent 2%, var(--marker) 4%, var(--marker) 96%, transparent 98%); padding: 0 1.2mm; }
.kern { margin-top: 2mm; font-size: 9.6pt; }
.kern b { color: var(--amtsblau); }
h2 { font-family: 'Courier New', monospace; font-weight: 400; font-size: 7.6pt; text-transform: uppercase; letter-spacing: .14em; color: var(--grau);
margin: 2.8mm 0 1.2mm; display: flex; gap: 3mm; align-items: center; }
h2::after { content: ''; flex: 1; border-top: 0.25mm solid rgba(33,33,29,.25); }
.schritt { display: grid; grid-template-columns: 13mm 1fr; gap: 2.5mm; padding: 1mm 0; border-bottom: 0.25mm dotted rgba(33,33,29,.35); }
.zeit { font-family: 'Courier New', monospace; font-weight: 700; color: var(--amtsblau); font-size: 8.6pt; padding-top: .3mm; }
.schritt h3 { font-size: 9.8pt; margin-bottom: .5mm; }
.sag { border-left: 0.8mm solid var(--amtsblau); background: #fff; padding: .5mm 2mm; margin: .45mm 0; font-style: italic; }
.tun { color: #3d3a33; }
.tun b { font-style: normal; }
.drei { font-weight: 700; font-style: normal; color: var(--amtsblau); }
.kurz { margin-top: 2.2mm; border: 0.5mm solid var(--rot); background: #fff; padding: 1.8mm 3mm; font-size: 8.6pt; }
.kurz b { color: var(--rot); }
.zwei { display: grid; grid-template-columns: 1fr 1fr; gap: 4.5mm; }
.kasten { background: #fff; border: 0.3mm solid rgba(33,33,29,.3); padding: 2.2mm 3mm; }
ul { list-style: none; }
li { position: relative; padding-left: 3.6mm; margin-bottom: .7mm; }
li::before { content: '›'; position: absolute; left: 0; color: var(--amtsblau); font-weight: 700; }
.check li::before { content: '☐'; font-weight: 400; }
.frage { margin-bottom: 1.2mm; }
.frage b { display: block; }
.nicht li::before { content: '✗'; color: var(--rot); }
.nicht { border-left: 0.8mm solid var(--rot); background: #fdf1ef; padding: 1.8mm 2.5mm; }
.wissen { border-left: 0.8mm solid var(--amtsblau); background: #fff; padding: 1.8mm 2.5mm; }
.klein { font-size: 8pt; color: var(--grau); }
</style>
</head>
<body>
<!-- ================= Seite 1: Ablauf ================= -->
<div class="seite">
<div class="kopf"><b>📬 BehördenKlar · Spickzettel</b><span>MBE Kirchheimbolanden (FID) · Do 29.10.2026 · nur für mich</span></div>
<h1>13 Minuten: <span class="markiert">fragen, zeigen, ehrlich sein, bitten.</span></h1>
<p class="kern">Leitbild <b>Hilfe zur Selbsthilfe</b>, nie „Zeit sparen“. Ziel: <b>Code übergeben</b> und <b>26.11. mit Uhrzeit</b> im Kalender.</p>
<h2>Ablauf</h2>
<div class="schritt"><span class="zeit">0:00</span><div>
<h3>Begrüßung (langsam, Blickkontakt reihum)</h3>
<p class="sag">„Ich bin Justin Klein aus Winnweiler, fast von nebenan. Schwierige Briefe vom Amt kenne ich von klein auf, meine Mutter ist selbst nach Deutschland gekommen. Deshalb habe ich BehördenKlar gebaut. Eine Viertelstunde, passt das? … Sie kennen die Menschen, ich kenne nur die Technik. Heute geht es nicht um einen Vertrag, am Ende habe ich eine Bitte. Darf ich Sie zuerst etwas fragen?“</p>
</div></div>
<div class="schritt"><span class="zeit">1:00</span><div>
<h3>Erst fragen, dann zeigen</h3>
<p class="sag">„Wenn jemand mit einem Brief zu Ihnen kommt: Was passiert dann als Erstes?“ · „Wie oft sind Termin oder Frist dann schon knapp?“</p>
<p class="tun"><b>Still sein, bis fünf zählen, ihre Wörter mitschreiben.</b> Bleibt es still: „Was war der letzte Brief, der hier lag?“</p>
</div></div>
<div class="schritt"><span class="zeit">2:30</span><div>
<h3>Der Gedanke dahinter, Musterbrief Nr. 1 ans Team</h3>
<p class="sag">„Der Brief ist nicht erledigt, wenn die Person aus Ihrer Tür geht. Bei Ihnen heißt das Hilfe zur Selbsthilfe, oder? Genau da soll BehördenKlar helfen. … Ein erfundener Brief einer Ausländerbehörde. Sie haben das Original, am Ende schauen Sie bitte, ob alles stimmt.“</p>
</div></div>
<div class="schritt"><span class="zeit">3:30</span><div>
<h3>Vorführung: „Herr Beispiel“ fotografiert mit seinem Handy</h3>
<p class="tun">Erst jetzt <b>„📱 Lieber mit dem Handy fotografieren“</b> → scannen → <b>„✅ Handy verbunden“</b> zeigen → Handy hochhalten → Häkchen → Cloudflare abwarten → <b>📷</b> → <b>„Foto aufnehmen“</b> → Musterbrief Nr. 2 → „Foto verwenden“.</p>
<p class="sag">„Das ist das Handy von Herrn Beispiel. Keine App, kein Konto. Die Seite ist auf Arabisch, auch die Einwilligung. Sie können das nicht lesen. Er kann es. Darum geht es.“</p>
</div></div>
<div class="schritt"><span class="zeit">4:30</span><div>
<h3>Wartezeit, etwa eine Minute: kurz Datenschutz, dann fragen</h3>
<p class="sag">„Das Foto geht verschlüsselt an unseren Server bei Cloudflare, dann an den KI-Dienst Anthropic, beide USA. Bei uns nicht gespeichert, Anthropic löscht in der Regel nach 30 Tagen, kein Training. Wer nicht einwilligt, wird ganz normal beraten. … Wenn Herr Beispiel mit diesem Brief zu Ihnen käme: Was müsste er unbedingt verstehen?“ <span class="tun">→ Liste mitschreiben.</span></p>
</div></div>
<div class="schritt"><span class="zeit">5:30</span><div>
<h3>Erstens: Er versteht seinen Brief</h3>
<p class="sag"><span class="tun">Laptop zum Team, ihre Liste abhaken, nur vorlesen, was dasteht, Fachbegriff aufklappen.</span> „Sie haben das Original. Stimmt das so? Stimmen Termin und Frist?“ · Bei Fehler: <b>„Gut, dass er damit bei Ihnen sitzt.“</b></p>
</div></div>
<div class="schritt"><span class="zeit">7:00</span><div>
<h3>Zweitens, drittens: Termin, Frist, ein nötiger Anruf. Dann das, was nur sie können</h3>
<p class="tun">Ampel (rot). Am Handy <b>📅</b> → Vorschau → abbrechen (nie am PC). Am PC oben <b>„العربية“</b>: bei „Anrufen“ Satz deutsch, darunter arabisch. Zurück auf <b>„Deutsch“</b>.</p>
<p class="sag">„Mit wenigen Tipps in seinem Kalender, mit Erinnerung. Der Eintrag liegt nur bei ihm. … Muss er absagen: oben deutsch, so sagt er es. Darunter arabisch, damit er weiß, was er sagt.“</p>
<p class="sag"><span class="drei">„Er versteht seinen Brief. Er denkt leichter an Termin und Frist. Er ist vorbereitet, wenn ein Anruf nötig ist.</span> Das kann keine KI. Das sind Sie.“ <span class="tun">→ Handy hoch, unten zeigen:</span> „Bei jeder Erklärung: Noch Fragen? <b>Ihre Beratungsstelle MBE Donnersberg hilft weiter.</b> Es schickt die Leute zu Ihnen, nicht weg.“</p>
</div></div>
<div class="schritt"><span class="zeit">8:30</span><div>
<h3>Ehrlich: was es nicht kann (vor der Bitte!)</h3>
<p class="sag">„Lieber jetzt als in vier Wochen: Eine KI kann sich irren, Fristen am Original prüfen. Keine Rechtsberatung. Ein Foto pro Erklärung. Kein Vorlesen, für Menschen, die nicht lesen können, nur eine halbe Hilfe. Die Erklärung bleibt nur, solange die Seite offen ist (am PC aber druckbar). Keine Sprache ist von Muttersprachlern geprüft.“</p>
</div></div>
<div class="schritt"><span class="zeit">9:30</span><div>
<h3>Die zwei Bitten. Erst jetzt die Mappe öffnen</h3>
<p class="sag">„Erstens ein Testzugang: ein Monat bis 29. November, bis zu 100 Briefe, kostenlos. Über Ihren Code zahlen auch Ihre Ratsuchenden nichts. Nur für Mitarbeitende, im Test nur übers Handy der Person. … Sie gehören zur Förderinitiative Donnersberg, richtig? Wer macht dort den Datenschutz?“ <span class="tun">→ Namen notieren.</span></p>
<p class="sag">„Zweitens: Darf ich am Donnerstag, 26. November, wiederkommen? Welche Uhrzeit passt Ihnen?“ <span class="tun">→ <b>schweigen</b>, eintragen, laut wiederholen.</span></p>
</div></div>
<div class="schritt"><span class="zeit">11:00</span><div>
<h3>Zuhören, dann Abschluss und aufstehen</h3>
<p class="sag">„Was müsste bis zum 26. November passiert sein, damit Sie sagen, das hat Ihren Ratsuchenden geholfen?“ · „Und was müsste passieren, damit Sie sagen: Das lassen wir lieber?“ <span class="tun">→ mitschreiben, nichts verteidigen.</span></p>
<p class="sag">„Code bis 29. November, das Blatt schicke ich [Name] heute als PDF, am 26. um [Uhrzeit] komme ich wieder. Rufen Sie an, auch bei Kleinigkeiten. Auch wenn es heißt: So brauchen wir das nicht. Das hilft mir genauso.“</p>
</div></div>
</div>
<!-- ================= Seite 2: Vorbereitung, Plan B, Einwände ================= -->
<div class="seite">
<div class="kopf"><b>📬 BehördenKlar · Spickzettel</b><span>Vorbereitung · Plan B · Einwände · Seite 2</span></div>
<div class="kurz" style="margin-top: 3mm;"><b>Nur 10 Minuten?</b> Keine Studien-Zahl, Grenzen in drei Sätzen (KI kann sich irren, keine Rechtsberatung, kein Vorlesen), nur eine Zuhör-Frage. <b>Die Bitte (Code + 26.11.) nie streichen.</b> &nbsp;·&nbsp; <b>Zögert das Team:</b> „Sie müssen heute nichts entscheiden. Darf ich mich Anfang nächster Woche melden?“</div>
<div class="zwei" style="margin-top: 3mm;">
<div>
<h2 style="margin-top: 0;">Vorher</h2>
<div class="kasten check">
<ul>
<li><b>Mi:</b> Generalprobe 3, Bildschirmfotos und Video mit roter Ampel offline. VORF-2EDF: mindestens 10 Briefe übrig</li>
<li>Mappe: 2× Musterbrief, 5× Handzettel, 5× Kurzanleitung (beide mit MBE-Code), 2× Datenschutz-Blatt, Block und Stift</li>
<li><b>MBE-Code nie am eigenen Laptop einlösen</b>, vorgeführt wird nur mit VORF-2EDF</li>
<li>Im Auto: <b>Hotspot an</b>, Seite offen, „🤝 Kostenlos über MBE Donnersberg (Vorführung)“ sichtbar, <b>Arabisch eingestellt</b>. Noch nicht auf „Lieber mit dem Handy“ klicken (QR gilt 15 Min.)</li>
<li>Laptop: <span style="font-family: 'Courier New', monospace;">caffeinate -d</span>, Ton aus, Ladekabel, Zoom 125 %. Handy: Akku voll, Sperre „Nie“, lautlos</li>
<li>Drinnen: Namen mit Sitzskizze notieren, Bildschirm zum Team, eigenes Internet</li>
<li>Nach dem Klick prüfen: Häkchen „Hier am Bildschirm immer auf Deutsch …“ ist gesetzt</li>
</ul>
</div>
<h2>Plan B</h2>
<div class="kasten">
<ul>
<li><b>Kein Internet:</b> Hotspot neu verbinden, sonst Bildschirmfotos. „Den Zugang lasse ich Ihnen da, dann sehen Sie es im Test selbst.“</li>
<li><b>Dauert lange:</b> nach 2 Min. aufs Handy schauen. Rechnet es noch: weiterreden, <b>nichts neu laden</b>. Warnung am PC kommt erst nach 3 Min. Steht die Erklärung am Handy: Knopf mit 🔁. Sonst am PC „Abbrechen“ und neu.</li>
<li><b>Laptop hängt, Handy hat das Ergebnis:</b> das Handy zeigen, dort auf Deutsch umschalten.</li>
<li><b>Kein Umschalter „Deutsch | العربية“:</b> „Hier hat die Übersetzung gehakt“, Bildschirmfotos.</li>
<li><b>Fehlermeldung:</b> ruhig bleiben. „Das kann im Alltag auch passieren, gut, dass Sie es sehen.“ Zweiter Versuch.</li>
<li class="klein">Jede fertige Erklärung kostet einen Vorführ-Brief, Fehlversuche ohne Ergebnis nicht.</li>
</ul>
</div>
<h2>Gut zu wissen</h2>
<div class="wissen">
<ul>
<li><b>Träger: Förderinitiative Donnersberg e.V. (FID)</b>, nicht kirchlich, im Paritätischen, also DSGVO. Eigene Datenschutzbeauftragung.</li>
<li>Kontakt MBE laut FID-Seite: <b>Herr v. Bose</b>. Also „Beraterinnen und Berater“, „Kolleginnen und Kollegen“.</li>
<li>Heißt heute „Migrationsberatung für erwachsene <b>Zugewanderte</b>“.</li>
<li>FID macht Alphabetisierungskurse: „kein Vorlesen“ ehrlich sagen.</li>
<li>Ausländerbehörde: bittet, nicht nach dem Stand zu fragen. Termine vereinbart und sagt man per Telefon oder Mail.</li>
<li><b>Nur auf Nachfrage:</b> MBE gibt es an rund 900 Stellen. „Sie wären die erste Stelle mit eigenem Testzugang.“</li>
</ul>
</div>
<h2>Nicht sagen</h2>
<div class="nicht">
<ul>
<li>„Zeit sparen“, „effizient“, „ersetzt“, „verpasst keinen Termin“, „erfindet nie“</li>
<li>„Zahlen nie etwas“ (immer „über Ihren Code“), „DSGVO-konform“, „Server in der EU“</li>
<li>Ein Datum für App oder neue Funktionen. „Ganz Deutschland“, Verbände, Kürzungen</li>
</ul>
</div>
</div>
<div>
<h2 style="margin-top: 0;">Einwände (kurz, ehrlich)</h2>
<div class="kasten">
<div class="frage"><b>„Wohin gehen die Daten? USA?“</b>Ja: Server bei Cloudflare, KI von Anthropic, beide USA, mit EU-Standardvertragsklauseln. Bei uns nicht gespeichert, Anthropic in der Regel 30 Tage, kein Training. Einwilligung pro Brief, in ihrer Sprache. Wer nicht will, wird normal beraten.</div>
<div class="frage"><b>„Das muss unsere Datenschutzstelle freigeben.“</b>Ja, bitte fragen, das Blatt ist für sie. AVV-Entwurf und TOMs kommen vor dem ersten Brief am Dienst-PC. Rollen und Folgenabschätzung kläre ich mit ihr, sie entscheidet.</div>
<div class="frage"><b>„Ist das nicht einfach ChatGPT?“</b>Auch eine KI, Claude von Anthropic. Dort bekommt man einen Text. Hier Kalender-Eintrag und Anruf-Hilfe, deutsche Fachbegriffe, und Sie lesen am PC Deutsch.</div>
<div class="frage"><b>„Ersetzt das unsere Beratung?“</b>Nein. Es erklärt den Brief. Was die Person dann tut, ist Beratung, und die bleibt bei Ihnen.</div>
<div class="frage"><b>„Und wenn die KI sich irrt?“</b>Kann passieren. Feste Regeln: unsicheres Datum bleibt leer, Nummern nur aus dem Brief. Fristen am Original prüfen. Haftungsfragen beantworte ich der Leitung schriftlich.</div>
<div class="frage"><b>„Was kostet das danach?“</b>„Über Ihren Code zahlen die Ratsuchenden auch danach nichts. Für eine Stelle Ihrer Größe voraussichtlich <b style="display:inline">290 € im Jahr für bis zu 1.200 Briefe</b>. Endpreis, eine Rechnung im Januar, endet am 31.12. von selbst. Ein Richtpreis, das Angebot bringe ich am 26.11. mit.“ <span class="klein">Nicht: Pilotpreis 190 €, „24 € im Monat“, Cent pro Brief.</span></div>
<div class="frage"><b>„Und nach dem 26.11.?“</b>Sagen Sie Ja, läuft der Code am selben Tag kostenlos bis Ende Dezember weiter. Keine Lücke.</div>
<div class="frage"><b>„Wie viel Arbeit macht das?“</b>Einmal ein Lesezeichen, dann Sprache, QR-Code, warten. Die Auswertung mache ich. Kostet es Zeit statt zu helfen, ist das auch ein Ergebnis.</div>
<div class="frage"><b>„Rechtlich geprüft? Die Leitung muss entscheiden.“</b>Von einem Anwalt noch nicht, ehrlich. Der Test kostet nichts, kein Vertrag. Ich komme gern zur Leitung.</div>
<div class="frage"><b>„Kurdisch? Dari?“</b>Kurdisch ist Kurmandschi, Sorani noch nicht. Dari: Farsi wählen. Was fehlt Ihnen?</div>
<div class="frage"><b>„Viele können kaum lesen.“</b>Echte Grenze, kein Vorlesen. Ampel und Kalender helfen trotzdem, und Sie sehen am PC Deutsch.</div>
<div class="frage"><b>„Mehrere Seiten? Drucken?“</b>Ein Foto pro Erklärung, die Seite mit Betreff und Frist. Mehrere Seiten nur als PDF. Drucken: am PC 🖨️, auch in der Sprache der Person.</div>
<div class="frage"><b>„Sehen Sie, wer was hochlädt?“</b>Nein, nur Zahlen pro Woche und Sprache. Dazu Protokolle ohne Briefinhalt, höchstens 7 Tage.</div>
<div class="frage"><b>„Wer steckt dahinter?“</b>Webklar GbR, Kenso Grimm und ich. Im Test bindet Sie nichts.</div>
<div class="frage"><b>„Wir haben doch mbeon.“</b>Das ergänzt sich: mbeon ist der Weg zu Ihnen, BehördenKlar erklärt den Brief auf dem Tisch.</div>
</div>
</div>
</div>
</div>
</body>
</html>
Binary file not shown.
@@ -0,0 +1,359 @@
<!DOCTYPE html>
<!--
Datenschutz-Blatt für die Datenschutzbeauftragte des Trägers (2 Seiten A4).
Beschreibt die WEBSEITE behoerdenklar.de/demo inkl. Einrichtungs-Code und
Übergabe PC <-> Handy. Ersetzt für die Webseite das alte Factsheet vom Juli
(rechtliches/datenschutz-factsheet.md beschreibt die App).
Quellen: webseite/datenschutz.html (Stand 22.10.2026), proxy/src/index.ts,
webseite/demo.html, webseite/uebergabe.js, proxy/wrangler.toml.
PDF: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless=new \
--disable-gpu --allow-file-access-from-files --no-pdf-header-footer \
--print-to-pdf=datenschutz-blatt.pdf "file://$PWD/datenschutz-blatt.html"
-->
<html lang="de">
<head>
<meta charset="UTF-8">
<title>Datenschutz auf einen Blick</title>
<script src="../../webseite/qrcode.js"></script>
<style>
@page { size: A4; margin: 0; }
:root {
--papier: #faf7f0; --tinte: #21211d; --grau: #6b675e; --text: #3a3833;
--amtsblau: #1d4e89; --stempelrot: #b3372b; --marker: #ffe66b; --gruen: #2e7d4f;
}
* { margin: 0; padding: 0; box-sizing: border-box; -webkit-print-color-adjust: exact; print-color-adjust: exact; }
body { font-family: Georgia, 'Times New Roman', serif; color: var(--tinte); background: #fff; }
.seite {
width: 210mm; height: 297mm; overflow: hidden; position: relative;
padding: 11mm 14mm 0;
background: repeating-linear-gradient(0deg, transparent 0 6.5mm, rgba(33,33,29,0.03) 6.5mm 6.7mm), var(--papier);
font-size: 8.8pt; line-height: 1.36;
page-break-after: always; break-after: page;
}
.seite:last-child { page-break-after: auto; break-after: auto; }
.mono { font-family: 'Courier New', ui-monospace, monospace; }
.briefkopf { display: flex; justify-content: space-between; align-items: baseline; padding-bottom: 2mm; border-bottom: 0.6mm solid var(--tinte); }
.absender { font-weight: 700; font-size: 12.5pt; }
.absender small { font-weight: 400; font-size: 8pt; opacity: .6; letter-spacing: .04em; }
.az { color: var(--grau); font-size: 8pt; }
.betreff { margin-top: 4mm; font-size: 8pt; color: var(--grau); text-transform: uppercase; letter-spacing: .14em; }
h1 { font-size: 22pt; line-height: 1.14; margin-top: 1mm; letter-spacing: -0.01em; }
.markiert { background: linear-gradient(104deg, transparent 2%, var(--marker) 4%, var(--marker) 96%, transparent 98%); padding: 0 1.5mm; }
.anrede { margin-top: 2mm; font-size: 9.6pt; line-height: 1.4; }
.anrede i { color: var(--grau); }
h2 { font-size: 8pt; text-transform: uppercase; letter-spacing: .14em; color: var(--grau); font-weight: 400;
margin: 3.8mm 0 2mm; display: flex; align-items: center; gap: 2.5mm; }
h2 .nr { font-family: 'Courier New', monospace; font-weight: 700; color: var(--amtsblau); letter-spacing: 0; font-size: 9pt; }
h2::after { content: ''; flex: 1; border-top: 0.25mm solid rgba(33,33,29,.25); }
.zwei { display: grid; grid-template-columns: 1fr 1fr; gap: 5mm; }
.eins-box { display: grid; grid-template-columns: 1fr 81mm; gap: 5mm; align-items: start; }
.kasten { background: #fff; border: 0.5mm solid var(--tinte); padding: 3.4mm 3.6mm 2.4mm; position: relative; }
.kasten .label { position: absolute; top: -2.6mm; left: 3.5mm; font-family: 'Courier New', monospace; font-size: 7pt;
text-transform: uppercase; letter-spacing: .1em; background: var(--tinte); color: var(--papier); padding: .4mm 2mm; }
ul.haken { list-style: none; font-size: 8.5pt; line-height: 1.32; }
ul.haken li { padding-left: 4mm; position: relative; margin-bottom: .9mm; }
ul.haken li::before { content: '✓'; position: absolute; left: 0; color: var(--gruen); font-weight: 700; }
ul.haken li.ehrlich::before { content: '!'; color: var(--stempelrot); left: .8mm; }
/* Datenfluss */
.schritte { display: grid; grid-template-columns: 1fr 1fr; gap: 2mm 5mm; }
.schritt { display: grid; grid-template-columns: 6mm 1fr; gap: 1.2mm; font-size: 8.5pt; line-height: 1.32; color: var(--text); }
.schritt .n { font-family: 'Courier New', monospace; font-weight: 700; font-size: 10.5pt; color: var(--amtsblau);
border: 0.35mm solid var(--amtsblau); background: #fff; width: 5.4mm; height: 5.4mm; display: flex; align-items: center; justify-content: center; }
.schritt b { color: var(--tinte); }
.wege { display: grid; grid-template-columns: 1fr 1fr; gap: 5mm; margin-top: 2.6mm; }
.weg { border: 0.3mm solid rgba(33,33,29,.35); background: #fff; padding: 1.5mm 2.4mm; font-size: 8pt; line-height: 1.3; color: var(--text); }
.weg b { color: var(--tinte); }
/* Tabellen */
table { width: 100%; border-collapse: collapse; font-size: 8pt; line-height: 1.24; }
th { font-family: 'Courier New', monospace; font-weight: 400; font-size: 7pt; text-transform: uppercase; letter-spacing: .1em;
color: var(--grau); text-align: left; padding: 0 2mm .8mm 0; border-bottom: 0.4mm solid var(--tinte); }
td { padding: .8mm 2mm .8mm 0; vertical-align: top; border-bottom: 0.25mm dotted rgba(33,33,29,.35); color: var(--text); }
td:first-child { color: var(--tinte); font-weight: 700; }
td.dauer { color: var(--tinte); }
td.dauer b { color: var(--amtsblau); }
tr.gruppe td { font-family: 'Courier New', monospace; font-weight: 400; font-size: 7pt; text-transform: uppercase; letter-spacing: .1em;
color: var(--papier); background: var(--tinte); padding: .4mm 2mm; border-bottom: none; }
tr.gruppe.hell td { background: rgba(33,33,29,.12); color: var(--grau); }
tr.nebensache td { color: var(--grau); }
tr.nebensache td:first-child { color: #4d4a43; }
.tabfuss { font-size: 7.8pt; color: var(--grau); margin-top: 1.4mm; line-height: 1.32; }
.tabfuss b { color: var(--tinte); }
/* Rollen */
.fall h3 { font-size: 9.8pt; line-height: 1.22; margin-bottom: .9mm; }
.fall p { font-size: 8.4pt; line-height: 1.32; color: var(--text); margin-bottom: 1mm; }
.fall p:last-child { margin-bottom: 0; }
.fall .folge { color: var(--tinte); border-left: 0.8mm solid var(--amtsblau); padding-left: 2.2mm; }
.fall .folge b { color: var(--amtsblau); }
.absprache { margin-top: 3mm; font-size: 8.4pt; line-height: 1.34; color: var(--text); }
.absprache .gross { font-weight: 700; font-size: 10.4pt; color: var(--tinte); display: inline-block; margin-bottom: .8mm; }
/* Einwilligung */
.zitat { background: #fff; border-left: 1mm solid var(--amtsblau); padding: 2mm 3mm; font-style: italic; font-size: 8.5pt; line-height: 1.36; }
.zitat .quelle { display: block; font-style: normal; font-family: 'Courier New', monospace; font-size: 6.8pt; color: var(--grau); margin-top: .8mm; letter-spacing: .04em; }
ul.punkte { list-style: none; font-size: 8.4pt; line-height: 1.32; color: var(--text); }
ul.punkte li { padding-left: 3.5mm; position: relative; margin-bottom: .9mm; }
ul.punkte li::before { content: '›'; position: absolute; left: 0; color: var(--amtsblau); font-weight: 700; }
ul.punkte b { color: var(--tinte); }
/* Grenzen */
.grenzen { display: grid; grid-template-columns: 1fr 1fr; gap: 1.3mm 5mm; list-style: none; font-size: 8.4pt; line-height: 1.32; color: var(--text); }
.grenzen li { padding-left: 4mm; position: relative; }
.grenzen li::before { content: '!'; position: absolute; left: .8mm; color: var(--stempelrot); font-weight: 700; }
.grenzen b { color: var(--tinte); }
/* Kontakt (Seite 2 unten, ersetzt dort die Fußzeile) */
.kontakt-unten { position: absolute; left: 14mm; right: 14mm; bottom: 9mm; }
.kontakt-unten h2 { margin-top: 0; }
.kontakt { display: grid; grid-template-columns: 1fr 1fr 19mm; gap: 5mm; align-items: center; border: 0.7mm solid var(--tinte);
box-shadow: 1.6mm 1.8mm 0 rgba(33,33,29,.9); background: #fff; padding: 2.8mm 4mm; }
.kontakt .name { font-size: 11pt; font-weight: 700; line-height: 1.2; }
.kontakt p { font-size: 8.4pt; line-height: 1.36; }
.kontakt .link { font-family: 'Courier New', monospace; color: var(--amtsblau); font-size: 9.5pt; font-weight: 700; }
.kontakt .klein { color: var(--grau); font-size: 7.8pt; }
#qr { width: 19mm; height: 19mm; }
#qr svg { width: 100%; height: 100%; display: block; }
.stempel { display: inline-block; padding: .8mm 2.2mm; border: 0.5mm solid var(--stempelrot); color: var(--stempelrot);
font-family: 'Courier New', monospace; font-weight: 700; font-size: 7pt; letter-spacing: .1em;
text-transform: uppercase; transform: rotate(-3deg); }
.fuss { position: absolute; left: 14mm; right: 14mm; bottom: 8mm; border-top: 0.4mm solid var(--tinte); padding-top: 2mm;
display: flex; justify-content: space-between; align-items: flex-end; font-size: 8pt; line-height: 1.4; }
.fuss .wer b { font-size: 9.5pt; }
.fuss .seitenzahl { font-family: 'Courier New', monospace; font-size: 7.5pt; color: var(--grau); letter-spacing: .06em; }
</style>
</head>
<body>
<!-- ============================ SEITE 1 ============================ -->
<div class="seite">
<div class="briefkopf">
<span class="absender">📬 BehördenKlar <small>by Webklar</small></span>
<span class="az mono">Az: KLAR-DATENSCHUTZ/2026 · Stand: 25.10.2026</span>
</div>
<p class="betreff">Für die Datenschutzbeauftragte Ihres Trägers · Webseite behoerdenklar.de/demo</p>
<h1>Datenschutz <span class="markiert">auf einen Blick</span></h1>
<p class="anrede">
Was mit den Daten passiert, wenn Ihre Beratungsstelle BehördenKlar im Browser nutzt, geprüft am
Server-Code und an der Datenschutzerklärung. <i>Das Blatt vom Juli 2026 beschrieb die App, nicht die Webseite.</i>
</p>
<h2><span class="nr">1</span> Was BehördenKlar tut</h2>
<div class="eins-box">
<p>
BehördenKlar erklärt Behördenbriefe in einfacher Sprache, auf Wunsch in 27 Sprachen.
Ein Foto oder PDF genügt: Eine KI (Claude von Anthropic) schreibt auf, was das Amt will,
was zu tun ist und bis wann. Kein Nutzerkonto, keine Anmeldung. Mit einem
<b>Einrichtungs-Code</b> ist der Dienst für Ihre Ratsuchenden kostenlos. Über den Code erfährt
Ihre Stelle nichts über Briefe, nur Zahlen: übrige Analysen und Nutzung pro Woche und Sprache.
</p>
<div class="kasten">
<span class="label">Kurz gesagt</span>
<ul class="haken">
<li>Briefe speichern wir nicht, Erklärungen nur verschlüsselt zur Übergabe (max. 15&nbsp;Min.).</li>
<li>Mit Code: kein Konto, keine E-Mail-Adresse nötig.</li>
<li class="ehrlich">Den Brief liest die KI: Anthropic (USA), in der Regel 30&nbsp;Tage gespeichert, kein Training.</li>
</ul>
</div>
</div>
<h2><span class="nr">2</span> So läuft ein Brief durch das System · Knopf „Lieber mit dem Handy fotografieren“</h2>
<div class="schritte">
<div class="schritt"><span class="n">1</span><div>
<b>QR-Code am Beratungs-PC.</b> Der Browser des PCs erzeugt eine zufällige Kennung und einen
neuen AES-256-Schlüssel. Beides steht im QR-Code hinter dem
„#“ der Adresse. <b>Den Schlüssel bekommt unser Server nie.</b>
</div></div>
<div class="schritt"><span class="n">4</span><div>
<b>Erklärung.</b> Anthropic (Modell Claude) erklärt den Brief auf Deutsch. Für eine andere
Sprache übersetzt ein zweiter KI-Aufruf die Erklärung. Die Antwort geht über unseren Server
zurück ans Handy, ohne dort gespeichert zu werden.
</div></div>
<div class="schritt"><span class="n">2</span><div>
<b>Einwilligung am eigenen Handy.</b> Die ratsuchende Person scannt den Code, setzt das
Häkchen für diesen einen Brief (Abschnitt&nbsp;6) und fotografiert ihn. Kein Konto, keine App.
</div></div>
<div class="schritt"><span class="n">5</span><div>
<b>Übergabe, Ende-zu-Ende verschlüsselt.</b> Das Handy verschlüsselt die Erklärung mit dem
Schlüssel aus dem QR-Code (AES-256-GCM) und legt sie bei uns ab. Der PC holt sie und
entschlüsselt sie. <b>Unser Server kann sie nicht lesen.</b>
</div></div>
<div class="schritt"><span class="n">3</span><div>
<b>Weg zur KI.</b> Das Foto geht über eine verschlüsselte Verbindung (TLS) an unseren Server
(Cloudflare). Er prüft Bot-Schutz und Guthaben und reicht es an Anthropic weiter,
<b>ohne es zu speichern</b>.
</div></div>
<div class="schritt"><span class="n">6</span><div>
<b>Löschen.</b> Der Zwischenspeicher wird beim Abholen gelöscht, sonst <b>spätestens
15&nbsp;Minuten</b> nach dem letzten Päckchen. Am PC bleibt die Erklärung nur in der offenen
Seite, bis diese neu geladen wird.
</div></div>
</div>
<div class="wege">
<div class="weg"><b>Beraterin lädt am Dienst-PC hoch:</b> nur Schritt 3 und 4. Das Häkchen setzt
dann die Beraterin (zur Rolle siehe Abschnitt&nbsp;4).</div>
<div class="weg"><b>„Ergebnis aufs Handy mitnehmen“:</b> genauso verschlüsselt, beim Abholen
gelöscht, sonst nach spätestens 15&nbsp;Minuten.</div>
</div>
<h2><span class="nr">3</span> Was gespeichert wird und wie lange</h2>
<table>
<colgroup><col style="width: 37mm"><col><col style="width: 45mm"></colgroup>
<thead><tr><th>Was</th><th>Was genau</th><th>Wie lange</th></tr></thead>
<tbody>
<tr class="gruppe"><td colspan="3">Beim Zugang über einen Einrichtungs-Code</td></tr>
<tr><td>Brief und Erklärung</td><td>Laufen nur durch unseren Server. Ausnahme: Übergabe, nächste Zeile.</td><td class="dauer"><b>bei uns: gar nicht</b></td></tr>
<tr><td>Übergabe-Päckchen</td><td>Erklärung, Name der Stelle und Statusmeldungen, verschlüsselt, für uns nicht lesbar. Dazu eine Schreib-Bremse pro IP-Adresse (Zeitfenster 1 Minute).</td><td class="dauer">beim Abholen, <b>spätestens 15 Min.</b> nach dem letzten Päckchen</td></tr>
<tr><td>Bei Anthropic (KI)</td><td>Foto und Erklärung. Keine Nutzung zum Training der KI.</td><td class="dauer"><b>in der Regel 30 Tage</b>, länger nur bei Missbrauchsverdacht</td></tr>
<tr><td>Einrichtungs-Guthaben</td><td>Code, Kennung, Name der Stelle, Ablaufdatum, Restbriefe. Nichts über Ratsuchende.</td><td class="dauer">ohne automatische Frist</td></tr>
<tr><td>Nutzungszähler</td><td>Je Analyse nur Datum und Sprache. Kein Briefinhalt, kein Personenbezug.</td><td class="dauer"><b>max. 13 Monate</b></td></tr>
<tr><td>Code-Fehlversuche</td><td>Zähler pro IP-Adresse und Tag, nur bei falscher Eingabe.</td><td class="dauer"><b>48 Stunden</b></td></tr>
<tr><td>Server-Protokolle</td><td>Zeitpunkt, aufgerufene Adresse, Fehlerart, technische Metadaten. Kein Briefinhalt.</td><td class="dauer"><b>max. 7 Tage</b></td></tr>
<tr><td>Im Browser des Geräts</td><td>Zugangs-Nachweis, Code und Name der Stelle, Ablaufdatum, Zahl übriger Briefe, Sprache. Keine Briefe.</td><td class="dauer">bis zum Löschen im Browser</td></tr>
<tr class="gruppe hell"><td colspan="3">Nur ohne Einrichtungs-Code: 2 Gratis-Analysen für Privatpersonen</td></tr>
<tr class="nebensache"><td>Gratis-Zähler</td><td>Zähler pro IP-Adresse und Tag, dazu die Tagessumme aller Gratis-Analysen.</td><td class="dauer">48 Stunden (Datenschutz&shy;erklärung: „max. 30 Tage“)</td></tr>
<tr class="nebensache"><td>E-Mail-Prüfsumme</td><td>Nur für die 2. Gratis-Analyse: SHA-256-Prüfsumme, die Adresse selbst nicht.</td><td class="dauer">unbefristet</td></tr>
</tbody>
</table>
<p class="tabfuss">
<b>Rechtsgrundlagen laut Datenschutzerklärung:</b> Brief und Erklärung: Einwilligung (Art. 6 Abs. 1 lit. a,
Art. 9 Abs. 2 lit. a DSGVO). Zähler, Schutz vor Missbrauch, Protokolle: berechtigtes Interesse (Art. 6 Abs. 1 lit. f DSGVO).
</p>
<div class="fuss">
<div class="wer">
<b>Justin Klein</b> · Webklar GbR · Am Schwimmbad 10, 67722 Winnweiler<br>
Tel. 0170 4969375 · justin@webklar.com · <b>behoerdenklar.de/datenschutz</b>
</div>
<span class="seitenzahl">Seite 1 von 2 · bitte wenden</span>
</div>
</div>
<!-- ============================ SEITE 2 ============================ -->
<div class="seite">
<div class="briefkopf">
<span class="absender">📬 BehördenKlar <small>by Webklar</small></span>
<span class="az mono">Datenschutz auf einen Blick · Seite 2 von 2</span>
</div>
<h2 style="margin-top: 5mm; margin-bottom: 3mm;"><span class="nr">4</span> Wer ist verantwortlich? Das hängt davon ab, wer hochlädt</h2>
<div class="zwei">
<div class="kasten fall">
<span class="label">Fall A · Die Person selbst</span>
<h3>Die ratsuchende Person nutzt den Dienst selbst</h3>
<p>Eigenes Handy, eigenes Häkchen für jeden Brief: zu Hause oder in der Beratung über
„Lieber mit dem Handy fotografieren“.</p>
<p class="folge"><b>Verantwortlich ist die Webklar GbR</b> (BehördenKlar). Grundlage ist die
Einwilligung der Person.</p>
<p>Bitte beachten: In der Beratung erscheint die Erklärung auch am Bildschirm Ihrer Stelle.
Gespeichert wird sie dort nicht.</p>
</div>
<div class="kasten fall">
<span class="label">Fall B · Ihre Stelle</span>
<h3>Ihre Beratungsstelle lädt den Brief selbst hoch</h3>
<p>Die Beraterin lädt den Brief einer Klientin am Dienst-PC hoch.</p>
<p class="folge">Dann arbeiten <b>wir als Auftragsverarbeiter</b> für Ihre Stelle (Art. 28 DSGVO),
mit Cloudflare und Anthropic als Unterauftragsverarbeitern. Einen <b>AVV mit
Verschwiegenheitsklausel</b> stellen wir auf Wunsch.</p>
<p>Das Häkchen am Dienst-PC setzt dann die Beraterin. Es ersetzt keine Einwilligung der Klientin.</p>
</div>
</div>
<p class="absprache">
<span class="gross"><span class="markiert">Vor dem ersten echten Brief am Dienst-PC sprechen wir das ab.</span></span><br>
Unser Vorschlag für den Test: Fall A. Haben Sie eine eigene AVV-Vorlage (z. B. nach DSG-EKD oder KDG),
schicken Sie sie uns gern.
</p>
<h2><span class="nr">5</span> Dienstleister</h2>
<table>
<colgroup><col style="width: 37mm"><col><col style="width: 30mm"></colgroup>
<thead><tr><th>Wer</th><th>Wofür</th><th>Beim Code-Zugang</th></tr></thead>
<tbody>
<tr><td>Cloudflare, Inc. (USA)</td><td>Unser Server (Cloudflare Workers), Zwischenspeicher und Zähler, Bot-Schutz (Turnstile), Hosting der Webseite, Besucherstatistik ohne Cookies</td><td class="dauer"><b>ja</b></td></tr>
<tr><td>Anthropic PBC (USA)</td><td>KI-Erklärung und Übersetzung (Modell Claude), keine Nutzung zum Training</td><td class="dauer"><b>ja</b></td></tr>
<tr class="nebensache"><td>Stripe und Brevo</td><td>Nur für Privatpersonen: Bezahlung beim Kauf von Guthaben (Stripe, Irland/USA), E-Mail mit dem Guthaben-Link und Warteliste (Brevo, Deutschland/Frankreich)</td><td class="dauer">nein, nicht relevant</td></tr>
</tbody>
</table>
<p class="tabfuss" style="color: var(--text); font-size: 8.2pt;">
<b>Übermittlung in die USA:</b> gestützt auf EU-Standardvertragsklauseln (Art. 46 Abs. 2 lit. c DSGVO).
Sie sind Teil der Auftragsverarbeitungsverträge (DPA) von Cloudflare und Anthropic, die mit deren
Geschäftsbedingungen gelten. Die Fundstellen nennen wir Ihnen gern.
</p>
<h2><span class="nr">6</span> Einwilligung: für jeden Brief neu</h2>
<div class="zwei" style="grid-template-columns: 1.12fr 1fr;">
<p class="zitat">
„Ich bin einverstanden, dass das Foto dieses Briefs zur Erklärung an den Server von BehördenKlar
und an den KI-Dienst Anthropic (USA) geschickt wird. Briefe können sehr persönliche Angaben
enthalten, zum Beispiel zu Gesundheit, Herkunft oder Aufenthalt. BehördenKlar speichert den Brief
nicht. Anthropic löscht ihn in der Regel nach 30 Tagen und nutzt ihn nicht zum Training.“
<span class="quelle">Text am Häkchen vor dem Hochladen, mit Link zur Datenschutzerklärung</span>
</p>
<ul class="punkte">
<li><b>Ohne Häkchen wird nichts hochgeladen.</b></li>
<li><b>Für genau einen Brief:</b> Nach jeder Erklärung ist das Häkchen wieder leer. Die nächste Person wird neu gefragt.</li>
<li><b>Grundlage:</b> Art. 6 Abs. 1 lit. a und Art. 9 Abs. 2 lit. a DSGVO.</li>
<li><b>In der Sprache der Person:</b> Am Handy in einer von 27 Sprachen, am PC auf Deutsch.
Von einer KI übersetzt, noch von keinem Muttersprachler geprüft. Die ausführliche
Datenschutzerklärung gibt es nur auf Deutsch.</li>
<li><b>Freiwillig:</b> Wer nicht einwilligt, wird ganz normal beraten.</li>
</ul>
</div>
<h2><span class="nr">7</span> Ehrliche Grenzen</h2>
<ul class="grenzen">
<li><b>USA.</b> Anthropic und Cloudflare sitzen in den USA. Eine Beschränkung auf Rechenzentren
in der EU ist nicht eingestellt.</li>
<li><b>30 Tage bei Anthropic</b> in der Regel, bei Verdacht auf Missbrauch länger. Darauf haben
wir keinen Einfluss.</li>
<li><b>Ende-zu-Ende gilt nur für die Übergabe.</b> Der Brief selbst geht per TLS über unseren
Server zur KI.</li>
<li><b>QR-Code nur der richtigen Person zeigen.</b> Wer ihn abfotografiert, kann die Erklärung
in diesen 15 Minuten öffnen.</li>
<li><b>Dienst-PC.</b> Nach jedem Gespräch „Fertig, nächste Person“. Kalender nur am Handy
der Person. Ausdrucke wie Akten behandeln.</li>
<li><b>Keine Rechtsberatung.</b> BehördenKlar erklärt Briefe, ersetzt aber keine Beratung. Auch
eine KI kann sich irren.</li>
<li><b>Selbstauskunft, kein Zertifikat.</b> Eine anwaltliche Prüfung von Datenschutzerklärung und
Blatt steht noch aus.</li>
<li><b>Noch offen:</b> AVV-Entwurf, TOMs, Baustein fürs Verarbeitungsverzeichnis. Sie kommen
vor dem ersten Brief am Dienst-PC.</li>
</ul>
<div class="kontakt-unten">
<h2><span class="nr">8</span> Kontakt und vollständige Datenschutzerklärung</h2>
<div class="kontakt">
<div>
<p class="name">Justin Klein</p>
<p>Webklar GbR, vertreten durch<br>Justin Klein und Kenso Grimm<br>
Am Schwimmbad 10, 67722 Winnweiler<br>
Tel. 0170 4969375 · justin@webklar.com</p>
</div>
<div>
<p class="link">behoerdenklar.de/datenschutz</p>
<p class="klein">Für die Webseite besonders die Abschnitte 3a, 4, 5, 8, 9a, 9b und 10.
Rückfragen beantworten wir gern, auch im Gespräch mit Ihnen.</p>
<p style="margin-top: 1.4mm;"><span class="stempel">Selbstauskunft · Stand 25.10.2026</span></p>
</div>
<div id="qr"></div>
</div>
</div>
</div>
<script>
var qr = qrcode(0, 'M');
qr.addData('https://behoerdenklar.de/datenschutz');
qr.make();
document.getElementById('qr').innerHTML = qr.createSvgTag({ cellSize: 4, margin: 0, scalable: true });
</script>
</body>
</html>
Binary file not shown.
+20 -18
View File
@@ -2,7 +2,7 @@
<!-- <!--
Handzettel für Beratungsstellen (DIN A4, zum Dalassen nach der Präsentation). Handzettel für Beratungsstellen (DIN A4, zum Dalassen nach der Präsentation).
CODE unten eintragen, sobald der Einrichtungs-Code angelegt ist CODE unten eintragen, sobald der Einrichtungs-Code angelegt ist
(node tools/einrichtungs-code.js neu "MBE Donnersberg" MBE --briefe 100 --monate 1), (node tools/einrichtungs-code.js neu "MBE Donnersberg" MBE --briefe 100 --bis 2026-11-29),
dann neu als PDF ausgeben: dann neu als PDF ausgeben:
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless=new \ "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless=new \
--no-pdf-header-footer --print-to-pdf=handzettel.pdf "file://$PWD/handzettel.html" --no-pdf-header-footer --print-to-pdf=handzettel.pdf "file://$PWD/handzettel.html"
@@ -66,7 +66,7 @@
.angebot .gross { font-size: 13pt; font-weight: 700; line-height: 1.25; margin: 1.5mm 0; } .angebot .gross { font-size: 13pt; font-weight: 700; line-height: 1.25; margin: 1.5mm 0; }
.angebot .gross .markiert { padding: 0 1mm; } .angebot .gross .markiert { padding: 0 1mm; }
.angebot .klein { font-size: 8pt; color: var(--grau); line-height: 1.35; } .angebot .klein { font-size: 8pt; color: var(--grau); line-height: 1.35; }
#qr { width: 34mm; height: 34mm; margin: 2.5mm auto 1.5mm; } #qr { width: 30mm; height: 30mm; margin: 2mm auto 1mm; }
#qr svg { width: 100%; height: 100%; display: block; } #qr svg { width: 100%; height: 100%; display: block; }
.code { font-family: 'Courier New', monospace; font-weight: 700; font-size: 13pt; letter-spacing: .08em; background: var(--marker); display: inline-block; padding: .3mm 2.5mm; } .code { font-family: 'Courier New', monospace; font-weight: 700; font-size: 13pt; letter-spacing: .08em; background: var(--marker); display: inline-block; padding: .3mm 2.5mm; }
.link { font-family: 'Courier New', monospace; font-size: 7.5pt; color: var(--amtsblau); word-break: break-all; margin-top: 1mm; } .link { font-family: 'Courier New', monospace; font-size: 7.5pt; color: var(--amtsblau); word-break: break-all; margin-top: 1mm; }
@@ -91,11 +91,11 @@
</div> </div>
<p class="betreff">Für Beratungsstellen · Migrationsberatung · Soziale Beratung</p> <p class="betreff">Für Beratungsstellen · Migrationsberatung · Soziale Beratung</p>
<h1>Ihre Ratsuchenden verstehen den Brief, <span class="markiert">bevor sie zu Ihnen kommen.</span></h1> <h1>Ihre Ratsuchenden verstehen ihren Brief, <span class="markiert">in ihrer eigenen Sprache.</span></h1>
<p class="anrede"> <p class="anrede">
BehördenKlar erklärt schwierige Post in einfacher Sprache, auf Wunsch in 27 Sprachen: BehördenKlar erklärt schwierige Post in einfacher Sprache, auf Wunsch in 27 Sprachen:
von Ausländerbehörde, Jobcenter, Finanzamt, Krankenkasse, Vermieter oder Inkasso. von Ausländerbehörde, Jobcenter, Finanzamt, Krankenkasse, Vermieter oder Inkasso.
Ein Foto genügt. Ihre Beratungszeit geht in die Lösung, nicht ins Vorlesen. Ein Foto genügt. So verstehen Ratsuchende ihren Brief selbst und kommen mit den richtigen Fragen zu Ihnen.
</p> </p>
<div class="schritte"> <div class="schritte">
@@ -116,7 +116,7 @@
</div></div> </div></div>
<div class="punkt"><span class="ik">📅</span><div> <div class="punkt"><span class="ik">📅</span><div>
<h3>Frist und Termin in den Handy-Kalender</h3> <h3>Frist und Termin in den Handy-Kalender</h3>
<p>Ein Tipp genügt, das Handy erinnert 3 Tage und 1 Tag vorher. Keine Frist geht zwischen zwei Beratungsterminen unter.</p> <p>Mit wenigen Tipps eingetragen, das Handy erinnert 3 Tage und 1 Tag vorher. So denkt man leichter an Frist und Termin.</p>
</div></div> </div></div>
<div class="punkt"><span class="ik">📞</span><div> <div class="punkt"><span class="ik">📞</span><div>
<h3>Anruf-Hilfe fürs Amt</h3> <h3>Anruf-Hilfe fürs Amt</h3>
@@ -131,12 +131,12 @@
<p>Per QR-Code wandert die Erklärung vom Beratungs-PC aufs Handy der Ratsuchenden, mit Kalender und Anruf-Hilfe.</p> <p>Per QR-Code wandert die Erklärung vom Beratungs-PC aufs Handy der Ratsuchenden, mit Kalender und Anruf-Hilfe.</p>
</div></div> </div></div>
<div class="punkt"><span class="ik">🔎</span><div> <div class="punkt"><span class="ik">🔎</span><div>
<h3>Erfindet nichts</h3> <h3>Rät nicht</h3>
<p>Steht keine Telefonnummer oder kein Datum im Brief, sagt BehördenKlar das, statt zu raten.</p> <p>Steht keine Telefonnummer oder kein Datum im Brief, sagt BehördenKlar das, statt zu raten.</p>
</div></div> </div></div>
<div class="punkt"><span class="ik">⚖️</span><div> <div class="punkt"><span class="ik">⚖️</span><div>
<h3>Ergänzung, kein Ersatz</h3> <h3>Ergänzung, kein Ersatz</h3>
<p>Jede Erklärung verweist bei wichtigen Entscheidungen ausdrücklich auf eine Beratungsstelle.</p> <p>Unter jeder Erklärung steht in der Sprache der Person: „Noch Fragen? Ihre Beratungsstelle hilft Ihnen gern weiter.“</p>
</div></div> </div></div>
</div> </div>
@@ -147,32 +147,34 @@
<ul> <ul>
<li>Kein Konto, keine Anmeldung, keine Installation nötig.</li> <li>Kein Konto, keine Anmeldung, keine Installation nötig.</li>
<li>Briefe werden bei uns nicht dauerhaft gespeichert.</li> <li>Briefe werden bei uns nicht dauerhaft gespeichert.</li>
<li>Übergabe zwischen PC und Handy Ende-zu-Ende verschlüsselt: Der Schlüssel steckt nur im QR-Code, unser Server sieht nichts.</li> <li>Übergabe zwischen PC und Handy zusätzlich Ende-zu-Ende verschlüsselt: Der Schlüssel steckt nur im QR-Code.</li>
<li>Keine Werbung, kein Verkauf von Daten.</li> <li>Keine Werbung, kein Verkauf von Daten.</li>
<li class="ehrlich">Die Erklärung erstellt der KI-Dienst Anthropic (USA). Er löscht Anfragen nach spätestens 30 Tagen und nutzt sie nicht zum Training. Das sagen wir offen, auch auf der Seite vor dem Hochladen.</li> <li class="ehrlich">Den Brief selbst muss die KI lesen: Anthropic (USA). Gelöscht in der Regel nach 30 Tagen, kein Training. Das steht offen auf der Seite, und die Person willigt für jeden Brief einzeln ein.</li>
</ul> </ul>
</div> </div>
<p class="chatgpt"> <p class="chatgpt">
<b>„Ist das nicht einfach ChatGPT?“</b> Dort braucht man ein Konto und eine gut <b>„Ist das nicht einfach ChatGPT?“</b> Dort bekommt man einen Text. Bei
formulierte Frage, und danach ist der Brief vergessen. Bei BehördenKlar macht man BehördenKlar macht man ein Foto, und Frist, Termin und Telefonnummer werden zu
ein Foto. Frist, Termin und Telefonnummer werden zu Kalender-Eintrag und einem Kalender-Eintrag mit Erinnerung und zu einer Anruf-Hilfe. Deutsche
Anruf-Hilfe, und deutsche Fachbegriffe bleiben erkennbar. Fachbegriffe bleiben erkennbar, und am PC lesen Sie Deutsch, während die Person
ihre Sprache sieht.
</p> </p>
<p class="chatgpt"> <p class="chatgpt">
<b>Und nach dem Test?</b> Ihre Einrichtung bekommt ein festes Briefkontingent zu <b>Und nach dem Test?</b> Nach vier Wochen schauen wir gemeinsam, was es gebracht
einem Preis für Beratungsstellen. Die Ratsuchenden zahlen weiterhin nichts. Ohne hat. Wenn Sie weitermachen möchten, bekommen Sie ein Angebot für Beratungsstellen.
Abo-Falle: Nach vier Wochen schauen wir gemeinsam, was es gebracht hat. Über Ihren Code zahlen Ihre Ratsuchenden weiterhin nichts. Kein Abo, keine automatische Verlängerung.
</p> </p>
</div> </div>
<div class="angebot"> <div class="angebot">
<p class="kopf">Ihr Testzugang</p> <p class="kopf">Ihr Testzugang</p>
<p class="gross">1 Monat · bis 100 Briefe<br><span class="markiert">kostenlos</span></p> <p class="gross">1 Monat · bis 100 Briefe<br><span class="markiert">kostenlos</span></p>
<p class="klein">Ratsuchende zahlen nichts. Kein Vertrag, endet von selbst, verlängerbar.</p> <p class="klein">Über Ihren Code zahlen Ihre Ratsuchenden nichts. Kein Vertrag, endet am 29.11.2026 von selbst, verlängerbar.</p>
<div id="qr"></div> <div id="qr"></div>
<p class="klein">Code für Ihre Ratsuchenden:</p> <p class="klein">Ihr Code, <b>nur für Mitarbeitende</b>, bitte nicht aushängen:</p>
<p><span class="code" id="codeText"></span></p> <p><span class="code" id="codeText"></span></p>
<p class="link" id="linkText"></p> <p class="link" id="linkText"></p>
<p class="klein" style="margin-top: 1.5mm;">Die Adresse einmal am Beratungs-PC eintippen, dann ist auch „Lieber mit dem Handy fotografieren“ für Ihre Ratsuchenden kostenlos.</p>
</div> </div>
</div> </div>
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 615 KiB

After

Width:  |  Height:  |  Size: 614 KiB

@@ -0,0 +1,239 @@
<!DOCTYPE html>
<!--
Kurzanleitung „So geht's am Beratungs-PC“ (DIN A4, Vorder- und Rückseite, für Beraterinnen).
Vorderseite: Ablauf in 6 Schritten. Rückseite: Wenn etwas hakt.
CODE (und ggf. STELLE) unten im Skript eintragen, sobald der Einrichtungs-Code
angelegt ist, dann neu als PDF ausgeben (im Ordner marketing/praesentation-mbe):
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless=new --disable-gpu \
--allow-file-access-from-files --no-pdf-header-footer \
--print-to-pdf=kurzanleitung-beratung.pdf "file://$PWD/kurzanleitung-beratung.html"
Knopf- und Meldungstexte stammen wörtlich aus webseite/demo.html und webseite/ui-texte.js,
„Der Zugang über … ist abgelaufen“ aus proxy/src/index.ts (Stand 25.10.2026).
-->
<html lang="de">
<head>
<meta charset="UTF-8">
<title>So geht's am Beratungs-PC</title>
<script src="../../webseite/qrcode.js"></script>
<style>
@page { size: A4; margin: 0; }
:root {
--papier: #faf7f0; --tinte: #21211d; --grau: #6b675e;
--amtsblau: #1d4e89; --stempelrot: #b3372b; --marker: #ffe66b;
}
* { margin: 0; padding: 0; box-sizing: border-box; -webkit-print-color-adjust: exact; print-color-adjust: exact; }
body { font-family: Georgia, 'Times New Roman', serif; color: var(--tinte); background: #fff; }
.seite {
width: 210mm; height: 297mm; overflow: hidden; position: relative;
padding: 11mm 16mm 0;
background: var(--papier);
font-size: 11.5pt; line-height: 1.4;
page-break-after: always;
}
.seite:last-child { page-break-after: auto; }
.mono { font-family: 'Courier New', ui-monospace, monospace; }
.briefkopf { display: flex; justify-content: space-between; align-items: baseline; padding-bottom: 2mm; border-bottom: 0.6mm solid var(--tinte); }
.absender { font-weight: 700; font-size: 12.5pt; }
.absender small { font-weight: 400; font-size: 8pt; opacity: .6; letter-spacing: .04em; }
.az { color: var(--grau); font-size: 8pt; }
.betreff { margin-top: 6mm; font-size: 8pt; color: var(--grau); text-transform: uppercase; letter-spacing: .14em; }
h1 { font-size: 26pt; line-height: 1.1; margin-top: 1.5mm; letter-spacing: -0.01em; }
.markiert { background: linear-gradient(104deg, transparent 2%, var(--marker) 4%, var(--marker) 96%, transparent 98%); padding: 0 1.5mm; }
.anrede { margin-top: 3mm; font-size: 12pt; color: #3a3833; }
/* Knöpfe so, wie man sie auf der Seite wiedererkennt */
.k { font-weight: 700; white-space: nowrap; background: #fff; border: 0.35mm solid var(--tinte); border-radius: 1mm;
padding: 0 1.4mm; box-shadow: 0.5mm 0.5mm 0 var(--tinte); }
.m { white-space: nowrap; }
.label { font-family: 'Courier New', monospace; font-size: 7.5pt; text-transform: uppercase; letter-spacing: .12em;
color: var(--grau); }
/* Einmal einrichten */
.einrichten { margin-top: 7mm; background: #fff; border: 0.5mm solid var(--tinte); padding: 5mm 6mm;
display: grid; grid-template-columns: 1fr 28mm; gap: 6mm; align-items: center; }
.einrichten p { margin-top: 1.5mm; }
.adresse { font-family: 'Courier New', monospace; font-weight: 700; font-size: 13pt; color: var(--amtsblau);
background: var(--marker); display: inline-block; padding: .6mm 2mm; margin-top: 2mm; word-break: break-all; }
.luecke { display: inline-block; width: 28mm; border-bottom: 0.35mm solid var(--amtsblau); height: 4.4mm; vertical-align: -0.6mm; }
.code { font-family: 'Courier New', monospace; font-weight: 700; letter-spacing: .08em; background: var(--marker); padding: 0 1.5mm; }
.leise { font-size: 9.5pt; color: var(--grau); }
#qr { width: 28mm; height: 28mm; }
#qr svg { width: 100%; height: 100%; display: block; }
/* Schritte */
.schritte { list-style: none; margin-top: 8mm; }
.schritte li { display: grid; grid-template-columns: 12mm 1fr; align-items: start; padding: 3.2mm 0;
border-top: 0.25mm solid rgba(33,33,29,.18); }
.schritte li:first-child { border-top: none; padding-top: 0; }
.nr { width: 8.5mm; height: 8.5mm; border-radius: 50%; background: var(--amtsblau); color: #fff;
font-family: 'Courier New', monospace; font-weight: 700; font-size: 13pt; line-height: 8.5mm; text-align: center; }
.schritte b { font-size: 12.5pt; }
.schritte .dazu { font-size: 10.5pt; color: #4a463e; margin-top: .6mm; }
/* Drei Regeln */
.regeln { margin-top: 7mm; border: 0.6mm solid var(--stempelrot); background: #fff; padding: 4.5mm 6mm 5mm; }
.regeln .label { color: var(--stempelrot); }
.regeln ul { list-style: none; display: grid; grid-template-columns: repeat(3, 1fr); gap: 5mm; margin-top: 2.5mm; }
.regeln li { font-size: 10.5pt; line-height: 1.35; }
.regeln li b { display: block; font-size: 11.5pt; margin-bottom: .6mm; }
/* Rückseite */
h2 { font-size: 13pt; margin-top: 8mm; }
h2 .label { display: block; margin-bottom: 1mm; }
table { width: 100%; border-collapse: collapse; margin-top: 3mm; font-size: 10.5pt; line-height: 1.38; }
td { padding: 2.6mm 0; vertical-align: top; border-top: 0.25mm solid rgba(33,33,29,.18); }
td:first-child { width: 42%; padding-right: 5mm; font-style: italic; color: #3a3833; }
tr.anrufen td { background: rgba(255,230,107,.45); }
tr.anrufen td:first-child { padding-left: 2mm; }
.tipps { list-style: none; columns: 2; column-gap: 9mm; margin-top: 3mm; font-size: 10.5pt; line-height: 1.38; }
.tipps li { break-inside: avoid; padding: 0 0 2.6mm 4mm; position: relative; }
.tipps li::before { content: '›'; position: absolute; left: 0; color: var(--amtsblau); font-weight: 700; }
.it { margin-top: 5mm; background: #fff; border: 0.4mm solid var(--tinte); padding: 3.5mm 5mm; font-size: 10pt; }
.it .mono { font-size: 9.5pt; }
.fuss { position: absolute; left: 16mm; right: 16mm; bottom: 9mm; border-top: 0.4mm solid var(--tinte); padding-top: 2.5mm;
display: flex; justify-content: space-between; align-items: flex-end; font-size: 8pt; line-height: 1.4; color: var(--grau); }
.fuss .anruf { font-size: 12.5pt; font-weight: 700; line-height: 1.3; color: var(--tinte); }
.fuss .anruf .nummer { font-family: 'Courier New', monospace; background: var(--marker); padding: 0 1.5mm; }
.fuss .wenden { font-family: 'Courier New', monospace; font-size: 8pt; text-transform: uppercase; letter-spacing: .1em; }
</style>
</head>
<body>
<!-- ============ Vorderseite ============ -->
<div class="seite">
<div class="briefkopf">
<span class="absender">📬 BehördenKlar <small>by Webklar</small></span>
<span class="az mono">Kurzanleitung Beratungs-PC · Seite 1 von 2</span>
</div>
<p class="betreff">Für Beraterinnen und Berater</p>
<h1>So geht's am <span class="markiert">Beratungs-PC</span></h1>
<p class="anrede">Die Person fotografiert ihren Brief mit dem eigenen Handy. Sie lesen am PC mit.</p>
<div class="einrichten">
<div>
<span class="label">Einmal einrichten</span>
<p>Diese Adresse am PC als Lesezeichen speichern:</p>
<p><span class="adresse" id="adresseText"></span></p>
<p class="leise">Ihr Code: <span class="code" id="codeText"></span> · nur für Mitarbeitende</p>
</div>
<div id="qr"></div>
</div>
<ol class="schritte">
<li><span class="nr">1</span><div>
<b>Lesezeichen öffnen.</b>
<p class="dazu">Oben steht <span class="m">„🤝 Kostenlos über <span id="stelleText"></span>“</span>.</p>
</div></li>
<li><span class="nr">2</span><div>
<b>Sprache der Person wählen.</b>
<p class="dazu">Bei <span class="m">„🌐 Erklärung in dieser Sprache“</span>, zuerst, vor Schritt 3.</p>
</div></li>
<li><span class="nr">3</span><div>
<b><span class="k">📱 Lieber mit dem Handy fotografieren</span> klicken.</b>
<p class="dazu">Die Person scannt den QR-Code mit ihrer Handy-Kamera.</p>
</div></li>
<li><span class="nr">4</span><div>
<b>Die Person setzt das Häkchen und fotografiert den Brief.</b>
<p class="dazu">Das Häkchen ist ihre Einwilligung. Am Handy steht alles in ihrer Sprache.</p>
</div></li>
<li><span class="nr">5</span><div>
<b>Etwa eine Minute warten.</b>
<p class="dazu">Sie lesen die Erklärung am PC auf Deutsch, die Person am Handy in ihrer Sprache.</p>
</div></li>
<li><span class="nr">6</span><div>
<b>Frist am Handy in den Kalender, dann <span class="k">✅ Fertig, nächste Person</span>.</b>
<p class="dazu">Auf Papier gewünscht? Vorher <span class="k">🖨️ Drucken oder als PDF</span>.</p>
</div></li>
</ol>
<div class="regeln">
<span class="label">Drei Regeln im Test</span>
<ul>
<li><b>Nur übers Handy der Person.</b>Briefe nicht selbst am PC hochladen.</li>
<li><b>Frist am Original prüfen.</b>Die Erklärung ist eine Lesehilfe.</li>
<li><b>Nur den Brief fotografieren.</b>Keine Ausweise oder Pässe.</li>
</ul>
</div>
<div class="fuss">
<span class="anruf">Fragen? Justin Klein · <span class="nummer">0170 4969375</span></span>
<span class="wenden">Wenn etwas hakt: Rückseite →</span>
</div>
</div>
<!-- ============ Rückseite ============ -->
<div class="seite">
<div class="briefkopf">
<span class="absender">📬 BehördenKlar <small>by Webklar</small></span>
<span class="az mono">Kurzanleitung Beratungs-PC · Seite 2 von 2</span>
</div>
<p class="betreff">Kurzanleitung · Rückseite</p>
<h1>Wenn etwas <span class="markiert">hakt</span></h1>
<h2><span class="label">Meldungen am PC</span>Was steht da, und was tun Sie?</h2>
<table>
<tr><td>„⚠️ Das dauert ungewöhnlich lange …“</td>
<td>Erst aufs Handy schauen. Rechnet es noch: warten. Sonst am Handy den Knopf mit 🔁 tippen oder am PC <span class="k">Abbrechen</span> und ab Schritt 3.</td></tr>
<tr><td>„⚠️ Am Handy hat es nicht geklappt …“</td>
<td>Am Handy steht, warum. Dort einfach neu fotografieren.</td></tr>
<tr><td>„Der QR-Code ist abgelaufen …“</td>
<td>Schritt 3 wiederholen. Ein QR-Code gilt für einen Brief.</td></tr>
<tr><td>„⚠️ Keine Verbindung zum Server …“</td>
<td>Internet prüfen. Sonst Ihre IT fragen (unten).</td></tr>
<tr><td>Oben fehlt „🤝 Kostenlos über …“</td>
<td>Unten auf der Seite <span class="k">🤝 Sie haben einen Code von einer Beratungsstelle?</span> öffnen und den Code eingeben.</td></tr>
<tr class="anrufen"><td>„Die kostenlosen Analysen sind aufgebraucht oder abgelaufen …“ oder „Der Zugang über … ist abgelaufen …“</td>
<td><b>Kontingent leer oder Test zu Ende.</b> Bitte Justin anrufen: 0170 4969375. Danach das Lesezeichen neu öffnen.</td></tr>
</table>
<h2><span class="label">Gut zu wissen</span>Kleine Dinge, die viel helfen</h2>
<ul class="tipps">
<li><b>Dari?</b> „Farsi“ wählen.</li>
<li><b>Sprache zuerst,</b> dann den QR-Code zeigen. Sonst ist das Handy auf Deutsch.</li>
<li><b>Beim Warten</b> den Handy-Bildschirm anlassen und keine andere App öffnen. Den PC nicht neu laden.</li>
<li><b>Mehrere Seiten?</b> Die Seite mit Betreff und Frist fotografieren.</li>
<li><b>Handy-Seite schon zu?</b> Am PC <span class="k">📱 Ergebnis aufs Handy mitnehmen</span> klicken.</li>
<li><b>Kalender nur am Handy,</b> sonst landet die Datei auf dem Dienst-PC.</li>
<li><b>Fristen „ab Zustellung“</b> bitte selbst nachrechnen.</li>
<li><b>Nicht</b> <span class="k">🔑 Zugang dauerhaft auf ein Handy geben</span> klicken. Das gibt Ihren Zugang weiter.</li>
<li><b>Lesezeichen von Hand anlegen</b> (mit „oe“, ohne „www“). Der Stern ☆ allein speichert den Code nicht.</li>
</ul>
<div class="it">
<b>Für Ihre IT:</b> Bitte diese Adressen freigeben:
<span class="mono">behoerdenklar.de</span> ·
<span class="mono">behoerdenklar-proxy.behoerdenbrief.workers.dev</span> ·
<span class="mono">challenges.cloudflare.com</span>
</div>
<div class="fuss">
<span class="anruf">Fragen? Justin Klein · <span class="nummer">0170 4969375</span></span>
<span>justin@webklar.com · <b>behoerdenklar.de</b></span>
</div>
</div>
<script>
// Einrichtungs-Code hier eintragen, sobald er angelegt ist (z. B. 'MBE-K7QX').
var CODE = '';
// Name der Einrichtung, so wie er beim Anlegen des Codes vergeben wurde (steht oben auf der Seite).
var STELLE = 'MBE Donnersberg';
var url = CODE ? 'https://behoerdenklar.de/demo?code=' + CODE : 'https://behoerdenklar.de/demo';
var qr = qrcode(0, 'M');
qr.addData(url);
qr.make();
document.getElementById('qr').innerHTML = qr.createSvgTag({ cellSize: 4, margin: 0, scalable: true });
var codeEl = document.getElementById('codeText');
codeEl.textContent = CODE || 'wird beim Termin eingetragen';
if (!CODE) { codeEl.style.letterSpacing = '0'; }
var adresseEl = document.getElementById('adresseText');
adresseEl.textContent = 'behoerdenklar.de/demo?code=' + CODE;
if (!CODE) { var l = document.createElement('span'); l.className = 'luecke'; adresseEl.appendChild(l); }
document.getElementById('stelleText').textContent = STELLE || 'Ihre Beratungsstelle';
</script>
</body>
</html>
@@ -109,7 +109,7 @@
<span class="fett">bis spätestens 12.11.2026</span> bei der Ausländerbehörde einzureichen.</p> <span class="fett">bis spätestens 12.11.2026</span> bei der Ausländerbehörde einzureichen.</p>
<p>Zur Aufnahme Ihrer biometrischen Merkmale (Fingerabdrücke, Unterschrift) werden Sie <p>Zur Aufnahme Ihrer biometrischen Merkmale (Fingerabdrücke, Unterschrift) werden Sie
gebeten, am <span class="fett">Donnerstag, den 05.11.2026, um 10:30 Uhr</span> in Zimmer 2.14 gebeten, am <span class="fett">Dienstag, den 03.11.2026, um 10:30 Uhr</span> in Zimmer 2.14
persönlich vorzusprechen. Bitte bringen Sie dieses Schreiben sowie Ihren derzeitigen persönlich vorzusprechen. Bitte bringen Sie dieses Schreiben sowie Ihren derzeitigen
Aufenthaltstitel mit. Sollten Sie den Termin nicht wahrnehmen können, ist dieser rechtzeitig Aufenthaltstitel mit. Sollten Sie den Termin nicht wahrnehmen können, ist dieser rechtzeitig
vorher telefonisch abzusagen.</p> vorher telefonisch abzusagen.</p>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 420 KiB

After

Width:  |  Height:  |  Size: 420 KiB

@@ -0,0 +1,155 @@
<!DOCTYPE html>
<!--
Pitch zum Üben: voller Wortlaut für den Termin bei der MBE Kirchheimbolanden (Do 29.10.2026).
Erzeugt aus dem Pitch-Workflow vom 25.10. (Synthese + 32 Korrekturen aus dem Faktencheck).
Der Spickzettel zum Mitnehmen ist ablaufplan.html (2 Seiten).
PDF: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless=new --disable-gpu \
--no-pdf-header-footer --print-to-pdf=pitch-zum-ueben.pdf "file://$PWD/pitch-zum-ueben.html"
-->
<html lang="de"><head><meta charset="UTF-8"><title>Pitch zum Üben</title>
<style>
@page { size: A4; margin: 14mm 16mm 14mm; }
:root { --papier: #faf7f0; --tinte: #21211d; --grau: #6b675e; --amtsblau: #1d4e89; --rot: #b3372b; --marker: #ffe66b; }
* { box-sizing: border-box; -webkit-print-color-adjust: exact; print-color-adjust: exact; }
html { background: var(--papier); }
body { font-family: Georgia, 'Times New Roman', serif; color: var(--tinte); font-size: 10.5pt; line-height: 1.45; margin: 0 auto; max-width: 178mm; background: var(--papier); }
.kopf { display: flex; justify-content: space-between; align-items: baseline; border-bottom: 0.6mm solid var(--tinte); padding-bottom: 2mm; }
.kopf b { font-size: 12.5pt; } .kopf span { font-family: 'Courier New', monospace; font-size: 8pt; color: var(--grau); }
h1 { font-size: 22pt; line-height: 1.15; margin: 5mm 0 2mm; }
.markiert { background: linear-gradient(104deg, transparent 2%, var(--marker) 4%, var(--marker) 96%, transparent 98%); padding: 0 1.5mm; }
.kern { font-size: 11.5pt; border-left: 1mm solid var(--amtsblau); background: #fff; padding: 2.5mm 4mm; margin: 3mm 0; }
h2 { font-family: 'Courier New', monospace; font-weight: 400; font-size: 8.5pt; text-transform: uppercase; letter-spacing: .14em; color: var(--grau);
margin: 8mm 0 3mm; display: flex; gap: 3mm; align-items: center; break-after: avoid; }
h2::after { content: ''; flex: 1; border-top: 0.25mm solid rgba(33,33,29,.25); }
.block { break-inside: avoid; margin-bottom: 4mm; padding-bottom: 3mm; border-bottom: 0.25mm dotted rgba(33,33,29,.35); }
.block h3 { font-size: 12pt; margin: 0 0 1.5mm; } .block h3 .zeit { font-family: 'Courier New', monospace; color: var(--amtsblau); margin-right: 2mm; }
.tun { color: #3d3a33; margin: 1mm 0 2mm; } .tun b { color: var(--tinte); }
.sag { background: #fff; border-left: 1mm solid var(--amtsblau); padding: 2mm 4mm; margin: 1.5mm 0; }
.sag p { margin: 0 0 1.4mm; font-style: italic; } .sag p:last-child { margin-bottom: 0; }
.regie { font-style: normal !important; color: var(--grau); font-size: 9.5pt; }
ul { padding-left: 5mm; margin: 1mm 0; } li { margin-bottom: 1.2mm; }
.einwand { break-inside: avoid; margin-bottom: 3mm; } .einwand b { display: block; }
.nicht li { color: #5a2a24; } .nicht { background: #fdf1ef; border-left: 1mm solid var(--rot); padding: 2mm 4mm 2mm 8mm; }
.klein { font-size: 9pt; color: var(--grau); }
p { margin: 0 0 2mm; }
</style></head><body>
<div class="kopf"><b>📬 BehördenKlar · Pitch zum Üben</b><span>MBE Kirchheimbolanden · Do 29.10.2026 · nur für mich</span></div>
<h1>Hilfe zur Selbsthilfe. <span class="markiert">Der volle Wortlaut.</span></h1>
<p class="klein">Zum Üben zu Hause. Im Termin nimmst du nur den Spickzettel (2 Seiten) mit. Auswendig lernen: die Eröffnung und die drei Sätze. Den Rest frei sprechen.</p>
<div class="kern"><b>Der eine Satz, den sie weitererzählen sollen:</b><br>Damit verstehen unsere Ratsuchenden ihren Brief in ihrer eigenen Sprache und haben Termin und Frist im Handy, und mit den Fragen, die nur wir beantworten können, kommen sie weiter zu uns.</div>
<h2>Zum Üben</h2><ul><li>Vor dem Üben erledigen (bis Di 27.10. abends, vor dem Code-Stopp): Die Webseite wird bis Di 27.10. so angepasst, dass „Vorlesen“ nirgends mehr als Funktion der Webseite steht. Wenn eine Beraterin vorher googelt und dann im Termin „kein Vorlesen“ hört, wirkt deine Ehrlichkeit wie Taktik.</li><li>Lern zwei Stellen auswendig und sprich sie jeden Tag dreimal laut, mit Stoppuhr. Erstens die Eröffnung, unter 1:10 Minuten. Zweitens die drei Sätze: „Er versteht seinen Brief. Er denkt leichter an Termin und Frist. Er ist vorbereitet, wenn ein Anruf nötig ist.“ Den Rest sprichst du frei nach dem Ablauf.</li><li>Generalprobe 2 (Mo) und 3 (Mi) machst du komplett mit Stoppuhr, so als säße das Team vor dir. Sprich den Wartezeit-Text laut mit und notier, nach wie vielen Sekunden das Ergebnis da ist. Am Mittwoch machst du die Bildschirmfotos mit roter Ampel. Prüf danach, wie viele Briefe auf VORF-2EDF übrig sind.</li><li>Üben, still zu sein: Nach jeder Frage zählst du innerlich bis fünf, bevor du weiterredest. Lass dir die Einstiegsfragen von jemandem beantworten und schreib dabei die Wörter wörtlich mit. Dann sagst du: „Sie hatten gesagt …“. Genau das hat bei allen drei Richtern Vertrauen gebracht.</li><li>Die acht Einwände mit „(oft)“ lässt du dir von jemandem in zufälliger Reihenfolge stellen und antwortest frei, nicht abgelesen. Wichtig ist der Datenschutz-Einwand: Cloudflare und Anthropic, Standardvertragsklauseln, „in der Regel“ 30 Tage, „wer nicht einwilligt, wird ganz normal beraten“. Die übrigen Einwände reicht es zu kennen.</li><li>Die Bitte (ab Minute 9:30) übst du am meisten. Sprich sie langsam. Nach „Welche Uhrzeit passt Ihnen?“ schweigst du und trägst den Termin vor ihren Augen in dein Handy ein. Bist du bei Minute 9 noch nicht bei den Grenzen, nimmst du die Kürzungsregel und streichst nie die Bitte.</li><li>Plan B übst du einmal trocken: Hotspot aus und dann die Bildschirmfotos in unter zehn Sekunden finden. Den Satz „Da hakt gerade die Verbindung …“ sprichst du ruhig. Merk dir: Zwei Minuten aufs Handy schauen, erst bei drei Minuten kommt die Warnung am PC, und neu geladen wird nichts.</li><li>Lies das Datenschutz-Blatt (vor allem Abschnitt 4 bis 7) und die Kurzanleitung einmal ganz durch. Die Datenschutzbeauftragte der FID wird deine mündlichen Sätze mit dem Blatt vergleichen. Alles, was du sagst, muss dort genauso stehen.</li></ul>
<h2>Ankommen und aufbauen</h2><ul><li>Am Vortag (Mi 28.10.): Generalprobe 3, genau wie am Termin. Danach den Stand des Vorführ-Codes prüfen: node tools/einrichtungs-code.js stand VORF-2EDF. Es müssen genug Briefe für zwei bis drei Versuche übrig sein. Bildschirmfotos und ein kurzes Video vom Mittwoch (dann ist die Ampel rot) offline auf den Laptop legen. Laptop und Handy laden, Ladekabel einpacken.</li><li>Mappe in dieser Reihenfolge: 2× Musterbrief, 5× Handzettel und 5× Kurzanleitung (beide mit dem MBE-Code vom Di 27.10.), 2× Datenschutz-Blatt. Dazu die ausgedruckte Seite 36–37 der DeZIM-Evaluation, nur falls jemand nach der Zahl fragt. Notizblock und Stift legst du obenauf. Den MBE-Code löst du nie auf deinem eigenen Laptop ein. Für die Vorführung nimmst du nur VORF-2EDF.</li><li>10–15 Minuten vorher, noch im Auto: Handy-Hotspot an, Laptop damit verbinden. Nicht das WLAN der Stelle nehmen. behoerdenklar.de/demo öffnen. Oben muss „🤝 Kostenlos über MBE Donnersberg (Vorführung)“ stehen. Bei „Erklärung in dieser Sprache“ jetzt schon „العربية – Arabisch“ einstellen. Auf „Lieber mit dem Handy fotografieren“ klickst du noch NICHT, denn der QR-Code gilt nur 15 Minuten. Das Häkchen „Hier am Bildschirm immer auf Deutsch zeigen …“ erscheint erst nach diesem Klick und ist von selbst gesetzt. Dann kurz prüfen.</li><li>Laptop: im Terminal caffeinate -d, „Nicht stören“ an, Ton aus, Ladekabel dran, Helligkeit hoch, alle anderen Tabs zu. Browser-Zoom etwa 125 % (Cmd und Plus), damit auch die hinterste Person mitlesen kann.</li><li>Handy: Akku voll, automatische Sperre auf „Nie“, Stromsparmodus aus, lautlos und „Nicht stören“ an. Kameralinse sauber wischen und einmal prüfen, ob die Kamera QR-Codes erkennt.</li><li>Drinnen allen die Hand geben. Die Namen schreibst du sofort mit einer kleinen Skizze, wer wo sitzt, oben auf den Block. Dann fragst du: „Wo darf ich den Laptop hinstellen, damit alle draufschauen können? Ich nehme mein eigenes Internet vom Handy, Ihr WLAN brauche ich nicht.“ Den Bildschirm zum Team drehen, du sitzt seitlich daneben und nicht dahinter.</li><li>Wer hält was: Den Laptop bedienst du. Du fotografierst auch selbst mit deinem Handy, das in der Vorführung „das Handy von Herrn Beispiel“ ist. In Minute 3 gibst du Musterbrief Nr. 1 einer Person aus dem Team in die Hand. Sie ist die Kontrolle und prüft am Ende das Ergebnis gegen das Original. Musterbrief Nr. 2 liegt flach vor dir, im guten Licht, zum Fotografieren. Während die KI arbeitet, bleibt das Handy bei dir, der Bildschirm bleibt an und du öffnest keine andere App. Erst wenn das Ergebnis da ist, darf jemand, der Arabisch liest, es halten.</li><li>Handzettel, Kurzanleitung und Datenschutz-Blatt bleiben bis zur Bitte (etwa Minute 9:30) in der Mappe, sonst lesen alle, statt zuzuschauen. Nur der Notizblock liegt offen vor dir. Das zeigt: Ich bin zum Zuhören hier.</li><li>Dauert der Aufbau, während alle warten, sagst du einfach: „Ich mach das nur kurz an, dann geht&#x27;s los.“</li><li>Letzter Blick vor dem ersten Satz: Ist die Seite offen, steht das Banner „Kostenlos über …“ da, ist Arabisch eingestellt und hat der Hotspot Empfang? Leg die Uhr so, dass du sie siehst. Merke dir: Bei etwa Minute 9:30 solltest du bei der Bitte sein.</li></ul>
<h2>Die ersten Sätze (auswendig)</h2><div class="sag"><p>Guten Tag. Schön, dass es heute klappt, und danke, dass Sie sich die Zeit nehmen.</p>
<p>Ich bin Justin Klein. Ich komme aus Winnweiler, also fast von nebenan.</p>
<p>Schwierige Briefe vom Amt kenne ich von klein auf. Meine Mutter ist selbst nach Deutschland gekommen. Solche Briefe gehörten bei uns zum Alltag. Deshalb habe ich BehördenKlar gebaut.</p>
<p>Ich habe mir etwa eine Viertelstunde vorgenommen. Passt das für Sie?</p>
<p class="regie">(kurz warten)</p>
<p>Ich habe zwei Sachen vor. Ich zeige Ihnen an einem Musterbrief, was es kann. Und ich möchte von Ihnen hören, ob das Ihren Ratsuchenden wirklich hilft. Sie kennen die Menschen, die zu Ihnen kommen. Ich kenne nur die Technik.</p>
<p>Heute geht es nicht um einen Vertrag. Am Ende habe ich eine Bitte an Sie, aber die kommt erst zum Schluss.</p>
<p>Bevor ich irgendwas zeige: Darf ich Sie zuerst etwas fragen?</p></div>
<h2>Ablauf</h2>
<div class="block"><h3><span class="zeit">0:00–1:00</span>Begrüßung: wer ich bin, was ich vorhabe</h3><div class="tun"><b>Tun:</b> Setz dich oder bleib stehen, je nachdem, was das Team anbietet. Der Laptop steht schon da, aber du zeigst noch nicht darauf. Die Eröffnung sprichst du wörtlich, langsam und mit Blickkontakt reihum. Nach „Passt das für Sie?“ wartest du wirklich auf eine Antwort.<br>KÜRZUNGSREGEL, wenn sie sagen „Wir haben nur zehn Minuten“: Die DeZIM-Zahl lässt du weg. Die Grenzen kürzt du auf drei Sätze (KI kann sich irren, keine Rechtsberatung, kein Vorlesen). Beim Zuhören stellst du nur die erste Frage, den Ausblick lässt du weg. Die Bitte (Code und 26.11.) streichst du nie.</div><p class="tun"><i>Die Eröffnung wörtlich, siehe oben. Der letzte Satz ist: „Bevor ich irgendwas zeige: Darf ich Sie zuerst etwas fragen?“</i></p></div>
<div class="block"><h3><span class="zeit">1:00–2:30</span>Erst fragen, dann zeigen</h3><div class="tun"><b>Tun:</b> Stell die Frage und sei dann wirklich still. Zähl innerlich bis fünf, bevor du nachhakst. Schreib ihre eigenen Wörter mit, zum Beispiel „kommt zu spät“ oder „erst mal vorlesen“. Genau diese Wörter greifst du später in der Vorführung wieder auf. Unterbrich nicht und antworte nicht sofort mit dem Produkt. Erzählen sie viel, ist das gut, dann wird die Überleitung kürzer.</div><div class="sag"><p>„Wenn jemand mit einem Brief zu Ihnen kommt: Was passiert dann als Erstes?“</p>
<p class="regie">(zuhören, mitschreiben)</p>
<p>„Und wie oft sind Termin oder Frist dann schon ganz knapp?“</p>
<p class="regie">(zuhören)</p>
<p class="regie">[Wenn es still bleibt:] „Oder anders gefragt: Was war der letzte Brief, der hier bei Ihnen auf dem Tisch lag?“</p>
<p>„Danke. Das hilft mir wirklich.“</p></div></div>
<div class="block"><h3><span class="zeit">2:30–3:30</span>Der Gedanke dahinter und der Musterbrief</h3><div class="tun"><b>Tun:</b> Den Satz mit der Studie sagst du nur, wenn er zu dem passt, was das Team gerade erzählt hat. Haben sie es schon selbst gesagt, lässt du die Zahl weg und sagst nur: „Sie haben es ja selbst gesagt.“ Die Quelle nennst du nur auf Nachfrage: DeZIM-Evaluation der MBE (2025), Befragung von Ratsuchenden im Frühjahr 2024, S. 36–37. Dann gibst du Musterbrief Nr. 1 einer Person aus dem Team in die Hand.</div><div class="sag"><p class="regie">[Nur wenn es passt:] „Das passt zur Evaluation der MBE vom DeZIM-Institut. Da haben rund sechs von zehn befragten Ratsuchenden gesagt: Sie haben in der Beratung Hilfe bekommen, Dokumente zu verstehen, zu übersetzen oder auszufüllen. Aber das wissen Sie besser als jede Studie.“</p>
<p>„Mich hat eine Frage beschäftigt. Der Brief ist ja nicht erledigt, wenn die Person aus Ihrer Tür geht. Zu Hause muss sie selbst dran denken. Unterlagen suchen. Zum Termin gehen. Vielleicht absagen.</p>
<p>Bei Ihnen heißt das Hilfe zur Selbsthilfe, oder? Genau da soll BehördenKlar helfen.</p>
<p>Ich habe einen Brief von einer Ausländerbehörde mitgebracht. Der Grund: Aufenthalt war in der Evaluation der häufigste Hauptgrund, warum Menschen zur MBE kommen. Alles daran ist erfunden: Kreisverwaltung Musterhausen, Herr Ahmad Beispiel.</p>
<p>Darf ich Ihnen den geben? Sie haben jetzt das Original. Am Ende schauen Sie bitte, ob alles stimmt.“</p></div></div>
<div class="block"><h3><span class="zeit">3:30–4:30</span>Vorführung: Herr Beispiel fotografiert mit seinem Handy</h3><div class="tun"><b>Tun:</b> 1. Kurz auf den Laptop zeigen: oben „Kostenlos über MBE Donnersberg (Vorführung)“, darunter Arabisch. Erst jetzt klickst du auf „📱 Lieber mit dem Handy fotografieren“.<br>2. Mit deinem Handy scannst du den QR-Code mit der normalen Kamera und öffnest den Link. Am PC erscheint „✅ Handy verbunden …“, darauf zeigst du.<br>3. Das Handy hältst du ins Team, damit alle die arabische Seite mit dem Häkchen-Text sehen. Dann setzt du das Häkchen, wartest, bis die Cloudflare-Prüfung durch ist, und tippst auf den Knopf mit 📷. In der Auswahl tippst du auf „Foto aufnehmen“ (Android: „Kamera“). Musterbrief Nr. 2 fotografierst du von oben, mit dem ganzen Text im Bild, und tippst auf „Foto verwenden“.<br>4. Das Handy behältst du in der Hand oder legst es mit dem Bildschirm nach oben neben den Laptop. Es bleibt an, und du öffnest keine andere App.</div><div class="sag"><p>„Stellen Sie sich vor, Herr Beispiel sitzt jetzt bei Ihnen. Er spricht Arabisch und noch wenig Deutsch.</p>
<p>Hier am Laptop sehen Sie Ihren Bildschirm in der Beratung. Ich habe Arabisch eingestellt und klicke jetzt auf ‚Lieber mit dem Handy fotografieren‘.</p>
<p>Das hier ist jetzt mal das Handy von Herrn Beispiel. Er scannt den Code mit der normalen Kamera. Keine App, kein Konto.</p>
<p class="regie">(scannen)</p>
<p>Am PC steht jetzt: Handy verbunden.</p>
<p class="regie">(Handy hochhalten)</p>
<p>Und das sieht Herr Beispiel. Die Seite ist auf Arabisch, auch die Einwilligung. Nur die ausführliche Datenschutzerklärung dahinter gibt es bisher auf Deutsch, das steht auch so am Link. Sie können das gerade nicht lesen. Er kann es. Darum geht es.</p>
<p>Das Häkchen setzt er selbst, für genau diesen einen Brief. Dann fotografiert er.“</p></div></div>
<div class="block"><h3><span class="zeit">4:30–5:30</span>Wartezeit: kurz zum Datenschutz, dann fragen</h3><div class="tun"><b>Tun:</b> Sprich den Text für die Wartezeit (siehe unten). Bei der Frage an das Team schreibst du ihre Punkte als Liste mit, denn die hakst du gleich ab. Kommt das Ergebnis, während jemand redet, lässt du die Person ausreden. Nichts neu laden. Nach etwa zwei Minuten schaust du aufs Handy. Was nach drei Minuten zu tun ist, steht im Plan B.</div><p class="tun"><i>Siehe Wartezeit-Text. Der Kern ist die Frage: „Wenn Herr Beispiel mit diesem Brief zu Ihnen käme: Was müsste er unbedingt verstehen?“</i></p></div>
<div class="block"><h3><span class="zeit">5:30–7:00</span>Erstens: Er versteht seinen Brief</h3><div class="tun"><b>Tun:</b> Dreh den Laptop zum Team. Zeig die Kernaussage oben und „Einfach erklärt“. Lies nur vor, was wirklich dasteht, denn die KI formuliert jedes Mal etwas anders. Hake die Punkte des Teams von deinem Block ab. Dann lässt du die Person mit dem Original prüfen. Fehlt etwas oder stimmt etwas nicht: ruhig bleiben, danken und nicht verteidigen. Unter „Schwere Wörter erklärt“ klappst du „Fiktionsbescheinigung“ auf. Steht sie nicht in der Liste, nimmst du ein anderes Wort von dort. Zum Schluss hältst du das Handy mit Arabisch hoch und zeigst oben den Umschalter Deutsch | العربية. Den Brief selbst erklärst du nicht inhaltlich, das kann das Team besser.</div><div class="sag"><p>„Da ist es. Hier am PC steht es auf Deutsch, für Sie. Ganz oben steht in einem Satz, worum es geht, darunter einfach erklärt.</p>
<p>Sie hatten gesagt: (ihre Punkte nennen). Schauen wir mal.</p>
<p class="regie">(abgleichen)</p>
<p>Sie haben das Original in der Hand. Stimmt das so? Stimmen Termin und Frist?</p>
<p class="regie">(Antwort abwarten)</p>
<p class="regie">[Falls etwas fehlt oder nicht stimmt:] Das hat sie nicht so deutlich gemacht. Gut, dass er damit bei Ihnen sitzt.</p>
<p>Und hier stehen die schweren Wörter. ‚Fiktionsbescheinigung‘ bleibt auf Deutsch stehen, auf seinem Handy ist nur die Erklärung übersetzt. So findet er das Wort im Brief wieder. Und er kann Sie gezielt fragen: Was heißt das für mich?</p>
<p class="regie">(Handy hochhalten)</p>
<p>Herr Beispiel liest dasselbe gleichzeitig auf seinem Handy, auf Arabisch. Liest jemand von Ihnen Arabisch? Dann schauen Sie ruhig drauf.“</p></div></div>
<div class="block"><h3><span class="zeit">7:00–8:30</span>Zweitens und drittens: Termin, Frist und ein nötiger Anruf, dann das, was nur Sie können</h3><div class="tun"><b>Tun:</b> Zeig die Ampel. Am 29.10. sollte sie rot sein (Termin am 03.11.). Lies vor, was dasteht. Dann tippst du am Handy auf den Knopf mit 📅 (er ist auf Arabisch), zeigst kurz die Kalender-Vorschau und brichst ab. Am PC klickst du nie auf den Kalender-Knopf. Danach zeigst du am PC die Karte „Anrufen“: die Nummer, das Aktenzeichen und die Sätze. Dafür klickst du am PC oben im Umschalter auf „العربية“, erst dann steht unter jedem deutschen Satz die arabische Bedeutung. Danach wieder auf „Deutsch“. Den Anruf zeigst du nur für den Fall „Termin absagen“, wie es im Brief steht. Hintergrund: Die Ausländerbehörde im Kreis bittet, auf telefonische Nachfragen zum Stand zu verzichten. Termine vereinbart oder sagt man dort aber per Telefon oder Mail. Genau dafür ist die Anruf-Hilfe da. Es wird nicht wirklich angerufen. Zum Schluss hältst du das Handy hoch und zeigst unten den Hinweis „🤝 Noch Fragen zu diesem Brief? Ihre Beratungsstelle … hilft Ihnen gern weiter.“</div><div class="sag"><p>„Zweitens: Termin und Frist. Die Ampel ist rot. Rot heißt: eine Woche oder weniger. Hier steht, was er tun muss und bis wann.</p>
<p class="regie">(am Handy auf den Kalender-Knopf tippen)</p>
<p>Mit wenigen Tipps an seinem Handy kommen Termin und Frist in seinen Kalender. Wenn er speichert, ist im Eintrag eine Erinnerung drei Tage und einen Tag vorher eingestellt. Der Eintrag liegt nur bei ihm. Nicht bei mir, und auch nicht bei Ihnen.</p>
<p>Drittens: falls er doch anrufen muss. Im Brief steht, wer den Termin nicht schafft, soll vorher absagen. Dafür gibt es die Anruf-Hilfe: die Nummer aus dem Brief, das Aktenzeichen und ein paar Sätze. Ich schalte hier kurz auf Arabisch, so sieht Herr Beispiel das auf seinem Handy. Oben steht der Satz auf Deutsch, so sagt er ihn. Darunter steht er auf Arabisch, damit er weiß, was er sagt. Die KI hat die Regel, eine Nummer nur zu nehmen, wenn sie wörtlich im Brief steht.</p>
<p>Das sind die drei Sachen. Er versteht seinen Brief. Er denkt leichter an Termin und Frist. Und er ist vorbereitet, wenn ein Anruf nötig ist.</p>
<p>Und dann bleibt das, was nur Sie können. Wie kommt er an einen Pass? Reicht der Bescheid vom Jobcenter? Was heißt das für seinen Aufenthalt? Das kann keine KI. Das sind Sie. Selbstständig heißt nicht allein.</p>
<p class="regie">(Handy hochhalten)</p>
<p>Und hier unten steht bei jeder Erklärung, auf Arabisch: Noch Fragen zu diesem Brief? Ihre Beratungsstelle MBE Donnersberg hilft Ihnen gern weiter. BehördenKlar schickt die Leute zu Ihnen, nicht weg.“</p></div></div>
<div class="block"><h3><span class="zeit">8:30–9:30</span>Ehrlich: was es nicht kann</h3><div class="tun"><b>Tun:</b> Sprich ruhig und sachlich, ohne dich zu entschuldigen. Diesen Block sagst du, bevor du um etwas bittest. Die FID bietet Alphabetisierungskurse an, deshalb gehört der Satz zum Lesen unbedingt dazu. Bist du hinter der Zeit, sagst du nur den ersten Satz, die KI, die Rechtsberatung und das Vorlesen.</div><div class="sag"><p>„Ich will Ihnen auch sagen, was es nicht kann. Lieber jetzt als in vier Wochen.</p>
<p>Eine KI kann sich irren. Sie hat feste Regeln, zum Beispiel: Ein Datum, das sie nicht sicher lesen kann, lässt sie leer. Lieber kein Datum als ein falsches. Trotzdem prüft man Fristen immer am Original.</p>
<p>Es ist keine Rechtsberatung.</p>
<p>Es geht ein Foto pro Erklärung. Bei mehreren Seiten nimmt man die mit Betreff und Frist.</p>
<p>Vorlesen kann die Seite nicht. Wer gar nicht lesen kann, für den ist es nur eine halbe Hilfe.</p>
<p>Die Erklärung bleibt nur, solange die Seite offen ist. Was bleibt, ist der Kalender-Eintrag. Am PC können Sie die Erklärung aber ausdrucken, auch in der Sprache der Person.</p>
<p>Und die Übersetzungen macht die KI, bei jedem Brief neu. Von Muttersprachlern geprüft ist bisher keine Sprache. Am unsichersten bin ich bei Tigrinya, Somali, Paschtu und Kurdisch. Wenn Ihnen da etwas auffällt, sagen Sie es mir bitte.“</p></div></div>
<div class="block"><h3><span class="zeit">9:30–11:00</span>Die zwei Bitten: Testzugang und 26. November</h3><div class="tun"><b>Tun:</b> Erst jetzt öffnest du die Mappe. Jede Person bekommt einen Handzettel und eine Kurzanleitung, das Datenschutz-Blatt legst du extra hin. Zeig auf den Code. Den Namen der Datenschutz-Person schreibst du auf. Für den 26.11. lässt du sie die Uhrzeit nennen, trägst sie vor ihren Augen in dein Handy ein und wiederholst sie laut. Die Rolle beim Datenschutz (wer verantwortlich ist) legst du heute nicht fest. Das Lesezeichen richtest du nicht jetzt ein. Du bietest es nur für die Zeit nach dem Gespräch an, und nur, wenn ihre IT einverstanden ist. Nach „Welche Uhrzeit passt Ihnen?“ schweigst du.</div><div class="sag"><p>„Jetzt meine Bitte. Eigentlich sind es zwei.</p>
<p>Die erste: Ich lasse Ihnen gern einen Testzugang da. Einen Monat, bis zum 29. November, für bis zu 100 Briefe. Für Ihre Stelle ist das kostenlos, und über Ihren Code zahlen auch Ihre Ratsuchenden nichts. Es gibt keinen Vertrag, der Test endet von selbst.</p>
<p>Hier steht der Code. Er ist nur für Mitarbeitende, bitte nicht im Wartebereich auslegen. „Und das ist die Kurzanleitung für den PC: vorne die sechs Schritte, hinten, was zu tun ist, wenn etwas hakt.“ Wenn Sie mögen, richten wir das Lesezeichen nach dem Gespräch zusammen ein, wenn Ihre IT einverstanden ist.</p>
<p>Für den Test schlage ich vor: Die Ratsuchenden fotografieren mit dem eigenen Handy und setzen das Häkchen selbst, so wie eben. Bitte laden Sie keine Briefe selbst am Dienst-PC hoch. Dafür bekommen Sie vorher einen AVV-Entwurf von mir.</p>
<p>Sie gehören zur Förderinitiative Donnersberg, richtig? Wer macht dort den Datenschutz? Dieses Blatt ist für diese Person.</p>
<p class="regie">(Namen aufschreiben)</p>
<p>Die zweite Bitte: Darf ich am Donnerstag, 26. November, wiederkommen? Dann schauen wir zusammen, was es gebracht hat, und was nicht. Ich bringe mit, wie viele Briefe pro Woche und in welchen Sprachen genutzt wurden. Das sind nur Zahlen, ohne Inhalte.</p>
<p>Welche Uhrzeit passt Ihnen?“</p>
<p class="regie">(eintragen und wiederholen: „Also Donnerstag, 26. November, um … Uhr.“)</p></div></div>
<div class="block"><h3><span class="zeit">11:00–12:30</span>Zuhören: woran wir den Test messen</h3><div class="tun"><b>Tun:</b> Das ist die wichtigste Frage des Termins. Stell sie, sei still und schreib mit, denn die Antworten sind die Messlatte für den 26.11. Danach stellst du je nach Zeit ein oder zwei Fragen mehr. Nichts verteidigen. Auf Kritik antwortest du: „Danke, das schreibe ich mir auf.“ Versprich keine neue Funktion und kein Datum.</div><div class="sag"><p>„Und eine Frage ist mir wirklich wichtig: Was müsste bis zum 26. November passiert sein, damit Sie sagen, das hat Ihren Ratsuchenden geholfen?</p>
<p class="regie">(zuhören, mitschreiben)</p>
<p>Und andersherum: Was müsste passieren, damit Sie sagen, das lassen wir lieber?</p>
<p class="regie">(zuhören)</p>
<p class="regie">[Wenn Zeit ist:] Wo würde das bei Ihnen passen? Und wo eher nicht?</p>
<p class="regie">[Wenn Zeit ist:] Wer von Ihnen probiert es als Erstes aus? Soll ich mich nach der ersten Woche kurz melden, oder melden Sie sich, wenn etwas ist?“</p></div></div>
<div class="block"><h3><span class="zeit">12:30–13:30</span>Abschluss (und nur wenn es passt: ein leiser Ausblick)</h3><div class="tun"><b>Tun:</b> Den Ausblick (siehe „bundesweit“) sagst du nur, wenn Code und 26.11. feststehen und die Stimmung gut ist. Sonst gehst du direkt zum Abschluss und sprichst ihn wörtlich. Danach aufstehen, Hände schütteln und nichts mehr nachschieben. Kommt noch eine Frage, antwortest du kurz. Wollen sie das Lesezeichen jetzt einrichten, geht das nach dem Abschluss: die Adresse von der Kurzanleitung von Hand als Lesezeichen anlegen (mit „oe“, ohne „www“). Danach öffnen und prüfen, ob oben „Kostenlos über MBE Donnersberg“ steht.</div><p class="tun"><i>Wenn es passt, erst der Ausblick, dann der Abschluss (beides siehe unten).</i></p></div>
<div class="block"><h3><span class="zeit">jederzeit</span>Plan B, wenn etwas hakt</h3><div class="tun"><b>Tun:</b> Kein Internet: Hotspot neu verbinden. Geht es dann immer noch nicht, zeigst du die Bildschirmfotos vom Mi 28.10.<br>Die KI braucht lange: Nach etwa zwei Minuten aufs Handy schauen. Rechnet es noch, wartest du, redest weiter und lädst nichts neu. Erst nach drei Minuten zeigt der PC „⚠️ Das dauert ungewöhnlich lange …“. Steht die Erklärung dann am Handy schon da, tippst du dort auf den Knopf mit 🔁 (er ist auf Arabisch). Diesen Knopf gibt es nur, wenn die Übergabe gescheitert ist. Sonst brichst du am PC ab, klickst neu auf „Lieber mit dem Handy fotografieren“ und fotografierst noch einmal. Jede fertige Erklärung kostet einen Brief vom Vorführ-Code, auch wenn sie nicht am PC ankommt. Fehlversuche ohne Ergebnis kosten nichts.<br>Der Laptop hängt, aber das Handy hat das Ergebnis: Dann zeigst du einfach das Handy und schaltest dort auf Deutsch um.<br>Fehlt „Deutsch | العربية“: „Hier hat die Übersetzung gehakt.“ Dann zeigst du die Bildschirmfotos.<br>Fehlermeldung: ruhig bleiben, einen zweiten Versuch machen, sonst die Bildschirmfotos zeigen.<br>Wird die Zeit knapp, gilt die Kürzungsregel aus Minute 0. Code und 26.11. haben immer Vorrang.</div><div class="sag"><p>„Da hakt gerade die Verbindung. Das kann im Alltag auch mal passieren, deshalb ist es gut, dass Sie es sehen.“</p>
<p>Bei Bildschirmfotos: „Ich zeige Ihnen, wie es aussieht. Den Zugang lasse ich Ihnen da, dann sehen Sie es im Test selbst.“</p></div></div>
<div class="block"><h3><span class="zeit">danach (am selben Tag)</span>Nach dem Termin</h3><div class="tun"><b>Tun:</b> Gleich im Auto ergänzt du die Notizen: Namen, die Antworten auf die Messlatte-Frage, alle Einwände, die Datenschutz-Person und die Uhrzeit am 26.11. Noch am selben Tag schreibst du eine kurze Dankes-Mail mit Code, Adresse und Termin. Das Datenschutz-Blatt hängst du als PDF für die genannte Person an. Dann Claude Bescheid geben, damit STAND.md aktuell wird.</div><div class="sag"><p>Kern der Mail: „Vielen Dank für das Gespräch heute. Wie besprochen: Ihr Code lautet …, gültig bis 29.11., für bis zu 100 Briefe. Wir sehen uns am Donnerstag, 26.11., um … Uhr. Wenn vorher etwas hakt, rufen Sie mich gern an: 0170 4969375.“</p></div></div>
<h2>Wartezeit (etwa eine Minute)</h2><div class="sag"><p>„Jetzt arbeitet die KI. Das dauert etwa eine Minute, manchmal zwei. Es sind zwei Schritte: Erst schreibt sie die Erklärung auf Deutsch, für Sie am PC. Dann übersetzt sie sie ins Arabische, für sein Handy.</p>
<p>Kurz dazu, was gerade mit dem Brief passiert. Das Foto geht verschlüsselt an unseren Server. Der läuft bei Cloudflare, einer Firma aus den USA. Von dort geht es an den KI-Dienst Anthropic, ebenfalls in den USA. Bei uns wird der Brief nicht gespeichert. Anthropic löscht ihn in der Regel nach 30 Tagen und trainiert nicht damit. Das stand eben auch beim Häkchen, auf Arabisch. Und wer das Häkchen nicht setzen will, wird ganz normal beraten, wie bisher.</p>
<p>Darf ich Sie etwas fragen, solange es läuft? Wenn Herr Beispiel mit diesem Brief zu Ihnen käme: Was müsste er unbedingt verstehen?“</p>
<p class="regie">(zuhören, ihre Punkte als Liste mitschreiben)</p>
<p>„Gut. Dann schauen wir gleich, ob die KI das auch gefunden hat.“</p>
<p class="regie">(Falls es noch läuft:)</p>
<p>„Die Erklärung kommt gleich vom Handy auf den PC. Diese Übergabe ist Ende-zu-Ende verschlüsselt. Den Schlüssel hat nur der QR-Code, unser Server kann sie nicht lesen. Für Ihre Datenschutzstelle habe ich ein Blatt dabei. Da steht alles genau drin, auch was nicht geht.“</p>
<p class="regie">(Falls es immer noch läuft:)</p>
<p>„Welche Sprachen brauchen Sie hier am meisten?“</p>
<p class="regie">(Nach etwa zwei Minuten:)</p>
<p>„Heute dauert es etwas länger. Ich lasse es laufen und schaue kurz aufs Handy.“ (Nichts neu laden, weiter siehe Plan B.)</p>
<p>(Kommt das Ergebnis mitten im Satz: den Satz zu Ende sprechen, dann:) „Da ist es.“</p></div>
<h2>Abschluss</h2><div class="sag"><p>„Vielen Dank für Ihre Zeit und für Ihre ehrlichen Antworten.</p>
<p>Ich fasse kurz zusammen. Sie haben den Code, er gilt bis zum 29. November, für bis zu 100 Briefe. Das Datenschutz-Blatt schicke ich [Name] heute noch als PDF. Und am Donnerstag, 26. November, komme ich um [Uhrzeit] wieder.</p>
<p>Wenn bis dahin etwas hakt, rufen Sie mich an. Die Nummer steht auf jedem Blatt. Auch bei Kleinigkeiten. Gerade bei Kleinigkeiten.</p>
<p>Ich bin gespannt, was Ihre Ratsuchenden sagen. Auch wenn es heißt: So brauchen wir das nicht. Das hilft mir genauso.“</p>
<p class="regie">(Falls das Team noch zögert:)</p>
<p>„Sie müssen heute nichts entscheiden. Ich lasse Ihnen alles da. Der Code kostet Sie nichts und läuft Ende November von selbst aus. Darf ich mich Anfang nächster Woche kurz melden und fragen, wie Sie es sehen?“</p></div>
<h2>Der Gedanke „auch für andere Stellen“</h2><div class="block" style="border:none"><p>WANN: Höchstens einmal, ganz am Ende, wenn Code und 26.11. feststehen, und nur wenn die Stimmung gut ist. Nie vor dem Angebot und nie als Argument dafür. Nenn keine Zahl, keinen Verband und bitte heute um nichts. Wenn es sich nicht richtig anfühlt, lässt du es weg. Am 26.11. ist dafür genauso Platz.</p>
<p>WÖRTLICH (vor dem Abschluss, ruhig, als Gedanke und nicht als Plan):</p>
<p>„Noch ein Gedanke zum Schluss, ganz ohne Druck. Ich fange bewusst hier an. Bei Ihnen, in meinem Landkreis. Wenn es hier nicht hilft, dann hilft es woanders auch nicht. Und wenn es hier gut funktioniert, haben wir zusammen etwas herausgefunden, das vielleicht auch anderen Beratungsstellen hilft. Aber das ist heute nicht dran. Ob und wem Sie davon erzählen, entscheiden Sie. Und zwar erst, wenn Sie selbst überzeugt sind.“</p>
<p>Danach direkt zum Abschluss, ohne Pause für eine Antwort.</p>
<p>WENN DAS TEAM SELBST DAMIT ANFÄNGT (z. B. „Das wäre ja was für alle MBE-Stellen“):</p>
<p>„Das wäre schön. Aber erst muss es bei Ihnen funktionieren. Wenn es das tut, würde ich Sie am 26. November gern fragen, wie man das am besten angeht. Sie kennen den Weg viel besser als ich.“</p>
<p>NUR AUF NACHFRAGE („Machen Sie das auch woanders?“):</p>
<p>„Noch nicht. Sie wären die erste Stelle mit einem eigenen Testzugang. Die Migrationsberatung gibt es an rund 900 Stellen, das stand im Juni in einer Pressemeldung der Wohlfahrtsverbände. Aber erst mal will ich wissen, ob es hier in Kirchheimbolanden hilft.“ (Den ersten Satz sagst du nur, wenn er am 29.10. noch stimmt.)</p>
<p>AM 26.11. (nur wenn der Test gut gelaufen ist):</p>
<p>„Kennen Sie Kolleginnen und Kollegen, bei denen das auch helfen könnte? Zum Beispiel bei Ihnen in Alzey oder im MBE-Arbeitskreis? Dürfte ich sagen, dass Sie es getestet haben?“</p>
<p>HINTERGRUND (nur für dich, nicht sagen):</p>
<p>- Die MBE ist ein Bundesprogramm mit rund 900 Beratungsstellen. Die Stelle in Kirchheimbolanden gehört zur Förderinitiative Donnersberg e.V. (FID), und die ist Mitglied im Paritätischen.</p>
<p>- Der Weg geht Schritt für Schritt und immer über Empfehlung: zuerst FID Alzey (gleicher Träger, gleicher AVV). Dann die anderen MBE-Stellen des Paritätischen in Rheinland-Pfalz, zum Beispiel ABZ Kaiserslautern und Wörth. Dann das Referat Migration des Paritätischen in Mainz. Erst danach kommt der Paritätische Gesamtverband als Zentralstelle mit seinen MBE-Workshops, und noch später BAMF und Ministerium.</p>
<p>- Bevor du mit einem Verband sprichst, muss Folgendes fertig sein: AVV, TOMs, ein dokumentierter Test (Nutzung pro Woche und Sprache, Rückmeldungen, Liste der Fehler) und eine Prüfung von Tigrinya, Somali, Paschtu und Kurdisch durch Muttersprachler.</p>
<p>- Geld aus der MBE-Förderung läuft über die Träger, nicht über Webklar. Das ist erst nach der Auswertung ein Thema, und nur, wenn die FID es anspricht.</p>
<p>- Trete nicht vor der MBE beim Beirat für Migration oder bei der Integrationsbeauftragten des Kreises auf.</p></div>
<h2>Fragen an das Team</h2><ul><li>(Einstieg) „Wenn jemand mit einem Brief zu Ihnen kommt: Was passiert dann als Erstes?“</li><li>(Einstieg) „Wie oft sind Termin oder Frist dann schon ganz knapp?“</li><li>(Ersatz, wenn es still bleibt) „Was war der letzte Brief, der hier bei Ihnen auf dem Tisch lag?“</li><li>(Wartezeit) „Wenn Herr Beispiel mit diesem Brief zu Ihnen käme: Was müsste er unbedingt verstehen?“</li><li>(Ergebnis) „Sie haben das Original in der Hand. Stimmt das so? Stimmen Termin und Frist?“</li><li>(Handy) „Liest jemand von Ihnen Arabisch? Versteht man das?“</li><li>(Wartezeit, falls länger) „Welche Sprachen brauchen Sie hier am meisten?“</li><li>(Bitte, zur Bestätigung und nicht als Wissenstest) „Sie gehören zur Förderinitiative Donnersberg, richtig? Wer macht dort den Datenschutz?“</li><li>(Bitte) „Welche Uhrzeit passt Ihnen am 26. November?“</li><li>(Die wichtigste) „Was müsste bis zum 26. November passiert sein, damit Sie sagen, das hat Ihren Ratsuchenden geholfen?“</li><li>(Ehrlich) „Und was müsste passieren, damit Sie sagen, das lassen wir lieber?“</li><li>(Wenn Zeit ist) „Wo würde das bei Ihnen passen? Und wo eher nicht?“</li><li>(Wenn Zeit ist) „Haben die meisten Ihrer Ratsuchenden ein eigenes Smartphone dabei?“</li><li>(Wenn Zeit ist) „Wer von Ihnen probiert es als Erstes aus? Soll ich mich nach der ersten Woche kurz melden, oder melden Sie sich, wenn etwas ist?“</li><li>NICHT HEUTE, erst am 26.11. und nur wenn der Test gut war: „Würden Sie es weiterempfehlen? Kennen Sie Kolleginnen und Kollegen, zum Beispiel in Alzey oder im MBE-Arbeitskreis? Arbeiten Sie mit dem Jugendmigrationsdienst zusammen?“</li></ul>
<h2>Einwände, ausführlich</h2><div class="einwand"><b>(oft) Wohin gehen die Daten? In die USA?</b>Ja, das sage ich offen. Unser Server läuft bei Cloudflare, die KI ist von Anthropic. Beide sitzen in den USA. Die Übermittlung stützt sich auf EU-Standardvertragsklauseln. Die stehen in den Auftragsverarbeitungsverträgen von Cloudflare und Anthropic, die Fundstellen schicke ich Ihrer Datenschutzstelle gern. Bei uns wird der Brief nicht gespeichert. Anthropic löscht ihn in der Regel nach 30 Tagen, bei Verdacht auf Missbrauch länger, und trainiert nicht damit. Eine Beschränkung auf Rechenzentren in der EU ist nicht eingestellt. Die Person willigt für jeden Brief einzeln ein, am Handy in ihrer Sprache. Und wer nicht einwilligt, wird ganz normal beraten.</div><div class="einwand"><b>(oft) Das muss unsere Datenschutzstelle freigeben. Brauchen wir einen AVV? Eine Folgenabschätzung?</b>Ja, bitte fragen Sie da unbedingt nach. Für die Datenschutzstelle ist das Blatt. Da steht auch offen drin, was noch fehlt: ein AVV-Entwurf, die TOMs und ein Baustein fürs Verarbeitungsverzeichnis. Das bekommt sie von mir, bevor Ihre Stelle den ersten echten Brief selbst am Dienst-PC hochlädt. Für den Test schlage ich vor, dass nur die Ratsuchenden mit dem eigenen Handy fotografieren. Wie die Rollen dabei genau verteilt sind, auch weil die Erklärung an Ihrem Bildschirm erscheint, kläre ich gern direkt mit ihr. Ob eine Folgenabschätzung nötig ist, entscheidet sie. Ich liefere ihr alle Angaben dafür.</div><div class="einwand"><b>(oft) Ist das nicht einfach ChatGPT?</b>Dahinter steckt auch eine KI, Claude von Anthropic, das sage ich offen. Bei ChatGPT bekommt man einen Text. Hier macht man ein Foto, und Frist, Termin und Telefonnummer werden zu einem Kalender-Eintrag mit Erinnerung und zu einer Anruf-Hilfe. Die deutschen Fachbegriffe bleiben erkennbar. Und Sie sehen am PC Deutsch, während die Person gleichzeitig ihre Sprache sieht.</div><div class="einwand"><b>(oft) Ersetzt das unsere Beratung? Soll damit gespart werden?</b>Nein. Es erklärt, was im Brief steht. Was die Person dann tut und was das für ihren Aufenthalt heißt, das ist Beratung, und die bleibt bei Ihnen. Selbstständig heißt nicht allein. Unter jeder Erklärung steht: Bei wichtigen Entscheidungen hilft eine Beratungsstelle. Und unter jeder Erklärung steht in der Sprache der Person: Noch Fragen? Ihre Beratungsstelle hilft Ihnen gern weiter.</div><div class="einwand"><b>(oft) Was, wenn die KI sich irrt? Wer haftet dann?</b>Eine KI kann sich irren, das rede ich nicht klein. Darum gibt es feste Regeln. Ein Datum, das sie nicht sicher lesen kann, lässt sie leer. Eine Telefonnummer nimmt sie nur, wenn sie wörtlich im Brief steht. Die Fachbegriffe bleiben deutsch, damit man im Original nachsehen kann. Unter jeder Erklärung steht, dass es keine Rechtsberatung ist. Und auf der Kurzanleitung steht: Fristen immer am Original prüfen, und Fristen „ab Zustellung“ selbst nachrechnen. Wenn Ihre Leitung Fragen zur Haftung hat, beantworte ich sie gern schriftlich.</div><div class="einwand"><b>(oft) Was kostet das nach dem Test?</b>Über Ihren Code zahlen Ihre Ratsuchenden auch danach nichts. Für eine Stelle Ihrer Größe sind es voraussichtlich 290 Euro im Jahr für bis zu 1.200 Briefe, also so viel wie im Test, nur zwölf Monate lang. Das ist der Endpreis, Sie bekommen eine Rechnung im Januar, kein Abo, und es endet am 31. Dezember von selbst. Das ist ein Richtpreis. Das genaue Angebot bringe ich am 26. November mit, passend zu Ihren Zahlen aus dem Test. Heute geht es erst mal darum, ob es Ihnen im Alltag hilft.</div><div class="einwand"><b>(oft) Können die Leute das auch zu Hause nutzen?</b>Ohne Code sind auf der Seite zwei Briefe kostenlos, danach kostet es für Privatleute. Das sage ich lieber offen. Ihr Code ist für die Beratung gedacht und nur für Mitarbeitende. Bitte geben Sie ihn nicht weiter. Ich möchte nicht, dass Sie jemanden über die Beratung zu einem Kaufangebot schicken.</div><div class="einwand"><b>(oft) Wie viel Arbeit macht das für uns? Wir haben keine Zeit für etwas Neues.</b>Das verstehe ich. Einmal legen Sie ein Lesezeichen am PC an, das steht auf der Kurzanleitung. Pro Person heißt es dann: Sprache wählen, QR-Code zeigen, kurz warten. Es gibt keine Konten und nichts zu verwalten. Die Auswertung mache ich. Von Ihnen brauche ich nur das Gespräch am 26. November. Wenn es in einem Termin nicht passt, lassen Sie es einfach weg. Und wenn es Sie im Alltag Zeit kostet, statt zu helfen, sagen Sie es mir. Dann taugt es so nichts, und das ist auch ein Ergebnis.</div><div class="einwand"><b>Ist das rechtlich geprüft?</b>Von einem Anwalt noch nicht, das sage ich ehrlich. Das Blatt ist eine Selbstauskunft. Es ist am Programmcode und an der Datenschutzerklärung geprüft, und es steht offen drin, was nicht geht. Wenn Ihre Datenschutzstelle etwas anders sieht, will ich das wissen.</div><div class="einwand"><b>Das muss unsere Leitung entscheidenLine truncated
<h2>Preis: wenn das Thema kommt</h2><p class="klein">Erste Antwort steht oben bei den Einwänden (290 € im Jahr, Richtpreis). Nachfragen:</p><div class="einwand"><b>„Gibt es das auch kleiner oder größer?“</b>Ja. Für kleinere Stellen gibt es 600 Briefe für 190 Euro im Jahr, für große 2.400 Briefe für 450 Euro. Welches passt, sehen wir am 26. November an Ihren Zahlen.</div><div class="einwand"><b>„Das ist uns zu teuer, unser Budget ist knapp.“</b>Das verstehe ich. Für Stellen, die jetzt testen, gibt es 2027 ein Einstiegsangebot. Das rechne ich Ihnen am 26. November vor.</div><div class="einwand"><b>„Was kostet Sie selbst ein Brief?“</b>Ehrlich gesagt ein paar Cent für die KI. Bezahlt wird vor allem die Arbeit drumherum: Einrichtung, Datenschutz-Unterlagen, Hilfe und die Weiterentwicklung. (Keine Cent-Zahl nennen, sonst wird pro Brief verhandelt.)</div><div class="einwand"><b>„Warum zahlen wir nicht dasselbe wie Privatleute?“</b>Wenn Sie das Paket ausnutzen, zahlen Sie pro Brief weniger als Privatleute. Dafür kaufen Sie einmal im Jahr im Voraus, und ich schreibe eine Rechnung statt vieler kleiner Kartenzahlungen.</div><div class="einwand"><b>„Kommt da noch Mehrwertsteuer drauf?“</b>Nein. Wir sind Kleinunternehmer, der Preis ist der Endpreis.</div><div class="einwand"><b>„Müssen wir das ausschreiben oder Vergleichsangebote einholen?“</b>Bei so kleinen Beträgen braucht es nach meinem Stand in aller Regel kein förmliches Vergabeverfahren. Üblich ist ein kurzer, dokumentierter Preisvergleich, der auch über die Webseiten anderer Anbieter gehen kann. Dafür gebe ich Ihnen ein schriftliches Angebot und unsere Preisliste mit. Was bei Ihrem Träger intern gilt, weiß Ihre Verwaltung am besten. (Keine Rechtsauskunft geben.)</div><div class="einwand"><b>„Darf man das aus MBE-Mitteln bezahlen?“</b>Die neue MBE-Förderrichtlinie ab 2027 nennt bei den förderfähigen Ausgaben ausdrücklich IT-Dienstleistungen für die Beratungsarbeit, als Beispiel auch KI. Die Einzelheiten legt das BAMF fest, und wie Ihr Träger das beantragt oder bucht, entscheidet er. Ich schreibe den Leistungszeitraum und „MBE 2027“ auf die Rechnung.</div><div class="einwand"><b>„Geht das auch unbegrenzt, als Flatrate?“</b>Nein, es ist immer eine feste Briefzahl. So wissen Sie vorher genau, was es kostet. Wird es knapp, melde ich mich rechtzeitig und lade auf.</div><div class="einwand"><b>„Und wenn wir nach dem Test nicht weitermachen?“</b>Dann endet der Code am 29. November von selbst. Es gibt keinen Vertrag und keine Kosten.</div><div class="einwand"><b>„Können wir nach dem Test gleich weiterarbeiten?“</b>Ja. Wenn Sie am 26. November Ja sagen, verlängere ich den Code noch am selben Tag kostenlos bis Ende Dezember. Es entsteht keine Lücke, auch nicht für Ihre Ratsuchenden.</div>
<h2>Nicht sagen</h2><ul class="nicht"><li>Zeit, Tempo oder Effizienz als Nutzen: „erklärt den Brief in einer Minute“, „das Vorlesen hat eine Minute gedauert“, „spart Personal“, „effizienter“, „mehr Fälle schaffen“, „die einfachen Fälle werden abgefangen“. Nenn auch keine Zeitersparnis in Minuten. Um die MBE läuft eine Kürzungsdebatte. Sag stattdessen „Hilfe zur Selbsthilfe“ und „das, was nur Sie können“.</li><li>„Zeit für echte Beratung“ oder „wofür Sie eigentlich da sind“. Briefe erklären, Formulare und Behördenkontakte gehören zu ihrer Arbeit.</li><li>„Ersetzt“ in jeder Form: nicht „ersetzt die Beratung“, nicht „ersetzt Dolmetscher“ oder „ersetzt Sprachmittlung“.</li><li>Absolute Versprechen: „Er verpasst keinen Termin“, „Er kann selbst anrufen“. Sag „Er denkt leichter an Termin und Frist“ und „Er ist vorbereitet, wenn ein Anruf nötig ist“.</li><li>„Ihre Ratsuchenden zahlen nie etwas“ ohne Zusatz. Richtig ist: „über Ihren Code“.</li><li>„Ihre Leute können das mit Ihrem Code auch zu Hause nutzen“. Biete auch nie den Knopf „Zugang dauerhaft auf ein Handy geben“ für Ratsuchende an.</li><li>„Alles bleibt auf dem Handy“ und „Die Erklärung ist morgen noch da“. Beides stimmt für die Webseite nicht.</li><li>„Unser Server“ ohne Cloudflare zu nennen, und „Alles ist Ende-zu-Ende verschlüsselt“. Ende-zu-Ende gilt nur für die Übergabe zwischen Handy und PC, den Brief selbst schickt der Server per TLS zur KI.</li><li>„DSGVO-konform“, „rechtssicher“, „anwaltlich geprüft“, „zertifiziert“, „Data Privacy Framework“, „Server in Deutschland“ oder „in der EU“. Und nie „spätestens nach 30 Tagen“, immer „in der Regel nach 30 Tagen“.</li><li>Rechtliche Festlegungen: „Sie brauchen keinen AVV“, „Eine Folgenabschätzung ist nicht nötig“, „Im Test sind wir allein verantwortlich“. Sag auch nicht, der AVV liege schon fertig vor. Richtig ist: „kommt vor dem ersten Brief am Dienst-PC“.</li><li>Gesundheitsdaten freigeben, etwa mit „Briefe von der Krankenkasse gehen“. Das schätzt ihre Datenschutzstelle ein.</li><li>„Die KI macht keine Fehler“, „erfindet nie etwas“, „rät nie“, „perfekte Übersetzung“, „von Muttersprachlern geprüft“. Sag stattdessen: „Die KI hat die feste Regel …“.</li><li>„Bei ChatGPT braucht man ein Konto“. Das stimmt so nicht mehr und wurde am 25.10. bewusst aus dem Handzettel gestrichen.</li><li>„Vorlesen“ oder „fertige Antworten“ als Funktion der Webseite. Achtung: In den Metadaten von webseite/demo.html stehen noch „Vorlesen der Inhalte“ und „Fertige Antworten generieren“. Lass das vor dem Code-Stopp am Di 27.10. abends prüfen, falls jemand die Seite googelt.</li><li>Überholte Sätze aus dem alten Spickzettel: „Die Knöpfe übersetze ich als Nächstes“, „Drucken kommt als Nächstes“, „Darf ich Ihre Stelle auf meiner Seite nennen und würden Sie verlinken?“. Und keinen angeblichen Fehler im Datenschutz-Blatt ankündigen. Abschnitt 6 (Stand 25.10.) nennt schon 27 Sprachen und stimmt.</li><li>Ein Datum für die App, mehrere Fotos pro Brief oder andere neue Funktionen. Auch keine Zusagen zur Reihenfolge wie „kommt zuerst“, „kommt ganz oben auf die Liste“ oder „Ihre Rückmeldung bestimmt, was ich baue“.</li><li>„Unbegrenzt“. Es gibt immer eine feste Zahl an Briefen.</li><li>Preise von dir aus nennen, die eigene Untergrenze, ein Vergleich mit den Kosten für Sprachmittler, „zuzüglich Mehrwertsteuer“. Und nicht „ich bin Kleinunternehmer“, sondern „wir“ (Webklar GbR).</li><li>„Ich will Ihnen nichts verkaufen“. Nach dem Test kostet es die Stelle Geld. Ehrlicher ist: „Heute geht es nicht um einen Vertrag.“</li><li>„Rufen Sie einfach bei der Ausländerbehörde an“. Die Behörde im Kreis bittet selbst darum, auf telefonische Nachfragen zu verzichten. Kritisier die Ausländerbehörde des Kreises auch nicht.</li><li>Haushalt, Kürzungen, Stellenabbau oder Fälle pro Stelle von dir aus ansprechen. Und nicht „Ihre Beraterinnen sind überlastet“, frag lieber.</li><li>Am ersten Tag: „ganz Deutschland“, „bundesweit“, „900 Stellen“, Namen von Verbänden und Ämtern (Paritätischer, BAMF, BMI), „die Briefe sind überall dieselben“. Bitte heute auch nicht um eine Empfehlung oder um Kontakte zum Träger oder Verband.</li><li>„Sie wären die erste MBE in Deutschland“. Höchstens auf Nachfrage: „die erste Stelle mit eigenem Testzugang“, und nur, wenn das am 29.10. noch stimmt.</li><li>„Ich sehe nur Zahlen, keine Namen“ ohne Einschränkung. Richtig ist: „Über Ihre Ratsuchenden und ihre Briefe sehe ich nur Zahlen“, die Server-Protokolle gibt es zusätzlich.</li><li>Verallgemeinerungen ohne Beleg wie „Auf Deutsch anrufen ist für viele das Schwerste“. Und die Generalprobe nicht als Geschichte erzählen.</li><li>Die Mutter-Line truncated
<h2>Quellen (nur falls jemand fragt)</h2><ul class="klein"><li>DeZIM-Evaluation der MBE: In 60,5 % der Fälle bekamen befragte Ratsuchende eine inhaltliche Erklärung oder Hilfe beim Übersetzen und Ausfüllen von Dokumenten (Befragung von 1.751 Ratsuchenden, Frühjahr 2024, S. 36–37). Im Pitch: „rund sechs von zehn befragten Ratsuchenden“, nur wenn es passt. <span style="word-break:break-all">(https://www.dezim-institut.de/fileadmin/user_upload/fis/publikation_pdf/FA-6245.pdf)</span></li><li>DeZIM-Evaluation: Das häufigste Hauptanliegen sind rechtliche Fragen zum Aufenthalt (27,0 %, Tabelle 7, S. 36). Das ist die Begründung für den Musterbrief der Ausländerbehörde. <span style="word-break:break-all">(https://www.dezim-institut.de/fileadmin/user_upload/fis/publikation_pdf/FA-6245.pdf)</span></li><li>DeZIM-Evaluation: Das Leitbild der MBE ist „Hilfe zur Selbsthilfe“ (Bericht 2025, S. 6, 8). <span style="word-break:break-all">(https://www.dezim-institut.de/fileadmin/user_upload/fis/publikation_pdf/FA-6245.pdf)</span></li><li>BAGFW-Pressemeldung zum MBE-Kongress: MBE in rund 900 Beratungsstellen bundesweit (11.06.2026). Nur auf Nachfrage. <span style="word-break:break-all">(https://www.bagfw.de/fileadmin/user_upload/Veroeffentlichungen/Pressemeldungen/PM_2026/20260611_PM_MBE-Kongress.pdf)</span></li><li>Träger der MBE Kirchheimbolanden ist die Förderinitiative Donnersberg e.V. (FID), ein eingetragener Verein, nicht kirchlich, Mitglied im Paritätischen Landesverband Rheinland-Pfalz/Saarland. <span style="word-break:break-all">(https://www.fid-donnersberg.de/2015/html/das_sind_wir_start_15.html)</span></li><li>Die FID hat eine eigene betriebliche Datenschutzbeauftragung am Standort Kirchheimbolanden. <span style="word-break:break-all">(https://www.fid-donnersberg.de/2015/html/kontakt_15.html)</span></li><li>Die FID bietet Alphabetisierungskurse an (u. a. Alpha-Mobil in Kirchheimbolanden). Deshalb gehört die Grenze „kein Vorlesen“ aktiv in den Pitch. <span style="word-break:break-all">(https://www.fid-donnersberg.de/2015/html/alphakurs_15.html)</span></li><li>Die FID betreibt die MBE auch in Alzey. Die MBE-Standorte des Paritätischen in RLP/Saarland sind u. a. ABZ Kaiserslautern und Wörth, das Referat Migration sitzt in Mainz. Das ist nur Hintergrund für den Weg nach dem Test. <span style="word-break:break-all">(https://www.paritaet-rps.org/fachinformationen/integration-migration)</span></li><li>Der Paritätische Gesamtverband ist Zentralstelle für die paritätische MBE und richtet MBE-Workshops aus. Nur Hintergrund, kein Thema am 29.10. <span style="word-break:break-all">(https://www.der-paritaetische.de/themen/migration-und-internationale-kooperation/projekte/migrationsberatung-fuer-erwachsene-zuwanderer-mbe/)</span></li><li>Die Ausländerbehörde des Donnersbergkreises ist laut Integreat-Leitfaden sehr hoch ausgelastet und bittet, auf telefonische Nachfragen zu verzichten. Deshalb wird die Anruf-Hilfe nur für nötige Anrufe gezeigt (Termin absagen). <span style="word-break:break-all">(https://cms.integreat-app.de/donnersberg/de/wp-json/ig-mpdf/v1/pdf)</span></li><li>mbeon ist die Online-Beratung der MBE (Messenger-App, vom BMI finanziert, vom BAMF betreut). BehördenKlar ergänzt sie und konkurriert nicht damit. <span style="word-break:break-all">(https://www.der-paritaetische.de/themen/migration-und-internationale-kooperation/projekte/migrationsberatung-fuer-erwachsene-zugewanderte-mbe-mbeon/)</span></li><li>Das Data Processing Addendum von Anthropic mit EU-Standardvertragsklauseln ist Teil der Commercial Terms. Ein Data Privacy Framework ist nicht belegt. <span style="word-break:break-all">(https://www.anthropic.com/legal/data-processing-addendum)</span></li><li>Die MBE-Förderung ist 2026 bei 77,5 Mio. € eingefroren, der Regierungsentwurf 2027 sieht knapp 4 Mio. € weniger vor. Das ist nur der Grund für den Ton (keine Effizienz-Argumente), nicht ansprechen. <span style="word-break:break-all">(https://www.bagfw.de/fileadmin/user_upload/Veroeffentlichungen/Publikationen/Factsheet/Factsheet_MBE_2026_Stand_August_2026.pdf)</span></li></ul>
</body></html>
Binary file not shown.
@@ -0,0 +1,350 @@
# BehördenKlar: Plan bis zum MBE-Termin am 29.10.2026
Alle 63 Funde aus den 6 Perspektiven hat ein Prüfer bestätigt, aber er hat viele davon heruntergestuft. Unten zählt die Schwere nach dieser Prüfung. Doppelte Funde sind zusammengefasst, die IDs stehen in Klammern.
---
## 1. Urteil
**Frage 1: Läuft die Vorführung flüssig genug?**
- **Für die Vorführung: Fast.** Der geplante Weg ist kurz. Am PC wählt man die Sprache und klickt einmal, am Handy sind es etwa 6 bis 7 Fingertipps. Der PC zeigt dabei live an, was am Handy passiert. Vier Dinge können den wichtigsten Moment aber kippen:
- Die zweisprachige Analyse (PC Deutsch, Handy Arabisch) ist **noch nie mit echter KI gelaufen und nicht deployed** (LI1, TE3).
- Scheitert die Übersetzung, stehen zwei Knöpfe „Deutsch | Deutsch“ da und die Person bekommt Deutsch statt Arabisch (BE2, TE2).
- Vor 12 Uhr zeigt die Ampel beim Musterbrief Gelb statt Rot (LI2).
- Ein zweiter Brief vom Handy kommt am PC nicht mehr an (TE4).
- **Für den Alltag im Testmonat: Noch nicht.** Es gibt mehrere stille Sackgassen:
- Steht am PC „Deutsch“, bekommt die Beraterin kein Deutsch (TE1).
- Wer schon 2 Gratis-Analysen gemacht hat, sieht das Code-Feld nicht mehr (AN1).
- Wird die Seite neu geladen, ist die Verbindung still weg (BE1, TE5).
- Fehler am Handy kommen am PC nicht an (RA8).
- Die meisten Punkte sind in Minuten bis wenigen Stunden behoben. Nach der MUSS-Liste lautet die Antwort für die Vorführung: **Ja**.
**Frage 2: Ist es bequem genug für die Beratungsstelle?**
- **Für einen kostenlosen Test: Fast.** Das reicht, wenn die MUSS-Liste erledigt ist und Justin die Grenzen offen sagt.
- **Was schon gut ist:**
- Wenige Klicks am PC.
- Die ratsuchende Person setzt das Häkchen selbst am eigenen Handy.
- Mit Code erscheint kein Kaufangebot.
- Fehlgeschlagene Analysen kosten nichts.
- Oben steht der eigene Name der Stelle („Kostenlos über MBE Donnersberg“).
- **Was für den Dauerbetrieb noch fehlt:**
- Nur ein Foto pro Brief, mehrseitige Briefe gehen am Handy nicht (BE4).
- Kein Ausdruck (BE8).
- Kein Knopf „Fertig – nächste Person“ (BE9, DA8).
- Die Briefzahl ist veraltet und das Ablaufdatum unsichtbar (BE3).
- Die Bedienung am Handy ist nur Deutsch (RA1).
- Es gibt keine Kurzanleitung für Kolleginnen (BE5).
- **Die größte Hürde ist aber nicht die Technik, sondern das Papier.** Ungeklärt ist, wer verantwortlich ist, wenn die Beraterin am Dienst-PC hochlädt, und ob dafür ein Vertrag zur Auftragsverarbeitung (AVV) nötig ist (DA1). Das Datenschutz-Blatt ist veraltet und ging im Juli wahrscheinlich schon an die MBE (AN6, DA6).
---
## 2. MUSS vor dem 29.10.
Zusammen etwa 12 bis 14 Stunden.
### Wochenplan
| Tag | Was |
|---|---|
| **Do 22. / Fr 23.** | Code-Paket M1 und Sätze in der Datenschutzerklärung (M5c), wenn Zeit ist auch schnelle SOLLTE-Punkte |
| **Sa 24.** | Deploy (erst Worker, dann Webseite), Vorführ-Code anlegen, Generalprobe 1 |
| **So 25.** | Fehler aus der Probe beheben, Datenschutz-Blatt und Kurzanleitung schreiben |
| **Mo 26.** | MBE anrufen (wer ist Träger?), Generalprobe 2. **Spätester Deploy-Termin.** |
| **Di 27.** | MBE-Code anlegen, Handzettel neu erzeugen, QR testen, alles drucken. Ab abends nichts mehr am Code ändern. |
| **Mi 28.** | Generalprobe 3 genau wie am Termin, Geräte vorbereiten, Checkliste |
### M1. Code-Korrekturen vor dem Deploy (zusammen ca. 3–4 Std.)
| # | Aufgabe | Funde | Aufwand |
|---|---|---|---|
| a | Die Ampel in **Kalendertagen** rechnen, so wie die App (`ampel.ts`). Zusätzlich den Termin im Musterbrief auf **Di 03.11.2026, 10:30** legen. Im Spickzettel „Termin in 7 Tagen“ durch „Termin nächste Woche“ ersetzen. Die Ampelzeile soll „Termin am …“ oder „Frist bis …“ sagen. Die Frist-Aufgabe nur anhängen, wenn wirklich die Frist das früheste Datum ist. | LI2, LI6 | 30–45 Min. |
| b | „Deutsch \| Deutsch“ verhindern: `analyse_de` nur anhängen, wenn `sprache ≠ 'de'`. Scheitert die Übersetzung, am Handy den Hinweis „Übersetzung hat nicht geklappt, hier auf Deutsch“ zeigen. `[observability] enabled = true` in `wrangler.toml` eintragen. | BE2, TE2, LI8 | 30–45 Min. |
| c | Die Beraterin bekommt immer Deutsch: Das Häkchen „auch Deutsch“ am PC immer zeigen, standardmäßig an. `d=1` setzen, egal welche Sprache am PC eingestellt ist. | TE1 | 15 Min. |
| d | Das Code-Feld (`details#codeTeil`) aus `#eingabe` herausnehmen. Danach mit `bk_demo_v2=2` testen. | AN1 | 15–30 Min. |
| e | Nach dem ersten Ergebnis den Handy-Modus beenden. Am Handy steht dann: „Für den nächsten Brief am Computer noch einmal auf ‚Lieber mit dem Handy fotografieren‘ tippen.“ | TE4, BE4 | 20 Min. |
| f | Einwilligung: Das Häkchen nach **jeder** Analyse zurücksetzen (`konsens.checked = false`). Im Einrichtungs-Modus einen eigenen Text zeigen: Er nennt Gesundheit, Herkunft und Aufenthalt sowie Anthropic (USA) und sagt „in der Regel nach 30 Tagen gelöscht, kein Training“. | DA2, LI11 | 45 Min. |
### M2. Deploy und Generalprobe
**Funde:** LI1 (Blocker), TE3, BE2, LI8, DA7
**Aufwand:** 3–4 Std. für die Proben, dazu Zeit für Korrekturen
- **Bis Sa 24.10., spätestens Mo 26.10.**
1. Zuerst den Worker deployen (`cd proxy && npx wrangler deploy`).
2. Danach die Webseite (Ordner `webseite/`).
3. Wenn die Webseite vor dem Worker live geht, laufen „Code einlösen“ und die Übergabe ins Leere.
- **2–3 komplette Durchläufe genau nach Ablaufplan:**
- gleicher Laptop, gleiches Handy, Hotspot, gedruckter Musterbrief
- Arabisch **und** Farsi
- einmal über mobile Daten
- mit Stoppuhr
- Bildschirmfotos für den Notfall machen
- **Dabei prüfen:**
- Falscher Code ergibt „Diesen Code kennen wir nicht“.
- Der Laptop zeigt „Handy verbunden“.
- Am Ende stehen zwei Knöpfe **„Deutsch | العربية“**.
- Die Ampel ist rot.
- Auf der Live-Datenschutzseite steht „9b.“.
- **Wenn „Deutsch | Deutsch“ erscheint:** sofort mit `npx wrangler tail` ins Log schauen.
- **Unsicher:** Ob die Rate-Limit-Einstellung `[[ratelimits]]` im kostenlosen Cloudflare-Tarif läuft, ist nicht geprüft. Scheitert der Deploy daran: den Block und `index.ts:832-836` vorerst entfernen (TE3).
### M3. Codes richtig anlegen
**Funde:** LI3, AN2, BE3, TE11
**Aufwand:** Minuten
```
node tools/einrichtungs-code.js neu "MBE Donnersberg (Vorführung)" VORF --briefe 30 --bis 2026-11-30
node tools/einrichtungs-code.js neu "MBE Donnersberg" MBE --briefe 100 --bis 2026-12-18
node tools/einrichtungs-code.js stand <CODE>
```
- **Ein festes Datum nach dem 26.11.** lässt der MBE Zeit für die Bestellung. Sonst sperrt der Code mitten im Bestellvorgang und löscht den Zugang bei den Ratsuchenden.
- Handzettel und Spickzettel sagen dann „Test bis 18.12., Auswertung am 26.11.“ statt „1 Monat“.
- Nach dem Anlegen mit `stand` prüfen, dass kein „NaN“ und das richtige Datum erscheint.
- Den Vorführ-Code vor den Proben am Laptop einlösen.
### M4. Handzettel überarbeiten und neu erzeugen
**Funde:** AN9, LI5, BE6, DA4, AN2
**Aufwand:** ca. 1 Std.
- Den MBE-Code in `handzettel.html:190` eintragen. Der QR muss auf `/demo?code=MBE-…` zeigen.
- „Ihr Zugangscode für den Beratungs-PC“ statt „Code für Ihre Ratsuchenden“ schreiben.
- Dazu den Satz: „Einmal am Beratungs-PC öffnen, dann ist auch ‚Mit dem Handy fotografieren‘ kostenlos.“
- „gültig bis 18.12.2026“ eintragen.
- Datenschutz-Sätze korrigieren: „in der Regel nach 30 Tagen (länger nur bei Verdacht auf Missbrauch), kein Training“. Und: „Den Brief selbst muss die KI lesen. Ende-zu-Ende verschlüsselt ist zusätzlich die Übergabe zwischen PC und Handy.“
- **Den gedruckten QR mit dem Handy testen.** Erst wenn „Kostenlos über MBE Donnersberg“ erscheint, 5 Stück drucken. Die alte `handzettel.png/pdf` ohne Code nicht mehr verwenden.
### M5. Datenschutz-Unterlagen, nur das Nötigste
**Funde:** DA1, DA4, DA5, DA6, AN6
**Aufwand:** ca. 3 Std.
- **a) Mo 26.10. bei der MBE anrufen:** Wer ist der Träger (z. B. Diakonie oder Caritas)? Gibt es eine eigene AVV-Vorlage? (DA1)
- **b) Neues Datenschutz-Blatt für die Webseite schreiben (1–2 Seiten):**
- Datenfluss: Foto, dann Worker, dann Anthropic. Die QR-Übergabe ist verschlüsselt und nach 15 Minuten weg.
- Unterauftragsverarbeiter: Cloudflare und Anthropic.
- Rollenaussage: „Lädt die Stelle selbst hoch, arbeiten wir als Auftragsverarbeiter. Einen AVV mit Verschwiegenheitsklausel bekommen Sie auf Wunsch.“
- **Das alte Blatt vom Juli nicht mehr weitergeben.** Darin steht für die Webseite Falsches.
- **c) In der Datenschutzerklärung (geht mit dem Deploy raus):**
- Für Anthropic nur „EU-Standardvertragsklauseln“ schreiben, nicht das EU-US-Datenschutzabkommen (DPF), denn dafür gibt es keinen Beleg (DA5).
- Den 30-Tage-Satz wie in M4 anpassen (DA4).
### M6. Spickzettel (`ablaufplan.html`) nachschärfen
**Aufwand:** 30–45 Min.
- **Checkliste am Vorabend:**
- Vorführ-Code eingelöst, oben steht „Kostenlos über …“ (LI3).
- Gedruckten QR getestet (AN9).
- **Kurz vor dem Termin** (LI4):
- iPhone: Automatische Sperre auf „Nie“, Stromsparmodus aus.
- Mac: im Terminal `caffeinate -d`.
- **Bei der Vorführung:**
- QR erst live erzeugen. Steht „abgelaufen“ da, einfach neu klicken (LI10).
- Die Handy-Schritte üben: scrollen, Häkchen, Brief auswählen, Foto, verwenden (LI7).
- „Ein bis zwei Minuten“ sagen und den Datenschutz-Teil fest in die Wartezeit legen (LI8).
- Den Kalender-Knopf nur am Handy zeigen (LI9).
- Den Mitnehmen-QR von einer Beraterin mit ihrem eigenen Handy scannen lassen (LI10).
- Den Fachbegriff zeigen, der tatsächlich erscheint (LI10).
- Zeile 75 ehrlich machen: „Das Ergebnis bleibt, solange die Seite offen ist. Der Kalender-Eintrag bleibt immer.“ (RA6)
- **Angebotsteil:**
- Den Code gleich live am PC einer Beraterin einlösen und das Lesezeichen mit `?code=` setzen (LI5, BE3).
- Eine Beraterin macht einmal den Handy-Ablauf an **ihrem** Dienst-PC (BE10).
- „Auch auf dem Handy nutzen“ erst zeigen, wenn am Laptop der MBE-Code eingelöst ist. Sonst gibt der Laptop den Vorführ-Zugang weiter (AN8).
- **Ehrliche Antworten auf typische Fragen:**
- Mehrseitige Briefe: „Zurzeit ein Foto pro Erklärung, die Seite mit Betreff und Frist. Scanner-PDF am PC geht mehrseitig, dann aber nur in einer Sprache.“ (BE4)
- Bedienung auf Deutsch: „Die Erklärung kommt in der Muttersprache, die Bedienung übersetze ich als Nächstes.“ (RA1, LI7)
- AVV und Verantwortung: „Bekommt Ihr Datenschutzbeauftragter von mir.“ (DA1)
- Ausdrucken: „Kommt als Nächstes.“ (BE8)
- **Notfallplan:**
- Der Laptop hängt, das Handy zeigt das Ergebnis: einfach das Handy zeigen (LI4).
- „Deutsch | Deutsch“: „Hier hat die Übersetzung gehakt“ sagen und die Bildschirmfotos zeigen (LI8).
---
## 3. SOLLTE vor dem 29.10.
In dieser Reihenfolge, so weit die Zeit reicht. Zusammen ca. 7–9 Std.
| # | Aufgabe | Funde | Aufwand |
|---|---|---|---|
| S1 | **Fehler bei Arabisch (rechts nach links), sichtbar in der Vorführung:** Die Briefart-Plakette nicht in Courier setzen, sondern `font-family:inherit`, `letter-spacing:0`. Ampel- und Fristzeile mit KI-Text in `<bdi>` packen. Den Absatz bei den Fachbegriffen mit `dir=auto` versehen. `.todo::before` mit `margin-inline-end`. Danach am Vorführ-Handy ansehen. | RA2 | < 1 Std. |
| S2 | **Arabische Minimal-Bedienung:** Einwilligung, Startknopf, Verbunden-Banner, Wartetext und „Verbindung fehlgeschlagen“ auf Arabisch, dazu `dir=rtl`. Im Termin eine arabischsprachige Beraterin gegenlesen lassen. | RA1, DA3, BE7, LI7 | 2–3 Std. |
| S3 | **Handy-Seite aufräumen:** zum Banner scrollen (`scrollIntoView`). Im Einrichtungs-Modus die Gratis-Texte ersetzen. Im Kamera-Modus (a=k) Kaufbereich und Code-Feld immer ausblenden. Den Knopf nicht grau machen, sondern beim Tippen auf das fehlende Häkchen hinweisen. Sprachliste mit deutschem Zusatz („العربية – Arabisch“, „پښتو – Paschtu“). | RA7, BE11 | ca. 1 Std. |
| S4 | **Robustheit:** Warnung „Seite wirklich verlassen?“, solange der PC wartet. Wartezeit bei jeder Handy-Meldung verlängern. `meldeAnPc` auch im catch-Zweig aufrufen. `dateiFeld.value = ''` setzen. Nach 5 fehlgeschlagenen Abfragen oder mehr als 3 Minuten „analysiert“ einen Hinweis am PC zeigen. Im Worker den Anthropic-Aufruf in try/catch setzen. localStorage nur über einen abgesicherten Helfer ansprechen. | BE1, RA8, TE10, BE10, TE7 | 1–2 Std. |
| S5 | **Anruf-Sätze beim Mitnehmen übersetzen:** `mitBedeutung` aus der angezeigten Version nehmen und `l=` in den Mitnehmen-QR schreiben. | RA3, TE9 | 15 Min. |
| S6 | **Code-Eingabe tolerant machen:** alles außer A–Z und 0–9 entfernen, den Bindestrich vor den letzten 4 Zeichen wieder einsetzen, die Sperrgrenze auf 30 Fehlversuche anheben. | AN7, TE6, RA5 | 20 Min. |
| S7 | **Nutzung zählen ab Tag 1:** pro Analyse über einen Einrichtungs-Code ein eigener Eintrag mit Datum. Wird auch die Sprache gezählt, einen Satz in Abschnitt 9a der Datenschutzerklärung ergänzen. | TE8, AN4 | 30 Min. |
| S8 | **Kontingent leer oder abgelaufen:** Den Code nicht löschen, kein Kaufangebot zeigen, der PC hört auf zu warten und zeigt einen Kasten mit Justins Telefonnummer. Oben „gültig bis …“ anzeigen. | BE3, AN2 | 1–2 Std. |
| S9 | **Handy-Sprache übernehmen:** aus `navigator.languages` vorauswählen, aber nicht speichern. | RA4 | 15 Min. |
| S10 | **QR-Code am PC größer:** auf ca. 280–300 px (eine Zeile CSS). | BE12 | 1 Min. |
---
## 4. Zum Termin mitbringen
- **Geräte:** Laptop mit eingelöstem Vorführ-Code, eigenes Handy (Sperre aus, Akku voll), Hotspot, Ladegeräte.
- **Musterbrief** (Termin 03.11.) 2× gedruckt (LI2).
- **Handzettel mit MBE-Code**, 5× (M4).
- **Kurzanleitung „So geht's am Beratungs-PC“**, 5× (BE5): eine Seite mit 5 Schritten:
1. Lesezeichen genau auf `behoerdenklar.de/demo?code=MBE-…` setzen.
2. Sprache wählen.
3. „Lieber mit dem Handy fotografieren“ klicken.
4. Beim Warten nicht neu laden. Falls doch, steht das Ergebnis am Handy, dort auf Deutsch umschalten.
5. Nach jeder Person die Seite neu laden und die Sprache prüfen (BE9, DA8). Kalender-Einträge nur am Handy machen.
Dazu die Telefonnummer. Die Bildschirmfotos erst nach dem Deploy machen.
- **Neues Datenschutz-Blatt**, 2× „für Ihre Datenschutzbeauftragte“, mit Rollenaussage (M5, DA1, AN6). Dazu sagen: „Das Blatt aus dem Juli beschrieb die App.“
- *Optional:* eine einseitige Papier-Einwilligung zum Abheften für Klientinnen (DA2, DA3).
- **Bildschirmfotos der Generalprobe** als Notfall-Ersatz (LI1).
- **3 Fragen für die Auswertung** (genutzt? welche Sprache? Zeit gespart?) und einen festen Termin am 26.11. (AN4).
- **Nicht mitbringen:** das alte Factsheet/PDF vom Juli und den alten Handzettel ohne Code.
**Entscheidung vor dem Termin, wohin der Code geht (BE6, AN3):** Empfehlung für den Test: Der Code bleibt bei den Beraterinnen. Ratsuchende nutzen ihn nur in der Beratung über „Mit dem Handy fotografieren“. Dieser Weg gibt den Zugang nur für die Sitzung weiter. Einzelnen Personen kann die Beraterin den Zugang gezielt über „Auch auf dem Handy nutzen“ geben. Achtung: Dieser Zugang bleibt dauerhaft auf deren Handy. Einen Aushang mit Code erst nach der Auswertung machen, wenn die MBE das will.
---
## 5. NACH dem Termin
**Bevor der erste echte Brief am Dienst-PC hochgeladen wird:**
- AVV-Entwurf (nach dem Muster von GDD oder Bitkom, mit Verschwiegenheitsklausel), technische und organisatorische Maßnahmen (TOMs) in Stichpunkten, ein Absatz für das Verarbeitungsverzeichnis des Trägers (DA1, DA6).
- Brevo in den AVV-Nachweis aufnehmen (DA6).
- Die DPA-Verträge von Anthropic und Cloudflare als PDF ablegen und in beiden Konten die Organisation auf „Webklar GbR“ stellen (DA5).
**In Woche 1–2 des Tests:**
- Mehrere Fotos pro Brief, zählt als 1 Brief (BE4, ca. 1 Tag).
- Knopf „Drucken / als PDF speichern“ mit Druck-Ansicht und Teilen-Knopf (BE8, RA6).
- Knopf „Fertig – nächste Person“ (BE9, DA8).
- Verbindung nach Neuladen wiederherstellen (sessionStorage) für PC und Handy (BE1, TE5, RA9).
**Im Testmonat:**
- Die Bedienung in die Hauptsprachen übersetzen und von den Beraterinnen gegenlesen lassen (RA1, BE7, DA3).
- Aushang und Karten nur, wenn die MBE sie will (AN3).
**Laufender Betrieb:**
- Zweimal pro Woche `stand` prüfen und montags eine kurze Stand-Mail an die MBE schicken (BE3, AN4).
- Erinnerung 7 Tage vor Ablauf.
- Bei einer Zusage sofort `verlaengern`, erst danach die Rechnung schicken (AN2).
**Bis zum 26.11.:**
- Ein einseitiges Angebot und eine Rechnung (§ 19 UStG), am besten als Jahreskontingent.
- Die veraltete Zeile 334 in `outreach-september.md` korrigieren (AN5).
**Später:**
- Guthaben atomar in einem Durable Object führen (TE8).
- Das Token nicht mehr in den QR-Code legen (BE12).
- Eigene Adresse für den Worker, z. B. `api.behoerdenklar.de` (BE10).
- Tagesobergrenze pro Code (BE6).
- Tests für `/code` und `/uebergabe` in `npm run pruefung` (LI1, TE3).
- Eingabeprüfung im Werkzeug (TE11).
- Kleinigkeiten in der Datenschutzerklärung: 48 Stunden statt 30 Tage, E-Mail-Prüfsumme, Kontakt nicht über Gmail (DA9).
- Webseite und App mit derselben Ampel-Formel (LI2).
---
## 6. Größte Live-Risiken und Gegenmittel
| Risiko | Funde | Gegenmittel |
|---|---|---|
| Die zweisprachige Analyse läuft live zum ersten Mal und scheitert oder zeigt „Deutsch \| Deutsch“ | LI1, BE2, TE2 | Bis Sa/Mo deployen, 3 Generalproben, Korrektur M1b, Bildschirmfotos bereithalten, ruhig erklären |
| Die Analyse dauert deutlich länger als 1 Minute (nicht gemessen) | LI8 | Stoppuhr in der Probe, „ein bis zwei Minuten“ sagen, Datenschutz-Teil in die Wartezeit legen |
| Das Handy sperrt oder der Laptop schläft ein, das Ergebnis kommt nicht am Laptop an (**unsicher**, ob Safari dabei abbricht) | LI4 | Automatische Sperre „Nie“, `caffeinate -d`, im Notfall das Handy zeigen |
| Die Ampel zeigt Gelb statt Rot | LI2 | Formel reparieren und Termin im Musterbrief auf den 03.11. legen |
| Am Laptop ist kein Code eingelöst, das Handy landet in der Gratis-Demo oder ist gesperrt | LI3, LI5 | Vorführ-Code eingelöst, oben muss „Kostenlos über …“ stehen (Checkliste) |
| Eine Beraterin fotografiert spontan einen zweiten Brief oder Seite 2 | TE4, BE4 | Korrektur M1e und die vorbereitete ehrliche Antwort |
| „Versteht mein Klient, was er ankreuzt?“ oder „Brauchen wir einen AVV?“ | RA1, DA1–DA3 | S2 (Arabisch), Datenschutz-Blatt mit Rollenaussage, AVV zusagen |
| Das Netz der Einrichtung sperrt `workers.dev` (**unsicher**) | BE10 | Vorführen über den eigenen Hotspot, am Ende ein Test am Dienst-PC, bei Problemen die IT fragen |
| Der PC wird beim Warten neu geladen | BE1 | Warnung „Seite verlassen?“ (S4). Das Ergebnis steht trotzdem am Handy, dort auf Deutsch umschalten |
| Der QR-Code ist abgelaufen | LI10 | Erst live erzeugen, sonst neu klicken |
**Wichtigste Regel:** Was am Mi 28.10. nicht in der Generalprobe lief, kommt nicht mehr in den Code.
---
## Anhang: alle Funde im Detail
### Beraterin am PC
_Für die Vorführung am 29.10. ist der Ablauf kurz und überzeugend. Am PC wählt man die Sprache und klickt einmal, am Handy sind es etwa sechs Fingertipps. Danach steht die Erklärung am PC auf Deutsch und am Handy in der Muttersprache. Das gilt aber nur, wenn die zweisprachige Analyse live funktioniert, und die wurde noch nie getestet. Für den Alltag im Testmonat ist es aus Sicht einer Beraterin noch nicht bequem und robust genug. Lädt jemand die Seite neu oder schließt das Handy den Tab, geht still ein Brief verloren. Die Beraterin sieht weder den echten Reststand noch das Ablaufdatum. Es gibt keinen Ausdruck und keine mehrseitigen Briefe, die Handy-Seite ist nur auf Deutsch, und für Kolleginnen ohne Justin fehlt eine Anleitung. Die meisten Punkte lassen sich mit wenigen Stunden Arbeit beheben._
- **BE1 · Neu laden oder Handy-Tab weg: Ergebnis verloren, Brief trotzdem verbraucht** (mittel, stunden, vor Termin) — Am PC: Wer die Seite neu lädt (F5, aus Versehen, oder der Browser stellt sich nach einem Absturz wieder her), während das Handy fotografiert, verliert den Schlüssel der Übergabe. Das Handy schickt sein Ergebnis trotzdem ab, aber niemand holt es mehr ab. Es gibt keine Warnung 'Seite wirklich verlassen?'. Am Handy: Die Verbindung zum PC liegt nur im Arbeitsspeicher. Lädt der Handy-Browser die Seite neu, ist sie weg. Das kann passieren, wenn Android den Tab beim Öffnen der Kamera-App aus dem Speicher wirft; das ist ein Risiko und nicht getestet. Danach ist die Seite eine normale Gratis-Demo ohne Code und ohne Verbindung, eventuell mit E-Mail-Abfrage und Kaufangebot. Der PC zeigt dann 15 Minuten lang '✅ Handy verbunden'. Außerdem läuft die 15-Minuten-Uhr am PC ab Anzeige des QR-Codes und nicht ab der letzten Handy-Meldung: Fotografiert das Handy spät, gibt der PC auf, während das Handy noch analysiert. Jede Wiederholung kostet einen weiteren Brief aus den 100. *Beleg:* webseite/demo.html:1292 (pcWarten nur im Speicher), :806-809 (Handy legt Ergebnis ab, egal ob der PC noch wartet), :609 + :1507-1511 (Handy-Verbindung nur im Speicher, # wird sofort gelöscht), :1316 + :1337-1341 (Ablauf ab QR-Erzeugung), keine beforeunload-Warnung (grep: keine Treffer); proxy/src/index.ts:767/786 (Päckchen verfallen nach 15 Min.) *Vorschlag:* Vor dem Termin nur die billigen Teile (Minuten): 1) beforeunload-Warnung, solange pcWarten aktiv ist. 2) Bei jeder Status-Meldung vom Handy pcWarten.bis verlängern. 3) In die Kurzanleitung schreiben: 'Beim Warten nicht neu laden. Falls doch: Das Ergebnis steht am Handy, dort auf Deutsch umschalten.' sessionStorage-Wiederherstellung für PC und Handy erst nach dem Termin (Stunden).
- **BE2 · Der Kern der Vorführung (PC Deutsch, Handy Arabisch) ist ungetestet; bei einem Fehler zweimal 'Deutsch'** (hoch, stunden, vor Termin) — Genau der Moment, der die Beraterinnen überzeugen soll, wurde noch nie durchgespielt. Scheitert die Übersetzung mit Haiku, schickt der Worker zwei deutsche Fassungen. Dann zeigen PC und Handy zwei Knöpfe 'Deutsch | Deutsch', und die ratsuchende Person bekommt kommentarlos Deutsch statt Arabisch. Außerdem laufen Analyse (Sonnet) und Übersetzung (Haiku) nacheinander, die Seite verspricht aber 'bis zu einer Minute'. Wie lange es wirklich dauert, ist unbekannt. *Beleg:* proxy/src/index.ts:477-484 (Fallback: analyse und analyse_de beide deutsch, sprache 'de'); webseite/demo.html:857-861 (hängt analyse_de immer als zweite Version an, daher doppelter Knopf); index.ts:395 und :481 (nacheinander); demo.html:383 ('bis zu einer Minute'); laut Hintergrund lokal nicht getestet (kein KI-Schlüssel) *Vorschlag:* Wie vorgeschlagen. Ergänzung: Beim Probedurchlauf nach dem Deploy mindestens zwei Sprachen testen (Arabisch und Farsi) und das Handy einmal über mobile Daten verbinden. Bei 'Deutsch | Deutsch' sofort mit 'npx wrangler tail' ins Worker-Log schauen ('Übersetzung fehlgeschlagen'). Die Code-Korrektur (analyse_de nur bei sprache != 'de' anhängen, plus Hinweis am Handy) dauert Minuten und sollte vor dem Termin rein.
- **BE3 · Kontingent: Zahl veraltet, Ablaufdatum unsichtbar, leeres Kontingent fällt erst mitten in der Beratung auf** (mittel, stunden, vor Termin) — Als Beraterin sehe ich 'Kostenlos über MBE Donnersberg: 87 Analysen'. Diese Zahl stammt aus meinem eigenen Browser und wird nur durch meine eigenen Analysen kleiner. Nutzen Ratsuchende den Code zu Hause, merkt mein PC das nicht, die Zahl ist zu hoch. Ein Ablaufdatum sehe ich nirgends, obwohl der Server es mitschickt. Ist das Kontingent mitten in der Beratung leer, steht am Handy 'Bitte fragen Sie dort nach', obwohl die Person ja bei uns sitzt. Am PC steht '…aufgebraucht… Bitte dort noch einmal versuchen', und der PC wartet weiter, was sinnlos ist. Passiert es beim direkten Hochladen am PC, wird der Code aus meinem Browser gelöscht und das Kaufangebot für Privatleute erscheint. Nach dem Aufladen muss ich den Code neu eingeben. Eine Vorwarnung wie 'nur noch 5 Briefe' gibt es nicht, und Justin erfährt es auch nicht automatisch. Dazu kommt: Das Werkzeug setzt das Ablaufdatum auf 'heute + 1 Monat'. Wird der Code vor dem 26.10. angelegt, läuft er vor dem Auswertungstermin am 26.11. ab. *Beleg:* proxy/src/index.ts:742 (liefert 'ablauf') vs. webseite/demo.html:1257-1266 (ignoriert ihn); demo.html:596/645 (Zahl aus localStorage), :820 und :1368 (nur eigene Analysen aktualisieren); index.ts:446 (Server zieht für jedes Gerät ab); index.ts:329 + demo.html:766-768 + :1356 (widersprüchliche Meldungen); demo.html:783-790 (Code wird gelöscht) + :655 (Kauf-Block); tools/einrichtungs-code.js:46-50 + :81 (Ablauf = heute + 1 Monat) *Vorschlag:* In dieser Reihenfolge: 1) Code mit festem Datum anlegen: --bis 2026-11-30 (Sekunden). 2) Lesezeichen am Beratungs-PC genau auf behoerdenklar.de/demo?code=MBE-… setzen. Jedes Öffnen ruft dann /code auf (demo.html:1467) und holt den Stand frisch, das löst das 'veraltet' ohne Programmierung. 3) Bei kontingent_leer/abgelaufen den Code NICHT löschen, kein Kaufangebot zeigen, den PC das Warten beenden lassen und einen Kasten mit Justins Telefonnummer zeigen (Stunden). 4) Das Ablaufdatum im Banner anzeigen. 5) Zweimal pro Woche 'stand' prüfen.
- **BE4 · Mehrseitige Briefe gehen nicht, und Seite 2 landet nicht am PC** (hoch, tag, vor Termin) — Viele Bescheide (Jobcenter, Ausländerbehörde) haben mehrere Seiten. Am Handy kann man nur ein Foto pro Erklärung hochladen. Nach dem ersten Ergebnis hört der PC auf zu warten, das Handy bietet das Hochladen aber wieder an, und das Banner verspricht weiter 'erscheint hier und auf dem Bildschirm'. Ein Foto von Seite 2 erscheint also nur am Handy, kostet einen weiteren Brief und weiß nichts von Seite 1. Bei der Vorführung fällt das nicht auf, weil der Musterbrief einseitig ist. Die Frage kommt aber mit Sicherheit. *Beleg:* webseite/demo.html:331 (input ohne 'multiple'), :679 (nur files[0]), :1348-1352 (PC beendet das Warten nach dem ersten Ergebnis), :814 (Handy öffnet das Hochladen wieder), :1417 (Banner-Text bleibt); musterbrief-auslaenderbehoerde.html hat nur eine .seite *Vorschlag:* Bis 29.10.: Antwort in den Ablaufplan aufnehmen, aber ehrlich formuliert: 'Zurzeit ein Foto pro Erklärung: die Seite mit Betreff und Frist. Mehrseitig geht als Scanner-PDF direkt am PC, dann aber nur in EINER Sprache. Für die Beraterin Deutsch wählen.' Dazu den Handy-Banner nach dem ersten Ergebnis ändern (Minuten). Danach (etwa 1 Tag): 'Weitere Seite hinzufügen', bis zu 4 Fotos in einer KI-Anfrage, zählt als 1 Brief.
- **BE5 · Keine Kurzanleitung für den Beratungs-PC; der Code ist nach dem Termin schwer wiederzufinden** (mittel, stunden, vor Termin) — Der Handzettel wirbt, erklärt aber nicht, wie man es am PC benutzt. Der PC-Ablauf steht dort nur als ein Satz unter 'Was BehördenKlar kann'. Kolleginnen, die nicht beim Termin waren, wissen nicht, was sie klicken sollen. Das Code-Feld am PC steckt in einem zugeklappten Bereich ganz unten. Öffnet man den Link mit ?code=, verschwindet der Code sofort aus der Adresse. Ein Lesezeichen, das man danach anlegt, enthält ihn also nicht. Löscht der Dienst-Browser beim Schließen die Daten, ist der Code weg und muss gesucht werden. *Beleg:* marketing/praesentation-mbe/handzettel.html:93-176 (nur Werbung und Angebot), :125-128 (PC-Ablauf als Merkmal-Satz); webseite/demo.html:372-377 (Code-Feld in zugeklapptem details), :1467 (reinigeUrl entfernt ?code=) *Vorschlag:* Eine kurze Seite 'So geht's am Beratungs-PC' (5 Schritte, wie vorgeschlagen) ist gut und in Stunden machbar. Das Lesezeichen mit ?code= hat einen Zusatznutzen: Es holt bei jedem Öffnen den aktuellen Briefstand (siehe BE3). Bildschirmfotos erst nach dem Deploy machen, weil live noch der alte Stand läuft.
- **BE6 · Weitergabe des Codes an Ratsuchende ist ungeklärt und unbegrenzt** (mittel, stunden, vor Termin) — Auf dem Handzettel steht 'Code für Ihre Ratsuchenden' mit einem QR-Code zu demo?code=…. Diesen Link kann man weiterleiten, und jeder, der ihn öffnet, hat den Code dauerhaft gespeichert. Für Einrichtungs-Guthaben greift im Worker kein Tages- oder IP-Limit. Ein Link in einer WhatsApp-Gruppe kann also die 100 Briefe aufbrauchen, und die Beraterinnen merken es erst, wenn es leer ist (siehe BE3). Für Ratsuchende gibt es kein eigenes Material, weder Aushang noch Kärtchen, und nichts in ihrer Sprache. Der vorhandene Weg 'Zugang per QR vom PC aufs Handy' ist ein kleiner Link-Knopf mit der Käufer-Beschriftung 'Auch auf dem Handy nutzen'. *Beleg:* handzettel.html:173-175 + :191 (Code und Link für Ratsuchende); webseite/demo.html:1257-1259 + :1467 (Code wird dauerhaft gespeichert); proxy/src/index.ts:333-342 (Limits nur, wenn nicht bezahlt); demo.html:294 + :1392-1399 (a=g-Knopf) *Vorschlag:* Vor dem 29.10. entscheiden. Empfehlung für den Test: Der Code bleibt bei den Beraterinnen (Handzettel: 'Ihr Zugangscode für den Beratungs-PC' statt 'Code für Ihre Ratsuchenden'). Ratsuchende nutzen ihn nur während der Beratung über 'Lieber mit dem Handy fotografieren' (a=k, nur für die Sitzung). Den a=g-Knopf im Einrichtungs-Modus besser ausblenden oder deutlich als 'dauerhaft' kennzeichnen. Eine Tagesobergrenze im Worker ist eine sinnvolle Notbremse, aber nicht zwingend vor dem Termin, denn die 100 sind selbst schon die Obergrenze.
- **BE7 · Die Handy-Seite der Ratsuchenden ist komplett auf Deutsch, auch die Einwilligung** (mittel, tag) — Die gewählte Sprache ändert nur die KI-Erklärung. Was die ratsuchende Person am Handy bedienen muss, ist alles Deutsch: der Einwilligungstext mit dem Hinweis auf Anthropic (USA), der Start-Knopf, das Banner 'Mit dem Computer verbunden…', Kamera-Hinweise und Fehlermeldungen. In der Beratung muss ich die Einwilligung also erst übersetzen oder die Person setzt ein Häkchen, das sie nicht lesen kann. Menschlich und beim Datenschutz ist das wackelig. Übersetzte Texte gibt es für die Sprachseiten schon, aber nicht für die Demo. *Beleg:* webseite/demo.html:306-316 (Einwilligung), :332 (Knopf), :1417 (Banner), :728/:832 (Fehlermeldungen); :747 (Sprache geht nur an die KI); tools/sprachseiten/texte.js enthält z. B. kaufKonsens in allen Sprachen, aber keinen Upload-Konsens *Vorschlag:* Wenn das Handy per QR mit Sprache l≠de geöffnet wird, die etwa 8 Texte, die man bedienen muss, in der Zielsprache zeigen: Banner, Einwilligung, Start-Knopf, Kamera-Hinweis, Wartetext und 3 häufige Fehlermeldungen. Mit den häufigsten MBE-Sprachen anfangen (Arabisch, Farsi, Türkisch, Ukrainisch, Russisch, Kurdisch) und von Muttersprachlern gegenlesen lassen. Für den 29.10. reicht eine ehrliche Antwort: 'Die Bedienung am Handy wird als Nächstes übersetzt.'
- **BE8 · Kein Ausdruck, und am Handy ist das Ergebnis weg, sobald der Tab zu ist** (mittel, stunden, vor Termin) — Viele Ratsuchende wollen Papier, und für die Akte wäre ein Ausdruck praktisch. Es gibt aber weder einen Druck-Knopf noch Druck-Einstellungen. Mit Strg+P druckt man die ganze Seite mit Formular, Einwilligungstext und Fußzeile. Die Erklärungen der Fachbegriffe fehlen auf Papier, weil sie zugeklappt sind. Am Handy wird das Ergebnis nirgends gespeichert. Schließt die Person den Tab oder lädt neu, ist alles weg. Nur der Kalender-Eintrag bleibt. Der Handzettel verspricht aber 'Ergebnis zum Mitnehmen'. *Beleg:* webseite/demo.html: grep 'print' ohne Treffer; :905-917 (Fachbegriffe in zugeklappten details); :565-630 (localStorage speichert nur Sprache/Guthaben, kein Ergebnis); :1508-1511 (# wird gelöscht, Neuladen stellt nichts wieder her); handzettel.html:129-131 *Vorschlag:* Druck-Knopf mit @media print wie vorgeschlagen (Stunden). Er ist aber nicht zwingend vor dem Termin. Wenn die Zeit knapp ist, auf die Frage 'Kann man das ausdrucken?' ehrlich antworten und es danach bauen. Der Druck-Knopf am Handy ('Als PDF speichern') löst nebenbei das Aufbewahren.
- **BE9 · Nächste Person: Das Ergebnis der vorigen Person bleibt auf dem Bildschirm** (mittel, stunden) — Es gibt keinen Knopf 'Fertig'. Kommt die nächste Person an den Tisch, steht die Erklärung des vorigen Briefs weiter unten auf dem Bildschirm, mit Aktenzeichen und Telefonnummer, bis ein neues Ergebnis sie ersetzt. Auch die Sprache der vorigen Person bleibt eingestellt. Wer das übersieht, schickt der nächsten Person die falsche Sprache aufs Handy. *Beleg:* webseite/demo.html:879-927 (zeigeAnalyse ersetzt erst bei neuem Ergebnis, keine Zurücksetzen-Funktion); :1501 (Sprache wird dauerhaft gespeichert) *Vorschlag:* Wie vorgeschlagen. Bis der Knopf da ist, in die Kurzanleitung schreiben: 'Nach jeder Person die Seite neu laden und die Sprache prüfen.'
- **BE10 · Dienst-PC mit strengem Netz: Fehler bleiben stumm** (mittel, stunden, vor Termin) — Alle Anfragen gehen an behoerdenklar-proxy.behoerdenbrief.workers.dev, dazu an challenges.cloudflare.com. Ob der Web-Filter der Einrichtung workers.dev-Adressen durchlässt, ist unbekannt; manche Filter sperren diese Adressen. Scheitert das Abfragen am PC, wird der Fehler verschluckt. Die Beraterin sieht 15 Minuten '⏳ Warte auf das Handy …' und dann 'QR-Code ist abgelaufen', ohne Hinweis auf das Netzwerk. Außerdem greift die Seite an mehreren Stellen ohne Absicherung auf den Browser-Speicher zu. Sperrt die IT Website-Daten, bricht das Skript beim Start ab und kein Knopf funktioniert. Das ist eine Bedingung, die nicht getestet ist; die Sprach-Einstellung ist dagegen abgesichert. *Beleg:* webseite/demo.html:540-542 + webseite/uebergabe.js:15-16 (workers.dev); demo.html:534 (Turnstile); demo.html:1359-1361 (Abfragefehler werden still ignoriert), :618 (Handy-Meldungen an den PC ebenso); demo.html:594-597, :601-604, :629-630 (localStorage ohne try/catch) vs. :565-566 (mit try/catch) *Vorschlag:* Punkt 1 ist der wichtigste und kostet nur Minuten. Am Ende des Termins eine Beraterin bitten, den Link an IHREM Dienst-PC zu öffnen und einmal den Handy-Ablauf mitzumachen. Die Punkte 2 und 4 (Meldung nach mehreren Fehlversuchen, try/catch) dauern Minuten bis eine Stunde. Punkt 3 (eigene Adresse für den Worker) kommt später.
- **BE11 · Oberfläche im Einrichtungs-Modus: Gratis-Texte, falscher Hauptknopf, Sprachliste nur in fremder Schrift** (mittel, minuten, vor Termin) — Auch mit aktivem Code steht oben weiter '2 Analysen gratis', 'Antrag auf Klartext · 2 Gratis-Analysen' und 'Gratis-Demo'. Justin sagt aber '100 Briefe', das verwirrt. Der Knopf, den die Beraterin wirklich braucht ('Lieber mit dem Handy fotografieren'), ist der weiße Zweitknopf unter einem großen, ausgegrauten Hauptknopf. Der ist grau, weil das Häkchen nur für das direkte Hochladen gesetzt ist. Die Sprachliste zeigt nur die Eigennamen in Originalschrift und ist nicht alphabetisch sortiert. 'ትግርኛ' (Tigrinya) oder 'پښتو' (Paschtu) erkennt eine deutsche Beraterin nicht. *Beleg:* webseite/demo.html:268, :277, :284 (feste Gratis-Texte); :332-333 + :667 (Hauptknopf erst nach dem Häkchen aktiv, Handy-Knopf zweitrangig); :556-562 + :1494-1498 (nur Originalnamen) *Vorschlag:* Wie vorgeschlagen, aber die Reihenfolge nach Größe der Sprachgruppe beibehalten (nicht alphabetisch). Wichtiger als das Sortieren ist der deutsche Zusatz ('العربية – Arabisch', 'فارسی – Farsi/Dari', 'پښتو – Paschtu'). Aufwand: Minuten.
- **BE12 · QR-Code am Bildschirm wird mit Code doppelt so dicht** (niedrig, minuten, vor Termin) — Hat der PC einen Einrichtungs-Code, steckt das komplette Guthaben-Token im QR-Code. Der Code wird dadurch deutlich dichter: 61×61 statt 45×45 Punkte, bei fester Größe von 220 Pixeln nur 3,4 Pixel pro Punkt. Der weiße Rand ist nur 2 Punkte breit. Moderne Handys schaffen das. Ältere, günstige Handys von Ratsuchenden, ein spiegelnder Laptop-Bildschirm oder verkleinerte Browser-Ansicht machen das Scannen aber zäher. *Beleg:* Selbst nachgerechnet mit webseite/qrcode.js: a=k mit Code = 217 Zeichen, QR-Version 11 (61 Module), 3,38 px/Modul; ohne Code = 113 Zeichen, Version 7, 4,49 px/Modul. webseite/demo.html:218 (220 px), :1301 (Token im QR), webseite/uebergabe.js:113 (margin 2) *Vorschlag:* Nur .qr-box .qr auf etwa 280 bis 300 px vergrößern (eine Zeile CSS). Den margin zu ändern ist unnötig. Das Token aus dem QR herauszunehmen kann warten.
### Ratsuchende mit wenig Deutsch
_Wenn die Beraterin daneben sitzt (QR am PC scannen, a=k), funktioniert der Ablauf: Nach etwa 6 Fingertipps ist der Brief fotografiert, das Ergebnis steht auf Arabisch am Handy und auf Deutsch am PC. Allein zu Hause, mit dem Code vom Handzettel, bleibt ein Ratsuchender mit wenig Deutsch aber an mehreren Stellen hängen. Bis auf den Ergebnistext ist alles auf Deutsch: Einwilligung, Knöpfe, Hinweise, Fehler und Kartenüberschriften. Die Erklärungssprache steht auf Deutsch, obwohl das Handy auf Arabisch eingestellt ist, und nach dem Schließen der Seite ist das Ergebnis weg. Dazu kommen kleine Fehler bei Arabisch (rechts-nach-links) und eine fehlende Übersetzung in der Anruf-Hilfe. Beides sieht man genau in der geplanten Arabisch-Vorführung, und beides lässt sich in Minuten beheben._
- **RA1 · Handy-Seite ist bis auf das Ergebnis komplett Deutsch, auch die Pflicht-Einwilligung** (hoch, tag, vor Termin) — Nach dem QR-Scan sieht der Ratsuchende nur deutschen Text: den Kopf 'Probieren Sie es aus … 2 Analysen gratis', das Verbunden-Banner, die lange Einwilligung (Häkchen ist Pflicht, sonst bleibt der Knopf grau), den Knopf 'Brief auswählen & erklären lassen', 'Ihr Brief wird analysiert…', die Hinweise zu Kamera und Galerie und alle Kartenüberschriften im Ergebnis ('Einfach erklärt', 'Das müssen Sie tun', 'Anrufen', 'Danach werden Sie gefragt', 'Noch 7 Tage Zeit', 'In meinen Kalender eintragen', Rechtshinweis). Wer kaum Deutsch liest, hakt blind an oder bleibt stecken. Bei der Einwilligung nach Art. 9 DSGVO ist das außerdem heikel: Wer den Text nicht lesen kann, willigt nicht wirklich informiert ein. Das ist ein Hinweis, keine Rechtsauskunft. *Beleg:* demo.html:2 (lang="de", kein dir), 306-316 (Einwilligung), 332, 382-383, 446-473, 849, 1083-1084, 1122-1131, 1417. Gerendert bei 390 px Breite mit Handy-Sprache Arabisch: Alles außer den KI-Texten ist deutsch (Screenshots ak.png und am2.png im Scratchpad). Übersetzungen für die Demo-Seite gibt es nicht; tools/sprachseiten/texte.js deckt nur die Startseiten ab. *Vorschlag:* Vor dem 29.10. nur Arabisch, und nur das Nötigste: Einwilligung, Startknopf, Verbunden-Banner, Wartetext, 'Verbindung fehlgeschlagen'. Dazu dir='rtl' am Container, wenn die Sprache ar/fa/ur/ps ist. Den Rest wie die Sprachseiten nachziehen. Im Termin auf jeden Fall offen sagen: 'Die Bedienung ist noch deutsch, die Erklärung kommt in der Muttersprache.' Rechne damit, dass jemand nach der Einwilligung fragt: Die Beraterin kann sie im Moment vorlesen oder übersetzen.
- **RA2 · Arabisch (rechts-nach-links) an mehreren Stellen falsch dargestellt, sichtbar in der Vorführung** (mittel, stunden, vor Termin) — Vier Stellen sind betroffen. (1) Die Briefart-Plakette über der Kernaussage nutzt Courier mit letter-spacing. Dadurch werden arabische Buchstaben auseinandergerissen ('ر س ا ل ة' statt 'رسالة') und sind schwer lesbar. (2) In der Ampel-Zeile und der Frist-Zeile hängt der arabische Text hinter deutschem 'Noch 7 Tage Zeit · ' bzw. '⚠️ Frist: …'. Die Zeile läuft deshalb links-nach-rechts, und der Schlusspunkt sowie die Klammern landen auf der falschen Seite. (3) Die arabische Erklärung der Fachbegriffe ist linksbündig, der Punkt steht vorne. (4) Bei den Checkbox-Kästchen fehlt der Abstand zum Text. Eine arabischsprachige Beraterin sieht das sofort. *Beleg:* Headless-Chrome-Screenshot bei 390 px mit arabischem Beispielergebnis über eine echte lokale a=m-Übergabe (crop1.png, crop2.png). Code: demo.html:173-178 (.karten-label mit letter-spacing und Courier, 885 setzt dort brieftyp ein); 442 und 896 (ergAmpel ohne dir, computed direction 'ltr'); 1058 und 1083 (dir=auto, aber die Zeile beginnt mit 'Frist:', also ltr); 912-913 (p ohne dir, beobachtet: getAttribute('dir') = null); 186 (margin-right statt margin-inline-end). *Vorschlag:* #ergBrieftyp (oder .karten-label allgemein, sobald KI-Text darin steht): font-family:inherit oder eine Systemschrift, dazu letter-spacing:0 und text-transform:none. Die Schrift ist der eigentliche Fehler. Den Rest wie vorgeschlagen: Fachbegriff-<p> mit dir=auto, KI-Text in Ampel- und Fristzeile in ein eigenes <bdi>/<span dir=auto>, .todo::before mit margin-inline-end. Danach einmal auf dem eigenen Vorführ-Handy mit Arabisch ansehen. Aufwand eher unter einer Stunde.
- **RA3 · 'Ergebnis aufs Handy mitnehmen': Telefonsätze kommen ohne Übersetzung an** (mittel, minuten, vor Termin) — Ob unter dem deutschen Telefonsatz die Bedeutung in der Muttersprache steht, hängt an der gespeicherten Sprache des Handys, nicht an der Sprache des Ergebnisses. Der Mitnehmen-QR (a=m) überträgt keine Sprache. Auf einem fremden Handy, das noch nie auf der Seite war, steht die Sprache auf 'de'. Der Ratsuchende bekommt also ein arabisches Ergebnis, aber die Anruf-Hilfe zeigt nur deutsche Sätze, die er nicht versteht. Bei der Vorführung fällt das nicht auf: Justins Handy hat durch den a=k-Schritt vorher schon 'ar' gespeichert. *Beleg:* demo.html:1133 (mitBedeutung = zielsprache() !== 'de'); 1383 (Mitnehmen-QR nur mit a, s, k, ohne l). Beobachtet auf einem frischen Handy-Profil mit arabischem Ergebnis: Sprachauswahl 'de', Anzahl .anruf-bed = 0, nur '„Guten Tag, mein Aktenzeichen ist AB-123/26.“' ohne arabische Zeile. *Vorschlag:* zeigeAnruf die Sprache der gerade angezeigten Version mitgeben: mitBedeutung = versionen[aktiveVersion].code !== 'de'. Zusätzlich l= in den Mitnehmen-QR schreiben und am Handy übernehmen wie bei a=k (Zeilen 1413-1416). Danach den Ablauf einmal mit einem Inkognito-Fenster am Handy testen.
- **RA4 · Code vom Handzettel: Erklärung kommt auf Deutsch, obwohl das Handy auf Arabisch steht** (mittel, minuten, vor Termin) — Wer den Handzettel-QR (/demo?code=…) zu Hause scannt, löst den Code ein. Die Erklärungssprache bleibt aber auf 'Deutsch'. Die Seite fragt die Sprache des Handys nicht ab. Die Auswahl ist deutsch beschriftet ('Erklärung in dieser Sprache:') und wird leicht übersehen. Die erste Analyse aus dem Kontingent der MBE kommt dann auf Deutsch heraus, also verschwendet. *Beleg:* demo.html:563-568 (Rückfall immer 'de', navigator.language wird nirgends gelesen, per grep geprüft). Beobachtet mit Handy-Sprache Arabisch und ?code=TEST-AB23: navigator.language = 'ar', Sprachauswahl = 'de'. *Vorschlag:* Wie vorgeschlagen: In zielsprache() vor dem Rückfall navigator.languages durchgehen (Kürzel vor dem Bindestrich) und die erste Sprache nehmen, die es in SPRACH_NAMEN gibt. Die erkannte Sprache NICHT in localStorage speichern, nur verwenden. Dann gewinnt eine spätere Auswahl von Hand. Steht das Handy auf Deutsch, bleibt alles wie bisher.
- **RA5 · Code abtippen: Leerzeichen statt Bindestrich, fehlender Bindestrich oder arabische Ziffern scheitern und zählen als Fehlversuch** (niedrig, minuten, vor Termin) — Wer 'MBE K7QX' (mit Leerzeichen) oder 'MBEK7QX' tippt, bekommt 'Diesen Code kennen wir nicht', also eine deutsche Meldung. Arabische und persische Handy-Tastaturen tippen Ziffern oft als ٧ bzw. ۷. Diese fallen durch die Prüfung [A-Z0-9-]. Jeder Fehlversuch zählt zur Sperre von 10 pro IP und Tag. In der Beratungsstelle teilen sich alle dasselbe WLAN, also dieselbe IP. Nach ein paar Tippfehlern ist das Einlösen für den Rest des Tages für alle gesperrt, auch über den QR-Link. Dazu kommt: Das Code-Feld steckt in einem eingeklappten, deutsch beschrifteten Bereich ganz unten im Kasten. *Beleg:* proxy/src/index.ts:719 (entfernt Leerzeichen, setzt aber keinen Bindestrich ein), 729 (Prüfung /^[A-Z0-9-]{4,40}$/, dann exakter Abgleich), 723-733 (Fehlversuch-Zähler pro IP). Lokal getestet: 'TEST AB23' → code_unbekannt, ' test-ab23 ' → ok. Hinweis: Mein Test hat den lokalen Zähler für ::1 heute um 1 erhöht (vorher 5). demo.html:372-377 (details am Ende). *Vorschlag:* Im Worker (und gleich auf der Seite): alles außer A-Z0-9 entfernen und den Bindestrich vor den letzten 4 Zeichen wieder einsetzen. Das deckt Leerzeichen und den fehlenden Bindestrich ab. Die Umwandlung arabischer Ziffern ist optional. Nicht dringend vor dem Termin, auf dem Handzettel steht der QR.
- **RA6 · Ergebnis ist nach dem Schließen weg, es gibt keinen Weg zurück zur Erklärung** (mittel, stunden) — Das Ergebnis lebt nur in der offenen Seite. Es wird nirgends gespeichert und hat keinen Teilen- oder Speichern-Knopf. Nach a=k entfernt die Seite den QR-Teil aus der Adresse, nach a=m wird die Übergabe sofort gelöscht (einmalig, 15 Minuten). Wenn der Ratsuchende den Browser schließt, das Handy aufräumt oder die Seite neu lädt, sieht er wieder nur die deutsche Startansicht 'Probieren Sie es aus'. Die Erklärung, die To-do-Liste und die Telefonsätze sind weg. Ein Beraterinnen-Satz wie 'Schauen Sie es sich zu Hause noch mal an' lässt sich nicht einlösen. Nur den Kalender-Eintrag kann man behalten. *Beleg:* demo.html:856-863 (letzteDaten nur im Speicher), per grep: kein localStorage oder sessionStorage für Ergebnisse; 1507-1511 (Adresse wird bereinigt); 1440 (a=m löscht nach dem Abholen); 1437 ('gilt 15 Minuten und nur einmal'). *Vorschlag:* Vor dem Termin: Den Satz im Ablaufplan (Zeile 75) ehrlich machen, z. B. 'Das Ergebnis bleibt im Browser, solange die Seite offen ist. Wichtig ist der Kalender-Eintrag, der bleibt.' Nach dem Termin: zuerst einen Knopf 'Teilen/Speichern' mit navigator.share einbauen. Es wird nichts gespeichert, der Nutzer entscheidet selbst. Erst danach über localStorage nachdenken, dann mit Löschen-Knopf und einem Satz in der Datenschutzerklärung.
- **RA7 · Am Handy liegt der Foto-Knopf über einen Bildschirm tief, ist grau und erklärt nicht, warum** (mittel, minuten, vor Termin) — Nach dem QR-Scan zeigt der erste Bildschirm nur den deutschen Werbekopf 'Probieren Sie es aus … 2 Analysen gratis', obwohl die Einrichtung zahlt. Das Verbunden-Banner beginnt bei 588 px, das Häkchen bei 816 px (unterer Rand) und der Foto-Knopf bei 1060 px. Er ist ausgegraut, bis man die deutsche Einwilligung anhakt. Antippen tut nichts, es kommt keine Erklärung. Zählung bis zum Foto: Link öffnen, scrollen, Häkchen, Knopf, Auswahl Kamera/Galerie (Android, weil kein capture-Attribut gesetzt ist), Foto, 'OK'. Das sind etwa 6-7 Schritte. Mit Beraterin daneben ist das machbar, allein ist es schwer. Beim Handzettel-Link liegt der Knopf sogar bei 1182 px. *Beleg:* Gemessen in Handy-Emulation 390×844: bannerTop 588, konsensTop 816, knopfTop 1060, knopfDisabled true; mit ?code=: knopfTop 1182. Code: demo.html:271-279 (Kopf), 284 ('2 Gratis-Analysen'), 331 (input ohne capture), 332 (disabled), 667. *Vorschlag:* Im Handy-Modus (handyModus/leseModus) nach dem Verbinden verbundenBanner.scrollIntoView() aufrufen und den Kopf ausblenden. Den Knopf nicht deaktivieren: Beim Tippen ohne Häkchen das Häkchen markieren und hinscrollen. capture nur bei a=k und dann den Galerie-Hinweis für diesen Fall ausblenden. Zusätzlich im a=k-Modus kaufBlock und codeTeil immer ausblenden, auch ohne w.
- **RA8 · Fehlerfälle am Handy: deutsche Meldung, PC wartet bei Netzabbruch endlos, gleiches Foto nochmal auswählen tut nichts** (mittel, minuten, vor Termin) — (1) Alle Fehlermeldungen vom Server und von der Seite sind deutsch, z. B. 'Die Analyse ist fehlgeschlagen. Bitte versuchen Sie es mit einem neuen, gut beleuchteten Foto.' oder 'Verbindung fehlgeschlagen …'. (2) Reißt am Handy die Verbindung ab, landet der Fehler im catch-Zweig. Dieser meldet dem PC nichts. Der PC zeigt dann bis zu 15 Minuten '⏳ Das Handy hat fotografiert. Der Brief wird erklärt …', und die Beraterin merkt nicht, dass etwas schiefging. (3) Nach einem Fehler wie 'KI ausgelastet' wählt der Ratsuchende oft dasselbe Foto aus der Galerie. Das Datei-Feld wird nie zurückgesetzt, und Browser melden dieselbe Auswahl nicht erneut als Änderung. Es passiert dann nichts. *Beleg:* proxy/src/index.ts:284-474 (alle Meldungen deutsch). demo.html:828-833 (catch ohne meldeAnPc; im Gegensatz zu 764, wo der PC informiert wird), 751 (Status 'analyse' wird vorher gesendet), 1354-1357, 1337-1341 (Abbruch erst nach 15 Minuten). Per grep: kein dateiFeld.value = '' in der Datei, change-Listener in 678-680. Punkt (3) ist bekanntes Browser-Verhalten, auf einem echten Gerät nicht getestet. *Vorschlag:* Wie vorgeschlagen (meldeAnPc im catch, dateiFeld.value = '' vor dateiFeld.click()). Zusätzlich robuster am PC: Steht der Status länger als ca. 3 Minuten auf 'analyse', zeigt der PC 'Am Handy hat es wohl nicht geklappt, bitte dort neu versuchen'. Das hilft auch, wenn das Handy gar nichts mehr senden kann. Im Worker den Anthropic-fetch in try/catch setzen, damit immer JSON mit code 'ki' zurückkommt.
- **RA9 · Älteres Android: Wird der Tab beim Öffnen der Kamera neu geladen, ist die Verbindung zum PC weg (Risiko)** (niedrig, stunden) — Auf Handys mit wenig Arbeitsspeicher kann Android den Browser-Tab beenden, während die Kamera-App offen ist. Danach lädt der Tab neu. Die Seite hat die Übergabe-Daten aber schon beim Start aus der Adresse gelöscht und nirgends behalten. Nach dem Neuladen ist das Handy nicht mehr verbunden. Es zeigt die normale Gratis-Demo (mit Kaufbereich), das Guthaben vom PC fehlt, und der PC wartet weiter. Für den Ratsuchenden sieht das aus wie 'kaputt'. *Beleg:* demo.html:1507-1511 (Adresse wird beim Start bereinigt), 609 und 1412 (handyModus inkl. Guthaben w nur im Speicher), 652-655 (ohne Guthaben wird der Kaufbereich gezeigt). Das Neuladen selbst ist geräteabhängig und hier nicht auf echter Hardware beobachtet. *Vorschlag:* sessionStorage für a/s/k/l/d/w wie vorgeschlagen, mit Zeitstempel und Ablauf nach 15 Minuten. Nicht vor dem Termin nötig. Für den Termin reicht der Hinweis an die Beraterinnen: 'Wenn das Handy die Verbindung verliert, einfach am PC neu auf „Lieber mit dem Handy fotografieren“ tippen.'
### Live-Vorführung am 29.10.
_Der Ablaufplan passt im Großen zum Code: Die drei Knöpfe heißen genau so, und die Aufteilung (Laptop zeigt zuerst Deutsch, Handy zuerst Arabisch, dazu ein Umschalter) ist richtig gebaut. Drei Dinge können die Vorführung aber kippen. Erstens ist der Kern der Vorführung, die zweisprachige Analyse übers Handy, noch nie mit echter KI gelaufen und auch nicht deployed. Zweitens zeigt die Ampel für den Musterbrief vor 12 Uhr Gelb mit „Noch 8 Tage“ statt Rot. Drittens kommt das Ergebnis nur über das Handy auf den Laptop, das Handy darf in der Wartezeit also nicht in die Sperre gehen. In 10–15 Minuten ist das machbar, die 5 Minuten für die Live-Vorführung sind aber knapp. Für die Beraterinnen am PC ist es bequem. Für Ratsuchende am Handy ist es noch umständlich: deutsche Bedienung, eine deutsche Einwilligung zum Anhaken und mehrere Schritte._
- **LI1 · Kern der Vorführung nie mit echter KI getestet, nicht deployed, Prüfskript prüft das Neue nicht** (blocker, stunden, vor Termin) — Vorgeführt wird genau der Weg, der noch nie gelaufen ist: Laptop zeigt den QR-Code, das Handy fotografiert, dann zweisprachige Analyse (Sonnet auf Deutsch, danach Übersetzung mit Haiku). Lokal gibt es keinen KI-Schlüssel, und live läuft noch der alte Stand ohne /code und /uebergabe. Der Ablaufplan setzt „Deploy erledigt“ erst auf den Vorabend. Bleibt dann ein Fehler übrig, ist keine Zeit mehr zum Reparieren. Außerdem prüft „npm run pruefung alles grün“ die neuen Funktionen gar nicht. Wird nur die Webseite deployed und nicht der Worker, sieht man live den Handy-Knopf, aber die Übergabe geht nicht. *Beleg:* ablaufplan.html:113 (Deploy erst „Am Vorabend“). tools/pruefung.js: Kein Test ruft /code oder /uebergabe auf (grep findet nur hole(BASIS + '/demo') in Zeile 175). index.ts:479-484 (Übersetzungsweg, lokal ohne Schlüssel nicht ausführbar). demo.html:1326 und uebergabe.js:16 (Seite fragt live den Worker unter /uebergabe/ ab). *Vorschlag:* Wie vorgeschlagen: bis spätestens Mo 26.10. zuerst den Worker deployen, dann die Webseite, dann 2–3 komplette Durchläufe auf dem Live-System (gleiche Geräte, Hotspot, gedruckter Musterbrief, Arabisch, Zeit stoppen, Screenshots). Dazu von Hand prüfen: falscher Code → „Diesen Code kennen wir nicht“, Laptop zeigt nach dem Scan „Handy verbunden“, am Ende zwei Sprachknöpfe „Deutsch“ und „العربية“ (nicht zweimal „Deutsch“). Später einen kleinen Test für /code und /uebergabe in npm run pruefung ergänzen.
- **LI2 · Ampel zeigt am 29.10. vormittags Gelb mit „Noch 8 Tage“, nicht Rot** (hoch, minuten, vor Termin) — Die Web-Ampel rechnet vom jetzigen Zeitpunkt bis 12:00 Uhr am Zieltag und rundet auf. Für den Termin am 05.11.2026 kommt deshalb vor 12 Uhr „8 Tage“ heraus, also Gelb. Erst ab 12 Uhr sind es 7 Tage und damit Rot. Der Ablaufplan verspricht „rote Ampel (Termin in 7 Tagen)“. Findet die Präsentation vormittags statt, stimmt der wichtigste Moment nicht. Dazu kommt: Die App zählt anders, dort ist ein Abstand von genau 7 Tagen Gelb. Der Handzettel sagt dagegen „Rot bei 7 Tagen oder weniger“. *Beleg:* demo.html:843-846 (Math.ceil(...T12:00:00 - jetzt), rot bei ≤ 7). Mit derselben Formel nachgerechnet (TZ=Europe/Berlin): 29.10. 09:00 und 11:59 → 05.11. = 8 Tage, GELB. 29.10. 12:01 und 15:00 → 7 Tage, ROT. App: src/utils/ampel.ts:22-27 und 113 (Kalendertage, rot nur bei < 7). ablaufplan.html:74, handzettel.html:115, musterbrief-auslaenderbehoerde.html:112. *Vorschlag:* Besser die Formel reparieren als nur den Brief ändern, denn ein Deploy kommt sowieso. In demo.html ampel() wie tageBis() in ampel.ts in Kalendertagen rechnen (heute 00:00 bis Zieltag 00:00, Math.round). Dann gilt am 29.10. für den 05.11. zu jeder Uhrzeit „Noch 7 Tage“ und Rot, und am Fristtag erscheint „HEUTE“. Zusätzlich darf man den Termin im Musterbrief auf Dienstag, 03.11.2026, 10:30 legen, das ist dann doppelt sicher. Danach neu drucken und im Ablaufplan „Termin in 7 Tagen“ durch „Termin nächste Woche“ ersetzen.
- **LI3 · Den „Vorführ-Code“ gibt es nirgends, und der MBE-Code kann vor dem Auswertungstermin ablaufen** (mittel, minuten, vor Termin) — Der Ablaufplan setzt einen eingelösten Vorführ-Code voraus. In der Checkliste für den Vorabend steht aber nur der MBE-Code. Ohne Code am Laptop enthält der QR-Code kein Guthaben, und das Handy fällt in die Gratis-Demo. Nach zwei Übungsläufen mit demselben Handy blendet die Seite den Hochladen-Bereich aus und meldet „Ihre 2 Gratis-Analysen sind verbraucht“. Dann scheitert die Vorführung. Zweites Problem: „--monate 1“ rechnet ab dem Tag, an dem der Code angelegt wird. Legt Justin den MBE-Code heute an, endet er am 22.11., also vor dem Auswertungstermin am 26.11. Drittens ist der Handzettel noch ohne Code gedruckt: Dort steht „wird beim Termin eingetragen“, und der QR-Code führt nur auf /demo. *Beleg:* ablaufplan.html:70 und 123 („Vorführ-Code eingelöst“) gegen ablaufplan.html:114 (nur „MBE-Code angelegt“). demo.html:1301 (Guthaben kommt nur mit hatGuthaben() in den QR-Code). demo.html:657-661 (ab 2 Gratis-Analysen wird die Eingabe gesperrt). tools/einrichtungs-code.js plusMonate() rechnet ab heute. handzettel.html:190 (CODE = ''). handzettel.png zeigt „wird beim Termin eingetragen“. *Vorschlag:* Den Vorführ-Code ausdrücklich in die Checkliste „Am Vorabend“ schreiben und vor den Übungsläufen anlegen. Beide Codes mit festem Enddatum anlegen (Option --bis gibt es, einrichtungs-code.js:81), z. B. MBE mit --briefe 100 --bis 2026-11-30 und VORF mit --briefe 30 --bis 2026-11-30. Danach den MBE-Code in handzettel.html eintragen, das PDF neu erzeugen und prüfen, dass der QR-Code auf /demo?code=MBE-… zeigt.
- **LI4 · Das Ergebnis kommt nur über das Handy auf den Laptop, das Handy darf in der Wartezeit nicht sperren** (mittel, minuten, vor Termin) — Der Laptop bekommt das Ergebnis nicht vom Server, sondern nur, wenn das Handy es nach der Analyse weiterschickt. Das Handy muss also die ganze Wartezeit mit offener Seite im Vordergrund bleiben. Bei vielen iPhones geht der Bildschirm nach 30 Sekunden aus, im Stromsparmodus immer. Die Analyse dauert aber wahrscheinlich länger. Ob Safari die laufende Anfrage nach dem Sperren noch zu Ende bringt, ist nicht getestet. Wenn nicht: Das Handy zeigt „Verbindung fehlgeschlagen“, der Laptop bleibt bei „Der Brief wird erklärt …“ hängen, und die Analyse ist trotzdem schon abgebucht. Ähnlich beim Laptop: Geht er in den Ruhezustand, hört er auf nachzufragen. *Beleg:* demo.html:753-758 (Handy wartet auf /demo). demo.html:806-809 (erst danach meldeAnPc(..., 'ergebnis')). demo.html:1335-1358 (der PC fragt nur das Übergabe-Fach ab, alle 1,5 s). index.ts:444-446 (Guthaben wird auf dem Server abgezogen, egal ob das Handy die Antwort noch bekommt). ablaufplan.html:124 nennt nur „Handy entsperrt“, nicht die automatische Sperre. *Vorschlag:* In „Kurz vor dem Termin“ ergänzen: Am iPhone Einstellungen → Anzeige & Helligkeit → Automatische Sperre „Nie“ und den Stromsparmodus aus. Das Handy während der Analyse in der Hand behalten und nicht in eine andere App wechseln. Am Mac den Ruhezustand verhindern, z. B. im Terminal mit „caffeinate -d“. In den Notfallplan schreiben: „Laptop hängt, aber das Handy zeigt das Ergebnis → einfach das Handy zeigen.“
- **LI5 · Beratungs-PC ohne eingelösten Code: Ratsuchende landen in der Gratis-Demo mit Kaufangebot** (hoch, minuten, vor Termin) — Das „Foto mit dem Handy“ läuft nur dann über das Kontingent der Einrichtung, wenn der Code vorher am Beratungs-PC eingelöst wurde. Sonst steckt im QR-Code kein Guthaben. Das Handy der ratsuchenden Person nutzt dann ihre 2 Gratis-Analysen, fragt beim zweiten Mal nach der E-Mail und zeigt sofort den Abschnitt „Guthaben kaufen“ mit 2,99 €. Das widerspricht „Ratsuchende zahlen nichts“. Auf dem Handzettel steht nur „Code für Ihre Ratsuchenden“. Dass der Code auch am PC der Beraterin eingegeben werden muss, steht nirgends. Gerade die als NEU beworbene Funktion „Beratung am PC“ geht im Testmonat so leicht schief. *Beleg:* demo.html:1301 (w nur mit hatGuthaben()). demo.html:612-615 (Handy ohne Guthaben nutzt die Gratis-Stufe). demo.html:652-655 (kaufBlock wird in der Gratis-Stufe immer gezeigt). handzettel.html:125-128 und 173. *Vorschlag:* Im Termin, Abschnitt 9–11', den Code gleich live an einem PC der Beraterinnen einlösen („Ich richte es Ihnen sofort ein, eine Minute“). Das wirkt bequem und vermeidet den Fehler. Auf den Handzettel einen Satz setzen: „Einmal am Beratungs-PC unter ‚Sie haben einen Code von einer Beratungsstelle?‘ eingeben, dann ist auch ‚Mit dem Handy fotografieren‘ kostenlos.“ Danach den Handzettel neu erzeugen.
- **LI6 · Ampel-Zeile verbindet das Termin-Datum mit der Aufgabe aus der Frist** (mittel, minuten, vor Termin) — Die Ampel nimmt das früheste Datum, beim Musterbrief also den Termin am 05.11. Dahinter hängt sie aber immer die Aufgabe aus der Frist. Heraus kommt so etwas wie „Noch 7 Tage Zeit (05.11.2026) · Unterlagen einreichen“, obwohl die Unterlagen bis zum 12.11. reichen. Beraterinnen arbeiten jeden Tag mit Fristen und sehen das sofort. Das kostet Vertrauen, ausgerechnet beim Punkt „Frist erkannt“. *Beleg:* demo.html:839-842 (Frist- und Termin-Datum werden gemischt und sortiert, das erste gewinnt). demo.html:849 (Text mit daten[0]). demo.html:894-896 (hängt immer frist.aktion an). Musterbrief: Termin 05.11. (Zeile 112), Frist 12.11. (Zeile 109). *Vorschlag:* In ampel() mitschreiben, welches Datum gewonnen hat, und „Termin am 05.11.“ bzw. „Frist bis 12.11.“ anzeigen. frist.aktion nur anhängen, wenn das früheste Datum wirklich die Frist ist. Das ist eine kleine Änderung. Sonst im Vortrag selbst erklären: „Die Ampel richtet sich nach dem nächsten Datum, hier dem Termin.“
- **LI7 · Am Handy viele Schritte, Bedienung und Einwilligung nur auf Deutsch** (mittel, minuten, vor Termin) — Nach dem Scannen öffnet sich am Handy die ganze Demo-Seite. Oben steht „Probieren Sie es aus … 2 Analysen gratis“, der Hinweis „Mit dem Computer verbunden“ liegt weiter unten, und die Seite scrollt nicht von selbst dorthin. Danach muss man die Einwilligung anhaken (vorher bleibt der Knopf grau), auf „Brief auswählen“ tippen, „Foto aufnehmen“ wählen, fotografieren und „Foto verwenden“ antippen. Im Ablaufplan steht nur „Musterbrief fotografieren“. Für Ratsuchende sind die Einwilligung (Daten an Anthropic in den USA), alle Kartentitel, der Kalender-Knopf, die Ampel („Noch 7 Tage Zeit“) und der Hinweis „ersetzt keine Rechtsberatung“ auf Deutsch. Nur der Inhalt erscheint auf Arabisch. Beraterinnen der Migrationsberatung fragen sehr wahrscheinlich: „Versteht mein Klient, was er da ankreuzt?“ *Beleg:* demo.html:272-284 (Kopf und „2 Gratis-Analysen“, auch im Handy-Modus sichtbar). demo.html:306-316 (Einwilligung nur auf Deutsch). demo.html:667 (Knopf erst nach dem Häkchen aktiv). demo.html:1411-1422 (Handy-Modus ohne Scrollen zum Banner). demo.html:446-473 und 485-488 (deutsche Titel). demo.html:847-849 (Ampeltext fest auf Deutsch). *Vorschlag:* Vor dem Termin die genauen Handy-Schritte in den Ablaufplan schreiben und üben: scrollen → Häkchen → Brief auswählen → Foto aufnehmen → Foto verwenden. Klein und schnell zu bauen: im Handy-Modus mit verbundenBanner.scrollIntoView() zum Banner springen. Für die Frage eine ehrliche Antwort bereithalten: „Inhalt in der Muttersprache, die Bedienknöpfe und die Einwilligung übersetze ich als Nächstes.“ Danach den Text der Einwilligung und die Kartentitel in die 27 Sprachen übersetzen, z. B. über texte.js.
- **LI8 · Wartezeit nicht gemessen, „etwa eine Minute“ ist für zwei KI-Aufrufe nacheinander gewagt** (mittel, minuten, vor Termin) — Bei der zweisprachigen Analyse laufen zwei KI-Aufrufe nacheinander: erst Sonnet mit dem Bild, danach Haiku mit der ganzen Antwort. Der Server antwortet erst, wenn beide fertig sind. Dazu kommen das Hochladen über den Hotspot und bis zu 1,5 s, bis der Laptop das nächste Mal nachfragt. Ablaufplan, Handzettel und Seite versprechen „etwa“ bzw. „bis zu einer Minute“. Wie lange es wirklich dauert, hat niemand gemessen, denn lokal gibt es keinen Schlüssel. Außerdem: Scheitert nur die Übersetzung, zeigt das Handy Deutsch statt Arabisch, und im Umschalter steht zweimal „Deutsch“. Ausgerechnet die arabische Fassung würde dann in der Vorführung fehlen. *Beleg:* index.ts:395-419 (Sonnet) und danach index.ts:479-484 (Haiku, nacheinander). Bei Fehlschlag gilt ausgabeSprache = 'de', während analyse_de weiter mitgeschickt wird. demo.html:857-861 legt dann zwei Fassungen mit dem Code 'de' an. demo.html:383 („bis zu einer Minute“). ablaufplan.html:72. handzettel.html:103. demo.html:1326 (Abfrage alle 1,5 s). *Vorschlag:* Die Wartezeit in den Übungsläufen stoppen (siehe LI1). Im Vortrag lieber „ein bis zwei Minuten“ sagen. Den Datenschutz-Teil fest in die Wartezeit legen, nicht nur im Notfall: Dann ist die Wartezeit eingeplant und nicht peinlich. Erscheint zweimal „Deutsch“, ist die Übersetzung gescheitert. Dann ruhig sagen „Hier hat die Übersetzung gehakt“ und die Screenshots zeigen.
- **LI9 · Kalender-Knopf ist ein Datei-Download: „Ein Tipp genügt“ ist ungetestet, am Laptop landet der Eintrag im eigenen Kalender** (niedrig, minuten, vor Termin) — „In meinen Kalender eintragen“ erzeugt eine .ics-Datei und lädt sie herunter. Am Laptop landet die Datei im Download-Ordner. Beim Öffnen trägt der Mac den Termin in Justins eigenen Kalender ein, vor Publikum. Am Handy kommen wahrscheinlich je nach Browser Rückfragen wie Laden, Öffnen und Hinzufügen. Der Handzettel verspricht „Ein Tipp genügt, das Handy erinnert 3 Tage und 1 Tag vorher“. Wie viele Tipps es auf iPhone und Android wirklich sind, ist nicht dokumentiert. *Beleg:* demo.html:1088-1097 (Blob-Download mit link.download = 'BehoerdenKlar-Termin.ics'). handzettel.html:118-119. ablaufplan.html:74 (Vorführen von „In meinen Kalender“ ohne Gerät). *Vorschlag:* Den Kalender-Knopf nur am Handy vorführen, nicht am Laptop. Vorher auf dem eigenen iPhone und auf einem Android-Handy testen und die Zahl der Tipps zählen. Danach den Handzettel, falls nötig, auf „Mit einem Tipp in den Kalender, das Handy erinnert …“ oder „Mit wenigen Tipps …“ anpassen.
- **LI10 · Ablaufplan nachschärfen: Mitnehmen-Schritt doppelt, QR-Code läuft ab, Fachbegriff nicht sicher** (niedrig, minuten, vor Termin) — 1) Nach dem Handy-Foto hat das Handy das Ergebnis schon. Danach noch „Ergebnis aufs Handy mitnehmen“ mit demselben Handy zu zeigen, wirkt doppelt und kostet einen zweiten Scan. Die Seite liest den Teil hinter dem # nur beim Laden. Öffnet der Browser den neuen Link im schon offenen Tab nur als Sprung auf derselben Seite, passiert nichts. Das ist nicht getestet. 2) Der QR-Code für das Handy läuft 15 Minuten nach dem Klick ab. Wer ihn vor dem Gespräch schon „bereitlegt“, sieht mitten in der Vorführung „Der QR-Code ist abgelaufen“. 3) Ob „Fiktionsbescheinigung“ wirklich unter den Fachbegriffen auftaucht, entscheidet die KI. Fest versprechen lässt sich das nicht. *Beleg:* demo.html:1507-1516 (ausAdresse/pruefeUebergabe nur beim Start, kein hashchange-Handler). demo.html:1316 und 1337-1341 (15-Minuten-Grenze ab dem Klick). index.ts:140-147 (fachbegriffe frei von der KI gewählt). ablaufplan.html:74-75. *Vorschlag:* Den Mitnehmen-QR von einer Beraterin mit ihrem eigenen Handy scannen lassen. Das ist ein schöner Moment zum Mitmachen und umgeht das Tab-Problem. Mit dem Musterbrief ist das unbedenklich. In den Ablaufplan schreiben: „QR erst live erzeugen, bei ‚abgelaufen‘ einfach neu klicken.“ Beim Fachbegriff den zeigen, der tatsächlich erscheint.
- **LI11 · „Steht vor dem Hochladen auf der Seite“ stimmt nur zur Hälfte** (niedrig, minuten, vor Termin) — Ablaufplan und Handzettel sagen, die Seite nenne schon vor dem Hochladen „löscht nach spätestens 30 Tagen, kein Training“. In der Einwilligung auf der Demo-Seite steht aber nur „Es wird dort nicht dauerhaft gespeichert“. Die 30 Tage und das fehlende Training stehen nur in der Datenschutzerklärung. Eine aufmerksame Beraterin kann das während der Vorführung nachlesen. *Beleg:* demo.html:309-313 (Text der Einwilligung). ablaufplan.html:82 und 137. handzettel.html:152. datenschutz.html:64-65 und 115 (dort stehen die 30 Tage und das fehlende Training). *Vorschlag:* Entweder einen halben Satz in die Einwilligung einfügen („Anthropic löscht es nach spätestens 30 Tagen und nutzt es nicht zum Training.“). Oder im Vortrag sagen: „Das steht in der Datenschutzerklärung, die vor dem Hochladen verlinkt ist.“
### Datenschutz des Trägers
_Technisch ist BehördenKlar datensparsam gebaut, sparsamer als die meisten Werkzeuge, die Beratungsstellen sonst nutzen. Briefe werden nicht gespeichert, die Übergabe per QR ist wirklich Ende-zu-Ende verschlüsselt, und der Weg über den Einrichtungs-Code kommt ohne E-Mail und ohne IP-Zähler aus. Die Lücken liegen im Papier, nicht im Code. Erstens ist nicht geklärt, wer verantwortlich ist, wenn die Beraterin am Dienst-PC den Brief einer Klientin hochlädt. Zweitens passt die Einwilligung nicht zur Beratungssituation: Sie ist nur auf Deutsch, spricht von „mein Brief-Foto“ und wird nach dem ersten Brief nicht zurückgesetzt. Drittens fehlen die Unterlagen, die ein Träger-DSB vor einem Test sehen will: AVV-Entwurf, technische und organisatorische Maßnahmen (TOMs) und ein aktuelles Datenschutz-Blatt. Realistisch: Die Beraterinnen können am 29.10. Ja sagen wollen, müssen aber an ihren Träger bzw. Datenschutzbeauftragten verweisen. Bringt Justin eine kurze Datenschutz-Mappe mit und schlägt er als Standard vor, dass die Klientin mit ihrem eigenen Handy fotografiert und selbst einwilligt (a=k), steigen die Chancen auf einen schnellen Start deutlich._
- **DA1 · Ungeklärt: Wer ist verantwortlich, wenn die Beraterin am Dienst-PC hochlädt?** (hoch, tag, vor Termin) — Die Datenschutzerklärung kennt nur eine Rolle: Webklar ist verantwortlich, die Rechtsgrundlage ist die Einwilligung des Nutzers selbst. Lädt aber die Beraterin im Dienst den Brief einer Klientin hoch, nutzt der Träger das Werkzeug für seine Beratung. Ein Träger-DSB wird dann fast sicher sagen: Wir sind verantwortlich, Webklar arbeitet in unserem Auftrag, also brauchen wir einen Auftragsverarbeitungsvertrag (AVV) nach Art. 28 DSGVO. Den gibt es nicht. Der Handzettel sagt sogar „Kein Vertrag“. Dazu kommen typische Rückfragen: Beraterinnen mit staatlicher Anerkennung unterliegen der Schweigepflicht (§ 203 StGB), dann wird eine Verschwiegenheitsverpflichtung des Dienstleisters verlangt. Ist der Träger kirchlich (Diakonie: DSG-EKD, Caritas: KDG), gelten eigene Datenschutzgesetze mit eigenen Vorgaben für den AVV. Wer Träger der MBE Donnersberg ist (mbe@fid-donnersberg.de), ist in den Unterlagen nicht festgehalten. *Beleg:* webseite/datenschutz.html:35-42 und 68-75 (nur Webklar als Verantwortlicher, nur Einwilligung des Nutzers); marketing/praesentation-mbe/handzettel.html:171 („Kein Vertrag, endet von selbst“); rechtliches/ enthält keinen AVV-Entwurf für Einrichtungen; marketing/outreach-september.md:20 (Träger nicht genannt) *Vorschlag:* Vor dem Termin: (a) Anrufen und fragen, wer Träger der MBE ist und ob es eine eigene AVV-Vorlage gibt. (b) Eine kurze schriftliche Aussage zur Rolle mitbringen (eine halbe Seite): „Lädt die Beratungsstelle selbst hoch, arbeiten wir als Auftragsverarbeiter. Einen AVV mit Verschwiegenheitsklausel und Cloudflare/Anthropic als Unterauftragsverarbeitern stellen wir auf Wunsch bereit.“ (c) Für den Testmonat empfehlen, dass die Klientin selbst am eigenen Handy fotografiert und einwilligt (a=k). Dabei offen sagen, dass das Ergebnis trotzdem am PC der Stelle erscheint. Den vollständigen AVV-Entwurf (nach GDD- oder Bitkom-Muster) gleich nach dem Termin schicken, spätestens bevor echte Briefe am Dienst-PC hochgeladen werden. Ein fertiger AVV in einem Tag ist für einen Nicht-Juristen ehrgeizig. Wichtiger ist, dass er vor dem ersten echten Brief vorliegt.
- **DA2 · Häkchen-Text passt nicht zur Beratung und gilt nach dem ersten Brief weiter** (hoch, stunden, vor Termin) — Der Text lautet „Ich bin einverstanden, dass MEIN Brief-Foto …“. Am Dienst-PC setzt die Beraterin das Häkchen, ist aber nicht die betroffene Person und kann nicht für die Klientin einwilligen. Außerdem nennt der Text keine besonderen Daten (Gesundheit, Herkunft o. Ä.). Art. 9 DSGVO verlangt aber eine ausdrückliche Einwilligung, und gerade diese Daten stehen in Briefen von Ausländerbehörde, Krankenkasse oder Jobcenter. Dazu kommt: Das Häkchen wird nie zurückgesetzt. Mit Einrichtungs-Code öffnet sich nach jeder Analyse sofort wieder das Eingabefeld, das Häkchen ist noch gesetzt. Die zweite, dritte und vierte Klientin des Tages wird also gar nicht mehr gefragt. *Beleg:* webseite/demo.html:306-316 (Text „mein Brief-Foto“, keine besonderen Daten genannt); demo.html:667 (einzige Stelle mit konsens, nirgends wird es zurückgesetzt); demo.html:936-940 (bei Guthaben öffnet sich die Eingabe nach dem Ergebnis sofort wieder) *Vorschlag:* Im Einrichtungs-Modus einen eigenen Text zeigen, z. B.: „Die ratsuchende Person ist einverstanden, dass ihr Brief (der Angaben z. B. zu Gesundheit, Herkunft oder Aufenthalt enthalten kann) zur Erklärung an BehördenKlar und den KI-Dienst Anthropic (USA) geschickt wird.“ Nach jeder Analyse `konsens.checked = false` setzen und den Knopf sperren. Zusätzlich für die Beratungsstelle eine einseitige Papier-Einwilligung zum Unterschreiben anbieten, die sie mit ihrer üblichen Schweigepflichtentbindung abheften kann.
- **DA3 · Einwilligung nur auf Deutsch, auch für Klientinnen, die kein Deutsch lesen** (mittel, stunden, vor Termin) — Eine Einwilligung zählt nur, wenn die Person versteht, wozu sie Ja sagt (Art. 4 Nr. 11 und Art. 7 Abs. 2 DSGVO: klare, einfache Sprache). Die Zielgruppe der MBE liest oft wenig Deutsch. Trotzdem ist die Demo-Seite samt Häkchen-Text komplett deutsch, auch im a=k-Ablauf, in dem die Klientin am eigenen Handy zustimmt und die Zielsprache (z. B. Arabisch) schon bekannt ist. Die 27 Sprachseiten erwähnen weder Anthropic noch die USA und verlinken direkt auf die deutsche Demo. Ein DSB wird fragen: „Wie willigt eine Klientin ein, die nur Dari spricht?“ *Beleg:* webseite/demo.html:2 (lang=de) und 306-316 (fester deutscher Text, keine Übersetzungslogik im Skript); grep „Anthropic“ in ar.html, tr.html, uk.html, fa.html: jeweils 0 Treffer; ar.html:286 verlinkt auf /demo?sprache=ar; demo.html:1411-1416 (a=k setzt nur die Ergebnis-Sprache, nicht den Text der Seite) *Vorschlag:* Den 2-3 Sätze langen Häkchen-Text in der gewählten Zielsprache unter dem deutschen Text einblenden. Zuerst Arabisch, Farsi/Dari, Ukrainisch, Türkisch, Russisch, den Rest danach. Maschinelle Übersetzung möglichst von einer Muttersprachlerin gegenlesen lassen (z. B. beim Auswertungstermin die Beraterinnen fragen). Bis dahin beim Termin offen sagen, dass die Beraterin den Hinweis mündlich erklären muss. Die Papier-Einwilligung aus DA2 kann diese Lücke für den Testmonat überbrücken.
- **DA4 · Zu absolute Aussagen auf Handzettel und Spickzettel (30 Tage, „Server sieht nichts“)** (mittel, minuten, vor Termin) — (a) „löscht nach spätestens 30 Tagen“ stimmt so nicht. Laut Anthropics eigener Datenschutz-Hilfeseite ist 30 Tage der Normalfall, aber bei Verdacht auf Missbrauch (automatisch markiert) bleiben Ein- und Ausgaben bis zu 2 Jahre gespeichert, dazu gibt es gesetzliche Ausnahmen. (b) „unser Server sieht nichts“ gilt nur für die QR-Übergabe. Das Brief-Foto selbst läuft im Klartext (nur über TLS geschützt) durch den Worker zu Anthropic. Der Satz im Spickzettel „Zwischen PC und Handy ist alles Ende-zu-Ende verschlüsselt“ kann als „der Brief ist Ende-zu-Ende verschlüsselt“ verstanden werden. Ein DSB fragt dann: „Aber die KI liest den Brief doch?“ Das schadet der Glaubwürdigkeit, die der „ehrlich“-Kasten aufbauen soll. *Beleg:* marketing/praesentation-mbe/handzettel.html:150 und 152; ablaufplan.html:82 und 137; rechtliches/datenschutz-factsheet.md:30; webseite/datenschutz.html:64-65 und 115; Worker reicht das Bild im Klartext weiter: proxy/src/index.ts:390-419; Anthropic-Hilfeseite „How long do you store my organization's data“ (privacy.claude.com, Artikel 7996866): Ausnahme „inputs and outputs for up to 2 years“ bei markierten Verstößen *Vorschlag:* Umformulieren und Handzettel-PDF neu erzeugen: „Anthropic löscht Anfragen in der Regel nach 30 Tagen (länger nur bei Verdacht auf Missbrauch) und nutzt sie nicht zum Training.“ Und: „Den Brief selbst muss die KI lesen. Er geht verschlüsselt übertragen über unseren Server zu Anthropic und wird bei uns nicht gespeichert. Die Übergabe zwischen PC und Handy ist zusätzlich Ende-zu-Ende verschlüsselt.“ Dieselbe Formulierung in Datenschutzerklärung und Factsheet übernehmen.
- **DA5 · Drittland-Grundlage und Vertragspartner nicht belegt** (mittel, stunden, vor Termin) — Datenschutzerklärung und AVV-Nachweis stützen die Übermittlung an Anthropic auch auf das EU-U.S. Data Privacy Framework (DPF). Einen Beleg dafür gibt es in den Unterlagen nicht. Anthropics eigene Zertifizierungsseite nennt ISO 27001, ISO 42001 und SOC 2, aber kein DPF, und die Websuche brachte keinen DPF-Eintrag (unbestätigt, nicht widerlegt). Die DPA-PDFs sind nicht gesichert (offener Punkt im Nachweis). Außerdem steht im AVV-Nachweis als Verantwortlicher „Justin Klein“ mit einer privaten Gmail-Adresse als Kontoinhaber, in der Datenschutzerklärung dagegen die Webklar GbR. Ein DSB fragt: „Wer genau hat den Vertrag mit Anthropic geschlossen?“ *Beleg:* rechtliches/avv-nachweis.md:9-12 (Justin Klein, einkauf.justin@gmail.com), :20 (DPF ohne Quelle), :35-36 (DPA-PDFs noch nicht abgelegt); webseite/datenschutz.html:37-38 (Webklar GbR) und :107-110 („DPF bzw. SCC“) *Vorschlag:* In datenschutz.html:107-110, im Factsheet und im AVV-Nachweis für Anthropic nur „EU-Standardvertragsklauseln (Bestandteil des Anthropic-DPA)“ schreiben. Für Cloudflare darf das DPF stehen bleiben. Einen Eintrag nur dann ergänzen, wenn er auf dataprivacyframework.gov wirklich zu finden ist. Die DPA-PDFs ablegen und die Organisation in beiden Konten auf „Webklar GbR“ stellen. Das dauert eher Minuten als Stunden.
- **DA6 · Unterlagen für den Träger fehlen, das vorhandene Datenschutz-Blatt ist veraltet** (mittel, tag, vor Termin) — Vor einem Test mit echten Klientendaten verlangt ein Träger-DSB typischerweise: (1) eine Beschreibung der Datenflüsse, (2) die Liste der Unterauftragsverarbeiter, (3) die TOMs, (4) einen AVV oder eine klare Rollenaussage, (5) einen Textbaustein für sein Verarbeitungsverzeichnis, (6) Angaben für seine Datenschutz-Folgenabschätzung (KI, Art.-9-Daten, verletzliche Personen: eine solche Prüfung ist hier naheliegend). Davon gibt es nur das Factsheet, und das ist vom 15.07.: „9 weitere Sprachen“, die alte Adresse behoerdenklar.pages.dev, kein Wort zu Web-Demo, Einrichtungs-Code oder QR-Übergabe. Im Spickzettel fehlen die Fragen „Brauchen wir einen AVV?“ und „Wer ist verantwortlich?“. Brevo (Kauf-Mails, Warteliste) fehlt im AVV-Nachweis, obwohl es genutzt wird. *Beleg:* ls rechtliches/: nur avv-nachweis.md, datenschutz-factsheet.md, datenschutzerklaerung.md, docx; repoweite Suche nach TOM/Verarbeitungsverzeichnis/Folgenabschätzung/AVV-Vertrag: 0 Treffer; datenschutz-factsheet.md:4, 9 und 79 (Stand 15.07., 9 Sprachen, pages.dev); ablaufplan.html:137ff. (keine AVV-Frage); avv-nachweis.md:39-40 (Brevo als „später“), aber proxy/src/index.ts:562-578 und demo.html:509 nutzen Brevo *Vorschlag:* Vor dem Termin nur das Nötigste: ein aktualisiertes Factsheet auf 1-2 Seiten (Datenfluss Web-Demo, Code und QR-Übergabe, Unterauftragsverarbeiter Cloudflare und Anthropic, die korrigierten Sätze aus DA4/DA5, die Rollenaussage aus DA1). Das alte Factsheet bis dahin nicht weitergeben. Brevo in den AVV-Nachweis aufnehmen. TOMs in Stichpunkten, einen Absatz fürs Verarbeitungsverzeichnis und den AVV-Entwurf beim Termin anbieten („bekommt Ihr Datenschutzbeauftragter von mir“) und innerhalb weniger Tage nachliefern. In den Spickzettel die Fragen „Brauchen wir einen AVV?“ und „Wer ist verantwortlich?“ mit Antwort aufnehmen.
- **DA7 · Live-Datenschutzerklärung kennt Einrichtungs-Code und QR-Übergabe noch nicht** (niedrig, minuten, vor Termin) — Die neuen Abschnitte 9a (Einrichtungs-Code) und 9b (Übergabe Handy/PC) stehen nur in der lokalen Datei. Live ist die Fassung vom 18.08.2026. Wird nur der Worker deployt oder die Webseite vergessen, laufen die neuen Funktionen ohne passende Datenschutzerklärung. Klickt eine Beraterin bei der Vorführung auf „Datenschutzerklärung“, findet sie nichts zum QR-Code. *Beleg:* Beobachtet: curl https://behoerdenklar.de/datenschutz zeigt „Stand: 18.08.2026“ und die Überschriften 1–12 ohne 9a/9b; lokal webseite/datenschutz.html:32 (Stand 22.10.2026), :218-257 (9a, 9b) *Vorschlag:* Nach dem Deploy der Webseite kurz live prüfen, ob „9b. Übergabe zwischen Handy und Computer“ zu sehen ist. Optional einen Prüfpunkt in tools/pruefung.js aufnehmen (auf der Live-Datenschutzseite nach „9b.“ suchen).
- **DA8 · Gemeinsamer Dienst-PC: Das Ergebnis der vorigen Klientin bleibt auf dem Bildschirm** (mittel, stunden) — Nach einer Analyse bleibt die Erklärung (Name der Behörde, Aktenzeichen, Frist, Inhalt) sichtbar, bis der nächste Brief sie ersetzt oder die Seite neu geladen wird. Einen Knopf „Fertig, vom Bildschirm löschen“ gibt es nicht. Die nächste Person am Schreibtisch kann also das Ergebnis der vorigen sehen. Das gilt auch für Ergebnisse, die per a=k vom Handy kommen. Klickt die Beraterin am PC auf „In meinen Kalender eintragen“, landet die .ics-Datei mit der Frist der Klientin im Download-Ordner des Dienst-PCs. *Beleg:* demo.html:929-947 (zeigeErgebnis öffnet die Eingabe wieder, das Ergebnis bleibt stehen); keine Funktion zum Leeren oder Zurücksetzen (grep nach reload/zurücksetzen/leeren: nur Kartenreset beim nächsten Brief, demo.html:881); demo.html:1366-1373 (Ergebnis vom Handy wird ebenfalls nur angezeigt) *Vorschlag:* Unter dem Ergebnis einen Knopf „Fertig – vom Bildschirm löschen“ einbauen: Ergebnis ausblenden, letzteDaten leeren, Häkchen zurücksetzen (siehe DA2), nach oben scrollen. Bis dahin im Spickzettel und auf dem Handzettel den Tipp geben: „Nach jedem Gespräch die Seite neu laden. Am PC keinen Kalender-Eintrag, den macht die Klientin per ‚Ergebnis aufs Handy mitnehmen‘.“
- **DA9 · Kleine Unstimmigkeiten zwischen Datenschutzerklärung und Code** (niedrig, stunden) — (a) In der Erklärung steht, die IP-Zähler würden „max. 30 Tage“ gespeichert. Im Code laufen sie nach 48 Stunden ab. Die Erklärung ist damit vorsichtiger als nötig, aber ungenau, und der Code-Kommentar redet noch von „30 Tagen“. (b) Der E-Mail-Hash wird ohne Ablaufzeit gespeichert, also dauerhaft, fehlt aber in Abschnitt 5 „Speicherdauer“. (c) Widerruf der Einwilligung über „Alle Daten löschen in den Einstellungen“ gibt es nur in der App, nicht auf der Webseite. (d) Als Datenschutz-Kontakt steht eine Gmail-Adresse. Ein Träger-DSB stört sich daran, weil Anfragen zu Klientendaten dann bei Google landen. (e) Die IP-Adressen stehen im Klartext in KV-Schlüsseln, und KV wird weltweit verteilt. Im Einrichtungs-Weg betrifft das nur falsche Code-Eingaben. *Beleg:* datenschutz.html:168 vs. proxy/src/index.ts:443 und 449-453 (TTL 48 h) sowie :73-77 (veralteter Kommentar); index.ts:456-457 (mailKey ohne TTL) vs. datenschutz.html:113-118; datenschutz.html:74-75; datenschutz.html:41 und 133; index.ts:356-357 und 723 (IP in Schlüsseln) *Vorschlag:* Speicherfristen in der Erklärung an den Code angleichen (48 Stunden), den E-Mail-Hash mit „dauerhaft, nur als Prüfsumme“ in Abschnitt 5 aufnehmen. Für die Webseite schreiben: „Widerruf jederzeit per E-Mail, wirkt für künftige Analysen.“ Als Kontakt eine Adresse @webklar.com oder @behoerdenklar.de verwenden, wie auf dem Handzettel. Optional die IP vor dem Speichern hashen.
### Technik-Check des neuen Codes
_Technisch ist der neue Code sauber gebaut. Verschlüsselung, Durable Object, Limits und Fehlerpfade sind durchdacht, nichts stürzt ab, und der geplante Vorführ-Ablauf (Arabisch am Laptop vorgewählt, ein Brief, eigenes Handy) funktioniert, soweit man ihn lokal testen kann. Flüssig ist es aber nur auf diesem Vorführ-Pfad: Bleibt der PC auf Deutsch eingestellt, kommt am PC kein Deutsch an. Ein zweiter Brief erscheint nicht am PC, und wenn das Handy neu lädt, ist die Verbindung still weg. Das größte Risiko für den 29.10.: Die zweisprachige Analyse und der ganze Handy-Ablauf sind noch nie echt gelaufen. Bis spätestens zum Wochenende muss deployt und mit einem echten Handy geprobt werden. (Pfade unten relativ zu /Users/homefolder/Behörden_App/beh-rde-brief)_
- **TE1 · PC zeigt nur dann Deutsch, wenn am PC vorher eine Fremdsprache gewählt war** (hoch, minuten, vor Termin) — Im Beratungsalltag bleibt am PC meist 'Deutsch' eingestellt. Dann steht im QR-Code kein 'auch Deutsch' (d=1), und das Häkchen dafür ist sogar ausgeblendet. Wählt die ratsuchende Person am Handy ihre Sprache (z. B. Arabisch), wird nur auf Arabisch analysiert, und die Beraterin bekommt am PC Arabisch zu sehen. Damit klappt genau das nicht, was der Handzettel verspricht ('Sie lesen die Erklärung auf Deutsch, Ihr Gegenüber gleichzeitig in seiner Sprache'). In der Vorführung fällt es nicht auf, weil laut Ablaufplan am Laptop schon Arabisch gewählt ist. Im Testmonat trifft es aber die Beraterinnen. *Beleg:* webseite/demo.html:1297 (Häkchen bei 'de' versteckt), :1300 (d nur, wenn PC-Sprache nicht 'de'), :747 (Sprache kommt aus der Auswahl am Handy), :750 (auchDeutsch nur aus d); proxy/src/index.ts:281. Lokal beobachtet: PC auf Deutsch, in der Handy-Simulation auf Arabisch umgestellt, gesendet wurde {zielsprache:'ar'} OHNE auchDeutsch. Versprechen: marketing/praesentation-mbe/handzettel.html:127. *Vorschlag:* Die Richtung stimmt, nur 'immer true' würde ein bewusst abgewähltes Häkchen übergehen. Besser so: Das Häkchen am PC immer zeigen (Standard: an), in :1300 d='1' setzen, sobald es angehakt ist, egal welche Sprache am PC gewählt ist. Am Handy bleibt :750 dann unverändert. Der Worker ignoriert auchDeutsch bei 'de' sowieso (index.ts:281).
- **TE2 · Zweisprachige Analyse ist nie gelaufen, und wenn die Übersetzung scheitert, merkt es niemand** (hoch, stunden, vor Termin) — Das Herzstück der Vorführung (PC Deutsch, Handy Arabisch, umschalten) wurde nie mit echtem KI-Schlüssel ausprobiert. Wenn die Haiku-Übersetzung scheitert, schickt der Worker still Deutsch zurück. Dann (a) zeigt das Handy ohne jeden Hinweis Deutsch, (b) zeigt der Umschalter zwei Knöpfe 'Deutsch | Deutsch', und (c) landet der Grund nur in console.log. Ohne [observability] in wrangler.toml kann man das später nicht nachlesen, nur live mit 'wrangler tail'. Außerdem laufen jetzt zwei KI-Aufrufe nacheinander (Sonnet, dann Haiku), die Wartezeit wird also länger. Die Seite verspricht 'bis zu einer Minute', bei Schriften wie Tigrinya kann die Übersetzung spürbar länger dauern (nicht gemessen). *Beleg:* proxy/src/index.ts:222-251 (jeder Fehler ergibt null), :479-484 (Rückfall: analyse_de = analyse, sprache 'de'); webseite/demo.html:857-861 (analyse_de wird immer als zweite Version angehängt). Lokal mit genau dieser Rückfall-Antwort nachgestellt: Der Umschalter zeigte ['Deutsch','Deutsch']. proxy/wrangler.toml hat keinen [observability]-Block. *Vorschlag:* 1) Gleich nach dem Deploy mit dem Musterbrief echt testen: Arabisch, Türkisch, Tigrinya, Zeit stoppen. 2) In bereiteVersionen die deutsche Version nur anhängen, wenn d.sprache !== 'de'. 3) Bei einem Rückfall im Worker z. B. 'uebersetzung_fehlgeschlagen: true' mitschicken und am Handy einen kurzen Satz zeigen ('Übersetzung hat nicht geklappt, hier auf Deutsch'). 4) In wrangler.toml '[observability] enabled = true' eintragen, dann sind Fehler im Cloudflare-Dashboard nachlesbar.
- **TE3 · Den Handy-PC-Ablauf kann man lokal nicht echt testen: früh deployen und mit echtem Handy proben** (hoch, stunden, vor Termin) — Mit einem echten Handy lässt sich der neue Ablauf lokal nicht testen. Der QR-Code enthält 'http://localhost:4173/…', und das öffnet am Handy nichts. Öffnet man die Seite übers WLAN (http://192.168.…), gilt sie nicht als lokal: Sie spricht den LIVE-Worker an (der /uebergabe noch nicht kennt), nimmt den echten Turnstile-Schlüssel (an die Domain gebunden), und ohne HTTPS fehlt crypto.subtle. Der erste echte Test passiert also erst nach dem Deploy. Beim ersten Deploy kommen neu dazu: die Durable-Object-Migration und das [[ratelimits]]-Binding. SQLite-Durable-Objects laufen laut Cloudflare-Doku im kostenlosen Tarif. Ob das Rate-Limit-Binding im kostenlosen Tarif geht, sagen die Doku-Seiten nicht eindeutig. Die Reihenfolge ist wichtig: Geht die Webseite vor dem Worker live, laufen 'Code einlösen' und die QR-Übergabe ins Leere. npm run pruefung prüft die neuen Routen nicht. *Beleg:* webseite/uebergabe.js:15-16 (Live-Worker, außer bei localhost), :93 (QR-Adresse = aktuelle Seitenadresse); webseite/demo.html:354 (Test-Sitekey nur bei localhost), :540-542; proxy/wrangler.toml:24-38; tools/pruefung.js enthält keinen Test für /code oder /uebergabe. wrangler 4.110 ist installiert (für [[ratelimits]] ist mindestens 4.36 nötig). *Vorschlag:* Spätestens am Wochenende: erst den Worker deployen (cd proxy && npx wrangler deploy), dann die Webseite. Danach eine Generalprobe genau wie im Ablaufplan: Laptop und eigenes Handy über den Hotspot, einen TEST-Code mit dem Werkzeug anlegen (nicht den MBE-Code), Arabisch, ein Brief, 'Mitnehmen', 'Guthaben aufs Handy'. Scheitert der Deploy am Rate-Limit-Binding: den [[ratelimits]]-Block und index.ts:832-836 vorerst entfernen, die Grenze von 50 Schreibvorgängen pro Übergabe schützt weiter. In pruefung.js zwei Checks ergänzen: GET /uebergabe/<22 Zeichen> mit Origin ergibt 200 {faecher:{}}, OPTIONS /code ergibt 204.
- **TE4 · Ein zweiter Brief vom Handy kommt am PC nicht mehr an** (hoch, minuten, vor Termin) — Nach dem ersten Ergebnis hört der PC auf zu warten und löscht die Übergabe. Das Handy bleibt aber im Modus 'verbunden', zeigt wieder den Hochlade-Knopf und weiter den Satz 'Die Erklärung erscheint hier und auf dem Bildschirm'. Fotografiert die Person einen zweiten Brief, sieht ihn nur das Handy, am PC passiert nichts. In der Beratung bringen Menschen oft mehrere Briefe mit. Gut möglich, dass eine Beraterin das schon bei der Vorführung ausprobieren will. *Beleg:* webseite/demo.html:1348-1352 (stoppeWarten + loeschen nach dem ersten Ergebnis), :812-816 (Handy öffnet die Eingabe wieder), :1417 (Banner-Text). Lokal nachgestellt: zwei verschlüsselte Ergebnisse nacheinander abgelegt, der PC zeigte weiter 'Kernaussage Brief 1'. *Vorschlag:* Schnell (Minuten): Nach dem ersten Ergebnis am Handy den Handy-Modus beenden und anzeigen: 'Für den nächsten Brief am Computer noch einmal auf „Lieber mit dem Handy fotografieren“ tippen.' Besser (später, Stunden): Der PC wartet weiter bis Ablauf oder Abbrechen, das Handy schickt eine laufende Nummer mit (ergebnis.nr), der PC zeigt jedes neue Ergebnis und löscht die Übergabe erst beim Abbrechen.
- **TE5 · Lädt das Handy neu, ist die Verbindung zum PC weg, und die Seite springt still in den Gratis-/Kauf-Modus** (mittel, stunden, vor Termin) — Die Schlüssel stehen nur hinter dem # und werden direkt nach dem Öffnen aus der Adresse gelöscht (gewollt, wegen Datenschutz). Lädt die Seite am Handy neu, ist der Handy-Modus weg. Das passiert durch Herunterwischen, oder wenn ältere Android-Handys den Browser im Hintergrund beenden, während die Kamera-App offen ist. Dann fehlt das Banner, stattdessen erscheinen 'Guthaben kaufen' und der Code-Bereich. Analysiert die Person trotzdem, verbraucht sie ihre eigenen Gratis-Analysen (oder wird nach ihrer E-Mail gefragt), und der PC wartet bis zu 15 Minuten vergeblich. *Beleg:* webseite/demo.html:1507-1511 (Hash wird entfernt), :1412 (handyModus liegt nur im Arbeitsspeicher). Lokal beobachtet: Handy-Simulation neu geladen, danach Banner 'none', kaufBlock 'block', codeTeil 'block'. *Vorschlag:* Die Übergabe-Daten (s, k, w, d, l und die Startzeit) zusätzlich in sessionStorage merken (gilt nur für diesen Tab, wird beim Schließen gelöscht, mit try/catch absichern) und beim Laden ohne # wiederherstellen, solange die 15 Minuten nicht um sind.
- **TE6 · Ein paar falsch getippte Codes sperren die ganze Beratungsstelle für den Tag** (mittel, minuten, vor Termin) — Pro IP-Adresse sind 10 falsche Codes am Tag erlaubt, danach wird JEDER Code abgelehnt, auch der richtige, denn die Sperre wird vor der Prüfung angewendet. In einer Beratungsstelle teilen sich alle PCs und meist auch das Gäste-WLAN eine öffentliche IP. Dazu kommt: 'MBEK7QX' ohne Bindestrich zählt als falsch, weil nur Leerzeichen entfernt werden. Umgekehrt schützt die Sperre schwächer gegen Raten, als der Kommentar behauptet: 4 Zufallszeichen aus 31 ergeben rund 920.000 Möglichkeiten, und mit IPv6 kann man die Adresse fast beliebig wechseln. Schlimmster Schaden: Das Test-Kontingent ist weg. *Beleg:* proxy/src/index.ts:719 (nur Leerzeichen raus, Großbuchstaben), :724-727 (Sperre vor der Prüfung), :732 (Fehlversuch zählen); tools/einrichtungs-code.js:82 (Code = PRÄFIX-4 Zeichen, mit Bindestrich). *Vorschlag:* Vergleichen ohne Bindestriche: im Worker code.replace(/[^A-Z0-9]/g, '') und den Bindestrich nach dem Präfix wieder einsetzen. Alternativ die Codes ohne Bindestrich speichern und beim Einlösen alles außer Buchstaben und Ziffern entfernen. Die Grenze auf etwa 30 anheben. Die restlichen Punkte passen so.
- **TE7 · Verbietet der Browser das Speichern, reagiert die Demo-Seite gar nicht mehr** (niedrig, minuten, vor Termin) — Mehrere Funktionen greifen ohne try/catch auf localStorage zu. In Browsern, die Website-Daten blockieren (Safari mit 'Alle Cookies blockieren', Firefox mit gesperrten Cookies, manche App-internen Browser), wirft schon der Zugriff einen Fehler. Folge: Das Startskript bricht ab (Handy-Knopf erscheint nicht, ein gescannter QR wird nicht ausgewertet), und 'Brief auswählen' öffnet keine Dateiauswahl. Die Person sieht einfach nichts passieren. Die Sprachwahl ist schon abgesichert, der Rest nicht. Der normale private Modus im aktuellen Safari ist nicht betroffen. *Beleg:* webseite/demo.html:594-605 und :629-630 ohne try/catch (zum Vergleich :565-566 mit try/catch). Abbruch beim Start in :1513 (zeigeStand), deshalb laufen :1514-1516 nicht mehr. Lokal nachgestellt: localStorage zum Werfen gebracht, Häkchen gesetzt, 'Brief auswählen' geklickt, Ergebnis 'Uncaught SecurityError', Dateiauswahl nicht geöffnet. *Vorschlag:* Eine kleine Hilfsfunktion 'speicher' mit get/set/remove in try/catch, die bei Fehler ein Objekt im Arbeitsspeicher nimmt. Alle localStorage-Aufrufe darüber laufen lassen. Außerdem sollte zielsprache() den aktuellen Wert der Auswahlliste nehmen, nicht nur localStorage.
- **TE8 · Der Guthaben-Zähler kann sich verzählen, und für die Auswertung gibt es keine anderen Zahlen** (mittel, minuten, vor Termin) — Das Abziehen läuft so: lesen, KI fragen (30-90 s), dann Wert minus 1 schreiben. Laufen zwei Analysen über denselben Einrichtungs-Code gleichzeitig (mehrere Beraterinnen, oder Ratsuchende zuhause), lesen beide z. B. 57 und schreiben beide 56, eine Analyse wird also nicht gezählt. KV ist außerdem nicht sofort überall aktuell. Auch das Aufladen mit dem Werkzeug kann eine gerade laufende Analyse überschreiben. Bei gekauftem Guthaben ist das eine Lücke: viele gleichzeitige Anfragen ergeben viele Analysen für 1 Credit. Für den Auswertungstermin in 4 Wochen ist der Restzähler die einzige Zahl. Es gibt kein Protokoll, wie viele Briefe an welchen Tagen in welchen Sprachen erklärt wurden. *Beleg:* proxy/src/index.ts:318-322 (lesen), :395-419 (KI-Aufruf dazwischen), :446 (walletRest - 1 schreiben); tools/einrichtungs-code.js:93-96 (aufladen = lesen + schreiben). Cloudflare-KV-Doku: Änderungen erst 'bis zu 60 Sekunden oder mehr' später an anderen Standorten sichtbar, keine atomaren Operationen. *Vorschlag:* Vor dem 29.10. (Minuten): pro Analyse über einen Einrichtungs-Code einen eigenen KV-Schlüssel schreiben, z. B. 'nutzung:<walletId>:<datum>:<zufall>' mit der Sprache als Wert. Jeder Schlüssel ist eindeutig, also kein Verzählen. Zählen mit 'wrangler kv key list --prefix nutzung:<walletId>'. Workers-Logs eignen sich dafür nicht, sie werden nur wenige Tage aufbewahrt. Später (Stunden): Guthaben pro Wallet in einem Durable Object führen (atomar, wie bei der Übergabe), vor dem KI-Aufruf reservieren und bei Fehler zurückbuchen.
- **TE9 · 'Ergebnis aufs Handy mitnehmen': Auf einem fremden Handy fehlt die Übersetzung der Anruf-Sätze** (mittel, minuten, vor Termin) — Ob unter jedem deutschen Telefon-Satz die Übersetzung steht, hängt an der Sprache, die im Browser des Handys gespeichert ist, nicht an der Sprache des Ergebnisses. Der Mitnehmen-QR enthält keine Sprache. Auf dem Handy einer ratsuchenden Person, die die Seite noch nie offen hatte, ist 'de' gespeichert, also werden z. B. die arabischen Bedeutungen der Anruf-Sätze ausgeblendet. In der Vorführung fällt das nicht auf, weil Justins Handy vorher per QR auf Arabisch gestellt wurde. *Beleg:* webseite/demo.html:1133 (mitBedeutung = zielsprache() !== 'de'), :1383 (Mitnehmen-QR nur mit a, s, k), :563-568 (zielsprache aus URL oder localStorage). *Vorschlag:* zeigeAnruf die Sprache der gerade angezeigten Version mitgeben (versionen[aktiveVersion].code) und mitBedeutung = code !== 'de' setzen. Alternativ l=<sprache> in den Mitnehmen-QR schreiben.
- **TE10 · Nach einem Fehler dieselbe Datei nochmal wählen: Es passiert nichts** (niedrig, minuten, vor Termin) — Das Datei-Feld wird nie geleert, und Browser melden eine Dateiauswahl nur, wenn sie sich ändert. Wer nach 'KI ausgelastet, bitte erneut versuchen' denselben Scan oder dasselbe PDF wieder auswählt (typisch am Beratungs-PC), sieht keine Reaktion. Mit der Handy-Kamera passiert das nicht, weil jedes Foto eine neue Datei ist. *Beleg:* webseite/demo.html:678-680 (nur das change-Ereignis startet die Analyse). Die Datei enthält nirgends 'dateiFeld.value = ""'. Fehlerpfade danach: :760-799 und :828-833. *Vorschlag:* In starteAnalyse direkt am Anfang (nachdem die Datei übergeben wurde) dateiFeld.value = '' setzen.
- **TE11 · Werkzeug einrichtungs-code.js: Ein Tippfehler kann unbegrenztes Guthaben erzeugen** (niedrig, minuten, vor Termin) — '--briefe' ohne gültige Zahl ergibt NaN. Der Worker prüft nur 'walletRest <= 0', und 'NaN <= 0' ist falsch, also hätte der Code unbegrenzt viele Analysen. '--bis' wird nicht geprüft: '31.12.2026' wird als Text mit '2026-10-29' verglichen und läuft praktisch nie ab. Ist der wrangler-Login abgelaufen, meldet 'stand' fälschlich 'Code gibt es nicht', weil jeder Lesefehler als 'nicht vorhanden' gilt. Relevant, weil Justin den MBE-Code vor dem Termin mit diesem Werkzeug anlegt. *Beleg:* tools/einrichtungs-code.js:80-81 (keine Prüfung von --briefe/--bis), :29-31 (jeder Fehler wird zu null); proxy/src/index.ts:322 + :327 (NaN kommt durch), :324 (Datum als Text verglichen). *Vorschlag:* Im Werkzeug abbrechen, wenn briefe keine Zahl größer 0 ist oder bis nicht im Format JJJJ-MM-TT vorliegt. Im Worker 'if (!(walletRest > 0))' statt 'if (walletRest <= 0)'. Beim Lesen nur bei 'nicht gefunden' null zurückgeben, sonst den Fehler anzeigen. Nach dem Anlegen einmal 'stand' ausführen und die Werte prüfen.
### Angebot und Betrieb nach dem Termin
_Das Angebot ist für eine MBE einladend und ohne Risiko: kostenlos, kein Vertrag, Ratsuchende zahlen nichts, ein Code für alle, und der Datenschutz ist ehrlich erklärt. Der Alltag nach dem Termin ist aber noch nicht bequem genug. Es gibt nichts, was den Code zu den Ratsuchenden bringt (kein Aushang, keine Karte, nichts in ihren Sprachen). Das Testende ist so eingestellt, dass der Zugang ungefähr am Auswertungstag ausläuft, und niemand bekommt vorher eine Erinnerung. Die Beratungsstelle sieht ihren Verbrauch kaum. Für die Zeit nach dem Test fehlen ein schriftliches Angebot und eine Rechnung, wie Träger sie brauchen. Dazu kommt ein echter Fehler: Wer die 2 Gratis-Analysen schon verbraucht hat, sieht das Code-Feld gar nicht mehr. Fast alles davon ist mit wenigen Stunden Arbeit bis zum 29.10. lösbar._
- **AN1 · Wer die 2 Gratis-Analysen schon verbraucht hat, sieht das Code-Feld nicht mehr** (hoch, minuten, vor Termin) — Das Feld 'Sie haben einen Code von einer Beratungsstelle?' liegt innerhalb des Eingabebereichs. Wenn in einem Browser schon 2 Gratis-Analysen gemacht wurden, blendet die Seite diesen ganzen Bereich aus. Dann bleiben nur noch die Kauf-Knöpfe (2,99 €/6,99 €) und die Warteliste. Das Code-Feld ist nicht mehr zu finden. Das trifft genau die Richtigen: Beraterinnen, die den Link aus Justins Mails (outreach-september.md:50) am Büro-PC schon ausprobiert haben, und Ratsuchende, die BehördenKlar schon kennen. Sie können den Code vom Zettel nicht eintippen und landen beim Bezahlen. Nur der QR-Code oder der vollständige Link funktioniert dann noch. *Beleg:* demo.html:287 (div#eingabe) umschließt demo.html:372-377 (details#codeTeil). demo.html:658-661 setzt bei benutzt()>=2 eingabe.style.display='none'. Lokal im Browser geprüft (bk_demo_v2=2): #eingabe display:none, Code-Feld unsichtbar. Sichtbar sind nur noch '5 Analysen 2,99 €', '15 Analysen 6,99 €', Kauf-Häkchen und Warteliste. *Vorschlag:* Der Vorschlag passt (details#codeTeil hinter #eingabe setzen; zeigeStand steuert es schon selbst). Danach zwei Fälle testen: localStorage bk_demo_v2=2 und eine Antwort 'aufgebraucht' vom Worker. Darauf achten, dass das Feld nicht beim Laden der Analyse und nicht im Mitnehmen-Modus (a=m) am Handy unter dem Ergebnis auftaucht. Gegebenenfalls in starteAnalyse und pruefeUebergabe auch codeTeil ausblenden.
- **AN2 · Der Test endet ungefähr am Auswertungstag, und niemand bekommt eine Erinnerung** (mittel, minuten, vor Termin) — '--monate 1' rechnet einen Monat ab dem Tag, an dem der Code angelegt wird. Wird er wie geplant am Vorabend (28.10.) angelegt, gilt er bis 28.11., also nur 2 Tage nach der Auswertung am 26.11. Wird er schon jetzt für den Druck angelegt (22.10.), endet er am 22.11., also VOR der Auswertung. Sagt die MBE am 26.11. 'Ja', laufen Angebot, Bestellung und Rechnung beim Träger länger als 2 Tage. In dieser Lücke bekommen Ratsuchende 'abgelaufen. Bitte fragen Sie dort nach.' Danach wird ihr Zugang gelöscht und die Seite bietet ihnen den Kauf für 2,99 € an. Das widerspricht dem Versprechen 'Ratsuchende zahlen nichts'. Außerdem ist 1 Monat für eine kleine MBE knapp: Die erste Woche geht für Team-Info und Aushang drauf, und viele Ratsuchende kommen erst Wochen später wieder. Bis zur Auswertung gibt es also wenig Erfahrung mit der Nutzung zu Hause. Weder die MBE noch Justin wird an das Testende erinnert, und auf dem Handzettel steht kein Datum. *Beleg:* einrichtungs-code.js:46-50 und :81 (Ablauf = heute + 1 Monat). proxy/src/index.ts:324-326 und :735-736 (nach dem Ablaufdatum gesperrt). demo.html:783-789 (Zugang wird gelöscht, zeigeStand zeigt den Kaufbereich, demo.html:655). ablaufplan.html:88 (Auswertung 26.11.) und :114 (Code am Vorabend). handzettel.html:170 ('1 Monat', kein Datum). *Vorschlag:* Code mit festem Datum anlegen, das deutlich nach der Auswertung liegt, z. B. --bis 2026-12-18 oder 2026-12-31. Dann aber auch Handzettel (handzettel.html:170 '1 Monat') und den Satz im Ablaufplan (Zeile 87 'einen Monat') anpassen, z. B. 'Test bis 18.12., nach 4 Wochen schauen wir gemeinsam'. Sonst widersprechen sich Zettel und Code. Kalender-Erinnerung 7 Tage vor Ablauf. Bei Zusage sofort 'verlaengern', also bevor der Zugang abläuft und die Seiten der Ratsuchenden den Zugang löschen.
- **AN3 · Nichts bringt den Code zu den Ratsuchenden (kein Aushang, keine Karte, nichts in ihren Sprachen)** (mittel, stunden, vor Termin) — Der Handzettel ist für Beraterinnen gemacht: deutsch, dichter Text in 9 pt, A4, 5 Stück. Der Code steht nur in einem kleinen Kasten 'Code für Ihre Ratsuchenden'. Ratsuchende bekommen also nur etwas, wenn die Beraterin jedem einzeln das A4-Blatt hinhält oder den Code diktiert. Dann bleibt das Versprechen in der Überschrift ('verstehen den Brief, bevor sie zu Ihnen kommen') leer, denn zu Hause hat niemand den Code. Für Beraterinnen ist das zusätzliche Arbeit in jedem Termin, und das ist erfahrungsgemäß der häufigste Grund, warum ein Test einschläft. Die Seite hinter dem QR-Code ist außerdem ganz deutsch ('Gratis-Demo', '2 Gratis-Analysen', Einverständnis-Häkchen). Wer kein Deutsch liest, weiß nicht, dass er zuerst das Häkchen setzen muss. *Beleg:* handzettel.html:93-99 (richtet sich an die Beratungsstelle), :172-175 (der einzige QR mit Code). demo.html:2 lang=de, :284 'Antrag auf Klartext · 2 Gratis-Analysen' (bleibt auch mit Code so), :305-315 Einverständnis auf Deutsch. Lokal geprüft: /demo.html?code=…&sprache=ar stellt die Sprache auf Arabisch, die Bedienung bleibt deutsch. *Vorschlag:* Vor dem 29.10. reicht eine einfache Version: ein A5-Aushang und A7-Karten mit großem QR (Code schon im Link), 'kostenlos' und 3 Symbol-Schritte (Häkchen, Foto, Sprache). Text auf Deutsch, höchstens mit 1-2 Sätzen in den Hauptsprachen der MBE. Mehrsprachige Texte und eigene QRs pro Sprache besser NACH dem Termin gemeinsam mit den Beraterinnen machen: Sie wissen, welche Sprachen gebraucht werden, und können gegenlesen. Ungeprüfte KI-Übersetzungen (z. B. Tigrinya, Paschtu, siehe FEATURES.md) nicht ungeprüft drucken.
- **AN4 · Die Beratungsstelle sieht kaum, wie viel verbraucht ist, und für die Auswertung gibt es nur eine einzige Zahl** (niedrig, stunden) — Die Datenschutzerklärung verspricht, dass die Beratungsstelle sieht, 'wie viele Analysen noch übrig sind'. Das geht aber nur über die Zahl im Banner im eigenen Browser. Diese Zahl ist im Browser gespeichert und wird nur aktualisiert, wenn dieser Browser selbst etwas tut. Briefe, die Ratsuchende zu Hause machen, sieht die Beraterin nicht. Ein Ablaufdatum wird nirgends angezeigt, obwohl der Worker es beim Einlösen mitschickt. Für die MBE heißt das: Sie muss Justin anrufen. Justin selbst bekommt mit 'stand' nur 'Übrig: X Briefe'. Bei der Auswertung am 26.11. kann er also nur sagen: '23 Briefe verbraucht'. Er weiß nicht, wann (abends oder in der Beratung), in welchen Sprachen und ob sie von MBE-Ratsuchenden kamen. Dabei sind genau diese Zahlen das stärkste Argument für das Bezahlen. *Beleg:* datenschutz.html:224-225 (Versprechen). demo.html:620-623 und :643-645 (Banner liest den gespeicherten Wert). proxy/src/index.ts:742 schickt 'ablauf' mit, in demo.html kommt 'ablauf' kein einziges Mal vor (grep). einrichtungs-code.js:61-69 (zeigt nur Übrig und Gültig bis). index.ts:446 (es wird nur heruntergezählt). *Vorschlag:* Nur die kostenlosen Teile übernehmen: wöchentliche Stand-Mail aus 'stand' und den Beraterinnen sagen 'Link vom Zettel neu öffnen, dann stimmt die Zahl'. Für die Auswertung reicht eine kurze Strichliste oder 3 Fragen. 'gültig bis' im Banner anzeigen ist ein kleiner Gewinn für später. Zusätzliche Zählung nach Sprache und Zeit erst dann, wenn die Datenschutzerklärung angepasst ist.
- **AN5 · Kein Angebot und keine Rechnungsvorlage für die Zeit nach dem Test, und die Pakete sind für Träger zu kleinteilig** (mittel, stunden) — Die Preise gibt es nur intern, 'nur im Gespräch' (100 Briefe 20 €, 500 Briefe 75 €). Auf dem Handzettel steht nur 'festes Briefkontingent zu einem Preis für Beratungsstellen'. Ein Träger kann ohne schriftliches Angebot nichts bestellen und ohne ordentliche Rechnung nichts per Überweisung bezahlen. Im Repo gibt es weder Angebot noch Rechnung, und die AGB gelten nur für Verbraucher, die mit Stripe kaufen. Kleine 20-€-Pakete bedeuten außerdem: Jedes Mal, wenn sie leer sind, braucht es einen Anruf, eine neue Rechnung und eine neue Zahlungsanweisung. Der Verwaltungsaufwand ist dann größer als der Betrag. Die interne Notiz 'Den Einrichtungs-Code gibt es technisch noch nicht' ist außerdem veraltet. *Beleg:* outreach-september.md:314-335 (Preisblatt, Zeile 334 veraltet). handzettel.html:161-164 (keine Zahl). grep nach Rechnung/Angebot/IBAN in marketing/ und rechtliches/: nur Treffer im Musterbrief. agb.html:44-45 (Verbraucher). FEATURES.md: Kleinunternehmer § 19. *Vorschlag:* Bis zum 26.11. ein einseitiges Angebot vorbereiten (Leistung, Briefzahl, Laufzeit, Endpreis mit Hinweis auf § 19 UStG, Zahlung auf Rechnung). Für die Rechnung die vorhandene Webklar-Vorlage nehmen, falls es eine gibt. Ein Jahreskontingent mit fester Briefzahl und einer Rechnung pro Jahr ist sinnvoll ('Jahreslizenz mit X Briefen' steht schon in outreach-september.md). Nachladen aber nur gegen neue Rechnung im Voraus, damit die eigene Regel 'erst bezahlt, dann genutzt' gilt. Die veraltete Zeile 334 korrigieren.
- **AN6 · Das Datenschutz-Blatt für Beratungsstellen ist veraltet und sagt etwas Falsches über die Webseite** (mittel, stunden, vor Termin) — Bevor ein Träger einen Test erlaubt, fragt erfahrungsgemäß die Leitung oder die Datenschutzbeauftragte nach einer Unterlage. Die einzige Unterlage dafür ist vom 15.07. Darin stehen '9 weitere Sprachen', die alte Domain behoerdenklar.pages.dev und eine Gmail-Adresse. Vor allem steht dort: 'die Briefe ... liegen verschlüsselt auf deren eigenem Handy, nicht bei uns'. Das stimmt nur für die App. Im eigenen Ablaufplan steht genau das unter 'Nicht sagen'. Einrichtungs-Code und PC-Handy-Übergabe kommen im Blatt gar nicht vor. Schickt Justin dieses Blatt nach dem Termin, widerspricht es dem Handzettel und kann den Teststart verzögern. *Beleg:* rechtliches/datenschutz-factsheet.md Zeile 4 (Stand 15.07., pages.dev), Zeile 9 ('9 weiteren Sprachen'), Zeilen 17-19 ('liegen verschlüsselt auf deren eigenem Handy'). ablaufplan.html:147 ('Alles bleibt auf dem Handy: Das stimmt für die Webseite nicht'). Aktuelle Fassung in datenschutz.html:218-228 (9a/9b). *Vorschlag:* Der Vorschlag passt. Ergänzung: Im Termin kurz sagen 'Das Datenschutz-Blatt aus dem Juli beschrieb die App. Für die Webseite gilt dieses neue Blatt.' Wenn die Zeit vor dem 29.10. knapp ist, reicht auch ein Ausdruck der aktuellen datenschutz.html (Abschnitte zur Demo, 9a und 9b) als Übergangslösung. Das alte factsheet/PDF als veraltet markieren, damit es nicht noch einmal verschickt wird.
- **AN7 · Ein Leerzeichen statt Bindestrich zählt als falscher Code, und 10 Fehler sperren das ganze Büro für den Tag** (mittel, minuten, vor Termin) — Der Worker entfernt nur Leerzeichen. Wer 'MBE K7QX' oder 'MBEK7QX' tippt, bekommt 'Diesen Code kennen wir nicht', und das zählt als Fehlversuch. Nach 10 Fehlversuchen pro IP-Adresse und Tag ist Schluss. Die Sperre wird geprüft, BEVOR der Code geprüft wird, also wird dann auch der richtige Code abgelehnt ('Bitte versuchen Sie es morgen wieder'). In einer Beratungsstelle teilen sich alle Büro-PCs und oft auch das WLAN für Gäste eine IP-Adresse. Ein paar Tippfehler von Ratsuchenden reichen, und an diesem Tag kann im ganzen Haus niemand mehr einen Code einlösen. *Beleg:* proxy/src/index.ts:719 (.replace(/\s+/g,'') entfernt nur Leerzeichen, fügt keinen Bindestrich ein), :688 (CODE_FEHLVERSUCHE_PRO_TAG = 10), :723-727 (die Sperre kommt vor der Code-Prüfung), :731-733 (jeder unbekannte Code wird gezählt). demo.html:1235 (die Seite macht nur Großbuchstaben). Lokal per curl getestet: unbekannter Code ergibt code_unbekannt. *Vorschlag:* Im Worker alles außer A-Z und 0-9 entfernen und den Bindestrich vor den letzten 4 Zeichen selbst einsetzen. Dann gehen 'mbe k7qx', 'MBEK7QX' und 'MBE-K7QX'. Die Grenze auf etwa 30 pro Tag anheben: Bei 31^4 möglichen Codes pro Präfix bleibt Raten trotzdem aussichtslos. Das geht in den Deploy, der vor dem 29.10. sowieso ansteht.
- **AN8 · Den Test im Termin starten, nicht danach, und den Weg 'Zugang aufs Handy' zeigen** (mittel, minuten, vor Termin) — Im Ablaufplan endet das Angebot damit, dass der Handzettel übergeben wird ('Der Code steht hier auf dem Zettel'). Danach muss die MBE selbst anfangen: Code einlösen, Kolleginnen informieren, Ratsuchenden erklären. Erfahrungsgemäß bleibt das im Alltag liegen. Der bequemste Weg im Alltag kommt weder in der Vorführung noch auf dem Handzettel vor: Am Beratungs-PC auf '📱 Auch auf dem Handy nutzen' klicken. Die Ratsuchende scannt den QR-Code und kann danach zu Hause selbst Briefe erklären lassen, ohne Zettel und ohne Tippen. Gezeigt wird nur 'Ergebnis mitnehmen'. *Beleg:* ablaufplan.html:85-88 (Übergabe nur auf Papier), :70-76 (Vorführung ohne a=g). handzettel.html:125-132 (nur 'Beratung am PC' und 'Ergebnis zum Mitnehmen'). demo.html:294 und :1392-1397 (Knopf 'Auch auf dem Handy nutzen' gibt Zugang und Name der Stelle weiter, Art a=g). demo.html:1457 ('Übernommen. BehördenKlar ist für Sie kostenlos, über …'). *Vorschlag:* Der Vorschlag passt, mit einer Änderung: Für den Schritt 'Auch auf dem Handy nutzen' vorher den MBE-Code am Laptop einlösen (Handzettel-QR oder ?code=), sonst geht der Vorführ-Zugang weiter. Alternativ den Knopf nur zeigen und erklären, aber nicht scannen lassen. Die Zeile auf dem Handzettel ergänzen.
- **AN9 · Ohne eingetragenen Code führt der QR auf dem Handzettel zur Kaufseite** (niedrig, minuten, vor Termin) — Das vorhandene handzettel.pdf/png wurde ohne Code erzeugt: Dort steht 'wird beim Termin eingetragen', und der QR zeigt nur auf behoerdenklar.de/demo. Druckt Justin diese Fassung oder trägt den Code nur von Hand ein, landen alle, die den QR scannen (also der bequemste Weg), in der normalen Gratis-Demo. Nach 2 Briefen kommt dort der Kauf für 2,99 €. Nur wer den Code von Hand eintippt, nutzt den Zugang der MBE. Das ist das Gegenteil von 'Ratsuchende zahlen nichts'. *Beleg:* handzettel.html:190-191 (CODE='' ergibt QR auf https://behoerdenklar.de/demo), :197 (Platzhaltertext). handzettel.png angesehen: Platzhalter 'wird beim Termin eingetragen', Link 'behoerdenklar.de/demo'. Der Haken 'MBE-Code angelegt, im Handzettel eingetragen' steht in ablaufplan.html:114. *Vorschlag:* Die Checkliste in ablaufplan.html:113-115 um 2 Punkte ergänzen: 'gedruckten QR mit dem Handy getestet, es erscheint Kostenlos über MBE Donnersberg' und 'alte handzettel.pdf/png ohne Code nicht mehr verwenden'. Den Rest gibt es schon.
+84
View File
@@ -0,0 +1,84 @@
# Preise für Beratungsstellen
> Stand 25.10.2026. Ergebnis der Preis-Prüfung (Kosten, Beschaffung, Vergleichspreise,
> 3 Modelle, bewertet aus Sicht von Träger und Gründer, Faktencheck).
> **Entscheidung von Justin (25.10.):** Am 29.10. nennt er auf Nachfrage **290 € im Jahr**.
> Ersetzt die alte Tabelle in `outreach-september.md` (100 Briefe 20 €, 500 Briefe 75 €).
> Alle Beträge sind Endpreise. Nach § 19 UStG wird keine Umsatzsteuer berechnet.
## Preisliste (Vorschlag)
| Paket | Preis pro Kalenderjahr | Briefe | pro Brief bei voller Nutzung |
|---|---|---|---|
| Test | 0 € | bis 100, 1 Monat | – |
| Klein (ca. 1 Beratende) | 190 € | 600 | ca. 32 ct |
| **Standard (2–5 Beratende)** | **290 €** | **1.200** | ca. 24 ct |
| Groß (6+ oder mehrere Standorte) | 450 € | 2.400 | ca. 19 ct |
| Träger ab 3 Stellen (FID schon ab der 2.) | 160 / 260 / 420 € | wie oben | – |
| Verband oder Land, ab 20 Stellen | 130 / 230 / 390 € | wie oben | – |
| Privatleute (unverändert) | 2,99 € / 6,99 € | 5 / 15 | 60 / 47 ct |
- Ein Code für das ganze Team, eine Rechnung im Januar, Überweisung in 30 Tagen.
- Kein Abo. Endet am 31.12. von selbst, Restbriefe verfallen dann.
- Nie „unbegrenzt“, immer eine feste Briefzahl.
- Untergrenze beim Verhandeln: **15 ct pro Brief** bei voller Nutzung (alt: 10 ct).
## Was am Do 29.10. gesagt wird (nur auf Nachfrage)
> „Über Ihren Code zahlen Ihre Ratsuchenden auch danach nichts. Für eine Stelle Ihrer Größe
> sind es voraussichtlich 290 Euro im Jahr für bis zu 1.200 Briefe. Endpreis, eine Rechnung im
> Januar, endet am 31. Dezember von selbst. Das ist ein Richtpreis, das genaue Angebot bringe
> ich am 26. November mit.“
Nicht nennen: den Pilotpreis von 190 €, „24 € im Monat“, Cent pro Brief, die alten Pakete.
## Angebot für die MBE Donnersberg am 26.11. (Vorschlag)
1. **Brücke, 0 €:** Bei einer Zusage den Code am selben Tag bis 31.12.2026 verlängern, bei Bedarf
100 Briefe aufladen. Läuft die Bestellung im Januar noch, bis 31.01.2027.
`node tools/einrichtungs-code.js verlaengern <CODE> 2026-12-31`
2. **Pilotjahr 2027, 190 €:** Standard-Paket (1.200 Briefe) zum Klein-Preis, offen als Rabatt auf
den Listenpreis. Gilt für jede Stelle, die 2027 nach einem Test startet.
3. **Preisobergrenze 2028 und 2029:** höchstens 290 € im Jahr, Endpreis, auch falls Webklar
umsatzsteuerpflichtig wird. Die MBE-Förderrichtlinie gilt bis 31.12.2029, bewilligt wird
aber jedes Jahr einzeln.
4. **Gegenleistung:** Rückmeldung nach 3 und nach 12 Monaten. Als Referenz nur mit Zustimmung.
Rabatte gehen an die Einrichtung, nie an Personen.
## Was übrig bleibt (Schätzung, nicht gemessen)
Ein zweisprachiger Brief kostet an KI ca. 3,8 ct, mit Puffer 4,6 ct, ungünstig 10,8 ct,
mehrseitiges PDF ca. 13 ct (Sonnet 5: 2 $/10 $, Haiku 4.5: 1 $/5 $ je Mio. Tokens).
Stripe entfällt (Überweisung), Cloudflare wahrscheinlich 0 €.
| Standard, 290 € | KI-Kosten | Bleibt übrig (vor Steuern) |
|---|---|---|
| halbe Nutzung (600 Briefe) | ca. 28 € | ca. 262 € |
| volle Nutzung, normal | ca. 55 € | ca. 235 € |
| volle Nutzung, ungünstig | ca. 130 € | ca. 160 € |
| Pilot 190 €, voll, ungünstig | ca. 130 € | ca. 60 € |
Arbeit pro Stelle: ca. 4 Std. im 1. Jahr, ca. 2 Std. danach.
## Vor dem Angebot am 26.11. erledigen
- [ ] Echte Kosten messen (`usage` im Worker mitschreiben oder Anthropic-Konsole / Zahl der Analysen).
Liegen sie deutlich über 5 ct pro Brief: Pilotpreis neu prüfen.
- [ ] PDF-Seitenlimit einbauen (heute nur Dateigröße, proxy/src/index.ts).
- [ ] Angebotsvorlage (1 Seite) und Rechnungsvorlage nach § 34a UStDV, mit „MBE 2027“ und Leistungszeitraum.
- [ ] Bedingungen für Einrichtungen (die AGB gelten heute nur für Verbraucher).
- [ ] AVV, TOMs, Unterauftragsverarbeiter, Angaben für eine Folgenabschätzung: ohne die kauft kein Träger.
- [ ] Steuerberater: Umsatz der ganzen Webklar GbR gegen die 25.000-€-Grenze (§ 19 UStG), § 13b für Anthropic.
- [ ] Code-Werkzeug: Befehl `setzen` für den Jahreswechsel. Heute zählt `aufladen` zum Rest dazu.
- [ ] Monatlich `stand <CODE>` prüfen und vor 0 aufladen. Eine automatische 80-%-Warnung gibt es noch nicht.
## Gut zu wissen
- 2027 kommt das Geld voraussichtlich aus der Sachkostenpauschale oder aus Eigenmitteln. Den Antrag
für 2027 reicht die Zentralstelle schon bis 15.11.2026 ein. Ab 2028 kann der Träger BehördenKlar
als IT-Dienstleistung beantragen (Förderrichtlinie 2027, Ziff. 5.3.1 d, Antrag bis 15.11.2027).
- Konkurrenz: DokLotse Organisation S 348 € im Jahr (30 Analysen im Monat, 4 Sprachen).
KlarBrief bietet Behörden und Beratungsstellen kostenlose Piloten an, Preis auf Anfrage.
- Echte Behörden (Jobcenter, Ausländerbehörde) sind ein eigener Markt mit eigener Beschaffung und
bekommen später eine eigene, eher höhere Preisliste.
- Keine Rechts- oder Steuerberatung. Rechtsfragen beantwortet der Träger bzw. ein Steuerberater.
+56 -12
View File
@@ -245,7 +245,8 @@ async function uebersetzeAnalyse(env: Env, analyse: unknown, sprachName: string)
if (d.stop_reason !== 'end_turn' || !text) return null; if (d.stop_reason !== 'end_turn' || !text) return null;
return JSON.parse(text); return JSON.parse(text);
} catch (e) { } catch (e) {
console.log('Übersetzung fehlgeschlagen', String(e)); // Nur den Fehlertyp loggen: JSON.parse-Meldungen zitieren Teile der Eingabe (= Briefinhalt)
console.log('Übersetzung fehlgeschlagen', e instanceof Error ? e.name : 'unbekannt');
return null; return null;
} }
} }
@@ -392,7 +393,9 @@ async function demoHandler(request: Request, env: Env): Promise<Response> {
? { type: 'document', source: { type: 'base64', media_type: 'application/pdf', data: bild } } ? { type: 'document', source: { type: 'base64', media_type: 'application/pdf', data: bild } }
: { type: 'image', source: { type: 'base64', media_type: mimeType, data: bild } }; : { type: 'image', source: { type: 'base64', media_type: mimeType, data: bild } };
const antwort = await fetch(ANTHROPIC_URL, { let antwort: Response;
try {
antwort = await fetch(ANTHROPIC_URL, {
method: 'POST', method: 'POST',
headers: { headers: {
'content-type': 'application/json', 'content-type': 'application/json',
@@ -417,6 +420,10 @@ async function demoHandler(request: Request, env: Env): Promise<Response> {
], ],
}), }),
}); });
} catch (e) {
console.log('Demo-KI nicht erreichbar', String(e));
return demoFehler(503, 'ki', 'Der KI-Dienst ist gerade nicht erreichbar. Bitte versuchen Sie es in einer Minute erneut.', origin);
}
if (!antwort.ok) { if (!antwort.ok) {
const status = antwort.status; const status = antwort.status;
@@ -433,7 +440,13 @@ async function demoHandler(request: Request, env: Env): Promise<Response> {
return demoFehler(502, 'ki', 'Die Analyse ist fehlgeschlagen. Bitte versuchen Sie es mit einem neuen, gut beleuchteten Foto.', origin); return demoFehler(502, 'ki', 'Die Analyse ist fehlgeschlagen. Bitte versuchen Sie es mit einem neuen, gut beleuchteten Foto.', origin);
} }
const daten = (await antwort.json()) as { let datenRoh: unknown;
try {
datenRoh = await antwort.json();
} catch {
return demoFehler(502, 'ki', 'Die KI hat keine verwertbare Antwort geliefert. Bitte erneut versuchen.', origin);
}
const daten = datenRoh as {
stop_reason?: string; stop_reason?: string;
content?: { type: string; text?: string }[]; content?: { type: string; text?: string }[];
}; };
@@ -444,6 +457,17 @@ async function demoHandler(request: Request, env: Env): Promise<Response> {
if (bezahlt) { if (bezahlt) {
// Bezahlte Analyse: Guthaben um 1 verringern (kein TTL — bleibt bestehen) // Bezahlte Analyse: Guthaben um 1 verringern (kein TTL — bleibt bestehen)
await env.RATE_LIMIT.put(`wallet:${walletId}`, String(walletRest - 1)); await env.RATE_LIMIT.put(`wallet:${walletId}`, String(walletRest - 1));
if (einrichtungsName) {
// Für die Auswertung mit der Beratungsstelle: nur Datum und Sprache,
// kein Briefinhalt, kein Bezug zu einer Person. Ein Schlüssel pro
// Analyse, damit gleichzeitige Analysen sich nicht überschreiben.
// Lesen: node tools/einrichtungs-code.js stand <CODE>
await env.RATE_LIMIT.put(
`nutzung:${walletId}:${heute}:${sprachCode}:${crypto.randomUUID().slice(0, 8)}`,
'1',
{ expirationTtl: 60 * 60 * 24 * 390 }, // < 13 Monate (siehe Datenschutzerklärung 9a)
);
}
} else { } else {
const schreiben: Promise<void>[] = [ const schreiben: Promise<void>[] = [
env.RATE_LIMIT.put(tagKey, String(tagZahl + 1), { expirationTtl: TAG_TTL }), env.RATE_LIMIT.put(tagKey, String(tagZahl + 1), { expirationTtl: TAG_TTL }),
@@ -476,11 +500,18 @@ async function demoHandler(request: Request, env: Env): Promise<Response> {
let analyseDe: unknown = undefined; let analyseDe: unknown = undefined;
let ausgabeSprache = sprachCode; let ausgabeSprache = sprachCode;
let uebersetzungFehlgeschlagen = false;
if (zweisprachig) { if (zweisprachig) {
analyseDe = analyse;
const uebersetzt = await uebersetzeAnalyse(env, analyse, sprachName); const uebersetzt = await uebersetzeAnalyse(env, analyse, sprachName);
if (uebersetzt) analyse = uebersetzt; if (uebersetzt) {
else ausgabeSprache = 'de'; // lieber Deutsch als gar nichts analyseDe = analyse;
analyse = uebersetzt;
} else {
// lieber Deutsch als gar nichts — aber nur EINE Fassung schicken,
// sonst zeigt die Seite zwei Knöpfe „Deutsch | Deutsch"
ausgabeSprache = 'de';
uebersetzungFehlgeschlagen = true;
}
} }
return Response.json( return Response.json(
@@ -491,6 +522,7 @@ async function demoHandler(request: Request, env: Env): Promise<Response> {
guthaben: bezahlt ? walletRest - 1 : undefined, guthaben: bezahlt ? walletRest - 1 : undefined,
einrichtung: einrichtungsName ?? undefined, einrichtung: einrichtungsName ?? undefined,
sprache: ausgabeSprache, sprache: ausgabeSprache,
uebersetzung_fehlgeschlagen: uebersetzungFehlgeschlagen || undefined,
}, },
{ headers: demoCorsHeaders(origin) } { headers: demoCorsHeaders(origin) }
); );
@@ -685,7 +717,15 @@ async function kaufStatusHandler(request: Request, env: Env): Promise<Response>
// Der zufällige Teil im Code macht Raten aussichtslos; zusätzlich sind // Der zufällige Teil im Code macht Raten aussichtslos; zusätzlich sind
// Fehlversuche pro IP und Tag begrenzt. // Fehlversuche pro IP und Tag begrenzt.
const CODE_FEHLVERSUCHE_PRO_TAG = 10; // Großzügig, weil sich eine ganze Beratungsstelle eine IP teilt. Raten bleibt
// trotzdem aussichtslos: 31^4 ≈ 920.000 Codes je Präfix.
const CODE_FEHLVERSUCHE_PRO_TAG = 30;
/** „mbe k7qx", „MBEK7QX", „MBE-K7QX" → „MBE-K7QX" (Bindestrich vor den letzten 4 Zeichen). */
function normCode(eingabe: string): string {
const roh = eingabe.toUpperCase().replace(/[^A-Z0-9]/g, '');
return roh.length > 4 ? `${roh.slice(0, -4)}-${roh.slice(-4)}` : roh;
}
interface Einrichtung { interface Einrichtung {
name: string; name: string;
@@ -716,7 +756,7 @@ async function codeHandler(request: Request, env: Env): Promise<Response> {
} catch { } catch {
return demoFehler(400, 'json', 'Ungültige Anfrage.', origin); return demoFehler(400, 'json', 'Ungültige Anfrage.', origin);
} }
const code = typeof body.code === 'string' ? body.code.trim().toUpperCase().replace(/\s+/g, '') : ''; const code = typeof body.code === 'string' ? normCode(body.code) : '';
const ip = request.headers.get('cf-connecting-ip') ?? 'unbekannt'; const ip = request.headers.get('cf-connecting-ip') ?? 'unbekannt';
const heute = new Date().toISOString().slice(0, 10); const heute = new Date().toISOString().slice(0, 10);
@@ -782,9 +822,8 @@ export class Uebergabe extends DurableObject<Env> {
const zahl = (await this.ctx.storage.get<number>('zahl')) ?? 0; const zahl = (await this.ctx.storage.get<number>('zahl')) ?? 0;
if (zahl >= UEBERGABE_MAX_SCHREIBVORGAENGE) return false; if (zahl >= UEBERGABE_MAX_SCHREIBVORGAENGE) return false;
await this.ctx.storage.put({ [`fach:${fach}`]: wert, zahl: zahl + 1 }); await this.ctx.storage.put({ [`fach:${fach}`]: wert, zahl: zahl + 1 });
if ((await this.ctx.storage.getAlarm()) === null) { // gleitend: 15 Minuten nach dem LETZTEN Päckchen löschen, nicht nach dem ersten
await this.ctx.storage.setAlarm(Date.now() + UEBERGABE_LEBENSDAUER_MS); await this.ctx.storage.setAlarm(Date.now() + UEBERGABE_LEBENSDAUER_MS);
}
return true; return true;
} }
@@ -896,7 +935,12 @@ export default {
const pfad = new URL(request.url).pathname; const pfad = new URL(request.url).pathname;
lokalTest = env.LOKAL_TEST === '1'; lokalTest = env.LOKAL_TEST === '1';
// Web-Demo + Bezahl-Routen haben eigene Regeln // Web-Demo + Bezahl-Routen haben eigene Regeln
if (pfad === '/demo') return demoHandler(request, env); if (pfad === '/demo') {
return demoHandler(request, env).catch((e) => {
console.log('Demo-Fehler', e instanceof Error ? e.name : 'unbekannt');
return demoFehler(503, 'dienst', 'Der Dienst ist gerade nicht erreichbar. Bitte versuchen Sie es in einer Minute erneut.', request.headers.get('origin'));
});
}
if (pfad === '/kaufen') return kaufenHandler(request, env); if (pfad === '/kaufen') return kaufenHandler(request, env);
if (pfad === '/kauf-status') return kaufStatusHandler(request, env); if (pfad === '/kauf-status') return kaufStatusHandler(request, env);
if (pfad === '/code') return codeHandler(request, env); if (pfad === '/code') return codeHandler(request, env);
+5
View File
@@ -2,6 +2,11 @@ name = "behoerdenklar-proxy"
main = "src/index.ts" main = "src/index.ts"
compatibility_date = "2026-07-01" compatibility_date = "2026-07-01"
# Worker-Logs im Cloudflare-Dashboard (und `npx wrangler tail`) — hilft,
# wenn live etwas schiefgeht (z. B. die Übersetzung)
[observability]
enabled = true
# Erlaubte Anfragen pro Tag: pro Gerät (normale Nutzung) und pro IP-Adresse # Erlaubte Anfragen pro Tag: pro Gerät (normale Nutzung) und pro IP-Adresse
# (dämmt Angreifer ein, die Geräte-IDs fälschen; höher, weil sich viele # (dämmt Angreifer ein, die Geräte-IDs fälschen; höher, weil sich viele
# Nutzer eine IP teilen können) # Nutzer eine IP teilen können)
+3 -3
View File
@@ -5,7 +5,7 @@
import React from 'react'; import React from 'react';
import { StyleSheet, Text, View } from 'react-native'; import { StyleSheet, Text, View } from 'react-native';
import { AmpelStatus } from '../utils/ampel'; import { AmpelStatus } from '../utils/ampel';
import { abstand, schrift } from '../theme'; import { abstand, schrift, schriftart, ecke } from '../theme';
import { Ikone, IkonenName } from './Ikone'; import { Ikone, IkonenName } from './Ikone';
const IKONE: Record<string, IkonenName> = { rot: 'warnung', gelb: 'wecker', gruen: 'info' }; const IKONE: Record<string, IkonenName> = { rot: 'warnung', gelb: 'wecker', gruen: 'info' };
@@ -28,9 +28,9 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
borderLeftWidth: 6, borderLeftWidth: 6,
borderRadius: 12, borderRadius: ecke,
padding: abstand.m, padding: abstand.m,
gap: abstand.s, gap: abstand.s,
}, },
text: { flex: 1, fontSize: schrift.gross, fontWeight: '700' }, text: { fontFamily: schriftart.serif, flex: 1, fontSize: schrift.gross, fontWeight: '700' },
}); });
+4 -4
View File
@@ -14,7 +14,7 @@ import { AppState, AppStateStatus, StyleSheet, Text, View } from 'react-native';
import * as LocalAuthentication from 'expo-local-authentication'; import * as LocalAuthentication from 'expo-local-authentication';
import { holeAppSperre } from '../services/storage'; import { holeAppSperre } from '../services/storage';
import { GrossButton } from './GrossButton'; import { GrossButton } from './GrossButton';
import { farben, schrift, abstand } from '../theme'; import { farben, schrift, abstand, schriftart } from '../theme';
export function AppSchutz({ children }: { children: React.ReactNode }) { export function AppSchutz({ children }: { children: React.ReactNode }) {
const [entsperrt, setEntsperrt] = useState(false); const [entsperrt, setEntsperrt] = useState(false);
@@ -97,14 +97,14 @@ const styles = StyleSheet.create({
gap: abstand.m, gap: abstand.m,
}, },
sichtschutz: { justifyContent: 'center', alignItems: 'center' }, sichtschutz: { justifyContent: 'center', alignItems: 'center' },
symbol: { fontSize: 56, textAlign: 'center' }, symbol: { fontFamily: schriftart.serif, fontSize: 56, textAlign: 'center' },
titel: { titel: { fontFamily: schriftart.serif,
fontSize: schrift.titel, fontSize: schrift.titel,
fontWeight: '700', fontWeight: '700',
color: farben.text, color: farben.text,
textAlign: 'center', textAlign: 'center',
}, },
text: { text: { fontFamily: schriftart.serif,
fontSize: schrift.basis, fontSize: schrift.basis,
color: farben.textSekundaer, color: farben.textSekundaer,
textAlign: 'center', textAlign: 'center',
+13 -11
View File
@@ -8,7 +8,7 @@
*/ */
import React from 'react'; import React from 'react';
import { ActivityIndicator, Pressable, StyleSheet, Text, View } from 'react-native'; import { ActivityIndicator, Pressable, StyleSheet, Text, View } from 'react-native';
import { farben, schrift, abstand, TOUCH_TARGET } from '../theme'; import { farben, schrift, abstand, TOUCH_TARGET, schriftart, ecke } from '../theme';
import { Ikone, IkonenName } from './Ikone'; import { Ikone, IkonenName } from './Ikone';
interface Props { interface Props {
@@ -30,8 +30,8 @@ export function GrossButton({
}: Props) { }: Props) {
const istPrimaer = variante === 'primaer'; const istPrimaer = variante === 'primaer';
const istGefahr = variante === 'gefahr'; const istGefahr = variante === 'gefahr';
// Sekundär: dunkles Bronze statt hellem Gold — auf grauer Fläche gut lesbar // Wie `.cta` der Webseite: Amtsblau gefüllt bzw. weißes Blatt mit blauer Schrift
const inhaltsFarbe = istPrimaer || istGefahr ? farben.primaerText : farben.primaerFuellung; const inhaltsFarbe = istPrimaer ? farben.primaerText : istGefahr ? farben.fehler : farben.primaer;
return ( return (
<Pressable <Pressable
onPress={onPress} onPress={onPress}
@@ -44,7 +44,7 @@ export function GrossButton({
variante === 'sekundaer' && styles.sekundaer, variante === 'sekundaer' && styles.sekundaer,
istGefahr && styles.gefahr, istGefahr && styles.gefahr,
(deaktiviert || laedt) && styles.deaktiviert, (deaktiviert || laedt) && styles.deaktiviert,
pressed && styles.gedrueckt, pressed && !(deaktiviert || laedt) && styles.gedrueckt,
]} ]}
> >
{laedt ? ( {laedt ? (
@@ -62,17 +62,19 @@ export function GrossButton({
const styles = StyleSheet.create({ const styles = StyleSheet.create({
button: { button: {
minHeight: TOUCH_TARGET, minHeight: TOUCH_TARGET,
borderRadius: 14, borderRadius: ecke,
justifyContent: 'center', justifyContent: 'center',
alignItems: 'center', alignItems: 'center',
paddingHorizontal: abstand.l, paddingHorizontal: abstand.l,
paddingVertical: abstand.s, paddingVertical: abstand.s,
}, },
zeile: { flexDirection: 'row', alignItems: 'center', gap: abstand.xs + 2 }, zeile: { flexDirection: 'row', alignItems: 'center', gap: abstand.xs + 2 },
primaer: { backgroundColor: farben.primaerFuellung }, // Tinten-Rahmen + harter Versatz-Schatten wie `.cta` auf der Webseite;
sekundaer: { backgroundColor: farben.flaecheSekundaer }, // beim Drücken rutscht der Knopf in den Schatten (wie dort beim Hover)
gefahr: { backgroundColor: farben.fehler }, primaer: { backgroundColor: farben.primaerFuellung, borderWidth: 2, borderColor: farben.tinte, boxShadow: '4px 4px 0px #21211D' },
deaktiviert: { opacity: 0.4 }, sekundaer: { backgroundColor: farben.flaeche, borderWidth: 2, borderColor: farben.tinte, boxShadow: '4px 4px 0px #21211D' },
gedrueckt: { opacity: 0.65 }, gefahr: { backgroundColor: farben.flaeche, borderWidth: 2, borderColor: farben.fehler },
text: { fontSize: schrift.gross, fontWeight: '600', textAlign: 'center' }, deaktiviert: { opacity: 0.4, boxShadow: 'none' },
gedrueckt: { transform: [{ translateX: 2 }, { translateY: 2 }], boxShadow: '2px 2px 0px #21211D' },
text: { fontFamily: schriftart.serif, fontSize: schrift.gross, fontWeight: '700', textAlign: 'center' },
}); });
+29 -29
View File
@@ -24,7 +24,7 @@ import { terminZumKalender } from '../services/kalender';
import { berechneAmpel, naechsteFrist, formatiereLangDatum } from '../utils/ampel'; import { berechneAmpel, naechsteFrist, formatiereLangDatum } from '../utils/ampel';
import { GrossButton } from '../components/GrossButton'; import { GrossButton } from '../components/GrossButton';
import { Ikone } from '../components/Ikone'; import { Ikone } from '../components/Ikone';
import { farben, schrift, abstand, TOUCH_TARGET } from '../theme'; import { farben, schrift, abstand, TOUCH_TARGET, schriftart, ecke, kartenSchatten } from '../theme';
type Props = NativeStackScreenProps<RootStackParamList, 'Analyse'>; type Props = NativeStackScreenProps<RootStackParamList, 'Analyse'>;
@@ -343,66 +343,66 @@ const styles = StyleSheet.create({
zentriert: { flex: 1, justifyContent: 'center', alignItems: 'center' }, zentriert: { flex: 1, justifyContent: 'center', alignItems: 'center' },
// Frist-Karte // Frist-Karte
fristKarte: { borderRadius: 16, borderWidth: 1, padding: abstand.l }, fristKarte: { borderRadius: ecke, borderWidth: 1, padding: abstand.l },
fristKopf: { flexDirection: 'row', alignItems: 'center', gap: 8, marginBottom: 10 }, fristKopf: { flexDirection: 'row', alignItems: 'center', gap: 8, marginBottom: 10 },
fristKicker: { fontSize: 12, letterSpacing: 0.6, textTransform: 'uppercase', fontWeight: '700' }, fristKicker: { fontFamily: schriftart.mono, fontSize: 12, letterSpacing: 0.6, textTransform: 'uppercase', fontWeight: '700' },
grosseZahl: { fontSize: 64, lineHeight: 64, fontWeight: '800', fontVariant: ['tabular-nums'] }, grosseZahl: { fontFamily: schriftart.serif, fontSize: 64, lineHeight: 64, fontWeight: '800', fontVariant: ['tabular-nums'] },
zahlEinheit: { fontSize: 22, fontWeight: '700', lineHeight: 24 }, zahlEinheit: { fontFamily: schriftart.serif, fontSize: 22, fontWeight: '700', lineHeight: 24 },
zahlUnter: { fontSize: 13, color: farben.textSekundaer }, zahlUnter: { fontFamily: schriftart.serif, fontSize: 13, color: farben.textSekundaer },
trenner: { height: 1, backgroundColor: farben.rand, marginVertical: 14 }, trenner: { height: 1, backgroundColor: farben.rand, marginVertical: 14 },
datenZeile: { flexDirection: 'row', justifyContent: 'space-between', gap: 12, marginTop: 5 }, datenZeile: { flexDirection: 'row', justifyContent: 'space-between', gap: 12, marginTop: 5 },
datenLabel: { fontSize: schrift.klein, color: farben.textSekundaer }, datenLabel: { fontFamily: schriftart.serif, fontSize: schrift.klein, color: farben.textSekundaer },
datenWert: { fontSize: schrift.klein, fontWeight: '700', color: farben.text }, datenWert: { fontFamily: schriftart.serif, fontSize: schrift.klein, fontWeight: '700', color: farben.text },
keineFrist: { keineFrist: {
flexDirection: 'row', gap: abstand.s, alignItems: 'center', flexDirection: 'row', gap: abstand.s, alignItems: 'center',
backgroundColor: farben.ampelGruenHintergrund, borderRadius: 12, backgroundColor: farben.ampelGruenHintergrund, borderRadius: ecke,
borderLeftWidth: 4, borderLeftColor: farben.ampelGruen, padding: abstand.m, borderLeftWidth: 4, borderLeftColor: farben.ampelGruen, padding: abstand.m,
}, },
keineFristTitel: { fontSize: schrift.basis, fontWeight: '700', color: farben.text }, keineFristTitel: { fontFamily: schriftart.serif, fontSize: schrift.basis, fontWeight: '700', color: farben.text },
keineFristText: { fontSize: schrift.klein, color: farben.textSekundaer, marginTop: 2 }, keineFristText: { fontFamily: schriftart.serif, fontSize: schrift.klein, color: farben.textSekundaer, marginTop: 2 },
// Werkzeuge // Werkzeuge
werkzeugZeile: { flexDirection: 'row', gap: abstand.s, marginTop: abstand.m }, werkzeugZeile: { flexDirection: 'row', gap: abstand.s, marginTop: abstand.m },
werkzeug: { werkzeug: { ...kartenSchatten,
flex: 1, flexDirection: 'row', alignItems: 'center', justifyContent: 'center', gap: 7, flex: 1, flexDirection: 'row', alignItems: 'center', justifyContent: 'center', gap: 7,
backgroundColor: farben.flaeche, borderRadius: 12, minHeight: 48, paddingHorizontal: abstand.s, backgroundColor: farben.flaeche, borderRadius: ecke, minHeight: 48, paddingHorizontal: abstand.s,
}, },
werkzeugText: { fontSize: schrift.klein, fontWeight: '600', color: farben.primaerFuellung }, werkzeugText: { fontFamily: schriftart.serif, fontSize: schrift.klein, fontWeight: '600', color: farben.primaerFuellung },
kicker: { kicker: { fontFamily: schriftart.mono,
fontSize: 12, letterSpacing: 1.1, textTransform: 'uppercase', fontSize: 12, letterSpacing: 1.1, textTransform: 'uppercase',
color: farben.primaer, fontWeight: '700', marginTop: abstand.l, marginBottom: abstand.xs, color: farben.textSekundaer, fontWeight: '700', marginTop: abstand.l, marginBottom: abstand.xs,
}, },
kernaussage: { fontSize: schrift.gross, color: farben.text, lineHeight: 29, fontWeight: '600' }, kernaussage: { fontFamily: schriftart.serif, fontSize: schrift.gross, color: farben.text, lineHeight: 29, fontWeight: '600' },
erklaerung: { fontSize: schrift.basis, color: farben.textSekundaer, lineHeight: 27, marginTop: abstand.s }, erklaerung: { fontFamily: schriftart.serif, fontSize: schrift.basis, color: farben.textSekundaer, lineHeight: 27, marginTop: abstand.s },
dünnerTrenner: { height: 1, backgroundColor: farben.rand, marginTop: abstand.l }, dünnerTrenner: { height: 1, backgroundColor: farben.rand, marginTop: abstand.l },
// To-do // To-do
todoZeile: { flexDirection: 'row', gap: abstand.s, alignItems: 'flex-start', minHeight: 40 }, todoZeile: { flexDirection: 'row', gap: abstand.s, alignItems: 'flex-start', minHeight: 40 },
todoKreis: { todoKreis: {
width: 28, height: 28, borderRadius: 14, borderWidth: 1.5, borderColor: farben.primaer, width: 28, height: 28, borderRadius: ecke, borderWidth: 1.5, borderColor: farben.primaer,
alignItems: 'center', justifyContent: 'center', marginTop: 1, alignItems: 'center', justifyContent: 'center', marginTop: 1,
}, },
todoKreisFertig: { backgroundColor: farben.ampelGruen, borderColor: farben.ampelGruen }, todoKreisFertig: { backgroundColor: farben.ampelGruen, borderColor: farben.ampelGruen },
todoNummer: { fontSize: schrift.klein, fontWeight: '700', color: farben.primaerFuellung, fontVariant: ['tabular-nums'] }, todoNummer: { fontFamily: schriftart.serif, fontSize: schrift.klein, fontWeight: '700', color: farben.primaerFuellung, fontVariant: ['tabular-nums'] },
todoText: { flex: 1, fontSize: schrift.basis, color: farben.text, lineHeight: 25, paddingTop: 3 }, todoText: { fontFamily: schriftart.serif, flex: 1, fontSize: schrift.basis, color: farben.text, lineHeight: 25, paddingTop: 3 },
durchgestrichen: { textDecorationLine: 'line-through', color: farben.textSekundaer }, durchgestrichen: { textDecorationLine: 'line-through', color: farben.textSekundaer },
// Fachbegriffe // Fachbegriffe
begriffKarte: { backgroundColor: farben.flaeche, borderRadius: 12, padding: abstand.m }, begriffKarte: { ...kartenSchatten, backgroundColor: farben.flaeche, borderRadius: ecke, padding: abstand.m },
begriff: { fontSize: schrift.basis, fontWeight: '700', color: farben.text, marginBottom: 3 }, begriff: { fontFamily: schriftart.serif, fontSize: schrift.basis, fontWeight: '700', color: farben.text, marginBottom: 3 },
begriffText: { fontSize: schrift.klein, color: farben.textSekundaer, lineHeight: 23 }, begriffText: { fontFamily: schriftart.serif, fontSize: schrift.klein, color: farben.textSekundaer, lineHeight: 23 },
schutzZeile: { flexDirection: 'row', alignItems: 'center', justifyContent: 'center', gap: 6, marginTop: abstand.l }, schutzZeile: { flexDirection: 'row', alignItems: 'center', justifyContent: 'center', gap: 6, marginTop: abstand.l },
schutzText: { fontSize: 11.5, color: farben.textTertiaer }, schutzText: { fontFamily: schriftart.serif, fontSize: 11.5, color: farben.textTertiaer },
text: { fontSize: schrift.basis, color: farben.text, lineHeight: 27 }, text: { fontFamily: schriftart.serif, fontSize: schrift.basis, color: farben.text, lineHeight: 27 },
// Modal // Modal
modalHintergrund: { flex: 1, backgroundColor: 'rgba(0,0,0,0.45)', justifyContent: 'center', padding: abstand.l }, modalHintergrund: { flex: 1, backgroundColor: 'rgba(0,0,0,0.45)', justifyContent: 'center', padding: abstand.l },
modalKarte: { backgroundColor: farben.flaeche, borderRadius: 14, padding: abstand.m, maxHeight: '75%' }, modalKarte: { ...kartenSchatten, backgroundColor: farben.flaeche, borderRadius: ecke, padding: abstand.m, maxHeight: '75%' },
modalTitel: { fontSize: schrift.gross, fontWeight: '700', color: farben.text, marginBottom: abstand.xs }, modalTitel: { fontFamily: schriftart.serif, fontSize: schrift.gross, fontWeight: '700', color: farben.text, marginBottom: abstand.xs },
sprachZeile: { minHeight: TOUCH_TARGET, justifyContent: 'center' }, sprachZeile: { minHeight: TOUCH_TARGET, justifyContent: 'center' },
sprachZeileText: { fontSize: schrift.gross, color: farben.text }, sprachZeileText: { fontFamily: schriftart.serif, fontSize: schrift.gross, color: farben.text },
}); });
+18 -18
View File
@@ -26,7 +26,7 @@ import { generiereAntwort } from '../services/antwort';
import { ClaudeFehler } from '../services/claudeClient'; import { ClaudeFehler } from '../services/claudeClient';
import { GrossButton } from '../components/GrossButton'; import { GrossButton } from '../components/GrossButton';
import { Ikone, IkonenName } from '../components/Ikone'; import { Ikone, IkonenName } from '../components/Ikone';
import { farben, schrift, abstand } from '../theme'; import { farben, schrift, abstand, schriftart, ecke, kartenSchatten } from '../theme';
type Props = NativeStackScreenProps<RootStackParamList, 'Antwort'>; type Props = NativeStackScreenProps<RootStackParamList, 'Antwort'>;
@@ -258,28 +258,28 @@ function escapeHtml(s: string): string {
const styles = StyleSheet.create({ const styles = StyleSheet.create({
container: { flex: 1, backgroundColor: farben.hintergrund }, container: { flex: 1, backgroundColor: farben.hintergrund },
zentriert: { flex: 1, justifyContent: 'center', alignItems: 'center' }, zentriert: { flex: 1, justifyContent: 'center', alignItems: 'center' },
text: { fontSize: schrift.basis, color: farben.text }, text: { fontFamily: schriftart.serif, fontSize: schrift.basis, color: farben.text },
schrittLabel: { fontSize: schrift.klein, color: farben.textSekundaer, fontWeight: '600', marginBottom: abstand.xs }, schrittLabel: { fontFamily: schriftart.serif, fontSize: schrift.klein, color: farben.textSekundaer, fontWeight: '600', marginBottom: abstand.xs },
fortschritt: { flexDirection: 'row', gap: 6, marginBottom: abstand.l }, fortschritt: { flexDirection: 'row', gap: 6, marginBottom: abstand.l },
balken: { flex: 1, height: 5, borderRadius: 3 }, balken: { flex: 1, height: 5, borderRadius: 3 },
titel: { fontSize: schrift.titel, fontWeight: '800', color: farben.text, marginBottom: 4 }, titel: { fontFamily: schriftart.serif, fontSize: schrift.titel, fontWeight: '800', color: farben.text, marginBottom: 4 },
unterTitel: { fontSize: schrift.klein, color: farben.textSekundaer, lineHeight: 22, marginBottom: abstand.s }, unterTitel: { fontFamily: schriftart.serif, fontSize: schrift.klein, color: farben.textSekundaer, lineHeight: 22, marginBottom: abstand.s },
// Schritt 1 — Karten // Schritt 1 — Karten
typKarte: { typKarte: { ...kartenSchatten,
flexDirection: 'row', alignItems: 'center', gap: abstand.s, flexDirection: 'row', alignItems: 'center', gap: abstand.s,
backgroundColor: farben.flaeche, borderRadius: 14, padding: abstand.m, backgroundColor: farben.flaeche, borderRadius: ecke, padding: abstand.m,
}, },
typIkone: { typIkone: {
width: 44, height: 44, borderRadius: 12, borderWidth: 1, borderColor: farben.primaer, width: 44, height: 44, borderRadius: ecke, borderWidth: 1, borderColor: farben.primaer,
alignItems: 'center', justifyContent: 'center', flexShrink: 0, alignItems: 'center', justifyContent: 'center', flexShrink: 0,
}, },
typTitel: { fontSize: schrift.basis, fontWeight: '700', color: farben.text }, typTitel: { fontFamily: schriftart.serif, fontSize: schrift.basis, fontWeight: '700', color: farben.text },
typBeschreibung: { fontSize: schrift.klein, color: farben.textSekundaer, marginTop: 2, lineHeight: 20 }, typBeschreibung: { fontFamily: schriftart.serif, fontSize: schrift.klein, color: farben.textSekundaer, marginTop: 2, lineHeight: 20 },
empfohlenTag: { backgroundColor: farben.hervorhebung, borderRadius: 6, paddingHorizontal: 8, paddingVertical: 2 }, empfohlenTag: { backgroundColor: farben.hervorhebung, borderRadius: 6, paddingHorizontal: 8, paddingVertical: 2 },
empfohlenText: { fontSize: 11, fontWeight: '700', color: farben.primaerFuellung }, empfohlenText: { fontFamily: schriftart.serif, fontSize: 11, fontWeight: '700', color: farben.primaerFuellung },
// Schritt 2/3 // Schritt 2/3
wahlPill: { wahlPill: {
@@ -287,19 +287,19 @@ const styles = StyleSheet.create({
borderWidth: 1, borderColor: farben.primaer, borderRadius: 9999, borderWidth: 1, borderColor: farben.primaer, borderRadius: 9999,
paddingHorizontal: 12, paddingVertical: 6, marginBottom: abstand.m, paddingHorizontal: 12, paddingVertical: 6, marginBottom: abstand.m,
}, },
wahlPillText: { fontSize: schrift.klein, color: farben.primaerFuellung, fontWeight: '600' }, wahlPillText: { fontFamily: schriftart.serif, fontSize: schrift.klein, color: farben.primaerFuellung, fontWeight: '600' },
feldLabel: { fontSize: schrift.klein, color: farben.textSekundaer, fontWeight: '600', marginTop: abstand.s, marginBottom: 6 }, feldLabel: { fontFamily: schriftart.serif, fontSize: schrift.klein, color: farben.textSekundaer, fontWeight: '600', marginTop: abstand.s, marginBottom: 6 },
eingabe: { eingabe: { fontFamily: schriftart.serif,
borderWidth: 1, borderColor: farben.rand, borderRadius: 12, padding: abstand.s, borderWidth: 1, borderColor: farben.rand, borderRadius: ecke, padding: abstand.s,
fontSize: schrift.basis, color: farben.text, backgroundColor: farben.flaeche, minHeight: 52, fontSize: schrift.basis, color: farben.text, backgroundColor: farben.flaeche, minHeight: 52,
}, },
mehrzeilig: { minHeight: 110 }, mehrzeilig: { minHeight: 110 },
briefText: { minHeight: 300, lineHeight: 26 }, briefText: { minHeight: 300, lineHeight: 26 },
infoBox: { infoBox: {
flexDirection: 'row', gap: abstand.s, alignItems: 'flex-start', flexDirection: 'row', gap: abstand.s, alignItems: 'flex-start',
backgroundColor: farben.hervorhebung, borderRadius: 12, padding: abstand.m, marginTop: abstand.m, backgroundColor: farben.hervorhebung, borderRadius: ecke, padding: abstand.m, marginTop: abstand.m,
}, },
infoBoxText: { flex: 1, fontSize: schrift.klein, color: farben.text, lineHeight: 21 }, infoBoxText: { fontFamily: schriftart.serif, flex: 1, fontSize: schrift.klein, color: farben.text, lineHeight: 21 },
zurueck: { flexDirection: 'row', alignItems: 'center', justifyContent: 'center', gap: 6, marginTop: abstand.m, paddingVertical: abstand.s }, zurueck: { flexDirection: 'row', alignItems: 'center', justifyContent: 'center', gap: 6, marginTop: abstand.m, paddingVertical: abstand.s },
zurueckText: { fontSize: schrift.klein, color: farben.primaerFuellung, fontWeight: '600' }, zurueckText: { fontFamily: schriftart.serif, fontSize: schrift.klein, color: farben.primaerFuellung, fontWeight: '600' },
}); });
+17 -17
View File
@@ -13,7 +13,7 @@ import { berechneAmpel } from '../utils/ampel';
import { formatiereDatum } from '../services/erinnerungen'; import { formatiereDatum } from '../services/erinnerungen';
import { Ikone } from '../components/Ikone'; import { Ikone } from '../components/Ikone';
import { GrossButton } from '../components/GrossButton'; import { GrossButton } from '../components/GrossButton';
import { farben, schrift, abstand, TOUCH_TARGET } from '../theme'; import { farben, schrift, abstand, TOUCH_TARGET, schriftart, ecke, kartenSchatten } from '../theme';
type Nav = NativeStackNavigationProp<RootStackParamList>; type Nav = NativeStackNavigationProp<RootStackParamList>;
@@ -161,39 +161,39 @@ export function ArchivScreen() {
const styles = StyleSheet.create({ const styles = StyleSheet.create({
container: { flex: 1, backgroundColor: farben.hintergrund }, container: { flex: 1, backgroundColor: farben.hintergrund },
kicker: { kicker: { fontFamily: schriftart.mono,
fontSize: 12, letterSpacing: 1.3, textTransform: 'uppercase', fontSize: 12, letterSpacing: 1.3, textTransform: 'uppercase',
color: farben.primaer, fontWeight: '600', marginBottom: 4, color: farben.textSekundaer, fontWeight: '600', marginBottom: 4,
}, },
titel: { fontSize: schrift.riesig, fontWeight: '800', color: farben.text, marginBottom: abstand.m }, titel: { fontFamily: schriftart.serif, fontSize: schrift.riesig, fontWeight: '800', color: farben.text, marginBottom: abstand.m },
sucheBox: { sucheBox: { ...kartenSchatten,
flexDirection: 'row', alignItems: 'center', gap: 8, flexDirection: 'row', alignItems: 'center', gap: 8,
backgroundColor: farben.flaeche, borderRadius: 12, backgroundColor: farben.flaeche, borderRadius: ecke,
paddingHorizontal: abstand.s, marginBottom: abstand.s, minHeight: 48, paddingHorizontal: abstand.s, marginBottom: abstand.s, minHeight: 48,
}, },
sucheFeld: { flex: 1, fontSize: schrift.basis, color: farben.text, paddingVertical: abstand.s }, sucheFeld: { fontFamily: schriftart.serif, flex: 1, fontSize: schrift.basis, color: farben.text, paddingVertical: abstand.s },
chip: { chip: {
borderRadius: 9999, borderWidth: 1, borderColor: farben.rand, borderRadius: 9999, borderWidth: 1, borderColor: farben.rand,
backgroundColor: farben.flaeche, paddingHorizontal: 14, paddingVertical: 8, backgroundColor: farben.flaeche, paddingHorizontal: 14, paddingVertical: 8,
}, },
chipAktiv: { borderColor: farben.primaer, backgroundColor: farben.hervorhebung }, chipAktiv: { borderColor: farben.primaer, backgroundColor: farben.hervorhebung },
chipText: { fontSize: schrift.klein, color: farben.textSekundaer }, chipText: { fontFamily: schriftart.serif, fontSize: schrift.klein, color: farben.textSekundaer },
chipTextAktiv: { color: farben.primaer, fontWeight: '600' }, chipTextAktiv: { color: farben.primaer, fontWeight: '600' },
zahlZeile: { zahlZeile: { fontFamily: schriftart.mono,
fontSize: 12, letterSpacing: 1, textTransform: 'uppercase', fontSize: 12, letterSpacing: 1, textTransform: 'uppercase',
color: farben.textTertiaer, marginBottom: abstand.s, color: farben.textTertiaer, marginBottom: abstand.s,
}, },
zeile: { zeile: { ...kartenSchatten,
flexDirection: 'row', alignItems: 'center', gap: abstand.s, flexDirection: 'row', alignItems: 'center', gap: abstand.s,
backgroundColor: farben.flaeche, borderRadius: 12, backgroundColor: farben.flaeche, borderRadius: ecke,
padding: abstand.m, marginBottom: abstand.s, minHeight: TOUCH_TARGET, padding: abstand.m, marginBottom: abstand.s, minHeight: TOUCH_TARGET,
}, },
punkt: { width: 10, height: 10, borderRadius: 5 }, punkt: { width: 10, height: 10, borderRadius: 5 },
zeileTyp: { flex: 1, fontSize: schrift.basis, fontWeight: '700', color: farben.text }, zeileTyp: { fontFamily: schriftart.serif, flex: 1, fontSize: schrift.basis, fontWeight: '700', color: farben.text },
datum: { fontSize: schrift.klein, color: farben.textTertiaer, fontVariant: ['tabular-nums'] }, datum: { fontFamily: schriftart.serif, fontSize: schrift.klein, color: farben.textTertiaer, fontVariant: ['tabular-nums'] },
zeileMeta: { fontSize: schrift.klein, color: farben.textSekundaer, marginTop: 2 }, zeileMeta: { fontFamily: schriftart.serif, fontSize: schrift.klein, color: farben.textSekundaer, marginTop: 2 },
ampelText: { fontSize: schrift.klein, fontWeight: '600', marginTop: 2 }, ampelText: { fontFamily: schriftart.serif, fontSize: schrift.klein, fontWeight: '600', marginTop: 2 },
leerBox: { alignItems: 'center', gap: abstand.s, marginTop: abstand.xl }, leerBox: { alignItems: 'center', gap: abstand.s, marginTop: abstand.xl },
leerTitel: { fontSize: schrift.gross, fontWeight: '700', color: farben.text }, leerTitel: { fontFamily: schriftart.serif, fontSize: schrift.gross, fontWeight: '700', color: farben.text },
leerText: { fontSize: schrift.basis, color: farben.textSekundaer, textAlign: 'center', lineHeight: 26 }, leerText: { fontFamily: schriftart.serif, fontSize: schrift.basis, color: farben.textSekundaer, textAlign: 'center', lineHeight: 26 },
}); });
+5 -5
View File
@@ -8,7 +8,7 @@ import { NativeStackScreenProps } from '@react-navigation/native-stack';
import { RootStackParamList } from '../types'; import { RootStackParamList } from '../types';
import { speichereConsent } from '../services/storage'; import { speichereConsent } from '../services/storage';
import { GrossButton } from '../components/GrossButton'; import { GrossButton } from '../components/GrossButton';
import { farben, schrift, abstand } from '../theme'; import { farben, schrift, abstand, schriftart, ecke, kartenSchatten } from '../theme';
type Props = NativeStackScreenProps<RootStackParamList, 'Consent'>; type Props = NativeStackScreenProps<RootStackParamList, 'Consent'>;
@@ -60,18 +60,18 @@ export function ConsentScreen({ navigation }: Props) {
const styles = StyleSheet.create({ const styles = StyleSheet.create({
container: { flex: 1, backgroundColor: farben.hintergrund }, container: { flex: 1, backgroundColor: farben.hintergrund },
inhalt: { padding: abstand.l }, inhalt: { padding: abstand.l },
titel: { titel: { fontFamily: schriftart.serif,
fontSize: schrift.titel, fontSize: schrift.titel,
fontWeight: '700', fontWeight: '700',
color: farben.text, color: farben.text,
marginBottom: abstand.l, marginBottom: abstand.l,
}, },
karte: { karte: { ...kartenSchatten,
backgroundColor: farben.flaeche, backgroundColor: farben.flaeche,
borderRadius: 14, borderRadius: ecke,
padding: abstand.m, padding: abstand.m,
marginBottom: abstand.xl, marginBottom: abstand.xl,
gap: abstand.m, gap: abstand.m,
}, },
punkt: { fontSize: schrift.basis, color: farben.text, lineHeight: 27 }, punkt: { fontFamily: schriftart.serif, fontSize: schrift.basis, color: farben.text, lineHeight: 27 },
}); });
+9 -9
View File
@@ -33,7 +33,7 @@ import {
import { NUTZT_PROXY } from '../services/claudeClient'; import { NUTZT_PROXY } from '../services/claudeClient';
import { useAppStore } from '../store/useAppStore'; import { useAppStore } from '../store/useAppStore';
import { GrossButton } from '../components/GrossButton'; import { GrossButton } from '../components/GrossButton';
import { farben, schrift, abstand } from '../theme'; import { farben, schrift, abstand, schriftart, ecke, kartenSchatten } from '../theme';
type Props = NativeStackScreenProps<RootStackParamList, 'Einstellungen'>; type Props = NativeStackScreenProps<RootStackParamList, 'Einstellungen'>;
@@ -249,7 +249,7 @@ export function EinstellungenScreen({ navigation }: Props) {
<View style={styles.karte}> <View style={styles.karte}>
<Text style={styles.text}> <Text style={styles.text}>
• Brieffotos werden nur zur Analyse an den KI-Dienst Anthropic (USA) • Brieffotos werden nur zur Analyse an den KI-Dienst Anthropic (USA)
gesendet und dort nach spätestens 30 Tagen gelöscht. Sie werden nicht gesendet und dort in der Regel nach 30 Tagen gelöscht. Sie werden nicht
zum Training der KI verwendet.{'\n\n'} zum Training der KI verwendet.{'\n\n'}
• Alle Ergebnisse liegen ausschließlich auf Ihrem Gerät — verschlüsselt • Alle Ergebnisse liegen ausschließlich auf Ihrem Gerät — verschlüsselt
gespeichert (AES-256).{'\n\n'} gespeichert (AES-256).{'\n\n'}
@@ -268,30 +268,30 @@ export function EinstellungenScreen({ navigation }: Props) {
const styles = StyleSheet.create({ const styles = StyleSheet.create({
container: { flex: 1, backgroundColor: farben.hintergrund }, container: { flex: 1, backgroundColor: farben.hintergrund },
abschnittTitel: { abschnittTitel: { fontFamily: schriftart.serif,
fontSize: schrift.gross, fontSize: schrift.gross,
fontWeight: '700', fontWeight: '700',
color: farben.primaer, color: farben.primaer,
marginBottom: abstand.s, marginBottom: abstand.s,
}, },
text: { fontSize: schrift.basis, color: farben.text, lineHeight: 27 }, text: { fontFamily: schriftart.serif, fontSize: schrift.basis, color: farben.text, lineHeight: 27 },
hinweis: { hinweis: { fontFamily: schriftart.serif,
fontSize: schrift.klein, fontSize: schrift.klein,
color: farben.textSekundaer, color: farben.textSekundaer,
lineHeight: 22, lineHeight: 22,
marginVertical: abstand.s, marginVertical: abstand.s,
}, },
eingabe: { eingabe: { fontFamily: schriftart.serif,
borderWidth: 1, borderWidth: 1,
borderColor: farben.rand, borderColor: farben.rand,
borderRadius: 12, borderRadius: ecke,
padding: abstand.s, padding: abstand.s,
fontSize: schrift.basis, fontSize: schrift.basis,
color: farben.text, color: farben.text,
minHeight: 56, minHeight: 56,
marginBottom: abstand.s, marginBottom: abstand.s,
}, },
karte: { backgroundColor: farben.flaeche, borderRadius: 14, padding: abstand.m }, karte: { ...kartenSchatten, backgroundColor: farben.flaeche, borderRadius: ecke, padding: abstand.m },
trenner: { height: 1, backgroundColor: farben.rand, marginVertical: abstand.l }, trenner: { height: 1, backgroundColor: farben.rand, marginVertical: abstand.l },
schalterZeile: { schalterZeile: {
flexDirection: 'row', flexDirection: 'row',
@@ -301,7 +301,7 @@ const styles = StyleSheet.create({
option: { option: {
borderWidth: 1, borderWidth: 1,
borderColor: farben.rand, borderColor: farben.rand,
borderRadius: 12, borderRadius: ecke,
padding: abstand.s, padding: abstand.s,
minHeight: 56, minHeight: 56,
justifyContent: 'center', justifyContent: 'center',
+50 -35
View File
@@ -21,7 +21,7 @@ import {
NaechsteFrist, NaechsteFrist,
} from '../utils/ampel'; } from '../utils/ampel';
import { Ikone } from '../components/Ikone'; import { Ikone } from '../components/Ikone';
import { farben, schrift, abstand, TOUCH_TARGET } from '../theme'; import { farben, schrift, abstand, TOUCH_TARGET, schriftart, ecke, kartenSchatten, formularRahmen } from '../theme';
type Nav = NativeStackNavigationProp<RootStackParamList>; type Nav = NativeStackNavigationProp<RootStackParamList>;
@@ -93,8 +93,10 @@ export function FristenScreen() {
{/* Kopf */} {/* Kopf */}
<View style={styles.kopf}> <View style={styles.kopf}>
<View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}> <View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
<Ikone name="uhr" groesse={22} farbe={farben.primaer} /> <Ikone name="brief" groesse={22} farbe={farben.primaer} />
<Text style={styles.marke}>BehördenKlar</Text> <Text style={styles.marke}>
BehördenKlar <Text style={styles.markeZusatz}>by Webklar</Text>
</Text>
</View> </View>
<View style={{ flexDirection: 'row', gap: 8 }}> <View style={{ flexDirection: 'row', gap: 8 }}>
<KopfKnopf ikone="buch" label="Glossar" onPress={() => navigation.navigate('Glossar')} /> <KopfKnopf ikone="buch" label="Glossar" onPress={() => navigation.navigate('Glossar')} />
@@ -104,7 +106,9 @@ export function FristenScreen() {
<View style={{ paddingHorizontal: abstand.m }}> <View style={{ paddingHorizontal: abstand.m }}>
<Text style={styles.kicker}>Fristen-Übersicht</Text> <Text style={styles.kicker}>Fristen-Übersicht</Text>
<Text style={styles.titel}>Ihre Fristen</Text> <Text style={styles.titel}>
Ihre <Text style={styles.markiert}> Fristen </Text>
</Text>
<Text style={styles.unterTitel}> <Text style={styles.unterTitel}>
Nach Dringlichkeit geordnet. Kümmern Sie sich zuerst um das Oberste. Nach Dringlichkeit geordnet. Kümmern Sie sich zuerst um das Oberste.
</Text> </Text>
@@ -238,44 +242,55 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingHorizontal: abstand.m, marginHorizontal: abstand.m,
marginBottom: abstand.m, paddingBottom: abstand.s,
marginBottom: abstand.l,
// Briefkopf wie auf der Webseite: Tinten-Linie unter Absender
borderBottomWidth: 2,
borderBottomColor: farben.tinte,
}, },
marke: { fontSize: schrift.gross, fontWeight: '700', color: farben.text }, markeZusatz: { fontFamily: schriftart.serif, fontSize: 12, fontWeight: '400', color: farben.textSekundaer },
// gelber Textmarker — das Erkennungszeichen der Webseite
markiert: { backgroundColor: farben.marker },
marke: { fontFamily: schriftart.serif, fontSize: schrift.gross, fontWeight: '700', color: farben.text },
kopfKnopf: { kopfKnopf: {
width: 40, width: 40,
height: 40, height: 40,
borderRadius: 20, borderRadius: ecke,
backgroundColor: farben.flaeche, backgroundColor: farben.flaeche,
borderWidth: 1.5,
borderColor: farben.tinte,
alignItems: 'center', alignItems: 'center',
justifyContent: 'center', justifyContent: 'center',
}, },
kicker: { kicker: { fontFamily: schriftart.mono,
fontSize: 12, fontSize: 12,
letterSpacing: 1.3, letterSpacing: 1.3,
textTransform: 'uppercase', textTransform: 'uppercase',
color: farben.primaer, color: farben.textSekundaer,
fontWeight: '600', fontWeight: '600',
marginBottom: 4, marginBottom: 4,
}, },
titel: { fontSize: schrift.riesig, fontWeight: '800', color: farben.text, marginBottom: 4 }, titel: { fontFamily: schriftart.serif, fontSize: schrift.riesig, fontWeight: '800', color: farben.text, marginBottom: 4 },
unterTitel: { fontSize: schrift.klein, color: farben.textSekundaer, marginBottom: abstand.l }, unterTitel: { fontFamily: schriftart.serif, fontSize: schrift.klein, color: farben.textSekundaer, marginBottom: abstand.l },
// wichtigste Frist wie ein Formular der Webseite: Tinten-Rahmen, harter Schatten
heldKarte: { heldKarte: {
borderRadius: 16, ...formularRahmen,
borderLeftWidth: 5, borderRadius: ecke,
borderLeftWidth: 7,
padding: abstand.l, padding: abstand.l,
marginBottom: abstand.l, marginBottom: abstand.l,
}, },
heldKopf: { flexDirection: 'row', alignItems: 'center', gap: 8, marginBottom: 12 }, heldKopf: { flexDirection: 'row', alignItems: 'center', gap: 8, marginBottom: 12 },
punkt: { width: 9, height: 9, borderRadius: 5 }, punkt: { width: 9, height: 9, borderRadius: 5 },
heldKicker: { fontSize: 12, letterSpacing: 0.6, textTransform: 'uppercase', fontWeight: '700' }, heldKicker: { fontFamily: schriftart.mono, fontSize: 12, letterSpacing: 0.6, textTransform: 'uppercase', fontWeight: '700' },
grosseZahl: { fontSize: 68, lineHeight: 68, fontWeight: '800', fontVariant: ['tabular-nums'] }, grosseZahl: { fontFamily: schriftart.serif, fontSize: 68, lineHeight: 68, fontWeight: '800', fontVariant: ['tabular-nums'] },
zahlEinheit: { fontSize: 22, fontWeight: '700', lineHeight: 24 }, zahlEinheit: { fontFamily: schriftart.serif, fontSize: 22, fontWeight: '700', lineHeight: 24 },
zahlDatum: { fontSize: 13, color: farben.textSekundaer, marginTop: 2 }, zahlDatum: { fontFamily: schriftart.serif, fontSize: 13, color: farben.textSekundaer, marginTop: 2 },
trenner: { height: 1, backgroundColor: farben.rand, marginVertical: 15 }, trenner: { height: 1, backgroundColor: farben.rand, marginVertical: 15 },
briefTyp: { fontSize: schrift.gross, fontWeight: '700', color: farben.text, marginBottom: 3 }, briefTyp: { fontFamily: schriftart.serif, fontSize: schrift.gross, fontWeight: '700', color: farben.text, marginBottom: 3 },
briefMeta: { fontSize: schrift.klein, color: farben.textSekundaer }, briefMeta: { fontFamily: schriftart.serif, fontSize: schrift.klein, color: farben.textSekundaer },
abschnitt: { abschnitt: { fontFamily: schriftart.mono,
fontSize: 12, fontSize: 12,
letterSpacing: 1.1, letterSpacing: 1.1,
textTransform: 'uppercase', textTransform: 'uppercase',
@@ -284,42 +299,42 @@ const styles = StyleSheet.create({
marginTop: abstand.l, marginTop: abstand.l,
marginBottom: abstand.s, marginBottom: abstand.s,
}, },
zeile: { zeile: { ...kartenSchatten,
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
gap: abstand.m, gap: abstand.m,
backgroundColor: farben.flaeche, backgroundColor: farben.flaeche,
borderRadius: 12, borderRadius: ecke,
borderLeftWidth: 4, borderLeftWidth: 4,
padding: abstand.m, padding: abstand.m,
}, },
zahlBox: { width: 54, alignItems: 'center' }, zahlBox: { width: 54, alignItems: 'center' },
zahlKlein: { fontSize: 30, fontWeight: '800', fontVariant: ['tabular-nums'], lineHeight: 32 }, zahlKlein: { fontFamily: schriftart.serif, fontSize: 30, fontWeight: '800', fontVariant: ['tabular-nums'], lineHeight: 32 },
zahlBoxLabel: { fontSize: 10, letterSpacing: 0.5, textTransform: 'uppercase', color: farben.textTertiaer }, zahlBoxLabel: { fontFamily: schriftart.mono, fontSize: 10, letterSpacing: 0.5, textTransform: 'uppercase', color: farben.textTertiaer },
zeileTyp: { fontSize: schrift.basis, fontWeight: '700', color: farben.text }, zeileTyp: { fontFamily: schriftart.serif, fontSize: schrift.basis, fontWeight: '700', color: farben.text },
zeileMeta: { fontSize: schrift.klein, color: farben.textSekundaer, marginTop: 2 }, zeileMeta: { fontFamily: schriftart.serif, fontSize: schrift.klein, color: farben.textSekundaer, marginTop: 2 },
tag: { alignSelf: 'flex-start', borderRadius: 5, paddingHorizontal: 9, paddingVertical: 3, marginTop: 7 }, tag: { alignSelf: 'flex-start', borderRadius: 5, paddingHorizontal: 9, paddingVertical: 3, marginTop: 7 },
tagText: { fontSize: 11, fontWeight: '600' }, tagText: { fontFamily: schriftart.serif, fontSize: 11, fontWeight: '600' },
infoZeile: { infoZeile: { ...kartenSchatten,
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
gap: abstand.s, gap: abstand.s,
backgroundColor: farben.flaeche, backgroundColor: farben.flaeche,
borderRadius: 12, borderRadius: ecke,
padding: abstand.m, padding: abstand.m,
minHeight: TOUCH_TARGET, minHeight: TOUCH_TARGET,
}, },
schutz: { schutz: { ...kartenSchatten,
flexDirection: 'row', flexDirection: 'row',
gap: abstand.s, gap: abstand.s,
alignItems: 'flex-start', alignItems: 'flex-start',
backgroundColor: farben.flaeche, backgroundColor: farben.flaeche,
borderRadius: 12, borderRadius: ecke,
padding: abstand.m, padding: abstand.m,
marginTop: abstand.l, marginTop: abstand.l,
}, },
schutzText: { flex: 1, fontSize: 12.5, lineHeight: 19, color: farben.textSekundaer }, schutzText: { fontFamily: schriftart.serif, flex: 1, fontSize: 12.5, lineHeight: 19, color: farben.textSekundaer },
leerBox: { alignItems: 'center', gap: abstand.s, marginTop: abstand.xl, marginBottom: abstand.l }, leerBox: { alignItems: 'center', gap: abstand.s, marginTop: abstand.xl, marginBottom: abstand.l },
leerTitel: { fontSize: schrift.gross, fontWeight: '700', color: farben.text }, leerTitel: { fontFamily: schriftart.serif, fontSize: schrift.gross, fontWeight: '700', color: farben.text },
leerText: { fontSize: schrift.basis, color: farben.textSekundaer, textAlign: 'center', lineHeight: 26 }, leerText: { fontFamily: schriftart.serif, fontSize: schrift.basis, color: farben.textSekundaer, textAlign: 'center', lineHeight: 26 },
}); });
+8 -8
View File
@@ -4,7 +4,7 @@
import React, { useState } from 'react'; import React, { useState } from 'react';
import { FlatList, StyleSheet, Text, TextInput, View } from 'react-native'; import { FlatList, StyleSheet, Text, TextInput, View } from 'react-native';
import { GLOSSAR } from '../data/glossar'; import { GLOSSAR } from '../data/glossar';
import { farben, schrift, abstand } from '../theme'; import { farben, schrift, abstand, schriftart, ecke, kartenSchatten } from '../theme';
export function GlossarScreen() { export function GlossarScreen() {
const [suche, setSuche] = useState(''); const [suche, setSuche] = useState('');
@@ -44,30 +44,30 @@ export function GlossarScreen() {
const styles = StyleSheet.create({ const styles = StyleSheet.create({
container: { flex: 1, backgroundColor: farben.hintergrund }, container: { flex: 1, backgroundColor: farben.hintergrund },
suche: { suche: { fontFamily: schriftart.serif,
margin: abstand.m, margin: abstand.m,
borderWidth: 1, borderWidth: 1,
borderColor: farben.rand, borderColor: farben.rand,
borderRadius: 12, borderRadius: ecke,
padding: abstand.s, padding: abstand.s,
fontSize: schrift.basis, fontSize: schrift.basis,
color: farben.text, color: farben.text,
minHeight: 48, minHeight: 48,
}, },
karte: { karte: { ...kartenSchatten,
backgroundColor: farben.flaeche, backgroundColor: farben.flaeche,
borderRadius: 14, borderRadius: ecke,
padding: abstand.m, padding: abstand.m,
marginBottom: abstand.s, marginBottom: abstand.s,
}, },
begriff: { fontSize: schrift.gross, fontWeight: '700', color: farben.primaer }, begriff: { fontFamily: schriftart.serif, fontSize: schrift.gross, fontWeight: '700', color: farben.primaer },
erklaerung: { erklaerung: { fontFamily: schriftart.serif,
fontSize: schrift.basis, fontSize: schrift.basis,
color: farben.text, color: farben.text,
lineHeight: 27, lineHeight: 27,
marginTop: abstand.xs, marginTop: abstand.xs,
}, },
leer: { leer: { fontFamily: schriftart.serif,
textAlign: 'center', textAlign: 'center',
fontSize: schrift.basis, fontSize: schrift.basis,
color: farben.textSekundaer, color: farben.textSekundaer,
+5 -5
View File
@@ -22,7 +22,7 @@ import {
import { planeErinnerungen } from '../services/erinnerungen'; import { planeErinnerungen } from '../services/erinnerungen';
import { useAppStore, neueId } from '../store/useAppStore'; import { useAppStore, neueId } from '../store/useAppStore';
import { GrossButton } from '../components/GrossButton'; import { GrossButton } from '../components/GrossButton';
import { farben, schrift, abstand } from '../theme'; import { farben, schrift, abstand, schriftart } from '../theme';
type Props = NativeStackScreenProps<RootStackParamList, 'Scan'>; type Props = NativeStackScreenProps<RootStackParamList, 'Scan'>;
@@ -204,7 +204,7 @@ const styles = StyleSheet.create({
gap: abstand.m, gap: abstand.m,
justifyContent: 'center', justifyContent: 'center',
}, },
anleitung: { anleitung: { fontFamily: schriftart.serif,
fontSize: schrift.basis, fontSize: schrift.basis,
color: farben.textSekundaer, color: farben.textSekundaer,
textAlign: 'center', textAlign: 'center',
@@ -219,14 +219,14 @@ const styles = StyleSheet.create({
padding: abstand.xl, padding: abstand.xl,
gap: abstand.m, gap: abstand.m,
}, },
kontingent: { kontingent: { fontFamily: schriftart.serif,
fontSize: schrift.klein, fontSize: schrift.klein,
color: farben.textSekundaer, color: farben.textSekundaer,
textAlign: 'center', textAlign: 'center',
marginTop: abstand.m, marginTop: abstand.m,
}, },
ladeText: { fontSize: schrift.gross, fontWeight: '700', color: farben.text }, ladeText: { fontFamily: schriftart.serif, fontSize: schrift.gross, fontWeight: '700', color: farben.text },
ladeHinweis: { ladeHinweis: { fontFamily: schriftart.serif,
fontSize: schrift.basis, fontSize: schrift.basis,
color: farben.textSekundaer, color: farben.textSekundaer,
textAlign: 'center', textAlign: 'center',
+9 -9
View File
@@ -20,7 +20,7 @@ import { holeAusUebergabe, loescheUebergabe, oeffneUebergabe, sendeAnUebergabe }
import { briefZuWebPaket, leseUebergabeLink, webPaketZuBrief, WebPaket } from '../utils/uebergabeFormat'; import { briefZuWebPaket, leseUebergabeLink, webPaketZuBrief, WebPaket } from '../utils/uebergabeFormat';
import { GrossButton } from '../components/GrossButton'; import { GrossButton } from '../components/GrossButton';
import { Ikone } from '../components/Ikone'; import { Ikone } from '../components/Ikone';
import { farben, schrift, abstand } from '../theme'; import { farben, schrift, abstand, schriftart, ecke, kartenSchatten } from '../theme';
type Props = NativeStackScreenProps<RootStackParamList, 'Verbinden'>; type Props = NativeStackScreenProps<RootStackParamList, 'Verbinden'>;
@@ -173,19 +173,19 @@ export function VerbindenScreen({ navigation, route }: Props) {
const styles = StyleSheet.create({ const styles = StyleSheet.create({
container: { flex: 1, backgroundColor: farben.hintergrund }, container: { flex: 1, backgroundColor: farben.hintergrund },
titel: { fontSize: schrift.titel, fontWeight: '700', color: farben.text, marginBottom: abstand.s }, titel: { fontFamily: schriftart.serif, fontSize: schrift.titel, fontWeight: '700', color: farben.text, marginBottom: abstand.s },
text: { fontSize: schrift.basis, color: farben.text, lineHeight: 26 }, text: { fontFamily: schriftart.serif, fontSize: schrift.basis, color: farben.text, lineHeight: 26 },
klein: { fontSize: schrift.klein, color: farben.textSekundaer, marginBottom: abstand.s }, klein: { fontFamily: schriftart.serif, fontSize: schrift.klein, color: farben.textSekundaer, marginBottom: abstand.s },
kameraRahmen: { kameraRahmen: {
marginTop: abstand.m, height: 300, borderRadius: 16, overflow: 'hidden', marginTop: abstand.m, height: 300, borderRadius: ecke, overflow: 'hidden',
backgroundColor: farben.flaecheSekundaer, backgroundColor: farben.flaecheSekundaer,
}, },
kameraLeer: { flex: 1, justifyContent: 'center', padding: abstand.m, gap: abstand.m }, kameraLeer: { flex: 1, justifyContent: 'center', padding: abstand.m, gap: abstand.m },
meldung: { marginTop: abstand.m, gap: abstand.m, padding: abstand.m, borderRadius: 16, backgroundColor: farben.flaeche }, meldung: { ...kartenSchatten, marginTop: abstand.m, gap: abstand.m, padding: abstand.m, borderRadius: ecke, backgroundColor: farben.flaeche },
schutzZeile: { flexDirection: 'row', alignItems: 'center', gap: 6, marginTop: abstand.m }, schutzZeile: { flexDirection: 'row', alignItems: 'center', gap: 6, marginTop: abstand.m },
schutzText: { fontSize: 13, color: farben.textTertiaer }, schutzText: { fontFamily: schriftart.serif, fontSize: 13, color: farben.textTertiaer },
feld: { feld: { fontFamily: schriftart.serif,
backgroundColor: farben.flaeche, borderRadius: 12, padding: 14, fontSize: schrift.klein, backgroundColor: farben.flaeche, borderRadius: ecke, padding: 14, fontSize: schrift.klein,
color: farben.text, borderWidth: 1, borderColor: farben.rand, marginBottom: abstand.s, color: farben.text, borderWidth: 1, borderColor: farben.rand, marginBottom: abstand.s,
}, },
}); });
+65 -34
View File
@@ -1,38 +1,51 @@
/** /**
* Design-System: ruhig, vertrauenswürdig, barrierefrei. * Design-System — wie die Webseite behoerdenklar.de: ein Amtsbrief, der
* endlich verständlich ist. Papier, Tinte, Amtsblau, gelber Textmarker,
* Georgia-Serifenschrift, Etiketten in Schreibmaschinenschrift.
*
* - Große Schrift (Basis 18) für die Zielgruppe * - Große Schrift (Basis 18) für die Zielgruppe
* - Hoher Kontrast (dunkles Blau auf Weiß, WCAG AA) * - Hoher Kontrast (Tinte auf Papier, WCAG AA)
* - Große Touch-Targets (min. 56px Höhe) * - Große Touch-Targets (min. 56px Höhe)
*
* Die Werte entsprechen den CSS-Variablen der Webseite (--papier, --tinte,
* --amtsblau, --marker, --stempelrot …). Ändert sich dort etwas, hier mitziehen.
*/ */
import { Platform, TextStyle, ViewStyle } from 'react-native';
export const farben = { export const farben = {
// Warme, ruhige Palette nach dem Claude-Design-Entwurf ("Postklar/Classical") hintergrund: '#FAF7F0', // Papier (--papier)
// und passend zur Website: Papier-Beige, Gold-Akzent, dunkle Tinte. flaeche: '#FFFFFF', // weißes Formularblatt (Karten, Felder)
// Gut lesbar (hoher Kontrast bei Fließtext), nur die Schrift bleibt flaecheSekundaer: '#F1ECDF', // dunkleres Papier (--papier-dunkel)
// die klare System-Schrift statt der dünnen Serifenschrift. primaer: '#1D4E89', // Amtsblau (Icons, aktive Tabs, Links)
hintergrund: '#F1EFE9', // warmes Off-White (Grund) primaerFuellung: '#1D4E89', // Amtsblau — gefüllte Knöpfe
flaeche: '#FBFAF6', // warme, fast weiße Karten primaerText: '#FFFFFF', // Text auf gefüllten Knöpfen
flaecheSekundaer: '#EAE7E0', // gedämpfte Fläche (graue Taste) text: '#21211D', // Tinte
primaer: '#B68235', // Gold-Akzent (Icons, aktive Tabs, Rahmen, Punkte) textSekundaer: '#6B675E', // Grau (--grau)
primaerFuellung: '#7D5411', // dunkles Bronze — Hintergrund gefüllter Buttons (weiße Schrift lesbar) textTertiaer: '#9A958A', // helles Grau (Platzhalter, Chevrons)
primaerText: '#FBF7EF', // warmes Weiß (Text auf gefüllten Buttons) rand: 'rgba(33,33,29,0.22)', // dünne Linie wie auf der Webseite
text: '#201F1D', // dunkle Tinte tinte: '#21211D', // harte Rahmen und Schatten
textSekundaer: '#6B675E', // warmes Grau (wie --grau der Website) marker: '#FFE66B', // gelber Textmarker (Signatur der Marke)
textTertiaer: '#A8A29A', // helles warmes Grau (Chevrons) stempelrot: '#B3372B',
rand: '#E2DED6', // warme Trennlinie // Hervorhebung = Textmarker (z. B. aktive Filter)
// Dezente Gold-Hervorhebung (z. B. aktive Filter-Chips) hervorhebung: '#FFE66B',
hervorhebung: '#F7EFE0', hervorhebungRand: '#21211D',
hervorhebungRand: '#E9D8BC',
// Dringlichkeits-Ampel in den warmen Design-Tönen — als Text auf hellem // Dringlichkeits-Ampel wie auf der Webseite (--rot, --gelb, --gruen),
// Tint gut lesbar (WCAG): Backstein-Rot, Bronze-Gold, Salbei-Grün. // Gelb etwas dunkler, damit es als Text auf hellem Grund WCAG AA erreicht.
ampelRot: '#A23B2B', ampelRot: '#B3372B',
ampelGelb: '#8A5E14', ampelGelb: '#8A5A00',
ampelGruen: '#3F5A4C', ampelGruen: '#2E7D4F',
ampelRotHintergrund: '#F5E9E5', ampelRotHintergrund: '#FDF1EF',
ampelGelbHintergrund: '#F5EEDF', ampelGelbHintergrund: '#FFF6D6',
ampelGruenHintergrund: '#E8EFEA', ampelGruenHintergrund: '#E7F4EA',
fehler: '#A23B2B', fehler: '#B3372B',
};
/** Schriften der Webseite: Georgia (Text) und Courier (Etiketten). */
export const schriftart = {
serif: Platform.select({ ios: 'Georgia', android: 'serif', default: 'Georgia' }) as string,
mono: Platform.select({ ios: 'Courier New', android: 'monospace', default: 'Courier New' }) as string,
}; };
export const schrift = { export const schrift = {
@@ -54,9 +67,27 @@ export const abstand = {
/** Mindesthöhe für alle interaktiven Elemente (Barrierefreiheit). */ /** Mindesthöhe für alle interaktiven Elemente (Barrierefreiheit). */
export const TOUCH_TARGET = 56; export const TOUCH_TARGET = 56;
/** /** Papier hat (fast) keine runden Ecken. */
* Bewusst leer: Nach Apple-Vorbild heben sich weiße Karten allein durch export const ecke = 2;
* den grauen System-Hintergrund ab — ohne Schatten und Rahmen.
* (Als No-Op behalten, damit bestehende Spreads harmlos bleiben.) /** Karte wie `.brief-karte` der Webseite: weißes Blatt, feine Linie, flacher Schatten. */
*/ export const kartenSchatten: ViewStyle = {
export const kartenSchatten = {} as const; borderWidth: 1,
borderColor: 'rgba(33,33,29,0.28)',
boxShadow: '4px 5px 0px rgba(33,33,29,0.08)',
};
/** Formular wie `.antrag`: Tinten-Rahmen mit hartem Versatz-Schatten. */
export const formularRahmen: ViewStyle = {
borderWidth: 2,
borderColor: farben.tinte,
boxShadow: '6px 7px 0px rgba(33,33,29,0.9)',
};
/** Etikett wie `h2`/`.karten-label` der Webseite: Schreibmaschine, Versalien. */
export const etikett: TextStyle = {
fontFamily: schriftart.mono,
fontSize: 13,
letterSpacing: 1.4,
textTransform: 'uppercase',
};
+56 -7
View File
@@ -1,8 +1,9 @@
/** /**
* Einrichtungs-Codes für Beratungsstellen anlegen und verwalten. * Einrichtungs-Codes für Beratungsstellen anlegen und verwalten.
* *
* node tools/einrichtungs-code.js neu "MBE Donnersberg" MBE --briefe 100 --bis 2026-12-18
* node tools/einrichtungs-code.js neu "MBE Donnersberg" MBE --briefe 100 --monate 1 * node tools/einrichtungs-code.js neu "MBE Donnersberg" MBE --briefe 100 --monate 1
* node tools/einrichtungs-code.js stand MBE-K7QX * node tools/einrichtungs-code.js stand MBE-K7QX (mit Nutzung nach Woche und Sprache)
* node tools/einrichtungs-code.js aufladen MBE-K7QX 100 * node tools/einrichtungs-code.js aufladen MBE-K7QX 100
* node tools/einrichtungs-code.js verlaengern MBE-K7QX 2027-06-30 * node tools/einrichtungs-code.js verlaengern MBE-K7QX 2027-06-30
* *
@@ -26,8 +27,16 @@ function kv(...args) {
return execFileSync('npx', ['wrangler', 'kv', 'key', ...args, '--namespace-id', KV_ID, '--remote'], return execFileSync('npx', ['wrangler', 'kv', 'key', ...args, '--namespace-id', KV_ID, '--remote'],
{ cwd: PROXY, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] }).trim(); { cwd: PROXY, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] }).trim();
} }
/** null nur, wenn es den Schlüssel wirklich nicht gibt (404). Jeder andere Fehler bricht ab —
* sonst würden „aufladen"/„verlaengern" nach einem Wackler im Netz Guthaben oder Namen überschreiben. */
function lies(schluessel) { function lies(schluessel) {
try { return kv('get', schluessel, '--text'); } catch { return null; } try { return kv('get', schluessel, '--text'); } catch (e) {
const meldung = String((e && e.stderr) || (e && e.message) || '');
if (/404|not found/i.test(meldung)) return null;
abbruch(`Keine Verbindung zu Cloudflare (beim Lesen von ${schluessel.split(':')[0]}). Nichts wurde geändert.\n` +
'Einfach nochmal ausführen. Hilft das nicht: im Ordner proxy „npx wrangler login“ ausführen.\n\n' +
meldung.split('\n').filter((z) => z.trim()).slice(0, 3).join('\n'));
}
} }
function schreib(schluessel, wert) { kv('put', schluessel, wert); } function schreib(schluessel, wert) { kv('put', schluessel, wert); }
@@ -49,8 +58,26 @@ function plusMonate(monate) {
return d.toISOString().slice(0, 10); return d.toISOString().slice(0, 10);
} }
/** Wie im Worker: „mbe k7qx" → „MBE-K7QX". */
function normCode(c) {
const roh = String(c || '').toUpperCase().replace(/[^A-Z0-9]/g, '');
return roh.length > 4 ? `${roh.slice(0, -4)}-${roh.slice(-4)}` : roh;
}
/** Nutzung je Analyse (vom Worker: nutzung:<walletId>:<datum>:<sprache>:<zufall>). */
function nutzung(walletId) {
let liste = [];
try {
liste = JSON.parse(kv('list', '--prefix', `nutzung:${walletId}:`));
} catch { return null; }
return liste.map((e) => {
const [, , datum, sprache] = e.name.split(':');
return { datum, sprache };
});
}
function ladeCode(code) { function ladeCode(code) {
code = String(code || '').toUpperCase(); code = normCode(code);
const walletId = lies(`code:${code}`); const walletId = lies(`code:${code}`);
if (!walletId) abbruch(`Code ${code} gibt es nicht.`); if (!walletId) abbruch(`Code ${code} gibt es nicht.`);
const einrichtung = JSON.parse(lies(`einrichtung:${walletId}`) || '{}'); const einrichtung = JSON.parse(lies(`einrichtung:${walletId}`) || '{}');
@@ -58,14 +85,33 @@ function ladeCode(code) {
return { code, walletId, einrichtung, rest }; return { code, walletId, einrichtung, rest };
} }
function zeige({ code, einrichtung, rest }) { function zeige({ code, einrichtung, rest, walletId }) {
const heute = new Date().toISOString().slice(0, 10); const heute = new Date().toISOString().slice(0, 10);
const n = walletId ? nutzung(walletId) : null;
let auswertung = '';
if (n && n.length) {
const proWoche = {}, proSprache = {};
for (const { datum, sprache } of n) {
const d = new Date(`${datum}T00:00:00Z`);
const montag = new Date(d.getTime() - ((d.getUTCDay() + 6) % 7) * 86400000).toISOString().slice(0, 10);
proWoche[montag] = (proWoche[montag] || 0) + 1;
proSprache[sprache] = (proSprache[sprache] || 0) + 1;
}
auswertung = `
Genutzt: ${n.length} ${n.length === 1 ? 'Brief' : 'Briefe'}
Pro Woche: ${Object.keys(proWoche).sort().map((w) => `ab ${w}: ${proWoche[w]}`).join(' · ')}
Sprachen: ${Object.entries(proSprache).sort((a, b) => b[1] - a[1]).map(([s, z]) => `${s} ${z}`).join(' · ')}`;
} else if (n) {
auswertung = '\n Genutzt: noch keine Briefe';
} else if (walletId) {
auswertung = '\n Genutzt: konnte gerade nicht geladen werden (nochmal ausführen)';
}
console.log(` console.log(`
Einrichtung: ${einrichtung.name} Einrichtung: ${einrichtung.name}
Code: \x1b[1m${code}\x1b[0m Code: \x1b[1m${code}\x1b[0m
Übrig: ${rest} Briefe Übrig: ${rest} Briefe
Gültig bis: ${einrichtung.ablauf}${einrichtung.ablauf < heute ? ' \x1b[31m(abgelaufen)\x1b[0m' : ''} Gültig bis: ${einrichtung.ablauf}${einrichtung.ablauf < heute ? ' \x1b[31m(abgelaufen)\x1b[0m' : ''}
Link: https://behoerdenklar.de/demo?code=${code} Link: https://behoerdenklar.de/demo?code=${code}${auswertung}
`); `);
} }
@@ -78,7 +124,10 @@ if (befehl === 'neu') {
abbruch('So geht es: node tools/einrichtungs-code.js neu "MBE Donnersberg" MBE --briefe 100 --monate 1'); abbruch('So geht es: node tools/einrichtungs-code.js neu "MBE Donnersberg" MBE --briefe 100 --monate 1');
} }
const briefe = parseInt(option('briefe', '100'), 10); const briefe = parseInt(option('briefe', '100'), 10);
const ablauf = option('bis', plusMonate(parseInt(option('monate', '1'), 10))); const monate = parseInt(option('monate', '1'), 10);
const ablauf = option('bis', Number.isFinite(monate) && monate > 0 ? plusMonate(monate) : '');
if (!(briefe > 0)) abbruch('--briefe braucht eine Zahl größer 0, z. B. --briefe 100');
if (!/^\d{4}-\d{2}-\d{2}$/.test(ablauf)) abbruch('--bis braucht ein Datum wie 2026-12-18 (oder --monate 1)');
const code = `${praefix}-${zufall(4)}`; const code = `${praefix}-${zufall(4)}`;
if (lies(`code:${code}`)) abbruch('Zufällig schon vergeben — einfach nochmal ausführen.'); if (lies(`code:${code}`)) abbruch('Zufällig schon vergeben — einfach nochmal ausführen.');
const walletId = crypto.randomUUID(); const walletId = crypto.randomUUID();
@@ -86,7 +135,7 @@ if (befehl === 'neu') {
schreib(`einrichtung:${walletId}`, JSON.stringify({ name, ablauf })); schreib(`einrichtung:${walletId}`, JSON.stringify({ name, ablauf }));
schreib(`code:${code}`, walletId); schreib(`code:${code}`, walletId);
console.log('\n \x1b[32m✓ Code angelegt\x1b[0m'); console.log('\n \x1b[32m✓ Code angelegt\x1b[0m');
zeige({ code, einrichtung: { name, ablauf }, rest: briefe }); zeige({ code, einrichtung: { name, ablauf }, rest: briefe, walletId });
} else if (befehl === 'stand') { } else if (befehl === 'stand') {
zeige(ladeCode(a)); zeige(ladeCode(a));
} else if (befehl === 'aufladen') { } else if (befehl === 'aufladen') {
+27 -27
View File
@@ -60,7 +60,7 @@ TEXTE.tr = {
faq: [ faq: [
{ f: "Ücreti ne kadar?", a: "İlk 3 mektup ücretsiz (bekleme listesi koduyla 5). Sonrasında kontör satın alırsınız: 5 analiz 2,99 €, 15 analiz 6,99 €. Abonelik yok, hesap açmak yok." }, { f: "Ücreti ne kadar?", a: "İlk 3 mektup ücretsiz (bekleme listesi koduyla 5). Sonrasında kontör satın alırsınız: 5 analiz 2,99 €, 15 analiz 6,99 €. Abonelik yok, hesap açmak yok." },
{ f: "Hangi mektupları açıklayabilir?", a: "İş ve İşçi Bulma Kurumu (Jobcenter), Yabancılar Dairesi, emeklilik kurumu, hastalık sigortası, aile kasası (Kindergeld), vergi dairesi veya ceza dairesinden gelen mektuplar — kısacası hemen hemen her resmî mektup." }, { f: "Hangi mektupları açıklayabilir?", a: "İş ve İşçi Bulma Kurumu (Jobcenter), Yabancılar Dairesi, emeklilik kurumu, hastalık sigortası, aile kasası (Kindergeld), vergi dairesi veya ceza dairesinden gelen mektuplar — kısacası hemen hemen her resmî mektup." },
{ f: "Verilerime ne oluyor?", a: "Mektuplarınız şifreli olarak kendi cihazınızda kalır. Analiz için fotoğraf bir kez güvenli şekilde yapay zekâya gönderilir ve orada en geç 30 gün sonra silinir. Hesap açmanız gerekmez." }, { f: "Verilerime ne oluyor?", a: "Mektuplarınız şifreli olarak kendi cihazınızda kalır. Analiz için fotoğraf bir kez güvenli şekilde yapay zekâya gönderilir ve orada genellikle 30 gün sonra silinir. Hesap açmanız gerekmez." },
], ],
locale: 'tr_TR', navLabel: 'Dil seçin', locale: 'tr_TR', navLabel: 'Dil seçin',
titel: 'BehördenKlar – Alman resmî mektuplarını anlayın', titel: 'BehördenKlar – Alman resmî mektuplarını anlayın',
@@ -104,7 +104,7 @@ TEXTE.ar = {
faq: [ faq: [
{ f: "كم التكلفة؟", a: "أول 3 رسائل مجاناً (5 مع رمز قائمة الانتظار). بعد ذلك تشتري رصيداً: 5 تحليلات بـ 2,99 يورو أو 15 بـ 6,99 يورو. بدون اشتراك وبدون حساب." }, { f: "كم التكلفة؟", a: "أول 3 رسائل مجاناً (5 مع رمز قائمة الانتظار). بعد ذلك تشتري رصيداً: 5 تحليلات بـ 2,99 يورو أو 15 بـ 6,99 يورو. بدون اشتراك وبدون حساب." },
{ f: "أي الرسائل يمكن شرحها؟", a: "رسائل من مركز العمل (Jobcenter)، دائرة الأجانب، التأمين التقاعدي، التأمين الصحي، صندوق الأسرة (Kindergeld)، مكتب الضرائب أو دائرة المخالفات — باختصار: تقريباً كل رسالة رسمية." }, { f: "أي الرسائل يمكن شرحها؟", a: "رسائل من مركز العمل (Jobcenter)، دائرة الأجانب، التأمين التقاعدي، التأمين الصحي، صندوق الأسرة (Kindergeld)، مكتب الضرائب أو دائرة المخالفات — باختصار: تقريباً كل رسالة رسمية." },
{ f: "ماذا يحدث لبياناتي؟", a: "تبقى رسائلك مشفّرة على جهازك. للتحليل تُرسل الصورة مرة واحدة بشكل آمن إلى الذكاء الاصطناعي وتُحذف هناك خلال 30 يوماً كحد أقصى. لا تحتاج إلى حساب." }, { f: "ماذا يحدث لبياناتي؟", a: "تبقى رسائلك مشفّرة على جهازك. للتحليل تُرسل الصورة مرة واحدة بشكل آمن إلى الذكاء الاصطناعي وتُحذف هناك عادةً بعد 30 يوماً. لا تحتاج إلى حساب." },
], ],
locale: 'ar_AR', navLabel: 'اختر اللغة', locale: 'ar_AR', navLabel: 'اختر اللغة',
titel: 'BehördenKlar – افهم الرسائل الرسمية الألمانية', titel: 'BehördenKlar – افهم الرسائل الرسمية الألمانية',
@@ -148,7 +148,7 @@ TEXTE.ru = {
faq: [ faq: [
{ f: "Сколько это стоит?", a: "Первые 3 письма бесплатно (5 с кодом из списка ожидания). Дальше вы покупаете баланс: 5 разборов за 2,99 €, 15 за 6,99 €. Без подписки и без учётной записи." }, { f: "Сколько это стоит?", a: "Первые 3 письма бесплатно (5 с кодом из списка ожидания). Дальше вы покупаете баланс: 5 разборов за 2,99 €, 15 за 6,99 €. Без подписки и без учётной записи." },
{ f: "Какие письма приложение объясняет?", a: "Письма из джобцентра, ведомства по делам иностранцев, пенсионного страхования, больничной кассы, семейной кассы (Kindergeld), налоговой или органа по штрафам — словом, почти любое официальное письмо." }, { f: "Какие письма приложение объясняет?", a: "Письма из джобцентра, ведомства по делам иностранцев, пенсионного страхования, больничной кассы, семейной кассы (Kindergeld), налоговой или органа по штрафам — словом, почти любое официальное письмо." },
{ f: "Что происходит с моими данными?", a: "Ваши письма остаются зашифрованными на вашем устройстве. Для разбора фото один раз безопасно отправляется ИИ и удаляется там не позднее чем через 30 дней. Учётная запись не нужна." }, { f: "Что происходит с моими данными?", a: "Ваши письма остаются зашифрованными на вашем устройстве. Для разбора фото один раз безопасно отправляется ИИ и удаляется там обычно через 30 дней. Учётная запись не нужна." },
], ],
locale: 'ru_RU', navLabel: 'Выберите язык', locale: 'ru_RU', navLabel: 'Выберите язык',
titel: 'BehördenKlar – понять письмо из немецкого ведомства', titel: 'BehördenKlar – понять письмо из немецкого ведомства',
@@ -192,7 +192,7 @@ TEXTE.uk = {
faq: [ faq: [
{ f: "Скільки це коштує?", a: "Перші 3 листи безкоштовно (5 з кодом зі списку очікування). Далі ви купуєте баланс: 5 аналізів за 2,99 €, 15 за 6,99 €. Без підписки й без облікового запису." }, { f: "Скільки це коштує?", a: "Перші 3 листи безкоштовно (5 з кодом зі списку очікування). Далі ви купуєте баланс: 5 аналізів за 2,99 €, 15 за 6,99 €. Без підписки й без облікового запису." },
{ f: "Які листи застосунок пояснює?", a: "Листи з джобцентру, відомства у справах іноземців, пенсійного страхування, лікарняної каси, сімейної каси (Kindergeld), податкової або органу зі штрафів — словом, майже будь-який офіційний лист." }, { f: "Які листи застосунок пояснює?", a: "Листи з джобцентру, відомства у справах іноземців, пенсійного страхування, лікарняної каси, сімейної каси (Kindergeld), податкової або органу зі штрафів — словом, майже будь-який офіційний лист." },
{ f: "Що відбувається з моїми даними?", a: "Ваші листи залишаються зашифрованими на вашому пристрої. Для аналізу фото один раз безпечно надсилається до ШІ і видаляється там щонайпізніше через 30 днів. Обліковий запис не потрібен." }, { f: "Що відбувається з моїми даними?", a: "Ваші листи залишаються зашифрованими на вашому пристрої. Для аналізу фото один раз безпечно надсилається до ШІ і видаляється там зазвичай через 30 днів. Обліковий запис не потрібен." },
], ],
locale: 'uk_UA', navLabel: 'Оберіть мову', locale: 'uk_UA', navLabel: 'Оберіть мову',
titel: 'BehördenKlar – зрозуміти лист із німецької установи', titel: 'BehördenKlar – зрозуміти лист із німецької установи',
@@ -236,7 +236,7 @@ TEXTE.pl = {
faq: [ faq: [
{ f: "Ile to kosztuje?", a: "Pierwsze 3 pisma za darmo (5 z kodem z listy oczekujących). Potem kupujesz doładowanie: 5 analiz za 2,99 €, 15 za 6,99 €. Bez abonamentu i bez konta." }, { f: "Ile to kosztuje?", a: "Pierwsze 3 pisma za darmo (5 z kodem z listy oczekujących). Potem kupujesz doładowanie: 5 analiz za 2,99 €, 15 za 6,99 €. Bez abonamentu i bez konta." },
{ f: "Jakie pisma aplikacja wyjaśnia?", a: "Pisma z Jobcenter, urzędu do spraw cudzoziemców, ubezpieczenia emerytalnego, kasy chorych, kasy rodzinnej (Kindergeld), urzędu skarbowego lub organu mandatowego — krótko mówiąc prawie każde oficjalne pismo." }, { f: "Jakie pisma aplikacja wyjaśnia?", a: "Pisma z Jobcenter, urzędu do spraw cudzoziemców, ubezpieczenia emerytalnego, kasy chorych, kasy rodzinnej (Kindergeld), urzędu skarbowego lub organu mandatowego — krótko mówiąc prawie każde oficjalne pismo." },
{ f: "Co dzieje się z moimi danymi?", a: "Twoje pisma pozostają zaszyfrowane na Twoim urządzeniu. Do analizy zdjęcie jest raz bezpiecznie wysyłane do SI i usuwane tam najpóźniej po 30 dniach. Konto nie jest potrzebne." }, { f: "Co dzieje się z moimi danymi?", a: "Twoje pisma pozostają zaszyfrowane na Twoim urządzeniu. Do analizy zdjęcie jest raz bezpiecznie wysyłane do SI i usuwane tam zwykle po 30 dniach. Konto nie jest potrzebne." },
], ],
locale: 'pl_PL', navLabel: 'Wybierz język', locale: 'pl_PL', navLabel: 'Wybierz język',
titel: 'BehördenKlar – zrozum pismo z niemieckiego urzędu', titel: 'BehördenKlar – zrozum pismo z niemieckiego urzędu',
@@ -280,7 +280,7 @@ TEXTE.ro = {
faq: [ faq: [
{ f: "Cât costă?", a: "Primele 3 scrisori sunt gratuite (5 cu codul din lista de așteptare). Apoi cumperi credit: 5 analize la 2,99 €, 15 la 6,99 €. Fără abonament și fără cont." }, { f: "Cât costă?", a: "Primele 3 scrisori sunt gratuite (5 cu codul din lista de așteptare). Apoi cumperi credit: 5 analize la 2,99 €, 15 la 6,99 €. Fără abonament și fără cont." },
{ f: "Ce scrisori poate explica aplicația?", a: "Scrisori de la Jobcenter, Oficiul pentru Străini, asigurarea de pensie, casa de sănătate, casa familială (Kindergeld), administrația fiscală sau oficiul de amenzi — pe scurt, aproape orice scrisoare oficială." }, { f: "Ce scrisori poate explica aplicația?", a: "Scrisori de la Jobcenter, Oficiul pentru Străini, asigurarea de pensie, casa de sănătate, casa familială (Kindergeld), administrația fiscală sau oficiul de amenzi — pe scurt, aproape orice scrisoare oficială." },
{ f: "Ce se întâmplă cu datele mele?", a: "Scrisorile tale rămân criptate pe dispozitivul tău. Pentru analiză, fotografia este trimisă o singură dată în siguranță către IA și este ștearsă acolo în cel mult 30 de zile. Nu ai nevoie de cont." }, { f: "Ce se întâmplă cu datele mele?", a: "Scrisorile tale rămân criptate pe dispozitivul tău. Pentru analiză, fotografia este trimisă o singură dată în siguranță către IA și este ștearsă acolo de regulă după 30 de zile. Nu ai nevoie de cont." },
], ],
locale: 'ro_RO', navLabel: 'Alege limba', locale: 'ro_RO', navLabel: 'Alege limba',
titel: 'BehördenKlar – înțelege scrisoarea de la autoritățile germane', titel: 'BehördenKlar – înțelege scrisoarea de la autoritățile germane',
@@ -324,7 +324,7 @@ TEXTE.en = {
faq: [ faq: [
{ f: "What does it cost?", a: "Your first 3 letters are free (5 with the waiting-list code). After that you buy credit: 5 analyses for €2.99 or 15 for €6.99. No subscription, no account." }, { f: "What does it cost?", a: "Your first 3 letters are free (5 with the waiting-list code). After that you buy credit: 5 analyses for €2.99 or 15 for €6.99. No subscription, no account." },
{ f: "Which letters can the app explain?", a: "Letters from the Jobcenter, the immigration office, pension insurance, health insurance, the family benefits office (Kindergeld), the tax office or the fines authority — in short, almost any official letter." }, { f: "Which letters can the app explain?", a: "Letters from the Jobcenter, the immigration office, pension insurance, health insurance, the family benefits office (Kindergeld), the tax office or the fines authority — in short, almost any official letter." },
{ f: "What happens to my data?", a: "Your letters stay encrypted on your own device. For the analysis the photo is sent once, securely, to the AI and is deleted there after 30 days at the latest. You do not need an account." }, { f: "What happens to my data?", a: "Your letters stay encrypted on your own device. For the analysis the photo is sent once, securely, to the AI and is usually deleted there after 30 days. You do not need an account." },
], ],
locale: 'en_US', navLabel: 'Choose language', locale: 'en_US', navLabel: 'Choose language',
titel: 'BehördenKlar – understand letters from German authorities', titel: 'BehördenKlar – understand letters from German authorities',
@@ -368,7 +368,7 @@ TEXTE.fa = {
faq: [ faq: [
{ f: "هزینه آن چقدر است؟", a: "سه نامه اول رایگان است (با کد فهرست انتظار ۵ نامه). پس از آن اعتبار می‌خرید: ۵ تحلیل با ۲٫۹۹ یورو یا ۱۵ تحلیل با ۶٫۹۹ یورو. بدون اشتراک و بدون حساب کاربری." }, { f: "هزینه آن چقدر است؟", a: "سه نامه اول رایگان است (با کد فهرست انتظار ۵ نامه). پس از آن اعتبار می‌خرید: ۵ تحلیل با ۲٫۹۹ یورو یا ۱۵ تحلیل با ۶٫۹۹ یورو. بدون اشتراک و بدون حساب کاربری." },
{ f: "چه نامه‌هایی را می‌تواند توضیح دهد؟", a: "نامه‌های مرکز کاریابی (Jobcenter)، اداره اتباع خارجی، بیمه بازنشستگی، بیمه درمانی، صندوق خانواده (Kindergeld)، اداره مالیات یا اداره جرایم — به‌طور خلاصه تقریباً هر نامه رسمی." }, { f: "چه نامه‌هایی را می‌تواند توضیح دهد؟", a: "نامه‌های مرکز کاریابی (Jobcenter)، اداره اتباع خارجی، بیمه بازنشستگی، بیمه درمانی، صندوق خانواده (Kindergeld)، اداره مالیات یا اداره جرایم — به‌طور خلاصه تقریباً هر نامه رسمی." },
{ f: "با اطلاعات من چه می‌شود؟", a: "نامه‌های شما رمزگذاری‌شده روی دستگاه خودتان می‌مانند. برای تحلیل، عکس یک بار به‌صورت امن به هوش مصنوعی فرستاده می‌شود و حداکثر پس از ۳۰ روز آنجا پاک می‌شود. به حساب کاربری نیاز ندارید." }, { f: "با اطلاعات من چه می‌شود؟", a: "نامه‌های شما رمزگذاری‌شده روی دستگاه خودتان می‌مانند. برای تحلیل، عکس یک بار به‌صورت امن به هوش مصنوعی فرستاده می‌شود و معمولاً پس از ۳۰ روز آنجا پاک می‌شود. به حساب کاربری نیاز ندارید." },
], ],
locale: 'fa_IR', navLabel: 'زبان را انتخاب کنید', locale: 'fa_IR', navLabel: 'زبان را انتخاب کنید',
titel: 'BehördenKlar – نامه‌های اداری آلمان را بفهمید', titel: 'BehördenKlar – نامه‌های اداری آلمان را بفهمید',
@@ -412,7 +412,7 @@ TEXTE.ku = {
faq: [ faq: [
{ f: "Ew çiqas dike?", a: "Sê nameyên pêşîn belaş in (bi koda lîsteya bendewariyê 5). Piştre tu krediyê dikirî: 5 analîz bi 2,99 €, 15 bi 6,99 €. Bê abone, bê hesab." }, { f: "Ew çiqas dike?", a: "Sê nameyên pêşîn belaş in (bi koda lîsteya bendewariyê 5). Piştre tu krediyê dikirî: 5 analîz bi 2,99 €, 15 bi 6,99 €. Bê abone, bê hesab." },
{ f: "Kîjan name dikare rave bike?", a: "Nameyên ji Jobcenter, Daîreya Biyaniyan, sîgorteya teqawidiyê, sîgorteya tenduristiyê, sindoqa malbatê (Kindergeld), daîreya bacê an daîreya cezayan — bi kurtî hema hema her nameya fermî." }, { f: "Kîjan name dikare rave bike?", a: "Nameyên ji Jobcenter, Daîreya Biyaniyan, sîgorteya teqawidiyê, sîgorteya tenduristiyê, sindoqa malbatê (Kindergeld), daîreya bacê an daîreya cezayan — bi kurtî hema hema her nameya fermî." },
{ f: "Bi daneyên min çi tê kirin?", a: "Nameyên te bi şîfre li ser amûra te dimînin. Ji bo analîzê wêne carekê bi ewlehî ji AI re tê şandin û li wir herî dereng piştî 30 rojan tê jêbirin. Tu hewceyî hesabekî nînî." }, { f: "Bi daneyên min çi tê kirin?", a: "Nameyên te bi şîfre li ser amûra te dimînin. Ji bo analîzê wêne carekê bi ewlehî ji AI re tê şandin û li wir bi gelemperî piştî 30 rojan tê jêbirin. Tu hewceyî hesabekî nînî." },
], ],
locale: 'ku_TR', navLabel: 'Zimên hilbijêre', locale: 'ku_TR', navLabel: 'Zimên hilbijêre',
titel: 'BehördenKlar – nameyên fermî yên Almanyayê fêm bike', titel: 'BehördenKlar – nameyên fermî yên Almanyayê fêm bike',
@@ -456,7 +456,7 @@ TEXTE.bg = {
faq: [ faq: [
{ f: "Колко струва?", a: "Първите 3 писма са безплатни (5 с кода от списъка на чакащите). След това купувате кредит: 5 анализа за 2,99 €, 15 за 6,99 €. Без абонамент и без регистрация." }, { f: "Колко струва?", a: "Първите 3 писма са безплатни (5 с кода от списъка на чакащите). След това купувате кредит: 5 анализа за 2,99 €, 15 за 6,99 €. Без абонамент и без регистрация." },
{ f: "Кои писма може да обясни приложението?", a: "Писма от Jobcenter, службата за чужденци, пенсионното осигуряване, здравната каса, семейната каса (Kindergeld), данъчната служба или службата за глоби — накратко почти всяко официално писмо." }, { f: "Кои писма може да обясни приложението?", a: "Писма от Jobcenter, службата за чужденци, пенсионното осигуряване, здравната каса, семейната каса (Kindergeld), данъчната служба или службата за глоби — накратко почти всяко официално писмо." },
{ f: "Какво става с данните ми?", a: "Писмата ви остават криптирани на вашето устройство. За анализа снимката се изпраща еднократно и защитено към ИИ и се изтрива там най-късно след 30 дни. Не ви трябва регистрация." }, { f: "Какво става с данните ми?", a: "Писмата ви остават криптирани на вашето устройство. За анализа снимката се изпраща еднократно и защитено към ИИ и се изтрива там обикновено след 30 дни. Не ви трябва регистрация." },
], ],
locale: 'bg_BG', navLabel: 'Изберете език', locale: 'bg_BG', navLabel: 'Изберете език',
titel: 'BehördenKlar – разберете писмото от немска институция', titel: 'BehördenKlar – разберете писмото от немска институция',
@@ -500,7 +500,7 @@ TEXTE.hr = {
faq: [ faq: [
{ f: "Koliko košta?", a: "Prva 3 pisma su besplatna (5 s kodom s liste čekanja). Zatim kupujete bodove: 5 analiza za 2,99 €, 15 za 6,99 €. Bez pretplate i bez računa." }, { f: "Koliko košta?", a: "Prva 3 pisma su besplatna (5 s kodom s liste čekanja). Zatim kupujete bodove: 5 analiza za 2,99 €, 15 za 6,99 €. Bez pretplate i bez računa." },
{ f: "Koja pisma aplikacija objašnjava?", a: "Pisma Jobcentra, Ureda za strance, mirovinskog osiguranja, zdravstvenog osiguranja, obiteljske blagajne (Kindergeld), porezne uprave ili ureda za kazne — ukratko, gotovo svako službeno pismo." }, { f: "Koja pisma aplikacija objašnjava?", a: "Pisma Jobcentra, Ureda za strance, mirovinskog osiguranja, zdravstvenog osiguranja, obiteljske blagajne (Kindergeld), porezne uprave ili ureda za kazne — ukratko, gotovo svako službeno pismo." },
{ f: "Što se događa s mojim podacima?", a: "Vaša pisma ostaju šifrirana na vašem uređaju. Za analizu se fotografija jednom sigurno šalje umjetnoj inteligenciji i ondje se briše najkasnije nakon 30 dana. Račun nije potreban." }, { f: "Što se događa s mojim podacima?", a: "Vaša pisma ostaju šifrirana na vašem uređaju. Za analizu se fotografija jednom sigurno šalje umjetnoj inteligenciji i ondje se u pravilu briše nakon 30 dana. Račun nije potreban." },
], ],
locale: 'hr_HR', navLabel: 'Odaberite jezik', locale: 'hr_HR', navLabel: 'Odaberite jezik',
titel: 'BehördenKlar – razumite pismo njemačke ustanove', titel: 'BehördenKlar – razumite pismo njemačke ustanove',
@@ -544,7 +544,7 @@ TEXTE.sr = {
faq: [ faq: [
{ f: "Колико кошта?", a: "Прва 3 писма су бесплатна (5 са кодом са листе чекања). Затим купујете бодове: 5 анализа за 2,99 €, 15 за 6,99 €. Без претплате и без налога." }, { f: "Колико кошта?", a: "Прва 3 писма су бесплатна (5 са кодом са листе чекања). Затим купујете бодове: 5 анализа за 2,99 €, 15 за 6,99 €. Без претплате и без налога." },
{ f: "Која писма апликација објашњава?", a: "Писма Јобцентра, Управе за странце, пензијског осигурања, здравственог осигурања, породичне благајне (Kindergeld), пореске управе или службе за казне — укратко, готово свако службено писмо." }, { f: "Која писма апликација објашњава?", a: "Писма Јобцентра, Управе за странце, пензијског осигурања, здравственог осигурања, породичне благајне (Kindergeld), пореске управе или службе за казне — укратко, готово свако службено писмо." },
{ f: "Шта се дешава са мојим подацима?", a: "Ваша писма остају шифрована на вашем уређају. За анализу се фотографија једном безбедно шаље вештачкој интелигенцији и тамо се брише најкасније после 30 дана. Налог није потребан." }, { f: "Шта се дешава са мојим подацима?", a: "Ваша писма остају шифрована на вашем уређају. За анализу се фотографија једном безбедно шаље вештачкој интелигенцији и тамо се по правилу брише после 30 дана. Налог није потребан." },
], ],
locale: 'sr_RS', navLabel: 'Изаберите језик', locale: 'sr_RS', navLabel: 'Изаберите језик',
titel: 'BehördenKlar – разумејте писмо немачке установе', titel: 'BehördenKlar – разумејте писмо немачке установе',
@@ -588,7 +588,7 @@ TEXTE.bs = {
faq: [ faq: [
{ f: "Koliko košta?", a: "Prva 3 pisma su besplatna (5 s kodom s liste čekanja). Zatim kupujete bodove: 5 analiza za 2,99 €, 15 za 6,99 €. Bez pretplate i bez računa." }, { f: "Koliko košta?", a: "Prva 3 pisma su besplatna (5 s kodom s liste čekanja). Zatim kupujete bodove: 5 analiza za 2,99 €, 15 za 6,99 €. Bez pretplate i bez računa." },
{ f: "Koja pisma aplikacija objašnjava?", a: "Pisma Jobcentra, Ureda za strance, penzionog osiguranja, zdravstvenog osiguranja, porodične blagajne (Kindergeld), poreske uprave ili ureda za kazne — ukratko, gotovo svako službeno pismo." }, { f: "Koja pisma aplikacija objašnjava?", a: "Pisma Jobcentra, Ureda za strance, penzionog osiguranja, zdravstvenog osiguranja, porodične blagajne (Kindergeld), poreske uprave ili ureda za kazne — ukratko, gotovo svako službeno pismo." },
{ f: "Šta se dešava s mojim podacima?", a: "Vaša pisma ostaju šifrirana na vašem uređaju. Za analizu se fotografija jednom sigurno šalje vještačkoj inteligenciji i tamo se briše najkasnije nakon 30 dana. Račun nije potreban." }, { f: "Šta se dešava s mojim podacima?", a: "Vaša pisma ostaju šifrirana na vašem uređaju. Za analizu se fotografija jednom sigurno šalje vještačkoj inteligenciji i tamo se u pravilu briše nakon 30 dana. Račun nije potreban." },
], ],
locale: 'bs_BA', navLabel: 'Odaberite jezik', locale: 'bs_BA', navLabel: 'Odaberite jezik',
titel: 'BehördenKlar – razumijte pismo njemačke ustanove', titel: 'BehördenKlar – razumijte pismo njemačke ustanove',
@@ -632,7 +632,7 @@ TEXTE.sq = {
faq: [ faq: [
{ f: "Sa kushton?", a: "3 letrat e para janë falas (5 me kodin e listës së pritjes). Më pas blini kredi: 5 analiza për 2,99 €, 15 për 6,99 €. Pa abonim dhe pa llogari." }, { f: "Sa kushton?", a: "3 letrat e para janë falas (5 me kodin e listës së pritjes). Më pas blini kredi: 5 analiza për 2,99 €, 15 për 6,99 €. Pa abonim dhe pa llogari." },
{ f: "Cilat letra mund të shpjegojë?", a: "Letra nga Jobcenter, Zyra e të Huajve, sigurimi i pensionit, sigurimi shëndetësor, arka familjare (Kindergeld), zyra e tatimeve ose zyra e gjobave — shkurt, pothuajse çdo letër zyrtare." }, { f: "Cilat letra mund të shpjegojë?", a: "Letra nga Jobcenter, Zyra e të Huajve, sigurimi i pensionit, sigurimi shëndetësor, arka familjare (Kindergeld), zyra e tatimeve ose zyra e gjobave — shkurt, pothuajse çdo letër zyrtare." },
{ f: "Çfarë ndodh me të dhënat e mia?", a: "Letrat tuaja mbeten të koduara në pajisjen tuaj. Për analizën, fotoja dërgohet një herë në mënyrë të sigurt te inteligjenca artificiale dhe fshihet atje më së voni pas 30 ditësh. Nuk ju duhet llogari." }, { f: "Çfarë ndodh me të dhënat e mia?", a: "Letrat tuaja mbeten të koduara në pajisjen tuaj. Për analizën, fotoja dërgohet një herë në mënyrë të sigurt te inteligjenca artificiale dhe fshihet atje zakonisht pas 30 ditësh. Nuk ju duhet llogari." },
], ],
locale: 'sq_AL', navLabel: 'Zgjidhni gjuhën', locale: 'sq_AL', navLabel: 'Zgjidhni gjuhën',
titel: 'BehördenKlar – kuptoni letrën e një institucioni gjerman', titel: 'BehördenKlar – kuptoni letrën e një institucioni gjerman',
@@ -676,7 +676,7 @@ TEXTE.it = {
faq: [ faq: [
{ f: "Quanto costa?", a: "Le prime 3 lettere sono gratis (5 con il codice della lista d’attesa). Poi acquisti credito: 5 analisi a 2,99 € o 15 a 6,99 €. Nessun abbonamento, nessun account." }, { f: "Quanto costa?", a: "Le prime 3 lettere sono gratis (5 con il codice della lista d’attesa). Poi acquisti credito: 5 analisi a 2,99 € o 15 a 6,99 €. Nessun abbonamento, nessun account." },
{ f: "Quali lettere può spiegare?", a: "Lettere del Jobcenter, dell’Ufficio stranieri, dell’assicurazione pensionistica, della cassa malattia, della cassa familiare (Kindergeld), dell’ufficio delle imposte o dell’ufficio sanzioni — in breve, quasi ogni lettera ufficiale." }, { f: "Quali lettere può spiegare?", a: "Lettere del Jobcenter, dell’Ufficio stranieri, dell’assicurazione pensionistica, della cassa malattia, della cassa familiare (Kindergeld), dell’ufficio delle imposte o dell’ufficio sanzioni — in breve, quasi ogni lettera ufficiale." },
{ f: "Che fine fanno i miei dati?", a: "Le tue lettere restano cifrate sul tuo dispositivo. Per l’analisi la foto viene inviata una sola volta in modo sicuro all’IA e viene cancellata lì al più tardi dopo 30 giorni. Non serve un account." }, { f: "Che fine fanno i miei dati?", a: "Le tue lettere restano cifrate sul tuo dispositivo. Per l’analisi la foto viene inviata una sola volta in modo sicuro all’IA e viene cancellata lì di norma dopo 30 giorni. Non serve un account." },
], ],
locale: 'it_IT', navLabel: 'Scegli la lingua', locale: 'it_IT', navLabel: 'Scegli la lingua',
titel: 'BehördenKlar – capire le lettere degli uffici tedeschi', titel: 'BehördenKlar – capire le lettere degli uffici tedeschi',
@@ -720,7 +720,7 @@ TEXTE.el = {
faq: [ faq: [
{ f: "Πόσο κοστίζει;", a: "Τα πρώτα 3 γράμματα είναι δωρεάν (5 με τον κωδικό της λίστας αναμονής). Έπειτα αγοράζετε μονάδες: 5 αναλύσεις 2,99 € ή 15 για 6,99 €. Χωρίς συνδρομή, χωρίς λογαριασμό." }, { f: "Πόσο κοστίζει;", a: "Τα πρώτα 3 γράμματα είναι δωρεάν (5 με τον κωδικό της λίστας αναμονής). Έπειτα αγοράζετε μονάδες: 5 αναλύσεις 2,99 € ή 15 για 6,99 €. Χωρίς συνδρομή, χωρίς λογαριασμό." },
{ f: "Ποια γράμματα μπορεί να εξηγήσει;", a: "Γράμματα από το Jobcenter, την Υπηρεσία Αλλοδαπών, την ασφάλιση σύνταξης, το ταμείο υγείας, το οικογενειακό ταμείο (Kindergeld), την εφορία ή την υπηρεσία προστίμων — με λίγα λόγια, σχεδόν κάθε επίσημο γράμμα." }, { f: "Ποια γράμματα μπορεί να εξηγήσει;", a: "Γράμματα από το Jobcenter, την Υπηρεσία Αλλοδαπών, την ασφάλιση σύνταξης, το ταμείο υγείας, το οικογενειακό ταμείο (Kindergeld), την εφορία ή την υπηρεσία προστίμων — με λίγα λόγια, σχεδόν κάθε επίσημο γράμμα." },
{ f: "Τι γίνεται με τα δεδομένα μου;", a: "Τα γράμματά σας παραμένουν κρυπτογραφημένα στη συσκευή σας. Για την ανάλυση η φωτογραφία στέλνεται μία φορά με ασφάλεια στην ΤΝ και διαγράφεται εκεί το αργότερο μετά από 30 ημέρες. Δεν χρειάζεστε λογαριασμό." }, { f: "Τι γίνεται με τα δεδομένα μου;", a: "Τα γράμματά σας παραμένουν κρυπτογραφημένα στη συσκευή σας. Για την ανάλυση η φωτογραφία στέλνεται μία φορά με ασφάλεια στην ΤΝ και διαγράφεται εκεί συνήθως μετά από 30 ημέρες. Δεν χρειάζεστε λογαριασμό." },
], ],
locale: 'el_GR', navLabel: 'Επιλέξτε γλώσσα', locale: 'el_GR', navLabel: 'Επιλέξτε γλώσσα',
titel: 'BehördenKlar – κατανοήστε το γράμμα γερμανικής υπηρεσίας', titel: 'BehördenKlar – κατανοήστε το γράμμα γερμανικής υπηρεσίας',
@@ -764,7 +764,7 @@ TEXTE.es = {
faq: [ faq: [
{ f: "¿Cuánto cuesta?", a: "Las primeras 3 cartas son gratis (5 con el código de la lista de espera). Después compras saldo: 5 análisis por 2,99 € o 15 por 6,99 €. Sin suscripción y sin cuenta." }, { f: "¿Cuánto cuesta?", a: "Las primeras 3 cartas son gratis (5 con el código de la lista de espera). Después compras saldo: 5 análisis por 2,99 € o 15 por 6,99 €. Sin suscripción y sin cuenta." },
{ f: "¿Qué cartas puede explicar?", a: "Cartas del Jobcenter, de la Oficina de Extranjería, del seguro de pensiones, de la mutua de salud, de la caja familiar (Kindergeld), de Hacienda o de la oficina de multas — en resumen, casi cualquier carta oficial." }, { f: "¿Qué cartas puede explicar?", a: "Cartas del Jobcenter, de la Oficina de Extranjería, del seguro de pensiones, de la mutua de salud, de la caja familiar (Kindergeld), de Hacienda o de la oficina de multas — en resumen, casi cualquier carta oficial." },
{ f: "¿Qué pasa con mis datos?", a: "Tus cartas permanecen cifradas en tu propio dispositivo. Para el análisis, la foto se envía una sola vez de forma segura a la IA y allí se borra como máximo a los 30 días. No necesitas cuenta." }, { f: "¿Qué pasa con mis datos?", a: "Tus cartas permanecen cifradas en tu propio dispositivo. Para el análisis, la foto se envía una sola vez de forma segura a la IA y allí se borra normalmente a los 30 días. No necesitas cuenta." },
], ],
locale: 'es_ES', navLabel: 'Elige idioma', locale: 'es_ES', navLabel: 'Elige idioma',
titel: 'BehördenKlar – entiende las cartas de las oficinas alemanas', titel: 'BehördenKlar – entiende las cartas de las oficinas alemanas',
@@ -808,7 +808,7 @@ TEXTE.pt = {
faq: [ faq: [
{ f: "Quanto custa?", a: "As primeiras 3 cartas são grátis (5 com o código da lista de espera). Depois compra saldo: 5 análises por 2,99 € ou 15 por 6,99 €. Sem assinatura e sem conta." }, { f: "Quanto custa?", a: "As primeiras 3 cartas são grátis (5 com o código da lista de espera). Depois compra saldo: 5 análises por 2,99 € ou 15 por 6,99 €. Sem assinatura e sem conta." },
{ f: "Que cartas consegue explicar?", a: "Cartas do Jobcenter, do Serviço de Estrangeiros, do seguro de pensões, da caixa de saúde, da caixa familiar (Kindergeld), das finanças ou do serviço de multas — em resumo, quase qualquer carta oficial." }, { f: "Que cartas consegue explicar?", a: "Cartas do Jobcenter, do Serviço de Estrangeiros, do seguro de pensões, da caixa de saúde, da caixa familiar (Kindergeld), das finanças ou do serviço de multas — em resumo, quase qualquer carta oficial." },
{ f: "O que acontece aos meus dados?", a: "As suas cartas ficam cifradas no seu próprio dispositivo. Para a análise, a foto é enviada uma única vez de forma segura para a IA e é apagada lá no máximo ao fim de 30 dias. Não precisa de conta." }, { f: "O que acontece aos meus dados?", a: "As suas cartas ficam cifradas no seu próprio dispositivo. Para a análise, a foto é enviada uma única vez de forma segura para a IA e é apagada lá normalmente ao fim de 30 dias. Não precisa de conta." },
], ],
locale: 'pt_PT', navLabel: 'Escolha o idioma', locale: 'pt_PT', navLabel: 'Escolha o idioma',
titel: 'BehördenKlar – perceber as cartas das repartições alemãs', titel: 'BehördenKlar – perceber as cartas das repartições alemãs',
@@ -852,7 +852,7 @@ TEXTE.fr = {
faq: [ faq: [
{ f: "Combien ça coûte ?", a: "Les 3 premiers courriers sont gratuits (5 avec le code de la liste d’attente). Ensuite vous achetez du crédit : 5 analyses pour 2,99 € ou 15 pour 6,99 €. Sans abonnement et sans compte." }, { f: "Combien ça coûte ?", a: "Les 3 premiers courriers sont gratuits (5 avec le code de la liste d’attente). Ensuite vous achetez du crédit : 5 analyses pour 2,99 € ou 15 pour 6,99 €. Sans abonnement et sans compte." },
{ f: "Quels courriers peut-elle expliquer ?", a: "Les courriers du Jobcenter, du service des étrangers, de l’assurance retraite, de la caisse maladie, de la caisse familiale (Kindergeld), du fisc ou du service des amendes — bref, presque tout courrier officiel." }, { f: "Quels courriers peut-elle expliquer ?", a: "Les courriers du Jobcenter, du service des étrangers, de l’assurance retraite, de la caisse maladie, de la caisse familiale (Kindergeld), du fisc ou du service des amendes — bref, presque tout courrier officiel." },
{ f: "Que deviennent mes données ?", a: "Vos courriers restent chiffrés sur votre appareil. Pour l’analyse, la photo est envoyée une seule fois de façon sécurisée à l’IA et y est supprimée au plus tard au bout de 30 jours. Aucun compte nécessaire." }, { f: "Que deviennent mes données ?", a: "Vos courriers restent chiffrés sur votre appareil. Pour l’analyse, la photo est envoyée une seule fois de façon sécurisée à l’IA et y est supprimée en général au bout de 30 jours. Aucun compte nécessaire." },
], ],
locale: 'fr_FR', navLabel: 'Choisir la langue', locale: 'fr_FR', navLabel: 'Choisir la langue',
titel: 'BehördenKlar – comprendre les courriers administratifs allemands', titel: 'BehördenKlar – comprendre les courriers administratifs allemands',
@@ -896,7 +896,7 @@ TEXTE.hu = {
faq: [ faq: [
{ f: "Mennyibe kerül?", a: "Az első 3 levél ingyenes (a várólista kódjával 5). Utána egyenleget vásárol: 5 elemzés 2,99 €, 15 elemzés 6,99 €. Előfizetés és fiók nélkül." }, { f: "Mennyibe kerül?", a: "Az első 3 levél ingyenes (a várólista kódjával 5). Utána egyenleget vásárol: 5 elemzés 2,99 €, 15 elemzés 6,99 €. Előfizetés és fiók nélkül." },
{ f: "Milyen leveleket tud elmagyarázni?", a: "A Jobcenter, az idegenrendészet, a nyugdíjbiztosító, a betegpénztár, a családi pénztár (Kindergeld), az adóhivatal vagy a bírságoló hatóság leveleit — röviden szinte minden hivatalos levelet." }, { f: "Milyen leveleket tud elmagyarázni?", a: "A Jobcenter, az idegenrendészet, a nyugdíjbiztosító, a betegpénztár, a családi pénztár (Kindergeld), az adóhivatal vagy a bírságoló hatóság leveleit — röviden szinte minden hivatalos levelet." },
{ f: "Mi történik az adataimmal?", a: "A levelei titkosítva a saját készülékén maradnak. Az elemzéshez a fénykép egyszer, biztonságosan kerül el az MI-hez, és ott legkésőbb 30 nap múlva törlődik. Nincs szükség fiókra." }, { f: "Mi történik az adataimmal?", a: "A levelei titkosítva a saját készülékén maradnak. Az elemzéshez a fénykép egyszer, biztonságosan kerül el az MI-hez, és ott általában 30 nap múlva törlődik. Nincs szükség fiókra." },
], ],
locale: 'hu_HU', navLabel: 'Válasszon nyelvet', locale: 'hu_HU', navLabel: 'Válasszon nyelvet',
titel: 'BehördenKlar – értse meg a német hivatali levelet', titel: 'BehördenKlar – értse meg a német hivatali levelet',
@@ -940,7 +940,7 @@ TEXTE.vi = {
faq: [ faq: [
{ f: "Giá bao nhiêu?", a: "3 lá thư đầu tiên miễn phí (5 nếu có mã từ danh sách chờ). Sau đó bạn mua lượt: 5 lần phân tích 2,99 €, 15 lần 6,99 €. Không thuê bao, không cần tài khoản." }, { f: "Giá bao nhiêu?", a: "3 lá thư đầu tiên miễn phí (5 nếu có mã từ danh sách chờ). Sau đó bạn mua lượt: 5 lần phân tích 2,99 €, 15 lần 6,99 €. Không thuê bao, không cần tài khoản." },
{ f: "Ứng dụng giải thích được những thư nào?", a: "Thư từ Jobcenter, Sở Ngoại kiều, bảo hiểm hưu trí, bảo hiểm y tế, quỹ gia đình (Kindergeld), sở thuế hoặc cơ quan xử phạt — nói ngắn gọn là hầu hết mọi thư chính thức." }, { f: "Ứng dụng giải thích được những thư nào?", a: "Thư từ Jobcenter, Sở Ngoại kiều, bảo hiểm hưu trí, bảo hiểm y tế, quỹ gia đình (Kindergeld), sở thuế hoặc cơ quan xử phạt — nói ngắn gọn là hầu hết mọi thư chính thức." },
{ f: "Dữ liệu của tôi thì sao?", a: "Thư của bạn được mã hóa và nằm trên thiết bị của bạn. Để phân tích, ảnh được gửi một lần duy nhất và an toàn tới AI, rồi bị xóa ở đó chậm nhất sau 30 ngày. Bạn không cần tài khoản." }, { f: "Dữ liệu của tôi thì sao?", a: "Thư của bạn được mã hóa và nằm trên thiết bị của bạn. Để phân tích, ảnh được gửi một lần duy nhất và an toàn tới AI, rồi thường bị xóa ở đó sau 30 ngày. Bạn không cần tài khoản." },
], ],
locale: 'vi_VN', navLabel: 'Chọn ngôn ngữ', locale: 'vi_VN', navLabel: 'Chọn ngôn ngữ',
titel: 'BehördenKlar – hiểu thư từ cơ quan công quyền Đức', titel: 'BehördenKlar – hiểu thư từ cơ quan công quyền Đức',
@@ -984,7 +984,7 @@ TEXTE.hi = {
faq: [ faq: [
{ f: "इसकी कीमत क्या है?", a: "पहली 3 चिट्ठियाँ मुफ़्त हैं (प्रतीक्षा सूची के कोड से 5)। उसके बाद आप क्रेडिट खरीदते हैं: 5 विश्लेषण 2,99 € में या 15 विश्लेषण 6,99 € में। कोई सदस्यता नहीं, कोई खाता नहीं।" }, { f: "इसकी कीमत क्या है?", a: "पहली 3 चिट्ठियाँ मुफ़्त हैं (प्रतीक्षा सूची के कोड से 5)। उसके बाद आप क्रेडिट खरीदते हैं: 5 विश्लेषण 2,99 € में या 15 विश्लेषण 6,99 € में। कोई सदस्यता नहीं, कोई खाता नहीं।" },
{ f: "यह कौन-सी चिट्ठियाँ समझा सकता है?", a: "जॉबसेंटर, विदेशी विभाग, पेंशन बीमा, स्वास्थ्य बीमा, परिवार कोष (Kindergeld), कर विभाग या जुर्माना विभाग की चिट्ठियाँ — संक्षेप में, लगभग हर सरकारी चिट्ठी।" }, { f: "यह कौन-सी चिट्ठियाँ समझा सकता है?", a: "जॉबसेंटर, विदेशी विभाग, पेंशन बीमा, स्वास्थ्य बीमा, परिवार कोष (Kindergeld), कर विभाग या जुर्माना विभाग की चिट्ठियाँ — संक्षेप में, लगभग हर सरकारी चिट्ठी।" },
{ f: "मेरे डेटा का क्या होता है?", a: "आपकी चिट्ठियाँ आपके अपने उपकरण पर एन्क्रिप्टेड रहती हैं। विश्लेषण के लिए फ़ोटो एक बार सुरक्षित रूप से एआई को भेजी जाती है और वहाँ अधिकतम 30 दिनों में मिटा दी जाती है। आपको खाते की ज़रूरत नहीं।" }, { f: "मेरे डेटा का क्या होता है?", a: "आपकी चिट्ठियाँ आपके अपने उपकरण पर एन्क्रिप्टेड रहती हैं। विश्लेषण के लिए फ़ोटो एक बार सुरक्षित रूप से एआई को भेजी जाती है और वहाँ आमतौर पर 30 दिन बाद मिटा दी जाती है। आपको खाते की ज़रूरत नहीं।" },
], ],
locale: 'hi_IN', navLabel: 'भाषा चुनें', locale: 'hi_IN', navLabel: 'भाषा चुनें',
titel: 'BehördenKlar – जर्मन सरकारी चिट्ठी समझें', titel: 'BehördenKlar – जर्मन सरकारी चिट्ठी समझें',
@@ -1028,7 +1028,7 @@ TEXTE.ur = {
faq: [ faq: [
{ f: "اس کی قیمت کیا ہے؟", a: "پہلے 3 خط مفت ہیں (انتظار کی فہرست کے کوڈ کے ساتھ 5)۔ اس کے بعد آپ کریڈٹ خریدتے ہیں: 5 تجزیے 2,99 € میں یا 15 تجزیے 6,99 € میں۔ کوئی سبسکرپشن نہیں، کوئی اکاؤنٹ نہیں۔" }, { f: "اس کی قیمت کیا ہے؟", a: "پہلے 3 خط مفت ہیں (انتظار کی فہرست کے کوڈ کے ساتھ 5)۔ اس کے بعد آپ کریڈٹ خریدتے ہیں: 5 تجزیے 2,99 € میں یا 15 تجزیے 6,99 € میں۔ کوئی سبسکرپشن نہیں، کوئی اکاؤنٹ نہیں۔" },
{ f: "یہ کون سے خط سمجھا سکتا ہے؟", a: "جاب سینٹر، غیر ملکی دفتر، پنشن انشورنس، ہیلتھ انشورنس، فیملی فنڈ (Kindergeld)، ٹیکس دفتر یا جرمانہ دفتر کے خطوط — مختصراً تقریباً ہر سرکاری خط۔" }, { f: "یہ کون سے خط سمجھا سکتا ہے؟", a: "جاب سینٹر، غیر ملکی دفتر، پنشن انشورنس، ہیلتھ انشورنس، فیملی فنڈ (Kindergeld)، ٹیکس دفتر یا جرمانہ دفتر کے خطوط — مختصراً تقریباً ہر سرکاری خط۔" },
{ f: "میرے ڈیٹا کا کیا ہوتا ہے؟", a: "آپ کے خطوط آپ کے اپنے آلے پر خفیہ شکل میں رہتے ہیں۔ تجزیے کے لیے تصویر ایک بار محفوظ طریقے سے اے آئی کو بھیجی جاتی ہے اور وہاں زیادہ سے زیادہ 30 دن میں مٹا دی جاتی ہے۔ آپ کو اکاؤنٹ کی ضرورت نہیں۔" }, { f: "میرے ڈیٹا کا کیا ہوتا ہے؟", a: "آپ کے خطوط آپ کے اپنے آلے پر خفیہ شکل میں رہتے ہیں۔ تجزیے کے لیے تصویر ایک بار محفوظ طریقے سے اے آئی کو بھیجی جاتی ہے اور وہاں عام طور پر 30 دن بعد مٹا دی جاتی ہے۔ آپ کو اکاؤنٹ کی ضرورت نہیں۔" },
], ],
locale: 'ur_PK', navLabel: 'زبان منتخب کریں', locale: 'ur_PK', navLabel: 'زبان منتخب کریں',
titel: 'BehördenKlar – جرمن سرکاری خط سمجھیں', titel: 'BehördenKlar – جرمن سرکاری خط سمجھیں',
@@ -1072,7 +1072,7 @@ TEXTE.ps = {
faq: [ faq: [
{ f: "بیه یې څومره ده؟", a: "لومړي ۳ لیکونه وړیا دي (د انتظار لړلیک کوډ سره ۵). وروسته تاسو کریډیټ اخلئ: ۵ شننې په ۲٫۹۹ یورو یا ۱۵ په ۶٫۹۹ یورو. نه ګډون، نه حساب." }, { f: "بیه یې څومره ده؟", a: "لومړي ۳ لیکونه وړیا دي (د انتظار لړلیک کوډ سره ۵). وروسته تاسو کریډیټ اخلئ: ۵ شننې په ۲٫۹۹ یورو یا ۱۵ په ۶٫۹۹ یورو. نه ګډون، نه حساب." },
{ f: "کوم لیکونه رابرسېره کولی شي؟", a: "د جاب سنټر، د بهرنیانو ادارې، د تقاعد بیمې، روغتیايي بیمې، کورنۍ صندوق (Kindergeld)، مالیې ادارې یا د جریمو ادارې لیکونه — په لنډه توګه نږدې هر رسمي لیک." }, { f: "کوم لیکونه رابرسېره کولی شي؟", a: "د جاب سنټر، د بهرنیانو ادارې، د تقاعد بیمې، روغتیايي بیمې، کورنۍ صندوق (Kindergeld)، مالیې ادارې یا د جریمو ادارې لیکونه — په لنډه توګه نږدې هر رسمي لیک." },
{ f: "زما معلوماتو ته څه کیږي؟", a: "ستاسو لیکونه پټ شوي ستاسو په خپله وسیله پاتې کیږي. د شننې لپاره عکس یو ځل په خوندي ډول مصنوعي ځیرکتیا ته لیږل کیږي او هلته تر ۳۰ ورځو وروسته ړنګېږي. حساب ته اړتیا نشته." }, { f: "زما معلوماتو ته څه کیږي؟", a: "ستاسو لیکونه پټ شوي ستاسو په خپله وسیله پاتې کیږي. د شننې لپاره عکس یو ځل په خوندي ډول مصنوعي ځیرکتیا ته لیږل کیږي او هلته معمولاً تر ۳۰ ورځو وروسته ړنګېږي. حساب ته اړتیا نشته." },
], ],
locale: 'ps_AF', navLabel: 'ژبه وټاکئ', locale: 'ps_AF', navLabel: 'ژبه وټاکئ',
titel: 'BehördenKlar – د آلمان رسمي لیکونه پوه شئ', titel: 'BehördenKlar – د آلمان رسمي لیکونه پوه شئ',
@@ -1116,7 +1116,7 @@ TEXTE.ti = {
faq: [ faq: [
{ f: "ክንደይ ይኸፍል?", a: "እቶም ቀዳሞት 3 ደብዳበታት ብነጻ እዮም (ብናይ ምጽባይ ዝርዝር ኮድ 5)። ድሕሪኡ ክሬዲት ትገዝእ፦ 5 መጽናዕቲ ብ2,99 € ወይ 15 ብ6,99 €። ዝኾነ ምዝገባ ወይ ኣካውንት ኣየድልን።" }, { f: "ክንደይ ይኸፍል?", a: "እቶም ቀዳሞት 3 ደብዳበታት ብነጻ እዮም (ብናይ ምጽባይ ዝርዝር ኮድ 5)። ድሕሪኡ ክሬዲት ትገዝእ፦ 5 መጽናዕቲ ብ2,99 € ወይ 15 ብ6,99 €። ዝኾነ ምዝገባ ወይ ኣካውንት ኣየድልን።" },
{ f: "ኣየኖት ደብዳበታት ከብርህ ይኽእል?", a: "ካብ Jobcenter፣ ቤት ጽሕፈት ወጻእተኛታት፣ ውሕስነት ጡረታ፣ ውሕስነት ጥዕና፣ ስድራቤታዊ ካሳ (Kindergeld)፣ ቤት ጽሕፈት ግብሪ ወይ ቤት ጽሕፈት መቕጻዕቲ ዝመጹ ደብዳበታት — ብሓጺሩ ኩሉ ወግዓዊ ደብዳበ ማለት እዩ።" }, { f: "ኣየኖት ደብዳበታት ከብርህ ይኽእል?", a: "ካብ Jobcenter፣ ቤት ጽሕፈት ወጻእተኛታት፣ ውሕስነት ጡረታ፣ ውሕስነት ጥዕና፣ ስድራቤታዊ ካሳ (Kindergeld)፣ ቤት ጽሕፈት ግብሪ ወይ ቤት ጽሕፈት መቕጻዕቲ ዝመጹ ደብዳበታት — ብሓጺሩ ኩሉ ወግዓዊ ደብዳበ ማለት እዩ።" },
{ f: "ብዛዕባ ዳታይ እንታይ ይኸውን?", a: "ደብዳበታትካ ኣብ ናትካ መሳርሒ ተመስጢሮም ይጸንሑ። ንመጽናዕቲ እቲ ስእሊ ሓንሳብ ብውሑስ መንገዲ ናብ AI ይለኣኽ፣ ኣብኡ ድማ ዝበዝሐ ድሕሪ 30 መዓልቲ ይድምሰስ። ኣካውንት ኣየድልየካን።" }, { f: "ብዛዕባ ዳታይ እንታይ ይኸውን?", a: "ደብዳበታትካ ኣብ ናትካ መሳርሒ ተመስጢሮም ይጸንሑ። ንመጽናዕቲ እቲ ስእሊ ሓንሳብ ብውሑስ መንገዲ ናብ AI ይለኣኽ፣ ኣብኡ ድማ ብልሙድ ድሕሪ 30 መዓልቲ ይድምሰስ። ኣካውንት ኣየድልየካን።" },
], ],
locale: 'ti_ER', navLabel: 'ቋንቋ ምረጽ', locale: 'ti_ER', navLabel: 'ቋንቋ ምረጽ',
titel: 'BehördenKlar – ናይ ጀርመን ወግዓዊ ደብዳበ ተረዳእ', titel: 'BehördenKlar – ናይ ጀርመን ወግዓዊ ደብዳበ ተረዳእ',
@@ -1160,7 +1160,7 @@ TEXTE.so = {
faq: [ faq: [
{ f: "Intee ayey ku kacaysaa?", a: "3-da warqadood ee ugu horreeya waa bilaash (5 haddii aad haysato koodhka liiska sugitaanka). Kadib waxaad iibsanaysaa rasiid: 5 falanqayn 2,99 € ama 15 falanqayn 6,99 €. Rukun ma jiro, koonto looma baahna." }, { f: "Intee ayey ku kacaysaa?", a: "3-da warqadood ee ugu horreeya waa bilaash (5 haddii aad haysato koodhka liiska sugitaanka). Kadib waxaad iibsanaysaa rasiid: 5 falanqayn 2,99 € ama 15 falanqayn 6,99 €. Rukun ma jiro, koonto looma baahna." },
{ f: "Warqadaha noocee ah ayuu sharxi karaa?", a: "Warqadaha ka yimid Jobcenter, Xafiiska Ajaanibta, caymiska hawlgabka, caymiska caafimaadka, sanduuqa qoyska (Kindergeld), xafiiska canshuuraha ama xafiiska ganaaxyada — kooban: ku dhawaad warqad kasta oo rasmi ah." }, { f: "Warqadaha noocee ah ayuu sharxi karaa?", a: "Warqadaha ka yimid Jobcenter, Xafiiska Ajaanibta, caymiska hawlgabka, caymiska caafimaadka, sanduuqa qoyska (Kindergeld), xafiiska canshuuraha ama xafiiska ganaaxyada — kooban: ku dhawaad warqad kasta oo rasmi ah." },
{ f: "Maxaa ku dhacaya xogtayda?", a: "Warqadahaagu waxay ku hadhayaan qalabkaaga iyagoo sir ah. Falanqaynta awgeed sawirka hal mar ayaa si ammaan ah loogu diraa AI-ga, halkaasna waxaa laga tirtiraa ugu badnaan 30 maalmood gudahood. Koonto uma baahnid." }, { f: "Maxaa ku dhacaya xogtayda?", a: "Warqadahaagu waxay ku hadhayaan qalabkaaga iyagoo sir ah. Falanqaynta awgeed sawirka hal mar ayaa si ammaan ah loogu diraa AI-ga, halkaasna waxaa laga tirtiraa inta badan 30 maalmood kadib. Koonto uma baahnid." },
], ],
locale: 'so_SO', navLabel: 'Dooro luqadda', locale: 'so_SO', navLabel: 'Dooro luqadda',
titel: 'BehördenKlar – faham warqadda hay’adaha Jarmalka', titel: 'BehördenKlar – faham warqadda hay’adaha Jarmalka',
@@ -1204,7 +1204,7 @@ TEXTE.zh = {
faq: [ faq: [
{ f: "收费多少?", a: "前 3 封信免费(用等候名单的兑换码则是 5 封)。之后购买额度:5 次分析 2,99 €,15 次 6,99 €。无订阅,无需注册账号。" }, { f: "收费多少?", a: "前 3 封信免费(用等候名单的兑换码则是 5 封)。之后购买额度:5 次分析 2,99 €,15 次 6,99 €。无订阅,无需注册账号。" },
{ f: "能解释哪些信件?", a: "来自劳动介绍所(Jobcenter)、外管局、养老保险、医疗保险、家庭金库(Kindergeld)、税务局或罚款机关的信件——简而言之,几乎任何官方信件。" }, { f: "能解释哪些信件?", a: "来自劳动介绍所(Jobcenter)、外管局、养老保险、医疗保险、家庭金库(Kindergeld)、税务局或罚款机关的信件——简而言之,几乎任何官方信件。" },
{ f: "我的数据会怎样?", a: "您的信件以加密方式保存在您自己的设备上。分析时照片会安全地发送给人工智能一次,并最迟在 30 天后在那里删除。您不需要账号。" }, { f: "我的数据会怎样?", a: "您的信件以加密方式保存在您自己的设备上。分析时照片会安全地发送给人工智能一次,并通常在 30 天后在那里删除。您不需要账号。" },
], ],
locale: 'zh_CN', navLabel: '选择语言', locale: 'zh_CN', navLabel: '选择语言',
titel: 'BehördenKlar – 看懂德国政府部门的信件', titel: 'BehördenKlar – 看懂德国政府部门的信件',
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "ماذا يحدث لبياناتي؟", "name": "ماذا يحدث لبياناتي؟",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "تبقى رسائلك مشفّرة على جهازك. للتحليل تُرسل الصورة مرة واحدة بشكل آمن إلى الذكاء الاصطناعي وتُحذف هناك خلال 30 يوماً كحد أقصى. لا تحتاج إلى حساب." "text": "تبقى رسائلك مشفّرة على جهازك. للتحليل تُرسل الصورة مرة واحدة بشكل آمن إلى الذكاء الاصطناعي وتُحذف هناك عادةً بعد 30 يوماً. لا تحتاج إلى حساب."
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>ماذا يحدث لبياناتي؟</summary> <summary>ماذا يحدث لبياناتي؟</summary>
<p>تبقى رسائلك مشفّرة على جهازك. للتحليل تُرسل الصورة مرة واحدة بشكل آمن إلى الذكاء الاصطناعي وتُحذف هناك خلال 30 يوماً كحد أقصى. لا تحتاج إلى حساب.</p> <p>تبقى رسائلك مشفّرة على جهازك. للتحليل تُرسل الصورة مرة واحدة بشكل آمن إلى الذكاء الاصطناعي وتُحذف هناك عادةً بعد 30 يوماً. لا تحتاج إلى حساب.</p>
</details> </details>
</section> </section>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "Какво става с данните ми?", "name": "Какво става с данните ми?",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "Писмата ви остават криптирани на вашето устройство. За анализа снимката се изпраща еднократно и защитено към ИИ и се изтрива там най-късно след 30 дни. Не ви трябва регистрация." "text": "Писмата ви остават криптирани на вашето устройство. За анализа снимката се изпраща еднократно и защитено към ИИ и се изтрива там обикновено след 30 дни. Не ви трябва регистрация."
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>Какво става с данните ми?</summary> <summary>Какво става с данните ми?</summary>
<p>Писмата ви остават криптирани на вашето устройство. За анализа снимката се изпраща еднократно и защитено към ИИ и се изтрива там най-късно след 30 дни. Не ви трябва регистрация.</p> <p>Писмата ви остават криптирани на вашето устройство. За анализа снимката се изпраща еднократно и защитено към ИИ и се изтрива там обикновено след 30 дни. Не ви трябва регистрация.</p>
</details> </details>
</section> </section>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "Šta se dešava s mojim podacima?", "name": "Šta se dešava s mojim podacima?",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "Vaša pisma ostaju šifrirana na vašem uređaju. Za analizu se fotografija jednom sigurno šalje vještačkoj inteligenciji i tamo se briše najkasnije nakon 30 dana. Račun nije potreban." "text": "Vaša pisma ostaju šifrirana na vašem uređaju. Za analizu se fotografija jednom sigurno šalje vještačkoj inteligenciji i tamo se u pravilu briše nakon 30 dana. Račun nije potreban."
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>Šta se dešava s mojim podacima?</summary> <summary>Šta se dešava s mojim podacima?</summary>
<p>Vaša pisma ostaju šifrirana na vašem uređaju. Za analizu se fotografija jednom sigurno šalje vještačkoj inteligenciji i tamo se briše najkasnije nakon 30 dana. Račun nije potreban.</p> <p>Vaša pisma ostaju šifrirana na vašem uređaju. Za analizu se fotografija jednom sigurno šalje vještačkoj inteligenciji i tamo se u pravilu briše nakon 30 dana. Račun nije potreban.</p>
</details> </details>
</section> </section>
+16 -10
View File
@@ -61,8 +61,9 @@
<li> <li>
<strong>Anthropic PBC (USA)</strong> — den Betreiber des KI-Modells <strong>Anthropic PBC (USA)</strong> — den Betreiber des KI-Modells
„Claude". Anthropic verarbeitet die Daten ausschließlich zur „Claude". Anthropic verarbeitet die Daten ausschließlich zur
Erstellung der Analyse, speichert sie maximal 30 Tage (zur Erstellung der Analyse, löscht sie in der Regel nach 30 Tagen
Missbrauchserkennung) und verwendet sie nicht zum Training der KI. (länger nur, wenn ein Verdacht auf Missbrauch geprüft werden muss)
und verwendet sie nicht zum Training der KI.
</li> </li>
</ul> </ul>
<p> <p>
@@ -105,15 +106,16 @@
<h2>4. Übermittlung in die USA</h2> <h2>4. Übermittlung in die USA</h2>
<p> <p>
Anthropic PBC und Cloudflare, Inc. haben ihren Sitz in den USA. Die Anthropic PBC und Cloudflare, Inc. haben ihren Sitz in den USA. Die
Übermittlung stützt sich auf den Angemessenheitsbeschluss der Übermittlung stützt sich auf EU-Standardvertragsklauseln (Art. 46
EU-Kommission zum EU-U.S. Data Privacy Framework bzw. auf Abs. 2 lit. c DSGVO), die Bestandteil der
EU-Standardvertragsklauseln (Art. 46 DSGVO). Auftragsverarbeitungsverträge beider Anbieter sind.
</p> </p>
<h2>5. Speicherdauer</h2> <h2>5. Speicherdauer</h2>
<ul> <ul>
<li>Brieffotos bei Anthropic: maximal 30 Tage, danach automatische Löschung</li> <li>Brieffotos bei Anthropic: in der Regel 30 Tage, danach automatische Löschung (länger nur bei Prüfung eines Missbrauchsverdachts)</li>
<li>Anonyme Geräte-Kennung + Tageszähler auf unserem Server: maximal 48 Stunden</li> <li>Anonyme Geräte-Kennung + Tageszähler auf unserem Server: maximal 48 Stunden</li>
<li>Technische Server-Protokolle (Cloudflare Workers Logs: Zeitpunkt, aufgerufene Adresse, Fehlerart, technische Metadaten, kein Briefinhalt) zur Fehlersuche: maximal 7 Tage (Art. 6 Abs. 1 lit. f DSGVO)</li>
<li>Daten auf Ihrem Gerät: bis Sie sie löschen („Alle Daten löschen" in den Einstellungen oder Deinstallation der App)</li> <li>Daten auf Ihrem Gerät: bis Sie sie löschen („Alle Daten löschen" in den Einstellungen oder Deinstallation der App)</li>
</ul> </ul>
@@ -157,7 +159,7 @@
(Häkchen vor dem Hochladen, Art. 6 Abs. 1 lit. a, Art. 9 Abs. 2 (Häkchen vor dem Hochladen, Art. 6 Abs. 1 lit. a, Art. 9 Abs. 2
lit. a DSGVO) — über unseren Server (Cloudflare) an Anthropic (USA) lit. a DSGVO) — über unseren Server (Cloudflare) an Anthropic (USA)
zur Analyse geschickt. Es wird auf unserem Server nicht gespeichert; zur Analyse geschickt. Es wird auf unserem Server nicht gespeichert;
bei Anthropic wird es nach spätestens 30 Tagen gelöscht (wie in bei Anthropic wird es in der Regel nach 30 Tagen gelöscht (wie in
Abschnitt 3a beschrieben). Das Ergebnis sehen nur Sie in Ihrem Abschnitt 3a beschrieben). Das Ergebnis sehen nur Sie in Ihrem
Browser; wir speichern es nicht. Browser; wir speichern es nicht.
</li> </li>
@@ -222,9 +224,13 @@
Guthaben der Einrichtung, das wie in Abschnitt 9 beschrieben unter Guthaben der Einrichtung, das wie in Abschnitt 9 beschrieben unter
einer zufälligen Kennung verwaltet wird. Wir erfahren dabei nicht, wer einer zufälligen Kennung verwaltet wird. Wir erfahren dabei nicht, wer
den Code nutzt, und die Beratungsstelle sieht keine Briefe oder den Code nutzt, und die Beratungsstelle sieht keine Briefe oder
Ergebnisse, nur wie viele Analysen noch übrig sind. Gegen das Erraten Ergebnisse, nur Zahlen: wie viele Analysen noch übrig sind und wie
von Codes zählen wir falsche Eingaben pro IP-Adresse (Speicherung viele pro Woche und Sprache genutzt wurden. Für die Auswertung
max. 48 Stunden, Art. 6 Abs. 1 lit. f DSGVO). mit der Beratungsstelle zählen wir pro Analyse über einen Code nur das
Datum und die gewählte Sprache, ohne Briefinhalt und ohne Bezug zu
einer Person (Speicherung max. 13 Monate). Gegen das Erraten von
Codes zählen wir falsche Eingaben pro IP-Adresse (Speicherung max.
48 Stunden). Rechtsgrundlage ist jeweils Art. 6 Abs. 1 lit. f DSGVO.
</p> </p>
<h2>9b. Übergabe zwischen Handy und Computer</h2> <h2>9b. Übergabe zwischen Handy und Computer</h2>
+521 -127
View File
File diff suppressed because it is too large. Load diff
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "Τι γίνεται με τα δεδομένα μου;", "name": "Τι γίνεται με τα δεδομένα μου;",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "Τα γράμματά σας παραμένουν κρυπτογραφημένα στη συσκευή σας. Για την ανάλυση η φωτογραφία στέλνεται μία φορά με ασφάλεια στην ΤΝ και διαγράφεται εκεί το αργότερο μετά από 30 ημέρες. Δεν χρειάζεστε λογαριασμό." "text": "Τα γράμματά σας παραμένουν κρυπτογραφημένα στη συσκευή σας. Για την ανάλυση η φωτογραφία στέλνεται μία φορά με ασφάλεια στην ΤΝ και διαγράφεται εκεί συνήθως μετά από 30 ημέρες. Δεν χρειάζεστε λογαριασμό."
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>Τι γίνεται με τα δεδομένα μου;</summary> <summary>Τι γίνεται με τα δεδομένα μου;</summary>
<p>Τα γράμματά σας παραμένουν κρυπτογραφημένα στη συσκευή σας. Για την ανάλυση η φωτογραφία στέλνεται μία φορά με ασφάλεια στην ΤΝ και διαγράφεται εκεί το αργότερο μετά από 30 ημέρες. Δεν χρειάζεστε λογαριασμό.</p> <p>Τα γράμματά σας παραμένουν κρυπτογραφημένα στη συσκευή σας. Για την ανάλυση η φωτογραφία στέλνεται μία φορά με ασφάλεια στην ΤΝ και διαγράφεται εκεί συνήθως μετά από 30 ημέρες. Δεν χρειάζεστε λογαριασμό.</p>
</details> </details>
</section> </section>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "What happens to my data?", "name": "What happens to my data?",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "Your letters stay encrypted on your own device. For the analysis the photo is sent once, securely, to the AI and is deleted there after 30 days at the latest. You do not need an account." "text": "Your letters stay encrypted on your own device. For the analysis the photo is sent once, securely, to the AI and is usually deleted there after 30 days. You do not need an account."
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>What happens to my data?</summary> <summary>What happens to my data?</summary>
<p>Your letters stay encrypted on your own device. For the analysis the photo is sent once, securely, to the AI and is deleted there after 30 days at the latest. You do not need an account.</p> <p>Your letters stay encrypted on your own device. For the analysis the photo is sent once, securely, to the AI and is usually deleted there after 30 days. You do not need an account.</p>
</details> </details>
</section> </section>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "¿Qué pasa con mis datos?", "name": "¿Qué pasa con mis datos?",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "Tus cartas permanecen cifradas en tu propio dispositivo. Para el análisis, la foto se envía una sola vez de forma segura a la IA y allí se borra como máximo a los 30 días. No necesitas cuenta." "text": "Tus cartas permanecen cifradas en tu propio dispositivo. Para el análisis, la foto se envía una sola vez de forma segura a la IA y allí se borra normalmente a los 30 días. No necesitas cuenta."
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>¿Qué pasa con mis datos?</summary> <summary>¿Qué pasa con mis datos?</summary>
<p>Tus cartas permanecen cifradas en tu propio dispositivo. Para el análisis, la foto se envía una sola vez de forma segura a la IA y allí se borra como máximo a los 30 días. No necesitas cuenta.</p> <p>Tus cartas permanecen cifradas en tu propio dispositivo. Para el análisis, la foto se envía una sola vez de forma segura a la IA y allí se borra normalmente a los 30 días. No necesitas cuenta.</p>
</details> </details>
</section> </section>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "با اطلاعات من چه می‌شود؟", "name": "با اطلاعات من چه می‌شود؟",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "نامه‌های شما رمزگذاری‌شده روی دستگاه خودتان می‌مانند. برای تحلیل، عکس یک بار به‌صورت امن به هوش مصنوعی فرستاده می‌شود و حداکثر پس از ۳۰ روز آنجا پاک می‌شود. به حساب کاربری نیاز ندارید." "text": "نامه‌های شما رمزگذاری‌شده روی دستگاه خودتان می‌مانند. برای تحلیل، عکس یک بار به‌صورت امن به هوش مصنوعی فرستاده می‌شود و معمولاً پس از ۳۰ روز آنجا پاک می‌شود. به حساب کاربری نیاز ندارید."
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>با اطلاعات من چه می‌شود؟</summary> <summary>با اطلاعات من چه می‌شود؟</summary>
<p>نامه‌های شما رمزگذاری‌شده روی دستگاه خودتان می‌مانند. برای تحلیل، عکس یک بار به‌صورت امن به هوش مصنوعی فرستاده می‌شود و حداکثر پس از ۳۰ روز آنجا پاک می‌شود. به حساب کاربری نیاز ندارید.</p> <p>نامه‌های شما رمزگذاری‌شده روی دستگاه خودتان می‌مانند. برای تحلیل، عکس یک بار به‌صورت امن به هوش مصنوعی فرستاده می‌شود و معمولاً پس از ۳۰ روز آنجا پاک می‌شود. به حساب کاربری نیاز ندارید.</p>
</details> </details>
</section> </section>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "Que deviennent mes données ?", "name": "Que deviennent mes données ?",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "Vos courriers restent chiffrés sur votre appareil. Pour l’analyse, la photo est envoyée une seule fois de façon sécurisée à l’IA et y est supprimée au plus tard au bout de 30 jours. Aucun compte nécessaire." "text": "Vos courriers restent chiffrés sur votre appareil. Pour l’analyse, la photo est envoyée une seule fois de façon sécurisée à l’IA et y est supprimée en général au bout de 30 jours. Aucun compte nécessaire."
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>Que deviennent mes données ?</summary> <summary>Que deviennent mes données ?</summary>
<p>Vos courriers restent chiffrés sur votre appareil. Pour l’analyse, la photo est envoyée une seule fois de façon sécurisée à l’IA et y est supprimée au plus tard au bout de 30 jours. Aucun compte nécessaire.</p> <p>Vos courriers restent chiffrés sur votre appareil. Pour l’analyse, la photo est envoyée une seule fois de façon sécurisée à l’IA et y est supprimée en général au bout de 30 jours. Aucun compte nécessaire.</p>
</details> </details>
</section> </section>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "मेरे डेटा का क्या होता है?", "name": "मेरे डेटा का क्या होता है?",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "आपकी चिट्ठियाँ आपके अपने उपकरण पर एन्क्रिप्टेड रहती हैं। विश्लेषण के लिए फ़ोटो एक बार सुरक्षित रूप से एआई को भेजी जाती है और वहाँ अधिकतम 30 दिनों में मिटा दी जाती है। आपको खाते की ज़रूरत नहीं।" "text": "आपकी चिट्ठियाँ आपके अपने उपकरण पर एन्क्रिप्टेड रहती हैं। विश्लेषण के लिए फ़ोटो एक बार सुरक्षित रूप से एआई को भेजी जाती है और वहाँ आमतौर पर 30 दिन बाद मिटा दी जाती है। आपको खाते की ज़रूरत नहीं।"
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>मेरे डेटा का क्या होता है?</summary> <summary>मेरे डेटा का क्या होता है?</summary>
<p>आपकी चिट्ठियाँ आपके अपने उपकरण पर एन्क्रिप्टेड रहती हैं। विश्लेषण के लिए फ़ोटो एक बार सुरक्षित रूप से एआई को भेजी जाती है और वहाँ अधिकतम 30 दिनों में मिटा दी जाती है। आपको खाते की ज़रूरत नहीं।</p> <p>आपकी चिट्ठियाँ आपके अपने उपकरण पर एन्क्रिप्टेड रहती हैं। विश्लेषण के लिए फ़ोटो एक बार सुरक्षित रूप से एआई को भेजी जाती है और वहाँ आमतौर पर 30 दिन बाद मिटा दी जाती है। आपको खाते की ज़रूरत नहीं।</p>
</details> </details>
</section> </section>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "Što se događa s mojim podacima?", "name": "Što se događa s mojim podacima?",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "Vaša pisma ostaju šifrirana na vašem uređaju. Za analizu se fotografija jednom sigurno šalje umjetnoj inteligenciji i ondje se briše najkasnije nakon 30 dana. Račun nije potreban." "text": "Vaša pisma ostaju šifrirana na vašem uređaju. Za analizu se fotografija jednom sigurno šalje umjetnoj inteligenciji i ondje se u pravilu briše nakon 30 dana. Račun nije potreban."
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>Što se događa s mojim podacima?</summary> <summary>Što se događa s mojim podacima?</summary>
<p>Vaša pisma ostaju šifrirana na vašem uređaju. Za analizu se fotografija jednom sigurno šalje umjetnoj inteligenciji i ondje se briše najkasnije nakon 30 dana. Račun nije potreban.</p> <p>Vaša pisma ostaju šifrirana na vašem uređaju. Za analizu se fotografija jednom sigurno šalje umjetnoj inteligenciji i ondje se u pravilu briše nakon 30 dana. Račun nije potreban.</p>
</details> </details>
</section> </section>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "Mi történik az adataimmal?", "name": "Mi történik az adataimmal?",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "A levelei titkosítva a saját készülékén maradnak. Az elemzéshez a fénykép egyszer, biztonságosan kerül el az MI-hez, és ott legkésőbb 30 nap múlva törlődik. Nincs szükség fiókra." "text": "A levelei titkosítva a saját készülékén maradnak. Az elemzéshez a fénykép egyszer, biztonságosan kerül el az MI-hez, és ott általában 30 nap múlva törlődik. Nincs szükség fiókra."
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>Mi történik az adataimmal?</summary> <summary>Mi történik az adataimmal?</summary>
<p>A levelei titkosítva a saját készülékén maradnak. Az elemzéshez a fénykép egyszer, biztonságosan kerül el az MI-hez, és ott legkésőbb 30 nap múlva törlődik. Nincs szükség fiókra.</p> <p>A levelei titkosítva a saját készülékén maradnak. Az elemzéshez a fénykép egyszer, biztonságosan kerül el az MI-hez, és ott általában 30 nap múlva törlődik. Nincs szükség fiókra.</p>
</details> </details>
</section> </section>
+2 -2
View File
@@ -336,7 +336,7 @@
{ {
"@type": "Question", "@type": "Question",
"name": "Was passiert mit meinen Briefen?", "name": "Was passiert mit meinen Briefen?",
"acceptedAnswer": { "@type": "Answer", "text": "Ihre Briefe bleiben auf Ihrem Handy — sicher verschlüsselt. Für die Analyse wird das Foto einmal sicher an die KI geschickt. Nach spätestens 30 Tagen wird es dort gelöscht. Sie brauchen kein Konto." } "acceptedAnswer": { "@type": "Answer", "text": "Ihre Briefe bleiben auf Ihrem Handy — sicher verschlüsselt. Für die Analyse wird das Foto einmal sicher an die KI geschickt. In der Regel wird es dort nach 30 Tagen gelöscht. Sie brauchen kein Konto." }
}, },
{ {
"@type": "Question", "@type": "Question",
@@ -607,7 +607,7 @@
</details> </details>
<details> <details>
<summary>Was passiert mit meinen Briefen?</summary> <summary>Was passiert mit meinen Briefen?</summary>
<p>Ihre Briefe bleiben auf Ihrem Handy — sicher verschlüsselt. Für die Analyse wird das Foto einmal sicher an die KI geschickt. Nach spätestens 30 Tagen wird es dort gelöscht. Sie brauchen kein Konto.</p> <p>Ihre Briefe bleiben auf Ihrem Handy — sicher verschlüsselt. Für die Analyse wird das Foto einmal sicher an die KI geschickt. In der Regel wird es dort nach 30 Tagen gelöscht. Sie brauchen kein Konto.</p>
</details> </details>
<details> <details>
<summary>Ersetzt die App einen Anwalt?</summary> <summary>Ersetzt die App einen Anwalt?</summary>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "Che fine fanno i miei dati?", "name": "Che fine fanno i miei dati?",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "Le tue lettere restano cifrate sul tuo dispositivo. Per l’analisi la foto viene inviata una sola volta in modo sicuro all’IA e viene cancellata lì al più tardi dopo 30 giorni. Non serve un account." "text": "Le tue lettere restano cifrate sul tuo dispositivo. Per l’analisi la foto viene inviata una sola volta in modo sicuro all’IA e viene cancellata lì di norma dopo 30 giorni. Non serve un account."
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>Che fine fanno i miei dati?</summary> <summary>Che fine fanno i miei dati?</summary>
<p>Le tue lettere restano cifrate sul tuo dispositivo. Per l’analisi la foto viene inviata una sola volta in modo sicuro all’IA e viene cancellata lì al più tardi dopo 30 giorni. Non serve un account.</p> <p>Le tue lettere restano cifrate sul tuo dispositivo. Per l’analisi la foto viene inviata una sola volta in modo sicuro all’IA e viene cancellata lì di norma dopo 30 giorni. Non serve un account.</p>
</details> </details>
</section> </section>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "Bi daneyên min çi tê kirin?", "name": "Bi daneyên min çi tê kirin?",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "Nameyên te bi şîfre li ser amûra te dimînin. Ji bo analîzê wêne carekê bi ewlehî ji AI re tê şandin û li wir herî dereng piştî 30 rojan tê jêbirin. Tu hewceyî hesabekî nînî." "text": "Nameyên te bi şîfre li ser amûra te dimînin. Ji bo analîzê wêne carekê bi ewlehî ji AI re tê şandin û li wir bi gelemperî piştî 30 rojan tê jêbirin. Tu hewceyî hesabekî nînî."
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>Bi daneyên min çi tê kirin?</summary> <summary>Bi daneyên min çi tê kirin?</summary>
<p>Nameyên te bi şîfre li ser amûra te dimînin. Ji bo analîzê wêne carekê bi ewlehî ji AI re tê şandin û li wir herî dereng piştî 30 rojan tê jêbirin. Tu hewceyî hesabekî nînî.</p> <p>Nameyên te bi şîfre li ser amûra te dimînin. Ji bo analîzê wêne carekê bi ewlehî ji AI re tê şandin û li wir bi gelemperî piştî 30 rojan tê jêbirin. Tu hewceyî hesabekî nînî.</p>
</details> </details>
</section> </section>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "Co dzieje się z moimi danymi?", "name": "Co dzieje się z moimi danymi?",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "Twoje pisma pozostają zaszyfrowane na Twoim urządzeniu. Do analizy zdjęcie jest raz bezpiecznie wysyłane do SI i usuwane tam najpóźniej po 30 dniach. Konto nie jest potrzebne." "text": "Twoje pisma pozostają zaszyfrowane na Twoim urządzeniu. Do analizy zdjęcie jest raz bezpiecznie wysyłane do SI i usuwane tam zwykle po 30 dniach. Konto nie jest potrzebne."
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>Co dzieje się z moimi danymi?</summary> <summary>Co dzieje się z moimi danymi?</summary>
<p>Twoje pisma pozostają zaszyfrowane na Twoim urządzeniu. Do analizy zdjęcie jest raz bezpiecznie wysyłane do SI i usuwane tam najpóźniej po 30 dniach. Konto nie jest potrzebne.</p> <p>Twoje pisma pozostają zaszyfrowane na Twoim urządzeniu. Do analizy zdjęcie jest raz bezpiecznie wysyłane do SI i usuwane tam zwykle po 30 dniach. Konto nie jest potrzebne.</p>
</details> </details>
</section> </section>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "زما معلوماتو ته څه کیږي؟", "name": "زما معلوماتو ته څه کیږي؟",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "ستاسو لیکونه پټ شوي ستاسو په خپله وسیله پاتې کیږي. د شننې لپاره عکس یو ځل په خوندي ډول مصنوعي ځیرکتیا ته لیږل کیږي او هلته تر ۳۰ ورځو وروسته ړنګېږي. حساب ته اړتیا نشته." "text": "ستاسو لیکونه پټ شوي ستاسو په خپله وسیله پاتې کیږي. د شننې لپاره عکس یو ځل په خوندي ډول مصنوعي ځیرکتیا ته لیږل کیږي او هلته معمولاً تر ۳۰ ورځو وروسته ړنګېږي. حساب ته اړتیا نشته."
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>زما معلوماتو ته څه کیږي؟</summary> <summary>زما معلوماتو ته څه کیږي؟</summary>
<p>ستاسو لیکونه پټ شوي ستاسو په خپله وسیله پاتې کیږي. د شننې لپاره عکس یو ځل په خوندي ډول مصنوعي ځیرکتیا ته لیږل کیږي او هلته تر ۳۰ ورځو وروسته ړنګېږي. حساب ته اړتیا نشته.</p> <p>ستاسو لیکونه پټ شوي ستاسو په خپله وسیله پاتې کیږي. د شننې لپاره عکس یو ځل په خوندي ډول مصنوعي ځیرکتیا ته لیږل کیږي او هلته معمولاً تر ۳۰ ورځو وروسته ړنګېږي. حساب ته اړتیا نشته.</p>
</details> </details>
</section> </section>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "O que acontece aos meus dados?", "name": "O que acontece aos meus dados?",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "As suas cartas ficam cifradas no seu próprio dispositivo. Para a análise, a foto é enviada uma única vez de forma segura para a IA e é apagada lá no máximo ao fim de 30 dias. Não precisa de conta." "text": "As suas cartas ficam cifradas no seu próprio dispositivo. Para a análise, a foto é enviada uma única vez de forma segura para a IA e é apagada lá normalmente ao fim de 30 dias. Não precisa de conta."
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>O que acontece aos meus dados?</summary> <summary>O que acontece aos meus dados?</summary>
<p>As suas cartas ficam cifradas no seu próprio dispositivo. Para a análise, a foto é enviada uma única vez de forma segura para a IA e é apagada lá no máximo ao fim de 30 dias. Não precisa de conta.</p> <p>As suas cartas ficam cifradas no seu próprio dispositivo. Para a análise, a foto é enviada uma única vez de forma segura para a IA e é apagada lá normalmente ao fim de 30 dias. Não precisa de conta.</p>
</details> </details>
</section> </section>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "Ce se întâmplă cu datele mele?", "name": "Ce se întâmplă cu datele mele?",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "Scrisorile tale rămân criptate pe dispozitivul tău. Pentru analiză, fotografia este trimisă o singură dată în siguranță către IA și este ștearsă acolo în cel mult 30 de zile. Nu ai nevoie de cont." "text": "Scrisorile tale rămân criptate pe dispozitivul tău. Pentru analiză, fotografia este trimisă o singură dată în siguranță către IA și este ștearsă acolo de regulă după 30 de zile. Nu ai nevoie de cont."
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>Ce se întâmplă cu datele mele?</summary> <summary>Ce se întâmplă cu datele mele?</summary>
<p>Scrisorile tale rămân criptate pe dispozitivul tău. Pentru analiză, fotografia este trimisă o singură dată în siguranță către IA și este ștearsă acolo în cel mult 30 de zile. Nu ai nevoie de cont.</p> <p>Scrisorile tale rămân criptate pe dispozitivul tău. Pentru analiză, fotografia este trimisă o singură dată în siguranță către IA și este ștearsă acolo de regulă după 30 de zile. Nu ai nevoie de cont.</p>
</details> </details>
</section> </section>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "Что происходит с моими данными?", "name": "Что происходит с моими данными?",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "Ваши письма остаются зашифрованными на вашем устройстве. Для разбора фото один раз безопасно отправляется ИИ и удаляется там не позднее чем через 30 дней. Учётная запись не нужна." "text": "Ваши письма остаются зашифрованными на вашем устройстве. Для разбора фото один раз безопасно отправляется ИИ и удаляется там обычно через 30 дней. Учётная запись не нужна."
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>Что происходит с моими данными?</summary> <summary>Что происходит с моими данными?</summary>
<p>Ваши письма остаются зашифрованными на вашем устройстве. Для разбора фото один раз безопасно отправляется ИИ и удаляется там не позднее чем через 30 дней. Учётная запись не нужна.</p> <p>Ваши письма остаются зашифрованными на вашем устройстве. Для разбора фото один раз безопасно отправляется ИИ и удаляется там обычно через 30 дней. Учётная запись не нужна.</p>
</details> </details>
</section> </section>
+28 -28
View File
@@ -3,7 +3,7 @@
xmlns:xhtml="http://www.w3.org/1999/xhtml"> xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url> <url>
<loc>https://behoerdenklar.de/</loc> <loc>https://behoerdenklar.de/</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -36,7 +36,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/tr</loc> <loc>https://behoerdenklar.de/tr</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -69,7 +69,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/ar</loc> <loc>https://behoerdenklar.de/ar</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -102,7 +102,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/ru</loc> <loc>https://behoerdenklar.de/ru</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -135,7 +135,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/uk</loc> <loc>https://behoerdenklar.de/uk</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -168,7 +168,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/pl</loc> <loc>https://behoerdenklar.de/pl</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -201,7 +201,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/ro</loc> <loc>https://behoerdenklar.de/ro</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -234,7 +234,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/en</loc> <loc>https://behoerdenklar.de/en</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -267,7 +267,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/fa</loc> <loc>https://behoerdenklar.de/fa</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -300,7 +300,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/ku</loc> <loc>https://behoerdenklar.de/ku</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -333,7 +333,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/bg</loc> <loc>https://behoerdenklar.de/bg</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -366,7 +366,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/hr</loc> <loc>https://behoerdenklar.de/hr</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -399,7 +399,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/sr</loc> <loc>https://behoerdenklar.de/sr</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -432,7 +432,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/bs</loc> <loc>https://behoerdenklar.de/bs</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -465,7 +465,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/sq</loc> <loc>https://behoerdenklar.de/sq</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -498,7 +498,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/it</loc> <loc>https://behoerdenklar.de/it</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -531,7 +531,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/el</loc> <loc>https://behoerdenklar.de/el</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -564,7 +564,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/es</loc> <loc>https://behoerdenklar.de/es</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -597,7 +597,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/pt</loc> <loc>https://behoerdenklar.de/pt</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -630,7 +630,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/fr</loc> <loc>https://behoerdenklar.de/fr</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -663,7 +663,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/hu</loc> <loc>https://behoerdenklar.de/hu</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -696,7 +696,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/vi</loc> <loc>https://behoerdenklar.de/vi</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -729,7 +729,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/hi</loc> <loc>https://behoerdenklar.de/hi</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -762,7 +762,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/ur</loc> <loc>https://behoerdenklar.de/ur</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -795,7 +795,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/ps</loc> <loc>https://behoerdenklar.de/ps</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -828,7 +828,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/ti</loc> <loc>https://behoerdenklar.de/ti</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -861,7 +861,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/so</loc> <loc>https://behoerdenklar.de/so</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
@@ -894,7 +894,7 @@
</url> </url>
<url> <url>
<loc>https://behoerdenklar.de/zh</loc> <loc>https://behoerdenklar.de/zh</loc>
<lastmod>2026-09-23</lastmod> <lastmod>2026-10-22</lastmod>
<xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/> <xhtml:link rel="alternate" hreflang="de" href="https://behoerdenklar.de/"/>
<xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/> <xhtml:link rel="alternate" hreflang="tr" href="https://behoerdenklar.de/tr"/>
<xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/> <xhtml:link rel="alternate" hreflang="ar" href="https://behoerdenklar.de/ar"/>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "Maxaa ku dhacaya xogtayda?", "name": "Maxaa ku dhacaya xogtayda?",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "Warqadahaagu waxay ku hadhayaan qalabkaaga iyagoo sir ah. Falanqaynta awgeed sawirka hal mar ayaa si ammaan ah loogu diraa AI-ga, halkaasna waxaa laga tirtiraa ugu badnaan 30 maalmood gudahood. Koonto uma baahnid." "text": "Warqadahaagu waxay ku hadhayaan qalabkaaga iyagoo sir ah. Falanqaynta awgeed sawirka hal mar ayaa si ammaan ah loogu diraa AI-ga, halkaasna waxaa laga tirtiraa inta badan 30 maalmood kadib. Koonto uma baahnid."
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>Maxaa ku dhacaya xogtayda?</summary> <summary>Maxaa ku dhacaya xogtayda?</summary>
<p>Warqadahaagu waxay ku hadhayaan qalabkaaga iyagoo sir ah. Falanqaynta awgeed sawirka hal mar ayaa si ammaan ah loogu diraa AI-ga, halkaasna waxaa laga tirtiraa ugu badnaan 30 maalmood gudahood. Koonto uma baahnid.</p> <p>Warqadahaagu waxay ku hadhayaan qalabkaaga iyagoo sir ah. Falanqaynta awgeed sawirka hal mar ayaa si ammaan ah loogu diraa AI-ga, halkaasna waxaa laga tirtiraa inta badan 30 maalmood kadib. Koonto uma baahnid.</p>
</details> </details>
</section> </section>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "Çfarë ndodh me të dhënat e mia?", "name": "Çfarë ndodh me të dhënat e mia?",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "Letrat tuaja mbeten të koduara në pajisjen tuaj. Për analizën, fotoja dërgohet një herë në mënyrë të sigurt te inteligjenca artificiale dhe fshihet atje më së voni pas 30 ditësh. Nuk ju duhet llogari." "text": "Letrat tuaja mbeten të koduara në pajisjen tuaj. Për analizën, fotoja dërgohet një herë në mënyrë të sigurt te inteligjenca artificiale dhe fshihet atje zakonisht pas 30 ditësh. Nuk ju duhet llogari."
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>Çfarë ndodh me të dhënat e mia?</summary> <summary>Çfarë ndodh me të dhënat e mia?</summary>
<p>Letrat tuaja mbeten të koduara në pajisjen tuaj. Për analizën, fotoja dërgohet një herë në mënyrë të sigurt te inteligjenca artificiale dhe fshihet atje më së voni pas 30 ditësh. Nuk ju duhet llogari.</p> <p>Letrat tuaja mbeten të koduara në pajisjen tuaj. Për analizën, fotoja dërgohet një herë në mënyrë të sigurt te inteligjenca artificiale dhe fshihet atje zakonisht pas 30 ditësh. Nuk ju duhet llogari.</p>
</details> </details>
</section> </section>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "Шта се дешава са мојим подацима?", "name": "Шта се дешава са мојим подацима?",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "Ваша писма остају шифрована на вашем уређају. За анализу се фотографија једном безбедно шаље вештачкој интелигенцији и тамо се брише најкасније после 30 дана. Налог није потребан." "text": "Ваша писма остају шифрована на вашем уређају. За анализу се фотографија једном безбедно шаље вештачкој интелигенцији и тамо се по правилу брише после 30 дана. Налог није потребан."
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>Шта се дешава са мојим подацима?</summary> <summary>Шта се дешава са мојим подацима?</summary>
<p>Ваша писма остају шифрована на вашем уређају. За анализу се фотографија једном безбедно шаље вештачкој интелигенцији и тамо се брише најкасније после 30 дана. Налог није потребан.</p> <p>Ваша писма остају шифрована на вашем уређају. За анализу се фотографија једном безбедно шаље вештачкој интелигенцији и тамо се по правилу брише после 30 дана. Налог није потребан.</p>
</details> </details>
</section> </section>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "ብዛዕባ ዳታይ እንታይ ይኸውን?", "name": "ብዛዕባ ዳታይ እንታይ ይኸውን?",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "ደብዳበታትካ ኣብ ናትካ መሳርሒ ተመስጢሮም ይጸንሑ። ንመጽናዕቲ እቲ ስእሊ ሓንሳብ ብውሑስ መንገዲ ናብ AI ይለኣኽ፣ ኣብኡ ድማ ዝበዝሐ ድሕሪ 30 መዓልቲ ይድምሰስ። ኣካውንት ኣየድልየካን።" "text": "ደብዳበታትካ ኣብ ናትካ መሳርሒ ተመስጢሮም ይጸንሑ። ንመጽናዕቲ እቲ ስእሊ ሓንሳብ ብውሑስ መንገዲ ናብ AI ይለኣኽ፣ ኣብኡ ድማ ብልሙድ ድሕሪ 30 መዓልቲ ይድምሰስ። ኣካውንት ኣየድልየካን።"
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>ብዛዕባ ዳታይ እንታይ ይኸውን?</summary> <summary>ብዛዕባ ዳታይ እንታይ ይኸውን?</summary>
<p>ደብዳበታትካ ኣብ ናትካ መሳርሒ ተመስጢሮም ይጸንሑ። ንመጽናዕቲ እቲ ስእሊ ሓንሳብ ብውሑስ መንገዲ ናብ AI ይለኣኽ፣ ኣብኡ ድማ ዝበዝሐ ድሕሪ 30 መዓልቲ ይድምሰስ። ኣካውንት ኣየድልየካን።</p> <p>ደብዳበታትካ ኣብ ናትካ መሳርሒ ተመስጢሮም ይጸንሑ። ንመጽናዕቲ እቲ ስእሊ ሓንሳብ ብውሑስ መንገዲ ናብ AI ይለኣኽ፣ ኣብኡ ድማ ብልሙድ ድሕሪ 30 መዓልቲ ይድምሰስ። ኣካውንት ኣየድልየካን።</p>
</details> </details>
</section> </section>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "Verilerime ne oluyor?", "name": "Verilerime ne oluyor?",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "Mektuplarınız şifreli olarak kendi cihazınızda kalır. Analiz için fotoğraf bir kez güvenli şekilde yapay zekâya gönderilir ve orada en geç 30 gün sonra silinir. Hesap açmanız gerekmez." "text": "Mektuplarınız şifreli olarak kendi cihazınızda kalır. Analiz için fotoğraf bir kez güvenli şekilde yapay zekâya gönderilir ve orada genellikle 30 gün sonra silinir. Hesap açmanız gerekmez."
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>Verilerime ne oluyor?</summary> <summary>Verilerime ne oluyor?</summary>
<p>Mektuplarınız şifreli olarak kendi cihazınızda kalır. Analiz için fotoğraf bir kez güvenli şekilde yapay zekâya gönderilir ve orada en geç 30 gün sonra silinir. Hesap açmanız gerekmez.</p> <p>Mektuplarınız şifreli olarak kendi cihazınızda kalır. Analiz için fotoğraf bir kez güvenli şekilde yapay zekâya gönderilir ve orada genellikle 30 gün sonra silinir. Hesap açmanız gerekmez.</p>
</details> </details>
</section> </section>
+3 -1
View File
@@ -69,7 +69,9 @@
/** Alle Fächer holen und entschlüsseln: { status: {...}, ergebnis: {...} }. */ /** Alle Fächer holen und entschlüsseln: { status: {...}, ergebnis: {...} }. */
async function holen(ue) { async function holen(ue) {
var r = await fetch(BASIS + ue.id, { cache: 'no-store' }); // Zeitlimit, damit eine hängende Anfrage die Abfrage am PC nicht blockiert
var signal = (w.AbortSignal && w.AbortSignal.timeout) ? w.AbortSignal.timeout(10000) : undefined;
var r = await fetch(BASIS + ue.id, { cache: 'no-store', signal: signal });
if (!r.ok) throw new Error('Übergabe nicht erreichbar (' + r.status + ')'); if (!r.ok) throw new Error('Übergabe nicht erreichbar (' + r.status + ')');
var faecher = (await r.json()).faecher || {}; var faecher = (await r.json()).faecher || {};
var aus = {}; var aus = {};
+2166
View File
File diff suppressed because it is too large. Load diff
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "Що відбувається з моїми даними?", "name": "Що відбувається з моїми даними?",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "Ваші листи залишаються зашифрованими на вашому пристрої. Для аналізу фото один раз безпечно надсилається до ШІ і видаляється там щонайпізніше через 30 днів. Обліковий запис не потрібен." "text": "Ваші листи залишаються зашифрованими на вашому пристрої. Для аналізу фото один раз безпечно надсилається до ШІ і видаляється там зазвичай через 30 днів. Обліковий запис не потрібен."
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>Що відбувається з моїми даними?</summary> <summary>Що відбувається з моїми даними?</summary>
<p>Ваші листи залишаються зашифрованими на вашому пристрої. Для аналізу фото один раз безпечно надсилається до ШІ і видаляється там щонайпізніше через 30 днів. Обліковий запис не потрібен.</p> <p>Ваші листи залишаються зашифрованими на вашому пристрої. Для аналізу фото один раз безпечно надсилається до ШІ і видаляється там зазвичай через 30 днів. Обліковий запис не потрібен.</p>
</details> </details>
</section> </section>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "میرے ڈیٹا کا کیا ہوتا ہے؟", "name": "میرے ڈیٹا کا کیا ہوتا ہے؟",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "آپ کے خطوط آپ کے اپنے آلے پر خفیہ شکل میں رہتے ہیں۔ تجزیے کے لیے تصویر ایک بار محفوظ طریقے سے اے آئی کو بھیجی جاتی ہے اور وہاں زیادہ سے زیادہ 30 دن میں مٹا دی جاتی ہے۔ آپ کو اکاؤنٹ کی ضرورت نہیں۔" "text": "آپ کے خطوط آپ کے اپنے آلے پر خفیہ شکل میں رہتے ہیں۔ تجزیے کے لیے تصویر ایک بار محفوظ طریقے سے اے آئی کو بھیجی جاتی ہے اور وہاں عام طور پر 30 دن بعد مٹا دی جاتی ہے۔ آپ کو اکاؤنٹ کی ضرورت نہیں۔"
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>میرے ڈیٹا کا کیا ہوتا ہے؟</summary> <summary>میرے ڈیٹا کا کیا ہوتا ہے؟</summary>
<p>آپ کے خطوط آپ کے اپنے آلے پر خفیہ شکل میں رہتے ہیں۔ تجزیے کے لیے تصویر ایک بار محفوظ طریقے سے اے آئی کو بھیجی جاتی ہے اور وہاں زیادہ سے زیادہ 30 دن میں مٹا دی جاتی ہے۔ آپ کو اکاؤنٹ کی ضرورت نہیں۔</p> <p>آپ کے خطوط آپ کے اپنے آلے پر خفیہ شکل میں رہتے ہیں۔ تجزیے کے لیے تصویر ایک بار محفوظ طریقے سے اے آئی کو بھیجی جاتی ہے اور وہاں عام طور پر 30 دن بعد مٹا دی جاتی ہے۔ آپ کو اکاؤنٹ کی ضرورت نہیں۔</p>
</details> </details>
</section> </section>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "Dữ liệu của tôi thì sao?", "name": "Dữ liệu của tôi thì sao?",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "Thư của bạn được mã hóa và nằm trên thiết bị của bạn. Để phân tích, ảnh được gửi một lần duy nhất và an toàn tới AI, rồi bị xóa ở đó chậm nhất sau 30 ngày. Bạn không cần tài khoản." "text": "Thư của bạn được mã hóa và nằm trên thiết bị của bạn. Để phân tích, ảnh được gửi một lần duy nhất và an toàn tới AI, rồi thường bị xóa ở đó sau 30 ngày. Bạn không cần tài khoản."
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>Dữ liệu của tôi thì sao?</summary> <summary>Dữ liệu của tôi thì sao?</summary>
<p>Thư của bạn được mã hóa và nằm trên thiết bị của bạn. Để phân tích, ảnh được gửi một lần duy nhất và an toàn tới AI, rồi bị xóa ở đó chậm nhất sau 30 ngày. Bạn không cần tài khoản.</p> <p>Thư của bạn được mã hóa và nằm trên thiết bị của bạn. Để phân tích, ảnh được gửi một lần duy nhất và an toàn tới AI, rồi thường bị xóa ở đó sau 30 ngày. Bạn không cần tài khoản.</p>
</details> </details>
</section> </section>
+2 -2
View File
@@ -231,7 +231,7 @@
"name": "我的数据会怎样?", "name": "我的数据会怎样?",
"acceptedAnswer": { "acceptedAnswer": {
"@type": "Answer", "@type": "Answer",
"text": "您的信件以加密方式保存在您自己的设备上。分析时照片会安全地发送给人工智能一次,并最迟在 30 天后在那里删除。您不需要账号。" "text": "您的信件以加密方式保存在您自己的设备上。分析时照片会安全地发送给人工智能一次,并通常在 30 天后在那里删除。您不需要账号。"
} }
} }
] ]
@@ -368,7 +368,7 @@
</details> </details>
<details> <details>
<summary>我的数据会怎样?</summary> <summary>我的数据会怎样?</summary>
<p>您的信件以加密方式保存在您自己的设备上。分析时照片会安全地发送给人工智能一次,并最迟在 30 天后在那里删除。您不需要账号。</p> <p>您的信件以加密方式保存在您自己的设备上。分析时照片会安全地发送给人工智能一次,并通常在 30 天后在那里删除。您不需要账号。</p>
</details> </details>
</section> </section>