98 Commits
Author SHA1 Message Date
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
JUSNandClaude Opus 5.5 6a7f35eb19 Praesentation MBE 29.10.: Handzettel, Musterbrief, Doku
- marketing/praesentation-mbe/handzettel: A4 zum Dalassen (Testzugang
  1 Monat, bis 100 Briefe), QR-Code wird nach Anlegen des Codes eingetragen
- musterbrief-auslaenderbehoerde: erfundene Behoerde/Person, zum Ausdrucken
  und Live-Fotografieren (Frist + Termin + Telefon + Fachbegriffe)
- Testphase im Preisblatt auf 1 Monat + Auswertungsgespraech
- FEATURES.md: Handy<->PC, Einrichtungs-Codes, lokal testen

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 18:46:29 +02:00
JUSNandClaude Opus 5.5 cf188af080 App: QR-Uebergabe mit dem Beratungs-PC
- Brief -> "Am Computer zeigen": schickt den Brief verschluesselt auf den
  Bildschirm der Beratung (zweisprachig, wenn eine Uebersetzung da ist)
- Archiv -> "Vom Computer uebernehmen": holt das Ergebnis vom PC ins
  verschluesselte Archiv, mit Erinnerungen
- Gleiches Paeckchen-Format wie die Webseite (expo-crypto combined =
  IV||Chiffrat||Tag); Test prueft beide Richtungen gegen WebCrypto
- Link-Einfuegen als Ersatz, wenn keine Kamera da ist

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 18:46:29 +02:00
JUSNandClaude Opus 5.5 014737bd95 Demo-Seite: Einrichtungs-Code, Handy als Kamera fuer den PC, Mitnehmen per QR
- ?code=... oder Eingabefeld: kostenlos ueber die Beratungsstelle
- PC: "Lieber mit dem Handy fotografieren" - QR scannen, am Handy
  fotografieren, Ergebnis erscheint am PC auf Deutsch und am Handy in der
  Muttersprache (Umschalter zwischen beiden Sprachen)
- PC: "Ergebnis aufs Handy mitnehmen" und "Guthaben auch auf dem Handy"
- uebergabe.js: AES-256-GCM per WebCrypto, Schluessel nur hinter dem #
- qrcode.js (MIT, Kazuhiko Arase) selbst gehostet, keine Drittanfragen
- Datenschutzerklaerung: Abschnitte 9a (Einrichtungs-Code) und 9b (Uebergabe)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 18:46:29 +02:00
JUSNandClaude Opus 5.5 0eab2a0ee9 Worker: Einrichtungs-Codes, verschluesselte Uebergabe Handy<->PC, zweisprachige Analyse
- /code loest Einrichtungs-Codes fuer Beratungsstellen ein (Guthaben mit
  Name + Ablaufdatum, max. 10 Fehlversuche pro IP und Tag). Leeres oder
  abgelaufenes Kontingent sagt "fragen Sie bei <Stelle> nach" statt "kaufen".
- /uebergabe/<id>: Durable Object haelt nur Chiffrat (AES-GCM, Schluessel
  nur im QR-Code), loescht nach 15 Minuten, 50 Schreibvorgaenge, Rate-Limit.
  Durable Object statt KV, weil KV fehlende Schluessel zwischenspeichert.
- /demo mit auchDeutsch: deutsch analysieren (Sonnet), dann mit Haiku in die
  Zielsprache uebersetzen - PC zeigt Deutsch, Handy die Muttersprache.
- LOKAL_TEST=1 (.dev.vars) erlaubt localhost fuer Tests mit wrangler dev.
- tools/einrichtungs-code.js: neu | stand | aufladen | verlaengern.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 18:46:29 +02:00
JUSNandClaude Opus 5.5 7621dd054a Outreach: Stand der Beratungsstellen-Mails aktualisiert
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 18:13:47 +02:00
JUSNandClaude Opus 5.5 9622fd68bd Outreach neu: drei Mails + Telefonleitfaden fuer Beratungsstellen
Die Vorlagen vom Juli waren an mehreren Stellen falsch geworden:
- 'Abo 2,99 EUR/Monat' — es gibt kein Abo mehr, sondern Guthaben
- 'iPhone-App, bevor sie im App Store erscheint' — das staerkste Argument
  fehlte: man kann es HEUTE im Browser nutzen
- 'Briefe bleiben verschluesselt auf dem Handy' — gilt nur fuer die App. Im
  Web geht das Foto zur Analyse an die KI. Gerade bei Beratungsstellen muss
  die Datenschutz-Aussage stimmen.
- Link auf die alte Domain behoerdenklar.pages.dev
- Kalender und Anruf-Hilfe fehlten

Die MBE hat bereits am 17.07. eine Mail bekommen und bekommt deshalb eine
Nachfass-Mail statt derselben Erstmail. Keine Anhaenge mehr: Mails von
Unbekannten mit Anhang werden oft nicht geoeffnet; der Demo-Link ueberzeugt
mehr.

Dazu Telefonleitfaden fuer den Anruf nach 3-5 Werktagen und Antworten auf
die fuenf wahrscheinlichsten Fragen (Datenschutz, ChatGPT, Kosten, Ersatz
fuer Beratung, wer steckt dahinter). Alte Vorlagen als veraltet markiert.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 16:07:54 +02:00
JUSNandClaude Opus 5.5 c5bc04bc5b Kalender-Karte: nicht 'keine Frist' behaupten, wenn nur kein Datum da ist
Der Nutzer testete mit einem echten Finanzamt-Brief (Zuteilung der
Steuernummer). Der enthaelt eine Frist — 'bis zum 10. Tag nach Ablauf des
Kalendervierteljahres' — aber kein einzelnes Datum, weil sie sich jedes
Quartal wiederholt und nur unter Bedingungen gilt. Die KI hat daraus
richtigerweise kein Datum gemacht.

Die Meldung vom letzten Commit haette dazu gesagt: '✓ In diesem Brief steht
keine Frist.' Bei genau diesem Brief falsch — und das Haekchen signalisiert
'alles erledigt'.

Jetzt: 'ℹ️ Kein festes Datum zum Eintragen gefunden' plus Hinweis, dass
manche Fristen kein festes Datum haben (z. B. jedes Vierteljahr) und in der
Erklaerung oben stehen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 15:51:09 +02:00
JUSNandClaude Opus 5.5 8cdaa8ff5b Kalender-Karte immer zeigen — auch wenn der Brief kein Datum hat
Der Nutzer suchte den Kalender-Knopf und fand ihn nicht. Grund: Die Karte
blieb komplett weg, wenn die KI keine Frist und keinen Termin fand. Man
konnte also nicht unterscheiden, ob gesucht und nichts gefunden wurde oder
ob etwas kaputt ist.

Jetzt erscheint die Karte immer:
- mit Datum: Knopf 'In meinen Kalender eintragen' wie bisher
- ohne Datum: 'In diesem Brief steht keine Frist und kein Termin — es gibt
  nichts in den Kalender einzutragen.'

Fuer einen aengstlichen Leser ist 'keine Frist' selbst eine wichtige
Nachricht, die vorher einfach fehlte.

Nicht im Browser sichtbar geprueft: Der lokale Testserver wurde nicht
freigegeben. Syntax und Logik geprueft, Aufruf-Reihenfolge (vor dem
Ausstieg fuer den Bezahl-Modus) kontrolliert.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 15:42:59 +02:00
JUSNandClaude Opus 5.5 fe6899da3d Web: Frist in den Kalender + Anruf-Hilfe — die Unterschiede zu ChatGPT ins Web geholt
Der Nutzer konnte in einer Praesentation nicht kontern, und die Ursache war
real: Alles, was BehoerdenKlar von ChatGPT unterscheidet (Erinnerungen,
Kalender, Antwort-Entwurf), steckte in der App — und die ist noch nicht
veroeffentlicht. Das Web-Produkt, das Kunden heute kaufen, war im Kern nur
'Brief erklaeren'.

Kalender (.ics, rein im Browser, nichts wird hochgeladen):
- Frist und Termin mit Erinnerung 3 Tage und 1 Tag vorher
- Zeilen nach BYTES gefaltet (RFC 5545), damit Arabisch/Tigrinya nicht reissen
- Termin 23:30 endet korrekt am naechsten Tag
- Wanduhrzeit ohne Zeitzone = Ortszeit des Geraets
- getestet: Frist, Termin mit Uhrzeit, Mitternacht, langer arabischer Text,
  Brief ohne Datum (-> keine Datei)

Anruf-Hilfe (Worker-Schema um kontakt + anruf erweitert):
- Telefonnummer als tel:-Knopf, Aktenzeichen hervorgehoben
- Spickzettel: Satz auf Deutsch + Bedeutung in der Nutzersprache
- Prompt-Regel: Kontaktdaten nur, wenn woertlich im Brief. Getestet mit Brief
  ohne Nummer -> telefon: null, nichts erfunden.

Nebenbei zwei bestehende Fehler behoben:
- Optionale Ergebniskarten wurden nie ausgeblendet: Beim zweiten Brief stand
  die Checkliste des ERSTEN Briefs noch da. Jetzt Reset zu Beginn.
- dir=auto auf den Ergebnistexten: Arabisch/Farsi/Urdu wurden im Web
  linksbuendig dargestellt (in der App war das schon behoben).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 15:26:23 +02:00
JUSNandClaude Opus 5 e01813f6ec FEATURES.md: das Besondere nach vorn statt flacher Liste
Der Nutzer bemerkte zu Recht, dass die Datei alles gleichrangig auflistete —
die Merkmale, die BehoerdenKlar von einem Uebersetzer unterscheiden, gingen
darin unter. Besonders die AUTOMATISCHEN Erinnerungen, die eigentlich das
Produktversprechen sind ('man muss nichts mehr im Kopf behalten').

Neuer Abschnitt 'Was BehoerdenKlar kann, was ein Uebersetzer nicht kann' mit
dem Unterschied zu DeepL/ChatGPT: aus einem Foto werden strukturierte Daten
(frist mit Datum UND Aktion, termin mit Uhrzeit und Ort, Checkliste,
antwort_noetig), mit denen die App selbst weiterarbeitet.

Dabei praezisiert, was tatsaechlich automatisch laeuft:
- Erinnerungen: automatisch, 4 pro Brief (3 und 1 Tag vor Frist UND Termin,
  jeweils 9 Uhr) — ausgeloest in ScanScreen direkt nach der Analyse
- Kalendereintrag: auf Tastendruck, bewusst nicht automatisch (ungefragt in
  einen fremden Kalender zu schreiben waere uebergriffig)

Ausserdem die Prompt-Sicherheitsregel dokumentiert: 'Wenn du ein Datum nicht
sicher lesen kannst, lass das Feld null — erfinde niemals Daten.'

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-27 15:09:11 +02:00
JUSNandClaude Opus 5 96936caf0b FEATURES.md: Ueberblick ueber alles, was es gibt
Beschreibt App, Webseite und Worker, die Bezahlung, die Schutzmechanismen und
die Befehle. Alle Angaben aus dem Code eingesammelt, nicht aus dem Gedaechtnis.

Enthaelt bewusst einen Abschnitt 'Fallen, die schon zugeschnappt sind' — die
teuersten Fehler dieses Projekts waren nicht schwer zu beheben, sondern
schwer zu BEMERKEN (Formular 6 Wochen tot, Schluessel zweimal ungueltig,
Demo konnte nur Deutsch).

Ueber CLAUDE.md eingebunden, damit der Ueberblick in jeder Sitzung mitkommt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 17:52:09 +02:00
JUSNandClaude Opus 5 f42761b040 Bezahlseite: feste Kartenzahlung statt Stripe Link
Screenshot des Nutzers zeigte: Wer ein Link-Konto hat, landet auf einer
Link-Ansicht mit gespeicherter Karte, schwarzem 'Pay'-Knopf und einem
kleinen, englischen 'Pay without Link' als einzigem Ausweg. Fuer Menschen,
die Deutsch kaum lesen, ist das eine Sackgasse — und das ist genau die
Zielgruppe.

payment_method_types[0]=card schaltet die automatische Methodenwahl ab und
damit auch Link. Jeder sieht jetzt dieselbe Ansicht mit Kartenfeldern.

ACHTUNG fuer spaeter: Solange diese Angabe gesetzt ist, erscheinen KEINE
weiteren Methoden, auch wenn sie im Dashboard freigeschaltet werden. Wer
PayPal oder Klarna anbieten will, muss sie hier ergaenzen.

Kauf nach der Aenderung geprueft: liefert weiter gueltige cs_live_-Seiten.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 16:05:11 +02:00
JUSNandClaude Opus 5 585f027ba5 Bezahlseite erscheint in der Sprache des Nutzers
Wer von der tuerkischen Seite kam, landete bisher auf einer deutschen
Stripe-Seite — fuer die Zielgruppe die groesste Huerde im Kaufvorgang.

/kaufen nimmt jetzt 'sprache' entgegen und gibt sie als locale an Stripe
weiter. Nur Sprachen aus STRIPE_SPRACHEN werden geschickt: Ein unbekannter
Wert laesst Stripe die Session mit 400 ablehnen, der Kauf waere kaputt. Fuer
Arabisch, Tigrinya usw. (kennt Stripe nicht) wird nichts mitgeschickt, dann
waehlt Stripe selbst anhand des Browsers.

Alle drei Kauf-Stellen geben die Sprache mit: Sprachseiten fest ihre eigene,
Demo-Seite die dort gewaehlte Zielsprache, Startseite 'de'.

Geprueft: tr/de/pl/ar liefern Bezahlseiten, und eine erfundene Sprache faellt
sauber zurueck statt den Kauf zu brechen.

Stripe Link (die vorausgewaehlte Schnellzahlung) laesst sich NICHT per API
abschalten — laut Stripe-Docs nur in den Zahlungsmethoden-Einstellungen des
Dashboards.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 15:59:46 +02:00
JUSNandClaude Opus 5 e5915f3cc2 Gesundheits-Check: ein Befehl prueft alles, was schon mal still kaputt war
Der Nutzer fragte zu Recht, warum staendig neue Probleme auftauchen. Antwort:
Sie tauchen nicht auf, wir schauen erst jetzt hin — und es gab bisher keine
einzige automatische Pruefung. Das Warteliste-Formular war SECHS WOCHEN
kaputt, ohne dass etwas Alarm geschlagen haette.

tools/pruefung.js prueft in ~30 Sekunden zehn Bereiche, jeder davon war
schon einmal ein echter Fehler:

 1 abgeschnittene Zeilen '[...]'      (Werkzeug kuerzte auf 200 Zeichen)
 2 Warteliste-Formular vollstaendig   (war 186 statt 248 Zeichen -> tot)
 3 strukturierte Daten gueltig        (Google meldete 'Fehlerhafter Aufbau')
 4 verlinkte Dateien existieren       (manifest.json lieferte HTML)
 5 Preis-IDs Worker == Seiten         (Kauf scheitert sonst stumm)
 6 alle Sitemap-Adressen liefern 200
 7 Kauf erzeugt echte cs_live_-Seite + fremde Origins abgewiesen
 8 Webhook-Secret gesetzt             (sonst keine Wiederherstellungs-Mail)
 9 KI antwortet                       (Schluessel war zweimal ungueltig)
10 Turnstile eingebunden              (sonst Missbrauch auf eigene Kosten)

Gegengeprueft: Mit absichtlich eingebauten Fehlern (abgeschnittene Zeile,
gekuerzte Formular-Adresse, kaputtes JSON-LD) schlaegt sie bei allen dreien
an und liefert Rueckgabewert 1.

Aufruf: npm run pruefung

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-21 14:42:09 +02:00
JUSNandClaude Opus 5 8e4ee58055 Webseite: kaputte Verweise repariert + Hinweis zur Kamera-Abfrage
Ein Nutzer wurde beim Hochladen nach dem Mikrofon gefragt. Geprueft: Die
Seite fordert es NICHT an — sie laedt nur Turnstile als fremdes Skript, das
Datei-Feld akzeptiert nur image/jpeg, image/png und application/pdf (kein
capture, kein video), und im gesamten Web-Code gibt es kein getUserMedia.
Ohne das ist Mikrofonzugriff im Browser nicht moeglich.

Ursache ist die Kamera-App des Handys: Wer im Datei-Dialog 'Kamera' waehlt,
oeffnet die App des Geraets, und die fragt nach IHREN Berechtigungen
(Kamera + Mikrofon, weil sie auch Video kann). Fuer den Nutzer sieht es aus,
als frage die Webseite. Jetzt steht genau das als Hinweis unter dem
Upload-Knopf.

Nebenbei zwei tote Verweise gefunden: manifest.json und apple-touch-icon.png
existierten nicht, Cloudflare lieferte die HTML-Fehlerseite mit Status 200.
Der Browser las also HTML als JSON bzw. als Bild. Manifest neu angelegt,
Icon-Verweis entfernt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-21 14:38:22 +02:00
JUSNandClaude Opus 5 2233372f08 App: Mikrofon-Berechtigung abschalten (expo-image-picker)
expo-image-picker traegt laut Expo-57-Docs standardmaessig RECORD_AUDIO in
die Android-Berechtigungen ein — weil der Bildwaehler auch Video aufnehmen
koennte. BehoerdenKlar nimmt aber ausschliesslich Fotos auf
(mediaTypes: 'images' an beiden Stellen im ScanScreen), Ton nie.

Eine Mikrofon-Abfrage in einer App fuer Behoerdenbriefe zerstoert Vertrauen,
gerade bei dieser Zielgruppe. Mit microphonePermission: false nimmt das
Plugin die Berechtigung gar nicht erst auf.

Die Webseite war davon nie betroffen: Das Datei-Feld akzeptiert nur
image/jpeg, image/png und application/pdf, hat kein capture-Attribut, und im
gesamten Web-Code gibt es kein getUserMedia.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-21 14:35:09 +02:00
JUSNandClaude Opus 5 62d1d4286f Drei Ratgeber zu den angstbesetzten Briefen: Inkasso, Bussgeld, Kuendigung
Alle drei mit hohem Suchvolumen und dem gleichen Muster: die entscheidende
Frist zuerst, dann pruefen, dann Musterbrief.

- mahnung-inkasso-was-tun: Kernunterscheidung Inkasso-Brief (harmlos, keine
  gesetzliche Frist) vs. gerichtlicher Mahnbescheid (2 Wochen, sonst Titel
  fuer 30 Jahre). Dazu die Ratenzahlungs-Falle: Wer zahlt, erkennt an und
  die Verjaehrung beginnt neu.
- bussgeldbescheid-einspruch: Anhoerungsbogen vs. Bescheid, Frist laeuft ab
  ZUSTELLUNG nicht ab Bescheiddatum, Schweigerecht zur Sache, Einspruch ist
  kostenlos und braucht keine Begruendung.
- kuendigung-wohnung-eigenbedarf: zulaessige Gruende, Fristtabelle nach
  Wohndauer, warum pauschaler Eigenbedarf unwirksam ist, Sozialklausel,
  Schonfristzahlung bei Mietschulden.

Jetzt 13 Ratgeber, Sitemap 43 URLs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-21 14:30:12 +02:00
JUSNandClaude Opus 5 ba71bcf32f Zwei Ratgeber zur neuen Positionierung: Nebenkosten und Versicherung
Belegen das breitere Bild, statt es nur zu behaupten — und treffen Suchen,
die deutlich mehr Menschen tippen als 'Mitwirkungsaufforderung'.

- nebenkostenabrechnung-pruefen: die zwei leicht zu verwechselnden
  12-Monats-Fristen, Tabelle umlagefaehig/nicht umlagefaehig, Belegeinsicht
  als staerkstes Recht, Musterbrief mit Zahlung unter Vorbehalt
- versicherung-zahlt-nicht: warum eine Ablehnung kein Urteil ist, die vier
  Stufen bis zum Anwalt, Ombudsmann (kostenlos, bis 10.000 EUR bindend fuer
  den Versicherer), Musterbrief

Beide mit FAQPage-Schema, in Uebersicht, Startseite und Sitemap verlinkt.
Ratgeber-Kopf breiter gefasst ('Schwierige Briefe verstehen' statt
'Behoerdenbriefe'), neue Artikel stehen oben.

Jetzt 10 Ratgeber, Sitemap 40 URLs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-19 17:00:37 +02:00
JUSNandClaude Opus 5 7cc60742c7 Positionierung verbreitert: weg vom 'Hartz-IV'-Bild, ohne die Staerke aufzugeben
Der Nutzer wollte nicht mehr nur mit Jobcenter verbunden werden, aber die
Spezialisierung ist sein einziger Vorteil gegenueber DeepL/ChatGPT. Also
nicht weg von Behoerdenbriefen, sondern breiter, WELCHE Briefe:

- Beispielbrief SGB-II-Sanktion -> Finanzamt-Steuerbescheid (§164 AO).
  Trifft Angestellte wie Selbstaendige, kein Armuts-Signal. Auf Deutsch und
  in allen 27 Sprachen ausgetauscht.
- Claim 'Brief vom Amt' -> 'Schwierige Post'
- Briefarten: Finanzamt, Versicherung, Vermieter, Bank zuerst genannt
- Zielgruppe in Meta/Schema: statt 'Asylbewerber, vulnerable
  Bevoelkerungsgruppen' jetzt 'alle, die schwierige Post bekommen'
- Zahlen-Sektion dreht die Schuld um: nicht 'ihr koennt nicht lesen',
  sondern 'Amtsdeutsch ist unnoetig schwer — das liegt nicht an Ihnen'

Name, Domain, Ratgeber und SEO bleiben — dort haengt die gesamte bisherige
Arbeit dran.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-19 16:52:15 +02:00
JUSNandClaude Opus 5 7780d381b3 Web-Demo mehrsprachig + Sprachseiten bekommen Demo und Kauf
Beim Nachgehen der Frage 'warum gibt es auf den Sprachseiten kein Payment'
kam heraus: Die Web-Demo antwortete AUSSCHLIESSLICH auf Deutsch. Die
Uebersetzung war bisher reine App-Funktion — und die App gibt es noch nicht.
Kauf-Knoepfe auf der tuerkischen Seite haetten also 2,99 EUR fuer eine
deutsche Antwort kassiert. Deshalb zuerst der Worker:

- /demo nimmt jetzt 'zielsprache' entgegen (28 erlaubte Codes, Whitelist —
  der Wert geht nie als freier Text in den Prompt, sonst koennte man eigene
  Anweisungen einschleusen).
- Der deutsche Fachbegriff bleibt deutsch, nur dessen Erklaerung wird
  uebersetzt — der Nutzer muss ihn im Brief wiederfinden.
- demo.html hat eine Sprachauswahl und merkt sich die Wahl; die Sprachseiten
  verlinken mit ?sprache=xx.

Erst danach die Sprachseiten: Demo-Knopf als Haupt-Handlung (es gab bisher
GAR KEINEN — man konnte das Produkt in 27 Sprachen nicht einmal ausprobieren)
und ein Kauf-Abschnitt mit uebersetzter Pflicht-Einwilligung nach §356 BGB.

Geprueft: 27 Dateien ohne Syntaxfehler, keine offenen Platzhalter, Kauf
liefert cs_live_. Zwei Tippfehler im bulgarischen Text korrigiert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-19 16:27:59 +02:00
JUSNandClaude Opus 5 5486a6aafb Sprachseiten: FAQ in allen 27 Sprachen (sichtbar + FAQPage-Schema)
Bisher lagen alle 9 FAQ-Bloecke auf deutschen Seiten — die Sprachseiten
hatten gar keine. Jetzt hat jede drei Fragen (Kosten, welche Briefe,
Datenschutz) in der jeweiligen Sprache.

Zwei Effekte: Google kann die aufklappbaren Fragen auch fuer diese Sprachen
anzeigen (groesserer Treffer, mehr Klicks), und die Seiten sind inhaltlich
nicht mehr duenn — das war mein Bedenken beim Anlegen der 28 Seiten.

Sichtbarer Text und Schema werden aus derselben Quelle erzeugt, koennen also
nicht auseinanderlaufen. Geprueft: 38 gueltige Bloecke, 0 kaputt, sichtbare
Fragen identisch mit dem Schema.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-19 16:14:14 +02:00
JUSNandClaude Opus 5 1a239b7763 Sprachseiten: strukturierte Daten zurueck + Sitemap mit Sprach-Angaben
Zwei Luecken geschlossen:

1. Beim Umbau auf den Generator hatten die Sprachseiten ihren JSON-LD-Block
   verloren (Regression von mir). Jetzt erzeugt build.js pro Seite ein
   SoftwareApplication-Schema mit der Beschreibung IN DER JEWEILIGEN SPRACHE —
   ein deutscher Block auf der tuerkischen Seite waere widerspruechlich.

2. Die Sitemap war eine nackte URL-Liste ohne Sprachinformation. Jetzt traegt
   jede der 28 Sprachseiten xhtml:link-Angaben fuer alle Alternativen
   (812 Eintraege). Getrennte Sitemaps je Sprache waeren der falsche Weg —
   Google erwartet die Alternativen innerhalb einer Sitemap.

Sitemap wird ab jetzt vom Generator mitgeschrieben, bleibt also automatisch
synchron. Demo- und Ratgeber-URLs bleiben unveraendert erhalten.

Geprueft: 38 gueltige JSON-LD-Bloecke, 0 kaputt; Sitemap als XML valide.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-19 16:01:52 +02:00
JUSNandClaude Opus 5 15b09b9742 Startseite repariert: 8 abgeschnittene Zeilen wiederhergestellt
Acht Zeilen waren bei exakt 200 Zeichen abgeschnitten und endeten mit einem
woertlichen '[...]'. Folgen:
- Das Warteliste-Formular war KAPUTT (Brevo-Adresse 186 statt 248 Zeichen)
  -> Anmeldungen gingen ins Leere.
- Fuenf FAQ-Antworten im JSON-LD waren unvollstaendig -> Google meldete
  'Fehlerhafter Aufbau', keine Rich-Ergebnisse moeglich.
- Zwei sichtbare FAQ-Absaetze brachen mitten im Satz ab.

Inhalte dabei auf Stand gebracht: 'guenstiges Abo' -> Guthaben (2,99/6,99 EUR),
9 Sprachen -> ueber 25.

JSON-LD aller Seiten geprueft: 0 kaputte Bloecke.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-19 15:35:48 +02:00
JUSNandClaude Opus 5 7d0692150c Website: 28 Sprachen statt 7 — per Generator statt Handarbeit
tools/sprachseiten/ enthaelt jetzt vorlage.html + texte.js + build.js.
'node tools/sprachseiten/build.js' erzeugt alle 27 Sprachseiten und pflegt
hreflang + Sprachwaehler auch in der handgemachten index.html nach.

Warum ein Generator: 28 Seiten von Hand zu pflegen heisst, jede kuenftige
Aenderung 28-mal zu machen. So ist es eine Aenderung an einer Stelle.

Neue Sprachen u. a. Rumaenisch, Kurdisch (Kurmanci), Bulgarisch, Kroatisch,
Serbisch, Bosnisch, Albanisch, Italienisch, Griechisch, Vietnamesisch, Hindi,
Urdu, Paschtu, Tigrinya, Somali, Chinesisch.

Sprachleiste ist jetzt ein Aufklappmenue — 28 Links nebeneinander waeren
unbenutzbar, besonders auf dem Handy. Google findet die Seiten weiter ueber
hreflang (28 + x-default, auf jeder Seite identisch) und die Sitemap (38 URLs).

Ausserdem: Hinweis in beiden Kauf-Boxen, warum sich die E-Mail-Angabe lohnt
(Zugangs-Link -> Guthaben auf jedem Geraet nutzbar).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 15:56:49 +02:00
JUSNandClaude Opus 5 3cdf9d0bd1 Werbetexte: '9 Sprachen' -> 'ueber 25 Sprachen' (22 Stellen)
App unterstuetzt jetzt 27 Zielsprachen, die Texte sagten noch 9. Betrifft
Startseite (Meta/OG/JSON-LD/sichtbar), Demo, alle 6 Sprachseiten, Ratgeber-Hub,
3 Artikel und die Beratungsstellen-Mails.

Im Uebersetzen-Artikel ausserdem die sichtbare Sprachliste von 9 auf 28
erweitert und die FAQ-Antwort angepasst (sonst haette der Artikel der eigenen
Ueberschrift widersprochen). Dessen Meta-Description von 166 auf 147 Zeichen
gekuerzt — sie wurde von Google abgeschnitten.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 13:55:46 +02:00
JUSNandClaude Opus 5 fd97a76787 Webhook abgesichert: fehlendes Secret und kaputtes JSON fuehren nicht mehr zum 500er
Ohne gesetztes STRIPE_WEBHOOK_SECRET starb der Handler in hmacHex mit einer
Worker-Exception (error 1101 / HTTP 500). Jetzt: sauberes 503 mit Log-Hinweis.
JSON.parse ist zusaetzlich abgefangen -> 400 statt Absturz.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 13:36:07 +02:00
JUSNandClaude Opus 5 464e9b109f App: Sprachen von 9 auf 27 erweitert + RTL-Darstellung repariert
Neue Zielsprachen fuer die groessten Sprachgemeinschaften in Deutschland,
u. a. Kurdisch (Kurmanci), Bulgarisch, Kroatisch/Serbisch/Bosnisch,
Albanisch, Italienisch, Griechisch, Spanisch, Vietnamesisch, Hindi, Urdu,
Paschtu, Tigrinya, Somali, Chinesisch. Liste nach Groesse der Gemeinschaft
in Deutschland sortiert.

Ausserdem: Sprache bekommt ein rtl-Flag. Arabisch und Farsi wurden bisher
linksbuendig dargestellt, was bei diesen Schriften falsch ist — jetzt
laufen Kernaussage, Erklaerung, To-dos und Fachbegriff-Erklaerungen bei
ar/fa/ur/ps von rechts nach links (der deutsche Fachbegriff bleibt links).

Neuer Test sprachen.test.ts schuetzt vor doppelten Codes (die wuerden den
Uebersetzungs-Cache ueberschreiben). 35 Tests gruen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 15:13:59 +02:00
JUSNandClaude Opus 5 8dc9074691 Stripe-Fehlermeldung wieder nutzerfreundlich (Diagnose entfernt)
Der technische Stripe-Grund geht nur noch ins Worker-Log, nicht an den
Nutzer.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 14:36:03 +02:00
JUSNandClaude Opus 5 a5e1a7d70b Fehlermeldung: Auth-/Konfigfehler nicht dem Foto anlasten
401/403 vom KI-Dienst sagte bisher 'machen Sie ein besseres Foto'. Jetzt
eigener Zweig (ki_konfig) mit ehrlicher Meldung.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 23:47:47 +02:00
JUSNandClaude Opus 5 e8a48049dd Stripe: auf LIVE-Preise umgestellt (Worker + Startseite + Demo)
price_1U6BNn… = 5 Analysen / 2,99 EUR
price_1U6BPR… = 15 Analysen / 6,99 EUR

Achtung: funktioniert erst, wenn STRIPE_SECRET_KEY auf sk_live_ steht.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 17:41:45 +02:00
JUSNandClaude Opus 5 16e9d33b71 Branding: BehoerdenKlar by Webklar + Anbieter-Hinweis an der Kasse
Statt Statement-Descriptor-Trick: Webklar wird auf der Seite sichtbar
gemacht. Kauf-Boxen nennen Webklar GbR als Anbieter und sagen an, dass
auf der Kontoabrechnung 'Webklar' erscheint (verhindert Chargebacks).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 17:30:30 +02:00
JUSNandClaude Opus 4.8 874ba31344 SEO: 4 neue Ratgeber-Artikel (verstehen, uebersetzen, organisieren, antworten)
Gezielte Keyword-Seiten mit Title/H1/Meta/FAQ-Schema/Canonical, in
Ratgeber-Hub, Sitemap und (2 staerkste) auf der Startseite verlinkt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-19 00:12:19 +02:00
JUSNandClaude Opus 4.8 0b71cce57d Rechtstexte: AGB + Widerruf neu, Impressum/Datenschutz auf Webklar GbR
- Impressum: Webklar GbR (Justin Klein, Kenso Grimm), Kleinunternehmer §19,
  EU-Streitschlichtung; Steuernummer bewusst nicht veroeffentlicht
- Datenschutz: Verantwortlicher = Webklar GbR; neuer Abschnitt Bezahlung
  (Stripe) + Wiederherstellungs-Mail (Brevo)
- AGB (agb.html) + Widerrufsbelehrung (widerruf.html) neu, verlinkt
- Kauf-UI: falsche 'inkl. USt' entfernt -> §19-Hinweis; AGB/Widerruf im
  Pflicht-Haekchen und in den Footern verlinkt

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-19 00:03:25 +02:00
JUSNandClaude Opus 4.8 1f3aad7e62 Startseite: Guthaben-Kauf direkt oben (Preise + Stripe-Checkout)
Neue Kauf-Sektion #kaufen gleich unter dem Hero (Pakete 5/15 Analysen,
Pflicht-Einwilligung, POST /kaufen -> Stripe). Hero-CTA 'Guthaben kaufen'.
Rueckkehr/Aktivierung laeuft wie gehabt ueber /demo.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 19:56:26 +02:00
JUSNandClaude Opus 4.8 3c2e5c24ae Web-Kauf: Kauf-Block nach oben (jetzt §2, direkt hinter Upload)
Guthaben-Kauf erscheint jetzt gleich unter dem Upload statt ganz unten.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 19:52:49 +02:00
JUSNandClaude Opus 4.8 0634e3cd38 Web-Kauf: Guthaben jederzeit kaufbar (auch ohne Gratis-Test)
Kauf-Block ist von Anfang an sichtbar — beide Wege parallel: sofort kaufen
oder erst 2x gratis testen. Einleitungstext angepasst.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 19:46:51 +02:00
JUSNandClaude Opus 4.8 521f504aa3 Web-Kauf: Guthaben kaufen & nutzen im Browser (Stripe, Demo-Seite)
- demo.html: Kauf-Block mit Paketen (5/15 Analysen), Guthaben-Banner,
  Pflicht-Einwilligung (sofortige Leistung, Widerruf erlischt), Rückkehr
  von Stripe (/kauf-status), Wallet-Token in localStorage, bezahlte
  Analysen umgehen die Gratis-Sperre und zählen das Guthaben herunter.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 19:40:58 +02:00
JUSNandClaude Opus 4.8 7440d35efb Web-Bezahlung Backend: Credit-Guthaben per Stripe (Phase 1)
- /kaufen: Stripe-Checkout-Session (REST, kein SDK)
- /kauf-status: nach Rueckkehr Zahlung pruefen -> Guthaben aktivieren ->
  signiertes Wallet-Token (HMAC) zurueckgeben
- /stripe-webhook: Signatur pruefen -> Guthaben aktivieren (idempotent) ->
  Wiederherstellungs-Link per Brevo mailen
- demoHandler: nimmt optional walletToken; gueltiges Guthaben umgeht die
  Gratis-Grenzen, wird nach Erfolg um 1 verringert
- neue Secrets: STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET,
  TOKEN_SIGNING_SECRET, BREVO_API_KEY; PAKETE-Mapping (Price-ID->Credits,
  echte IDs noch einzutragen)

Typecheck gruen. Noch nicht deployed (wartet auf Stripe-Einrichtung).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-17 14:34:38 +02:00
JUSNandClaude Opus 4.8 ce8a08a14d Fix: neues Turnstile-Widget mit behoerdenklar.de als Hostname
Altes Widget war nur fuer pages.dev freigeschaltet -> auf der neuen Domain
kam kein Token, Demo blockiert. Neues Widget (Hostnames: behoerdenklar.de,
www, pages.dev): Sitekey in demo.html, Secret als Worker-Secret gesetzt.
Token-Erzeugung auf behoerdenklar.de verifiziert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-17 12:55:10 +02:00
JUSNandClaude Opus 4.8 b2b7abb53b Google Search Console: Verifizierungs-Tag auf behoerdenklar.de-Property umgestellt
Neuer Code (6o1s...) fuer die .de-Property statt des alten pages.dev-Codes,
auf allen Seiten aktualisiert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-14 22:02:56 +02:00