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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
- 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>
- /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>
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>
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>
- Website: alle canonical/OG/hreflang/Sitemap/robots-URLs auf behoerdenklar.de
(alle Sprachseiten, Demo, Ratgeber)
- Worker: Demo-CORS erlaubt jetzt behoerdenklar.de (und www), nicht nur
pages.dev -> Demo funktioniert auf der neuen Domain
- eigene Domain via Cloudflare Pages Custom Domain verbunden (SSL aktiv)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 4 Ratgeber-Artikel als anklickbare Karten direkt auf der Startseite
(statt nur Fusszeilen-Link) + 'Alle Ratgeber ansehen'
- hilft Besuchern (Auffindbarkeit) und interner Verlinkung (SEO)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Fortschrittsbalken + 'Schritt X von 3'
- Schritt 1: Antwort-Art als Karten (Icon + Beschreibung, 'Empfohlen'-Tag
fuer die vom Brief vorgeschlagenen Typen)
- Schritt 2: optionale Angaben + Info-Box (Aktenzeichen/Behoerde kommen
automatisch aus dem Brief), dann KI-Entwurf
- Schritt 3: Entwurf pruefen/bearbeiten + PDF-Export + Teilen
- alle Funktionen erhalten (generiereAntwort, sichern, PDF, Teilen);
bei vorhandenem Entwurf Start direkt in Schritt 3
- warme Design-Farben durchs zentrale Theme
Typecheck + 30 Tests gruen. Visuelle Pruefung (Analyse + Antwort) im
Simulator steht noch aus.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 3 weitere Artikel im Muster-Stil: Steuerbescheid/Einspruch,
Auslaenderbehoerde/Aufenthaltstitel (mit Uebersetzungs-Hinweis),
Widerspruch (mit Muster-Text zum Abschreiben)
- je FAQPage-Schema, saubere URL, CTA zur Demo, Rechtshinweis, Breadcrumb
- Hub-Seite verlinkt alle 4; alle in sitemap.xml
- ehrlicher, hilfreicher Inhalt in einfacher Sprache (A2/B1)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Neuer Ratgeber (/ratgeber/): Hub-Seite + erster Artikel
'Mitwirkungsaufforderung vom Jobcenter' in einfacher Sprache,
mit FAQPage-Schema, sauberer URL, CTA zur Demo, Rechtshinweis
- Von Startseite verlinkt (Fusszeile) + in sitemap.xml
- index.html: wirkungsloser keywords-Tag entfernt, Beschreibung auf
138 Zeichen gekuerzt (Google schnitt sie sonst ab)
Ziel: eigene Seiten fuer konkrete Suchfragen (Jobcenter, Finanzamt,
Auslaenderbehoerde) statt nur einer Landingpage.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Verifizierung laeuft ueber den Meta-Tag in webseite/index.html (jetzt live
deployed). Die HTML-Datei-Methode funktioniert auf Cloudflare Pages nicht
(unbekannte Pfade liefern die Startseite als Fallback), daher entfernt.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Korrektur zur Rueckmeldung des Nutzers: der Lesbarkeits-Einwand galt nur der
duennen Serifenschrift, nicht den Farben. Die warmen Design-Farben sind gut
lesbar und vereinheitlichen App + Website.
- theme.ts: Papier-Beige-Grund, warme Karten, Gold-Akzent (#B68235) fuer
Icons/Tabs/Rahmen, dunkles Bronze (#7D5411, neu: primaerFuellung) als
Fuellung gefuellter Buttons (weisse Schrift kontrastreich), warme
Ampel-Toene (Backstein/Bronze/Salbei), warme Trennlinien/Graustufen
- GrossButton: Fuellung + Sekundaer-Text auf primaerFuellung (Kontrast)
- FAB-Scan-Knopf auf Bronze
- FristenScreen: ueberfaellige Zeilen zeigen 'faellig' statt 'Tage'
Im Simulator geprueft: Fristen-Start + Scan-Screen in warmen Farben, gut
lesbar. Typecheck + 30 Tests gruen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Fehler: Der anonyme Erst-Versuch war auf 1 pro IP (30 Tage) begrenzt.
Teilen sich mehrere Menschen eine Leitung (Familie, WLAN, Mobilfunk/CGNAT),
bekam der Zweite sofort 'E-Mail noetig' statt einer Analyse. Trat auch
beim Testen ueber denselben Anschluss auf.
- IP- und Anon-Zaehler jetzt TAEGLICH (Datum im Schluessel), 48h TTL
- Anonyme Erst-Analysen pro Anschluss/Tag: 3 (statt 1/30 Tage)
- IP-Gesamtlimit pro Tag: 8 (statt 3/30 Tage)
- 'Wallet'-Schutz unveraendert: globales Tagesbudget 100 + Turnstile +
E-Mail-Hash (dauerhaft 1x/Adresse)
- Client: email_noetig markiert den Browser NICHT mehr als verbraucht
(sonst dauerhafte Blockade ohne gelungene Analyse); localStorage-Key
auf 'bk_demo_v2' umbenannt -> setzt falsche Testphasen-Staende zurueck
Ende-zu-Ende verifiziert: frischer Erst-Upload liefert wieder das Ergebnis.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Warteliste nicht mehr nur Textlink, sondern zweiter Knopf (heller,
umrandeter Sekundaer-Stil .cta-sek) neben dem Demo-Knopf
- Beide Wege mit eigenem Nutzen benannt: Testen (eigener Brief, kein Konto)
/ Warteliste (5 Gratis-Analysen zum Start)
- Bald-im-App-Store-Stempel auf eigene Zeile
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Hero-Knopf ist jetzt die Demo ('Brief testen — 2x gratis', groesser),
Warteliste rueckt zum sekundaeren Textlink
- Subline: 'Mit Ihrem eigenen Brief, kein Konto, sofort im Browser'
- Zusaetzliche Probier-Box direkt nach dem Vorher/Nachher-Beispiel
('Genau das — mit Ihrem Brief') fuer den zweiten Impuls
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- E-Mail-Feld + Knopf im Papier-Design auf allen 7 Landingpages
(DE/EN/TR/AR/UK/RU/PL), lokalisierte Platzhalter/Button-Texte
- POST an Brevo (Double-Opt-in aktiv), Honeypot gegen Spam
- Besucher können sich jetzt mit 2 Klicks eintragen statt eine Mail
abzuschicken — deutlich niedrigere Hürde
- DE-Bonustext präzisiert: Code kommt per Mail, sobald die App fertig ist
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Der erste Token (2182...) wurde bei der Einrichtung nie in Cloudflare
gespeichert. Neuer Token (11f0...) ist jetzt richtig registriert und in
der Web-Analytics-Liste sichtbar. Alle 9 Seiten aktualisiert.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Primärfarbe: Apple-System-Blau (#007AFF) statt dunklem Marineblau —
Buttons, Icons und Links wirken wie in Apples eigenen Apps
- Header nach Apple-Konvention: Titel in Textfarbe, nur Interaktives im Tint
- Ampel: frische Signalfarben in zugänglichen Varianten (klares Rot,
Orange statt Braun, sattes Grün) — als Text auf Weiß weiter WCAG-lesbar
- Großtitel entfernt (renderte auf iOS 26 nicht zuverlässig) — Standard-
Header ist stabil auf allen Screens
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Neue Ikone-Komponente (expo-symbols): echte SF Symbols auf iOS,
Material Symbols auf Android — alle Emojis in Buttons/Kacheln/
Checkboxen/Ampel/Chevrons ersetzt
- Theme: iOS-Systemgrau (#F2F2F7) statt Papier-Ton, weiße Karten ohne
Rahmen und Schatten (wie Einstellungen/Health), "graue Taste" für
Sekundär-Buttons statt Umrandung
- Kernaussage-Karte: dezenter Marken-Tint statt Textmarker-Gelb
- Frist/Termin-Zeilen ohne Emoji-Präfixe
- Layout unverändert (Kacheln, Ampel-Streifen, großer Titel)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Theme: warmer Papier-Hintergrund (#FAF7F0) wie die Webseite, Inhalte
als weiße Karten mit dezentem Schatten + warmem Rand; Marker-Gelb
als Akzentfarbe für die Kernaussage
- Home: iOS-Großtitel (kollabiert beim Scrollen), Hero-Button mit
Schatten, Kachel-Navigation statt halbbreiter Text-Buttons (behebt
Umbruch "Einstellunge/n"), Abschnitts-Label, Brief-Karten mit
Ampel-Farbstreifen links, freundlicher Leerzustand
- Analyse: Kernaussage als Textmarker-Karte (Markenzeichen), Frist/
Termin-Karte in Ampel-Tönung mit Farbstreifen, einheitliche Karten
- Ampel-Banner: Streifen-Look statt Vollrahmen
- Layout-Fix: Home als FlatList-Wurzel mit automatischem Inset (vorher
verdeckte der große Titel die Kopf-Buttons)
Barrierefreiheit unverändert: Schriftgrößen, Touch-Targets, Kontraste.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Deutsche Seite sprachlich vereinfacht (kurze Sätze, keine schweren
Wörter — passend zum Produktversprechen); Sprachleiste ergänzt
- Neue Seiten: tr, ar (RTL), en, uk, ru, pl — kompakt, einfache Sprache,
gleiche Papier-Optik, Vorher/Nachher-Demo (deutsches Amtszitat +
Erklärung in der Zielsprache), Warteliste-CTA je Sprache
- hreflang-Verweise auf allen Seiten; arabische Seite mit dir=rtl,
deutsches Zitat dort explizit ltr
- Live geprüft: alle 6 Seiten erreichbar, RTL-Layout korrekt
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Brief-Archiv jetzt AES-256-GCM-verschlüsselt (expo-crypto, Schlüssel im
SecureStore); Migration alter Klartext-Bestände beim ersten Laden;
im Simulator auf der Platte verifiziert (nur Chiffrat, kein Klartext)
- AppSchutz-Komponente: optionale App-Sperre (Face ID / Geräte-Code,
expo-local-authentication) + Sichtschutz im App-Umschalter
- Auto-Löschen alter Briefe (30/90 Tage, Einstellungen), pure Filter-
Funktion mit Tests
- UTF-8-Helfer (Umlaute/Arabisch/Emoji-sicher) mit Tests; gesamt 30 Tests
- Einstellungen: neuer Abschnitt "Sicherheit"
- Datenschutzerklärung (Web + Entwurf) um die neuen Maßnahmen ergänzt
- Neu: rechtliches/datenschutz-factsheet.md für Kooperations-Pitches
- EU-Verarbeitung geprüft: inference_geo bietet aktuell nur us/global,
keine EU-Option (Haiku 4.5 gar nicht) — als Ausbaupfad dokumentiert
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Konzept: Die Seite sieht selbst aus wie ein Behördenbrief, der endlich
verständlich ist (Briefkopf mit Aktenzeichen, Paragraphen-Gliederung,
Stempel, Textmarker, Antragsformular-Parodie, Grußformel).
Eingesetzte Prinzipien: Von-Restorff (unverwechselbare Gestaltung),
Vorher/Nachher-Konkretbeispiel statt Abstraktion, Verlustaversion/
Exklusivität beim Wartelisten-Bonus, Social Proof über LEO-Studie,
Reim-Slogan "Brief rein. Klartext raus.", humorvoller Schluss
(Peak-End-Regel).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Backend-Proxy (Cloudflare Worker in proxy/): API-Key serverseitig,
Modell-Whitelist, max_tokens-Deckel, Tageslimits pro Gerät und IP
- Modell-Split: Analyse auf Sonnet 5, Übersetzung/Antwort auf Haiku 4.5
- Bild-Downscaling auf 2000px vor dem Upload (ScanScreen)
- Expo SDK 56 -> 57 Upgrade
- Freemium: 3 Gratis-Analysen mit lokalem Zähler und Paywall-Hinweis
- Einstellungen: API-Key-Feld nur noch im Dev-Modus (NUTZT_PROXY)
- Build-Setup: Bundle-IDs, eas.json, Splash-Screen-Plugin
- Tests: jest-expo + 17 Tests für die Ampel-/Fristlogik
- Rechtliches: Datenschutzerklärung (Entwurf), Webseite (webseite/,
live auf behoerdenklar.pages.dev), Store-Texte (store/)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>