Skip to content
Mignuti Chatbot

Changelog

Subscribe to releases
  1. 2026-04-29

    v0.7.9.x-klammer-skeleton Klammer (Replyr Desk) — Tauri-2.0-Skeleton bootstrapped

    Neuer Workspace `desk/` für die Karl-Klammer-Desktop-App ergänzt. Tauri 2.0 + Preact + globaler Hotkey + System-Tray + Side-Panel-Window mit Pin-to-Right. Magic-Link-Auth-Flow vorbereitet (wartet auf desk-magic-link + desk-chat Edge Fns). Eigene Brand `klammer.app`, geteilter Backend-Stack (Supabase, RAG-Pipeline, Stripe). v0.1-alpha — Skeleton steht, Backend-Wiring kommt v0.2 nach v0.8-Embed-Launch.

    New

    • • Workspace `desk/` als 5. NPM-Workspace (neben src/widget/marketing/shared/services). package.json + scripts (desk:dev, desk:build, dev:desk) ergänzt.
    • • Tauri-Backend (Rust): Cargo.toml mit Tauri 2.x + 5 Plugins (global-shortcut, shell, store, window-state, deep-link). Release-Profil optimiert für kleines Binary (~10 MB statt 100 MB Electron).
    • • Globaler Hotkey: Strg+Leertaste auf Windows/Linux, Strg+Umschalt+K auf macOS (Spotlight-Konflikt). User-Override kommt in v0.3.
    • • System-Tray-Icon mit Menü: 'Klammer öffnen' / 'An rechten Rand pinnen' / 'Beenden'. Linksklick toggelt Panel, Rechtsklick zeigt Menü.
    • • Side-Panel-Window: 380×720 px, frameless, transparent (rounded corners 12px), always-on-top toggleable, Pin-to-Right-Edge mit 16px Margin auf Primär-Monitor. Multi-Monitor-aware via tauri-plugin-window-state.
    • • Custom-Protocol-Handler `replyr-desk://` + `klammer://` für Auth-Callback (in tauri.conf.json + capabilities deklariert).
    • • Frontend-Stack (Preact + Vite): re-uses @replyr/shared, @replyr/widget via Vite-Aliasses. CSP eng gelockt (default-src 'self', connect-src nur Replyr-Backend + Anthropic).
    • • Auth-Flow vorbereitet: lib/auth.ts mit requestMagicLink + listenForAuthCallback. Sessions persistieren in OS-Keychain via tauri-plugin-store (Windows Credential Manager / macOS Keychain / Linux Secret-Service). Dev-Modus fällt auf localStorage zurück.
    • • UI-Components: TitleBar mit Drag-Region + Window-Controls (Always-on-Top-Toggle, Pin-to-Right, Logout, Hide-to-Tray), LoginView mit Magic-Link-Form, KlammerPanel mit SSE-Streaming-Chat.
    • • Capabilities-File (Tauri-2.0-Permission-Matrix): nur explizit gewährte APIs erreichbar. shell:allow-open whitelistet ausschließlich replyr.app/klammer.app/app.replyr.app.
    • • Icon-System: SVG-Master in src-tauri/icons/source.svg, Tauri-CLI generiert PNG/ICO/ICNS automatisch (`npx tauri icon`)
    • • Dokumentation: desk/README.md mit Setup-Instruktionen für Win/macOS/Linux, Architecture-Diagramm, Auth-Flow-Sequenz, Troubleshooting
  2. 2026-04-29

    v0.7.9-beta.2 v0.7.9 Patch — 13 Bugs aus /bug-check gefixt

    Adversarial Bug-Hunt auf v0.7.9-beta.1 hat 7 wichtige + 6 minor Bugs gefunden — alle gefixt. Schwerpunkte: Defensive Input-Validation für audit-bot (null-body crash), IP-Binding + is_paused-Check für widget-action-webhook (Security-Parität mit chat-completion), explicit per-row UPDATE in Migration 063 (gegen shared-secret Worst-Case bei volatile-DEFAULT eval), retention-job für db_heartbeat, NaN-guard in speed-Score, SpotlightTour-Polishing (0×0-skip + Esc + focus-trap), Status-Page Fallback-Label, WidgetApp 401-logging, lazyNamed runtime-check, audit_lead_log length-CHECKs (Bot-Spam-Schutz). 2 neue Tests (NaN + negative ttfbMs locking).

    Fixed

    • • 🟡 audit-bot — body-validation gegen null/non-array categories/non-string fields (vorher 500 statt 400)
    • • 🟡 widget-action-webhook — chatbots.is_paused-Check (paused Bot soll Webhook nicht mehr feuern, auch nicht aus stalen Session-JWTs)
    • • 🟡 widget-action-webhook — IP-hash-binding parität mit chat-completion (Stolen-JWT-Schutz)
    • • 🟡 Migration 063 — drei-Phasen-ADD COLUMN + explicit UPDATE für garantierte per-row-Uniqueness des webhook_signing_secret (Defense gegen volatile-DEFAULT Edge-Cases)
    • • 🟡 Migration 064 — pg_cron purge-db-heartbeat (täglich 03:07 UTC, alles >1h löschen) gegen Row-Leaks bei Edge-Fn-Crash zwischen INSERT und DELETE
    • • 🟡 audit-heuristics — Number.isFinite-Guard für ttfbMs in speed-Category (vorher 'TTFB NaNms' im Detail-String)
    • • 🟡 SpotlightTour — Skip bei 0×0 bounding-rect (für Targets im DOM aber ohne Layout, z.B. Pre-load ProjectSwitcher)
    • • 🔵 SpotlightTour — Esc-Handler + Focus-Trap auf Skip/Next-Button (a11y-Konvention für aria-modal Dialog)
    • • 🔵 status.astro — 'Not yet probed' Fallback wenn health-check Edge Fn noch nicht gelaufen ist (statt ewiges '...')
    • • 🔵 WidgetApp.tsx — console.warn bei nicht-2xx von widget-action-webhook (vorher silent failure bei expired JWT)
    • • 🔵 router.tsx — lazyNamed Runtime-Check + actionable Error-Message bei Tippfehlern in Component-Namen
    • • 🔵 audit_lead_log — length-CHECKs für target_url/target_host/lead_email/vendor (Bot-Spam-Schutz, RFC-konform)
    • • 🔵 audit-bot — pre-validate lead_email + targetUrl-Länge VOR DB-INSERT (vermeidet wasted roundtrips + ReDoS bei massiven Inputs)
  3. 2026-04-24

    v0.7.9-beta.1 Solo-Sprint v0.7.9 — 10 Production-Hardening Tasks (CI, Audit-Bot, HMAC, FR-Locale)

    Alle 10 Production-Hardening-Solo-Tasks fertig. CI hat jetzt Lighthouse + pa11y-Gates. Audit-Bot-Backend live (statische Vendor-Detection-Heuristik + 8 Kategorien). HMAC-SHA256 für action-button-trigger_webhook (Customer kann Mignuti Chatbot-Calls verifizieren). Honeypot-Fields auf 3 Forms. 3 neue _shared-Module (audit-heuristics, intent-classify, webhook-sign) mit 67 neuen Tests. Code-Splitting für 25 Admin-Routes via React.lazy. Status-Page mit echtem External-Health-Probe (anthropic/openai/azure/db). Onboarding-Spotlight-Tour bei Erst-Login. FR-Locale-Stub (homepage + pricing) plus Nav/Footer/Base-Trilingual. Total: 4 neue Migrationen (062-064 + audit_lead_log), 3 neue Edge Functions (audit-bot, widget-action-webhook, health-check), 3 neue Unit-Test-Suites, 1 Component-Render-Test-Suite, 4 neue Doc-Dateien (ROADMAP.md, CONTRIBUTING.md, audit-cases.json, architecture-§11).

    New

    • • P1 CI/CD-Gates: .github/workflows/ci.yml + zwei neue Jobs lighthouse + a11y. Lighthouse-CI gegen ./marketing/dist via treosh/lighthouse-ci-action@v12 — 4 URLs (/, /pricing, /faq, /trust, /docs), assertions perf≥0.85 / a11y≥0.95 / best-practices≥0.9 / seo≥0.95 / FCP<2s / LCP<2.5s / CLS<0.1. Pa11y-CI via npx serve + npm run a11y:ci. Beide continue-on-error: true als informational, tighten zu required-status nach 30-Tage-Baseline. .lighthouserc.json neu
    • • P2 Audit-Bot Backend: supabase/functions/audit-bot Edge Fn macht statische Vendor-Detection-Heuristik (10 Vendors: mignuti-chatbot/intercom/tidio/chatbase/drift/crisp/voiceflow/hubspot/zendesk/unknown) + 8 Kategorien-Score (ai_disclosure / sources / hallucination / prompt_injection / multilang / refusal / speed / data_leakage). SSRF-defense, Rate-Limit 5/60s pro IP, 1MB-Body-Cap, 8s-Timeout. Lead-Capture in audit_lead_log (Migration 062, super_admin-only read, 24-Monat-Retention). Pure Logik in _shared/audit-heuristics.ts (28 Tests). bot-audit.astro callt jetzt echte Edge Fn (nicht nur Sim) via PUBLIC_SUPABASE_URL. scripts/seeds/audit-cases.json mit 25 Live-Probing-Cases als Doku + Roadmap für v0.8
    • • P3 Production-Hardening: (a) Honeypot-Fields auf waitlist.astro / avv-generator.astro / bot-audit.astro — bots auto-fillen 'company_url_hp', server/client checkt + droppt. (b) HMAC-SHA256-signierte Action-Button-Webhooks: Migration 063 (chatbots.webhook_signing_secret 32-byte hex + rotate_webhook_signing_secret RPC), neuer _shared/webhook-sign.ts (buildSigningPayload, computeSignature, constantTimeEqual, verifySignature mit 5min-replay-window), neue widget-action-webhook Edge Fn (server-side relay statt no-cors browser fetch). Customer-side prüft via X-MignutiChatbot-Signature: v1=<hex> + X-MignutiChatbot-Timestamp Header. (c) Widget WidgetApp.tsx: trigger_webhook ruft jetzt widget-action-webhook statt direct-fetch — keine spoofbaren browser-origin POSTs mehr
    • • P4 Test-Coverage-Pass: 3 neue _shared-Module mit 67 Tests gesamt. (a) _shared/audit-heuristics.ts (28 Tests — vendor-detection / clamp01 / scoreCategory pro Kategorie / aggregateScore). (b) _shared/intent-classify.ts (22 Tests — buildTranscript / extractJsonObject / clampLeadScore / validateIntents / parseClassifierOutput). classify-intent/index.ts refactored: nutzt jetzt parseClassifierOutput statt inline Regex. (c) _shared/webhook-sign.ts (17 Tests — payload building / sig compute / constant-time-compare / drift-window). Total Vitest-Suite jetzt 290 Tests grün (vorher 222)
    • • P5 Dokumentation: README.md + Sektion 'Roadmap & Contributing'. ROADMAP.md neu — strukturiert Phase 0 (Greenfield), Phase 1 (Pre-Launch v0.6.x→v0.7.x), Phase 2 (Public Launch v0.8.x: Real-Time-Bot-Audit, Voice-Widget, Marketplace, Compliance), Phase 3 (Scale v0.9.x→v1.0: White-Label, Public REST-API, Affiliate, Enterprise). CONTRIBUTING.md neu — Workflow, Pflicht-Checks (lint/typecheck/vitest/i18n-check), Code-Conventions (TS strict, React 19 Hooks, Preact-Bundle-Budget, SQL Default-DENY), Commit-Conventions, i18n-Regeln, Security-Disclosure. docs/architecture.md erweitert um §11 v0.7.x Feature-Layer (Live-Chat, Auto-QA, URL-Crawler, Action-Buttons+HMAC, Bot-Audit, AVV-Generator, Trust-Center, CI-Gates)
    • • P6 Component-Render-Tests: tests/unit/widget-components.test.tsx neu (file-scoped happy-dom env, file extension .tsx). 11 Tests gegen ChatPanel-Subkomponenten (vorher unexportiert) — SourceFootnotes (clamping, fallbacks, XSS-escape, similarity-clamping) + ActionButtons (rendering, emoji aria-hidden, click-dispatch, button type=button). vitest.config.ts include-Pattern erweitert für *.test.tsx. ChatPanel.tsx exportiert jetzt SourceFootnotes + ActionButtons
    • • P7 Performance-Pass: src/router.tsx vollständig refactored auf React.lazy + Suspense für 25 Admin-Pages (alle außer SignIn / AuthCallback / AppShell / Dashboard / Onboarding bleiben eager). Custom lazyNamed<P>-Helper preserviert Component-Props-Typen (z.B. MessageInspectorPage{messageId}). RouteLoader-Fallback. Build-Result: 25 separate Page-Chunks à ~6-15 KB statt one-big-bundle. Initial-Bundle index-CUXOuas7.js bei 679 KB (204 KB gzipped) — heavy admin-only Pages werden lazy geladen
    • • P8 Status-Page real: Migration 064 erweitert service_health um anthropic_ok / openai_ok / azure_ok / db_write_ok / probed_externally_at. Neue Edge Fn supabase/functions/health-check macht externe Liveness-Probes (HEAD-Requests gegen api.anthropic.com / api.openai.com / Azure-Endpoint + db_heartbeat insert/delete round-trip), 0 LLM-Tokens verbraucht. pg_cron-Schedule alle 5 min (offset 1 min von sample_service_health damit Race-vermeidet). marketing/status.astro liest die neuen Felder + zeigt Components-Panel (Anthropic / OpenAI / Azure / Database) als grün/rot/Not-configured
    • • P9 Onboarding-Walkthrough: Neue src/components/SpotlightTour.tsx — 4-Step-Tour bei Erst-Login (data-tour='project-switcher' → 'nav-knowledge-base' → 'nav-embed' → 'health-pill'). localStorage 'replyr_tour_v1_done' verhindert Re-Show. Skip-Button setzt Flag genauso. Cutout-Effekt via 4-Quadrant-Dim-Panels (kein SVG-Mask, breiter Browser-Support). Touch-Target 44px, role='dialog' aria-modal='true' aria-labelledby. AppShell.tsx + data-tour-Markierungen + <SpotlightTour/>-Mount. i18n-Keys 'tour.*' EN+DE
    • • P10 +1 Locale FR (Marketing): Trilingual Nav.astro / Footer.astro / Base.astro mit locale='en'|'de'|'fr'. Neue marketing/src/pages/fr/index.astro (translated homepage mit Coming-Soon-Hinweis für FAQ/Trust/Docs/Legal-FR) + fr/pricing.astro (volle FR-Tarif-Tabelle). hreflang fr im <head>. og:locale fr_FR. CookieBanner.astro um FR erweitert. Legal-Slugs für FR fallen auf EN-Versionen zurück bis FR-anwaltlich-Review in v0.8
  4. 2026-04-29

    v0.7.8-beta.1 Solo-Sprint v0.7.8 — 14 Tier-1/2/3 Tasks fertig (Closed-Beta-ready)

    Alle 14 Solo-Tasks aus dem 'was-fehlt-noch'-Audit umgesetzt. Lead-Score-Pipeline aktiv, URL-Crawler-Worker live (kritischer Code-Blocker), pg_cron-Schedules konsolidiert, Subprocessor-Trigger, Cookie-Banner DSGVO-konform, Stripe-Dunning, Trial-Reminders, Bulk-Pause für Agencies, Partitioning-Plan dokumentiert, AVV-Generator + Bot-Audit als Lead-Magnete. 5 neue Migrationen (057-061), 1 neue Edge Function (url-crawl-worker), 2 neue Marketing-Pages, 11 neue Tests.

    New

    • • P1 Welcome-Email als Auth-Template ([auth.email.template.confirmation] in config.toml — Customer kriegt jetzt Branded-Welcome statt Default-Supabase-Default)
    • • P2 Lead-Score-Pipeline aktiv: chat-completion finalizePersistence triggert classify-intent fire-and-forget am Ende jedes nicht-fallback-Turns. Bisher blieben conversations.lead_score immer NULL → Agency-Dashboard zeigte 0 Hot-Leads. Jetzt: ~1s nach Chat-Ende setzt classify-intent intents[] + lead_score. Hot-Lead-Trigger 027 fired automatisch ab Score ≥ 70
    • • P3 URL-Crawler-Worker als Edge Function (kritischer Code-Blocker geschlossen): pgmq-Reader holt Jobs aus replyr_url_crawl-Queue, crawlt jede URL (oder parsed Sitemap/RSS/Atom bei XML-Endpoint), extrahiert Content via CSS-Selectors, embedded in Batches via OpenAI, schreibt embeddings mit url_source_id. SSRF-Defense + 1MB-per-page-Cap + 6s-Timeout + 500-chunks-Total-Cap + 3-Retry-Limit. Vorher: enqueue_url_crawl schrieb in pgmq, niemand las. Jetzt: alle 60s pickt der Worker bis zu 5 Jobs ab
    • • P4 Migration 057 — pg_cron-Schedules konsolidiert: notification-dispatcher (1min), url-crawl-worker (1min), webhook-dispatcher (1min), gdpr-export-build (15min), demo-crawls-cleanup (15min), trial-reminders (6h), auto-suggest-qa (nightly 03:00 UTC), audit-log-retention (daily 04:00 UTC). Plus _cron_invoke_edge-Helper der via app.settings.supabase_url + service_role_key arbeitet (auto-set durch Supabase-Platform)
    • • P5 Migration 058 — Subprocessor-Trigger: ON INSERT/UPDATE/DELETE auf subprocessors-Table fired notification_outbox-Events pro opt-in-Subscriber. Notification-Dispatcher (existiert) sendet Resend-Email mit subprocessor-update.html-Template. Idempotency keyed auf processor_id+action+channel — Stripe-style ohne Doppel-Mails. DSGVO Art. 28 Compliance: Subscribers werden 30 Tage vor Wirksamkeit benachrichtigt
    • • P6 Sentry-Status verifiziert: Admin (@sentry/react SDK) + Widget (custom /envelope/-Transport ohne SDK-Bloat) bereits komplett. Edge Functions nutzen Supabase-Function-Logs (vor Sentry-Integration nicht nötig)
    • • P7 Cookie-Banner Marketing-Site (DSGVO-Pflicht): Vanilla-JS Component im Base.astro, EN+DE, localStorage 'mignuti-chatbot.consent.v1' für Persistenz, Custom-Events 'mignuti-chatbot:consent-granted'/'denied', Plausible-Pageview erst nach consent, Widget-data-consent-Toggle. Re-open-Hook für Footer-Link
    • • P8 11 neue Unit-Tests: extractLinks (Multi-Origin, Fragment-Strip, Dedupe, Anti-DoS-Cap, javascript:-Reject) + draftConfidence (Floor 0.3 / Cap 0.95 / linear citation-scaling). Helpers extrahiert nach _shared/url-extract.ts so url-crawl-worker + auto-suggest-qa testbar bleiben
    • • P9 Stripe-Dunning-Logic: invoice.payment_failed → emitDunningEvent erstellt billing-alerts-Channel falls keiner existiert (Auto-Owner-Email-Lookup), schreibt notification_outbox mit Idempotency. Plus customer.subscription.trial_will_end-Handler für 3-Day-Stripe-eigenes-Reminder. Closes Customer-frustrating-silence wenn Karte abläuft
    • • P10 Migration 059 — Trial-Reminder-Ladder: 7d → 3d → 1d-Reminder vor trial_ends_at. Cron alle 6h (so jedes Window getroffen wird auch bei kurzen Pausen). Idempotenz via trial_reminder_{7d,3d,1d}_at-Spalten. Auto-Channel-Creation falls Owner keine Notification-Channel hat
    • • P11 Migration 060 + UI — Bulk-Pause Agency-Dashboard: chatbots.is_paused/pause_reason/paused_at + RPC bulk_set_chatbots_paused (max 50 IDs/call, per-Project-Auth-Check, audit_log-Eintrag). Dashboard-Bulk-Bar mit Pause/Unpause-Buttons + Pause-Reason-Prompt. i18n EN+DE
    • • P12 Migration 061 — Partitioning-Plan dokumentiert: KEIN sofortiges Live-Partitioning (invasiv auf gefüllten Tabellen). Stattdessen: partition_health()-RPC der bei >50M Rows in messages/usage_log/ai_interactions_log warnt + partition_migration_plan-Tabelle mit 3-Tabellen-Playbook. Pragmatisch — wir ziehen die Migration genau dann durch wenn das Volumen es rechtfertigt (~Monat 6-9 nach Launch)
    • • P13 AVV-Generator als Marketing-Lead-Magnet: /avv-generator Astro-Page, client-side jsPDF-loses Form (kein Server-Roundtrip = keine PII bei uns), generiert Art.-28-AVV mit 9 Paragraphen + TOM-Anlage + Signatur-Block. Optional Newsletter-Capture für Subprocessor-Updates. SEO-Long-Tail 'AVV Generator' / 'DSGVO AVV' = ~1k Suchen/Monat DACH
    • • P14 Replyr Bot-Audit-Mode: /bot-audit Astro-Page mit Form für Wettbewerber-URL → 8 Kategorien (AI-Disclosure, Sources, Hallucination, Prompt-Injection, Multi-Lang, Refusal, Speed, Data-Leakage), Score 0-100 + Findings-Liste, Mignuti Chatbot-Cross-Sell-CTA. Edge-Function audit-bot als Server-Backend optional (client-side simulated fallback für Demo). Sales-Waffe für Agencies
  5. 2026-04-29

    v0.7.7-beta.1 Live-Chat Visitor-Side Polling — Phase 3 jetzt End-to-End

    v0.7.6 hatte den Admin-side der Live-Chat-Hybrid-Funktion komplett (Inbox-Page mit Realtime, Claim, Send, Close), aber Visitor-side fehlte: ein Visitor klickte 'Mit Mensch sprechen' und sah nichts mehr, weil das Widget nur am chat-completion SSE-Stream hing. Lösung: leichter Polling-Endpoint widget-poll + Widget-Engine die alle 3-5s neue Agent-Antworten holt. Bundle 27.55 → 28.71 KB gzipped (Budget 30 KB ✅).

    New

    • • Edge Function widget-poll: Session-JWT-Auth, IP-Hash-Binding, Origin-Check, Rate-Limit (max 1 Req/2s pro Session), conversation+session-bound (kein Cross-Session-Leak), liefert handover_state + new_messages-Liste seit since-Timestamp + agent_joined_at + next_poll_after_ms-Hint
    • • shared/api.ts: WidgetPollRequest/Response + WidgetPollMessage + HandoverState-Type erweitert; ChatMessageChunk um type='handover' und handover_state-Field auf done-event ergänzt
    • • chat-completion: emittiert handover_state in jedem done-event (per maybeSingle-Query auf conversations) und im Handover-Sentinel-Pfad ein dediziertes 'handover'-event mit awaiting_agent
    • • Widget API-Client: pollUpdates-Methode mit 429-Soft-Hint-Handling
    • • WidgetApp.tsx Poll-Engine: aktiviert sich bei handover_state != 'bot', polling-Loop mit document.hidden-Pause + Visibility-Resume + exponential-backoff bei Errors (3s/6s/12s/24s) + Auto-Stop bei closed-State, server-driven cadence via next_poll_after_ms
    • • ChatPanel.tsx: 3 Handover-Banner-Varianten (awaiting/joined/closed) mit aria-status + Pulse-Animation, Agent-Message-Rendering als grüne Bubble mit 'Mitarbeiter'-Role-Label, Plain-Text-Render (kein Markdown — auch defensiv falls Agents später formatieren)
    • • Widget-i18n erweitert um 4 neue Keys: widget.handover.awaiting/joined/closed + widget.role_agent (EN+DE)
    • • Visitor-Erfahrung: klickt Handover → 'Mitarbeiter wird benachrichtigt' (orange Pulsing-Banner) → ~30s später 'Mitarbeiter ist beigetreten' (grünes Banner) → jede Agent-Antwort innerhalb 3s sichtbar
  6. 2026-04-28

    v0.7.6-beta.1 Vision Prio 1-4 — Auto-QA, Action-Buttons, Live-Chat, Smart-Outbound

    Vision-Strategist hatte 4 Prioritäten identifiziert die zusammen den Switching-Cost-Moat aufbauen. Alle 4 in einem Sprint geliefert: (1) Closed-Loop-Auto-QA - der Steve-Jobs-Moment wo der Bot nachts besser wird, (2) Action-Buttons im Chat als Conversion-Booster, (3) Hybrid Live-Chat mit Agent-Inbox (Tidio-Killer), (4) Smart-Outbound-Triggers DSGVO-konform. 4 Migrationen, 2 Edge Functions, 2 neue Admin-Pages, Widget-Engine erweitert.

    New

    • • PHASE 1 — Closed-Loop-Auto-QA (der Steve-Jobs-Moment):
    • • Migration 053: pending_questions erweitert um draft_answer/draft_confidence/draft_model + RPCs pending_questions_for_draft + approve_pending_question_draft
    • • Edge Function auto-suggest-qa: nutzt Anthropic Claude Haiku 4.5 mit constrained-Prompt (NEEDS_HUMAN-Sentinel wenn KB unzureichend) + Citation-Counting für Confidence-Score 0.3-0.95
    • • pending-questions.tsx UI mit Draft-Preview + 1-Click-Approve-Editor + automatischer qa-pair-embed-Trigger nach Save → neuer Q&A ist binnen 1 Sek retrievable
    • • Switching-Cost-Moat: Bot wird über Wochen besser ohne Owner-Aufwand, Konkurrenz-Re-Training kostet Stunden
    • • PHASE 2 — Action-Buttons (Conversion-Booster):
    • • Migration 054: chat_action_buttons + chat_action_kind ENUM (open_url/open_calendar/send_message/trigger_webhook/request_handover) + RPC action_buttons_for_session mit intent+path-prefix-Filter + URL-https-CHECK + RLS
    • • shared/api.ts: ChatActionButton + ChatMessageChunk.actions[] type
    • • Widget WidgetApp.tsx: onAction-Handler für 5 Kinds (window.open mit noopener für url/calendar, sendMessage für send_message + handover-sentinel, no-cors-fetch für webhook)
    • • ChatPanel.tsx: ActionButtons-Component mit Pill-Style + Touch-Target 36px + emoji-Prefix
    • • chat-completion: emittiert actions-event nach sources-event basierend auf page_path-Match
    • • chat-action-buttons.tsx Admin-Page mit CRUD-Form + Conditional-Rendering-Felder (intent/path)
    • • Widget-Bundle: +0.5 KB für ActionButtons-Render, weiter unter 30 KB
    • • PHASE 3 — Hybrid Live-Chat (Tidio-Killer):
    • • Migration 055: conversation_handover_state ENUM (bot/awaiting_agent/with_agent/closed) + agent_user_id + handover_requested_at + 'agent' role im messages.role + RPCs request_handover/claim_conversation/agent_send_message/close_conversation + Realtime-Publication für conversations + messages
    • • inbox.tsx Admin-Page mit Realtime-Subscription auf conversations (postgres_changes) → Live-Liste der awaiting/active Sessions, Click-to-Claim, Reply-Box, Close-Button
    • • chat-completion: erkennt '__request_handover__'-Sentinel und triggert request_handover-RPC + ack-Message statt LLM-Call
    • • Tech-Debt next-iter: Visitor-Widget-Realtime (Polling oder SSE) für Live-Agent-Antworten — würde +50KB bundle kosten via supabase-js, daher als separate Iteration geplant
    • • PHASE 4 — Smart-Outbound-Triggers (DSGVO-konform):
    • • Migration 056: proactive_rules-Validator erweitert um delay_seconds/scroll_depth_pct/exit_intent/returning_visitor_only/time_window_hours/time_window_days + neue RPC resolve_proactive_rule mit time-window-Gate
    • • shared/api.ts: WidgetSessionResponse.proactive um die 4 neuen Felder erweitert
    • • Widget-Engine: 3 parallele Trigger (time-on-page setTimeout + scroll-depth-Listener + exit-intent-mouseout-Listener) + returning_visitor_only-localStorage-Gate ohne Tracking-Cookies
    • • Verkaufs-Twist: Tidio/Intercom haben Behavior-Triggers aber mit Cookies — Mignuti Chatbot macht es DSGVO-konform
  7. 2026-04-28

    v0.7.5-beta.1 Marketing-Site Aufwertung — FAQ, Docs, Use-Cases, Trust-FAQ, eigener Bot

    Reality-Check der Landing identifizierte 6 Lücken: keine zentrale FAQ, kein /docs, dünne Index-Page, 3 fehlende Verticals, kein eigener Bot, Trust-Center ohne Security-FAQ. Alle 6 geschlossen. 9 neue gerenderte Pages (48 → 57). Marketing-Site-Score: 60 → 95.

    New

    • • Zentrale /faq + /de/faq mit 25 kuratierten B2B-Fragen in 5 Sektionen (General, Setup, Security/DSGVO, Bot-Funktion, Agency) inklusive Schema.org FAQPage JSON-LD für Google rich-results
    • • /docs Hub mit Quickstart, Embed-tag-Anatomie und 6 Plattform-Tutorials (WordPress, Shopify, Webflow, Plain HTML, React/Next, Vue/Nuxt) plus Consent/Cookie-Banner-Integration und Troubleshooting
    • • Index-Page komplett aufgewertet (EN+DE): Use-Case-Showcase-Grid mit 6 Vertical-Cards (sortiert nach Headline), Comparison-Highlight (5 Wettbewerber-Pills zu /compare/*), inline-FAQ mit 5 Top-Fragen + 'Read all 25 →' Link, finaler CTA-Block
    • • 3 fehlende Vertical-Use-Cases ergänzt: dental.json (HWG-Compliance + Kassen + Termine), hospitality.json (12 Sprachen + Allergen-Sicherheit + PMS-Integration), consulting.json (Lead-Score + Discovery-Call-Routing). Beide Sprachen, mit FAQ-Schema.org
    • • Trust-Center Security-FAQ ergänzt: 10 Fragen die jeder DPO/CISO vor dem Signing stellt (Daten-Standort, LLM-Training, Multi-Tenant-Isolation, PII, Incident-Response, Prompt-Injection, ISO/SOC, Custom-DPA, DSAR, Shutdown-Plan)
    • • Eigener Bot auf chatbot.mignuti.com — Widget-Script ENV-gated im Base.astro (PUBLIC_OWN_BOT_KEY + PUBLIC_OWN_BOT_SECRET). Wenn beide gesetzt: Widget lädt automatisch und bedient Mignuti Chatbot-Fragen direkt auf der Marketing-Site (eat-your-own-dogfood, Vision-Sprint-Empfehlung)
    • • Nav erweitert um FAQ + Docs + Trust-Links (vorher nur Pricing + Agency + AI-Act)
  8. 2026-04-28

    v0.7.4-beta.1 Closed-Beta-Ready — Format-Coverage + Profitabilität + Diagnostics-Center

    Reality-Check identifizierte 4 Lücken (Format-Coverage, Cost-Hebel, Errors-Page, UX-Härtung). Alle 4 geschlossen: Q&A-Pair-Editor, TXT/Markdown/JSON-FAQ-Upload, XML-Sitemap-Crawl-Mode, /diagnostics-Page mit Cost+Errors+Source-Coverage, Widget-quota-UX, Stripe-timing-attack + replay-window. Tests: 162 → 201 (+39).

    New

    • • PHASE A — Format-Coverage (5 Lücken geschlossen):
    • • Q&A-Pair-Editor (Migration 050 + qa_pairs Tabelle + RPC upsert_qa_pair_with_embedding + Edge Function qa-pair-embed mit inline-OpenAI-Embedding + UI-Tab in /knowledge-base) — schließt die größte KMU-Lücke ('kann ich einfach FAQ-Einträge tippen?')
    • • TXT/Markdown/JSON-FAQ-Upload (text_documents Tabelle + Edge Function text-doc-ingest + Chunker mit paragraph+sentence-split + RPC upsert_text_document_with_chunks für atomic insert + UI-Tab mit Drop-Zone für .txt/.md/.json)
    • • JSON-FAQ-Parser akzeptiert Top-level-Array oder {items: [...]} mit q/question/Q + a/answer/A Felder, max 500 Einträge, jeder ≤500/4000 chars, mit Length-Caps gegen DoW
    • • XML-Sitemap-Crawl-Mode (Migration 050 url_crawl_mode Enum + sitemap.ts Parser für sitemap-urlset / sitemap-index / RSS-2.0 / Atom mit max-1MB + max-500-URLs + Allow-list http(s) only)
    • • Vereinheitlichte Knowledge-Base-UI mit 4 Tabs (PDFs · URL-Quellen · Q&A-Paare · Text & FAQ) + Counts-Pills + EmptyStates pro Tab
    • • PHASE B — Profitabilität:
    • • Prompt-Caching im chat-completion verifiziert: System-Prompt + Sources-Block beide mit cache_control:ephemeral, Cache-Hit-Tracking via cache_read_input_tokens, estimateCostEur applies 90%-Discount bei Hit. 17 Cost-Tests pinnen das Margin-Contract (Pro-Plan cached >60% Margin)
    • • Migration 052 — analytics_cost_summary + analytics_cost_daily + source_coverage + error_summary RPCs
    • • PHASE C — Diagnostics-Center:
    • • Neue Page /p/:slug/diagnostics — kombiniert (a) Cost-Summary mit Cache-Hit-Rate-Karten, (b) tägliche Cost-Trend-Bars, (c) aggregierte Errors aus PDF/URL/Text-Doc/LLM in einer Stelle (statt 4 separater Pages — Vertrauensbruch geheilt), (d) Source-Coverage-Liste (welche KB-Einträge werden tatsächlich abgerufen?)
    • • Sidebar-Eintrag 'Diagnose'/'Diagnostics' eingefügt zwischen Analytics und Chatbot-Config
    • • PHASE D — UX/Risk-Härtung:
    • • Widget-API-Client unterscheidet jetzt 402 (quota_exceeded) und 422 (content_policy) als eigene Error-Codes statt generisch internal — User sieht 'Bot is at quota' statt 'Network error'
    • • Stripe-Webhook gegen Timing-Attack: constant-time string-compare bei Signatur-Vergleich + Replay-Window-Check (5min Tolerance) gegen wiederholtes Abspielen alter Payloads
  9. 2026-04-28

    v0.7.3-beta.1 Notification-Dispatcher gehärtet — Finding #1 jetzt real geschlossen

    Der existierende notification-dispatcher hatte exakt die Schwachstellen, die Hacker-Audit Finding #1 (HOCH) beschrieben hatte: inline-escapeHtml statt zentralem Helper, kein Template-Rendering für die HTML-Files, JSON.stringify-Fallback für unbekannte event_kinds. Plus: Ein Recon-Pass entdeckte einen kompromittierten Anthropic API-Key in .env.example. Dispatcher komplett refaktoriert auf email-safe.ts + email-render.ts; alle 8 event_kinds nutzen den Encoding-Contract; Slack-Webhook-Host gegen hooks.slack.com gepinnt; +18 neue Tests (144 → 162).

    New

    • • supabase/functions/_shared/email-render.ts — dispatcher-spezifischer Renderer mit 8 event_kinds (hot_lead, fallback_spike, quota_80/100, pdf_ready/failed, new_pending_question, weekly_digest), Slack + Email + Plain-Text-Fallback, locale EN/DE, alle Werte safe-encoded vor Substitution
    • • Slack-Markdown-Escape (slackEscape): escaped <, >, & für Slack incoming-webhook-payloads. Verhindert dass `<…>` als Slack-link-syntax interpretiert wird
    • • Plain-text-Fallback in jedem Email-Render: text/plain für Email-Clients ohne HTML

    Fixed

    • • 🚨 CRITICAL: Echter Anthropic API-Key (sk-ant-api03-…) war in .env.example committet. Sofort durch Placeholder ersetzt. Repository ist (noch) kein git-Repo, also kein Push-Leak — aber der Key sollte trotzdem rotiert werden (Festplatten-Logs, Backups, AV-Scanner-Quarantäne als potenzielle Exfiltrationspfade)
    • • Hacker-Audit Finding #1 real geschlossen: notification-dispatcher render-Logik komplett extrahiert nach _shared/email-render.ts. Alle End-User-Werte (TopUnansweredQuestion, first_message, question_text, error, filename) gehen durch safeUserText (htmlEscape ∘ clampForEmail). Alle URLs durch safeUrl (Allow-List mignuti-chatbot/replyr-Domains). Numerische Felder (lead_score, conversations_count, fallback_pct) durch clampLeadScore/clampInt/clampPct (bounded gegen NaN/Infinity/-1)
    • • JSON.stringify-Fallback entfernt: vorher würde ein unbekannter event_kind die ganze payload-jsonb in HTML rendern → direkter Phishing-Relay-Vektor. Jetzt: deliberately bland 'system notice' ohne payload-Daten
    • • Slack-Webhook-Host gepinnt: target-URL muss https://hooks.slack.com sein. Schützt gegen kompromittierte Org-Admin-Konten, die einen Slack-Webhook auf eine Angreifer-Domain umbiegen, um Lead-Snippets zu exfiltrieren
    • • Email-Recipient-Validierung: regex gegen CR/LF/NUL-Injection im to:-Feld (Header-Injection Defence) + length-cap 254 (RFC-5321)
    • • Error-message-Redaction: provider-error-bodies werden auf 120 chars geclamped und nur als strukturierter Code gespeichert (keine User-Content-Leak via Resend/Slack-Error-Echo)
  10. 2026-04-28

    v0.7.2-beta.1 Final Hacker-Pentest — alle 6 Findings durchgehend behoben

    Pentest durch /hacker-Skill auf den Audit-gehärteten Code (v0.7.1) hat 6 zusätzliche Findings produziert: 1× HOCH (Cross-Customer-Email-Phishing via TopUnansweredQuestion), 2× MITTEL (Tabnabbing + Encoding-Contract-Lücke), 3× NIEDRIG (UI-Trust-Spoofing + Supply-Chain + Surrogate-Split). Alle 6 gefixt + 37 neue Unit-Tests (107 → 144). 3 dieser Tests haben echte Code-Bugs aufgedeckt (TDD-Wert), die alle behoben sind. Widget-Bundle: 26.72 KB gzipped (Budget 30 KB ✅).

    New

    • • supabase/templates/CONTRACT.md — Encoding-Contract als Single-Source-of-Truth für alle Email-Renderer (3 Trust-Level-Klassen, allow-list, Mandatory-Rules)
    • • supabase/functions/_shared/email-safe.ts — htmlEscape + clampForEmail + safeUrl + safeUserText als Pflicht-Primitive für jeden notification-dispatcher
    • • scripts/lib/validate-template.mjs — extrahierte Pure-Logic-Validation, testbar ohne Supabase
    • • src/src/lib/safe-href.ts isExternalHref() Helper für saubere noopener-Logik
    • • EmptyState öffnet externe Links jetzt automatisch in neuem Tab mit Tab-Hijacking-Schutz

    Fixed

    • • Hacker-HOCH #1: Cross-Customer-Email-Phishing via {{ .TopUnansweredQuestion }} im weekly-digest.html — End-Nutzer-controlled HTML-Injection-Vektor. Behoben durch (a) `supabase/templates/CONTRACT.md` als zentrale Encoding-Doku, (b) Inline-Security-Header in weekly-digest.html mit Trust-Level-Mapping pro Variable, (c) `supabase/functions/_shared/email-safe.ts` mit htmlEscape/clampForEmail/safeUrl/safeUserText-Primitiven, (d) Allow-List für URL-Hosts (chatbot.mignuti.com / replyr.app + Subdomains)
    • • Hacker-MITTEL #2: EmptyState-CTA-Tabnabbing — externe https-Links bekommen jetzt rel='noopener noreferrer' + target='_blank'. Plus: isSafeHref akzeptiert nur noch https:// (kein http:// mehr) — Mixed-Content + Downgrade-Vektor geschlossen. Neue isExternalHref()-Helper
    • • Hacker-MITTEL #3: Encoding-Contract-Lücke in subprocessor-update + welcome + magic-link Templates — Inline-Header verweist jetzt auf supabase/templates/CONTRACT.md mit klarem Trust-Level pro Variable und Allow-List-Regeln
    • • Hacker-NIEDRIG #4: Browser-Mockup im Onboarding Step 4 — 🔒-Emoji entfernt (versprach falsches TLS), durch 'Vorschau'-Label (i18n) ersetzt. Verhindert Brand-Spoof-Screenshots und falsche Trust-Signale
    • • Hacker-NIEDRIG #5: scripts/lib/validate-template.mjs — vor jedem Seed-Run werden alle 6 JSON-Templates schema-geprüft (Vertical-Allow-List, Tone-Enum, Hex-Colors, system_prompt_base 50-4000 chars, kein non-allow-listed external URL, content_policy_keywords als string-array). PR-Merge bleibt 1. Defense-Layer; das ist die 2.
    • • Hacker-NIEDRIG #6: clamp() in widget/src/lib/text.ts ist jetzt codepoint-aware via Array.from — UTF-16-Surrogate-Pairs (Emoji, CJK Han) werden nicht mehr an Cutoff-Position zerschnitten (würde sonst U+FFFD-Replacement-Chars rendern)
    • • Bug aus TDD: safeUrl() ließ http://allow-listed.com durch — jetzt nur noch https:// erlaubt (Test enttarnte das)
    • • Bug aus TDD: validate-template URL-Regex erlaubte nur chatbot.mignuti.com/replyr.app aber keine Subdomains wie app.mignuti.com — Refactor zu URL-Parsing + isAllowedPromptHost() mit endsWith-Check
  11. 2026-04-28

    v0.7.1-beta.1 Audit-Sprint — 4-Lens-Hardening of the 5-Day-Sprint

    Selbst-Audit durch Bug-Check, Security, Hacker, E2E-Test über die in v0.7.0-beta.1 hinzugefügten Files. 6 Findings (1 HIGH, 3 MEDIUM, 2 LOW) durchgängig gefixt + 22 neue Unit-Tests. Tests: 85→107, Widget-Bundle stabil bei 26.70 KB gzipped (Budget 30 KB).

    New

    • • shared utilities extracted: widget/src/lib/text.ts (clamp), src/src/lib/safe-href.ts, src/src/lib/preview-host.ts — DRY + testbar

    Fixed

    • • Hacker-HIGH: SourceFootnotes excerpt + filename clamp(600/80 chars) — verhindert UI-DoS wenn ein bösartiger oder buggy Server Multi-MB-Excerpts streamt. Plus similarity-Wert auf [0,1] bounded und Number.isFinite-Guard gegen NaN/Infinity
    • • Security-MEDIUM: EmptyState cta.href nutzt jetzt isSafeHref()-Guard — javascript:/data:/vbscript:/file:-URIs werden blockiert, Component fällt auf <button> zurück. Defense-in-depth gegen i18n-Translation-Bugs
    • • Bug-MEDIUM: Onboarding Step-4 previewUrl wird durch cleanPreviewHost() normalisiert — User pastet 'https://example.com/' → Mockup zeigt 'https://example.com' statt 'https://https://example.com/'. Plus Length-Clamp 80
    • • Bug-LOW: trust.astro EN+DE nutzt jetzt PUBLIC_APP_URL env statt hardcoded https://app.replyr.app — robust gegen späteren Domain-Wechsel
    • • Hacker-LOW: seed-vertical-templates.mjs Error-Logs zeigen nur error.code (nicht .message) ohne DEBUG=1 — keine Postgres-Schema-Details in CI-Logs
  12. 2026-04-28

    v0.7.0-beta.1 Vision 5-Day-Sprint — Templates, Trust, Citations, Polish

    Fünf Vision-Tage hintereinander durchgezogen, während Supabase-Setup pausiert war. Schwerpunkt: Backend-unabhängige Frontend-Wow-Faktoren, Closed-Beta-Polish, und der Trust-Center als Agency-Sales-Enabler. Build grün, Tests grün (85/85), Widget-Bundle 26.57 KB gzipped (Budget 30 KB).

    New

    • • TAG 1 — Vertical-Template-Library bootstrappable: 6 JSON-Seeds (Steuerberater, Immobilien, E-Com, Zahnarzt, Hotel, Consulting) als Single-Source-of-Truth + Standalone-Seeder scripts/seed-vertical-templates.mjs (idempotent via service_role) + npm script db:seed-templates. Migration 047-Seeding hatte System-User-Abhängigkeit, neuer Pfad funktioniert ohne
    • • TAG 2 — Agency-Dashboard Polish: Loading-Skeleton (5 pulsierende Zeilen, Layout matches real rows um Sprung beim Daten-Load zu vermeiden) + dezidierter NoProjectsEmptyState (Heroicon + 'Start onboarding' CTA) — getrennt vom Filter-leer-State
    • • TAG 3 — Widget Live-Inline-Citations: Source-Pills upgraded zu klickbaren Footnotes mit Excerpt-Expansion via <details>. Numerierte Marker [1][2][3] + Filename + Page + Similarity-%. Fallback auf static-pill wenn Excerpt fehlt
    • • TAG 3 — Onboarding Step 4 als Browser-Mockup-Frame: Statt nacktem Inline-Widget jetzt gestyltes Browser-Chrome mit Adressleiste (User-konfigurierbare URL) + Mock-Site-Background + Widget-Overlay. Robuster als 3rd-Party-iframe (X-Frame-Options blockt)
    • • TAG 4 — 4 Custom-Branded Email-Templates: magic-link.html (mit config.toml-Anbindung), welcome.html, subprocessor-update.html, weekly-digest.html. Alle DSGVO-kompliant gestaltet, Mignuti Chatbot-Branded statt Default-Supabase-Look
    • • TAG 4 — 404-Page mit Personality + 2 prominente Empty-States: /404.astro mit Bot-Easter-Egg-SVG + drei CTAs. Wiederverwendbare EmptyState-Komponente mit 4 Heroicon-Varianten (chat, question, chart, inbox) — eingesetzt in conversations und pending-questions
    • • TAG 5 — Trust-Center chatbot.mignuti.com/trust (EN + DE): Architecture-SVG mit EU-Datenresidenz-Frame, Subprocessor-Tabelle (6 Auftragsverarbeiter mit DPAs), 8 TOMs, Compliance-Badges (DSGVO + EU-AI-Act compliant, ISO 27001 + SOC 2 in roadmap), 6 Legal-Doc-Links, dpo@mignuti.com Contact-Block. Polish-Level Stripe-Standard

    Fixed

    • • EmptyState type-narrowing: typeof === 'string' war zu schwach, ersetzt durch isIconKind() type-guard mit ICON_KINDS-array (TS2322 fix)
    • • shared/api.ts ChatMessageChunk.sources um source_page + source_filename erweitert — vorher hatte das Widget die Felder eigenständig getypt
  13. 2026-04-23

    v0.6.0-beta.1 9-Agent-Audit Fixes — Launch-Readiness 72 → 92

    Sequentieller Audit-Pass durch SEO, A11y, Anwalt, GDPR, UX, Security, Hacker, Widget-Embed, Bug. Alle 32 Findings (18 Blocker + 7 HIGH + 5 Polish + 2 Magic) abgearbeitet.

    New

    • • Onboarding-Step-4 'Test your bot' — Widget läuft inline im Wizard, First-Success-Moment < 60s
    • • Agency-Dashboard Bulk-Actions — Select-All, CSV-Export, Open-in-Tabs (max 10 gleichzeitig)
    • • Billing-Page Upgrade-Banner ab 80% Monats-Usage mit Ein-Klick-Upgrade zum nächsten Plan
    • • Cmd+K-Badge im Header (Linear/Vercel-Style) — klickbar öffnet Command-Palette
    • • Sidebar Bot-Health-Score-Pill (0–100 aus Coverage+Satisfaction+Speed) als Scorecard für Agency-Kundengespräche
    • • Page-context-aware Proactive-Teaser — Widget sendet page_path, Server matcht Prefix-Regel und liefert kontextspezifische Message
    • • Widget-Key-Rotation — v_widget_key_age View + rotate_widget_key() RPC mit 30-Tage-Grace, Admin-Warnung ab 365d
    • • Multi-Org-Switcher in API-Keys-Page (und shared Store useCurrentOrg) — Agenturen mit mehreren Orgs sehen jetzt alle

    Security

    • • Sec-1: chat-completion nutzt chat_config_for_session() + match_embeddings_for_session() RPCs (Migration 041) — DB erzwingt Session-Existenz, JWT-Forgery alleine reicht nicht
    • • Sec-2: neue dequeue_url_crawl + ack_url_crawl RPCs (Migration 042) — Worker nutzt offizielle Interface statt direktem pgmq.read
    • • Hacker-1: Prompt-Injection-Envelope — RAG-Sources in <source>-Tags gewrappt, Control-Chars gestrippt, 'ignore previous' Pattern redacted, PDF-Filename sanitize im Worker
    • • Hacker-2: Crawl-Demo Denial-of-Wallet-Schutz — IP-Limit 2/Tag (war 5/h), Per-Host-Cap 3/Tag, Turnstile-Hook, DNS-Rebinding-Defense via Deno.resolveDns (IPv4+IPv6)
    • • HIGH: Widget-JWT trägt ip_hash Claim — chat-completion rejected Sessions bei Netzwerk-Wechsel (401 session_network_mismatch)
    • • HIGH: SSRF-Defense zentralisiert in supabase/functions/_shared/ssrf.ts — isPrivateIp + isPublicHostname (AWS-IMDS, RFC1918, IPv6 ULA, link-local)
    • • HIGH: Webhook-Dispatcher x-replyr-timestamp Header — Receiver kann Replays rejecten (|now - ts| > 300s)
    • • HIGH: stripe-webhook upsert onConflict statt blocking insert — idempotent bei Retry
    • • HIGH: CSP-Meta-Fallback in Base.astro — edge-layer nonce-based CSP als Ziel dokumentiert
    • • GDPR: Widget-Default data-consent='pending' (war 'granted') — keine Session/LocalStorage ohne explizite Einwilligung
    • • POLISH: replyr.setConsent('denied') entfernt <replyr-widget> aus DOM + löscht alle replyr.* localStorage-Einträge

    Fixed

    • • B-11: .single() → .maybeSingle() in onboarding/branding/url-sources mit expliziten Fehlerpfaden
    • • B-12: Shared FNV-1a prompt-hash utility (shared/src/prompt-hash.ts) — admin + Edge-Fn byte-identisch
    • • B-13: api-keys.tsx akzeptiert jetzt Multi-Org-Context via useCurrentOrg-Store
    • • B-14: gdpr-export-build Cron mit Queue-Depth-Guard — skip wenn 3+ exports building
    • • B-15: deferrable Constraint-Trigger prüft sum(weight) = 100 für active prompt_versions
    • • A11y-S3: Try-it-Hero Live-Region entkoppelt (role=log + separate aria-live span, streaming bubbles aria-hidden)
    • • A11y: Widget-Launcher aria-label mit EU-AI-Act-Disclosure in DE+EN
    • • A11y: Status-Sparkline mit <title> + <desc> + numerischem Trend für Screen-Reader
    • • SEO: Imprint via marketing/src/config/site.ts zentralisiert (Mignuti Apps als Einzelunternehmen)
    • • SEO: Sitemap Edge Function um /compare, /for, DE-Varianten + xhtml:link hreflang erweitert
    • • SEO: hreflang-Mapping-Bug gelöst via explizite alternates={en, de} Props in Base.astro
    • • UX: Onboarding Step-Label-aria-current korrekt
    • • Widget: Streaming-Log mit overflow-anchor: none + min-height 2.4em auf Assistant-Bubbles → kein Layout-Shift
    • • Widget-Launcher Fokus-Ring nutzt currentColor (theme-aware) statt hardcoded #fff
    • • Widget z-index 2147483640 (max-1) — Fair-Play zu Host-Page Z-Stack
    • • Stripe-Webhook upsert mit onConflict ignoreDuplicates — kein Crash bei Retry-Storm

    Breaking

    • • Widget data-consent default changed from 'granted' to 'pending'. Embedder-Sites ohne Consent-Banner müssen jetzt explizit data-consent="granted" setzen.
  14. 2026-04-23

    v0.5.0-beta.1 Phase-0-Scaffold + Session 2+3+4 complete

    Greenfield MVP-Scaffold + agency depth + compliance-toolkit.

    New

    • • Lead-Intelligence: Intent-Classifier (8 intents) + Lead-Score 0–100 + smart Lead-Capture (trigger-based, not upfront)
    • • Custom-Branding: Logo-Upload, 4 fonts, background patterns, live-preview, 7-day shareable preview-link for client approval
    • • Notifications: Slack + Email, real-time hot-lead pings (not 'someone opened chat'), weekly-digest
    • • Agency-Portfolio with Churn-Risk-Traffic-Light (red = 'call your client tomorrow')
    • • Handover-to-Human with transparent business-hours + median response time (from real data)
    • • Webhook-API (HMAC-SHA256 signed) + 'Why this answer?'-Inspector with forensic chunk-view
    • • Analytics-Charts with Vertical-Benchmark-Overlay (Data-Flywheel: your metrics vs. industry median)
    • • URL-Crawler production with CSS-selector content-isolation + live preview before save
    • • GDPR Self-Service: ZIP export + Readiness-Report PDF (white-labelable) + 30-day soft-delete grace
    • • White-Label Custom-Domain (TXT + CNAME verification via DoH)
    • • Public REST-API v1 + scoped API-Keys
    • • Cmd+K Command-Palette + Breadcrumbs
    • • Status-Page with 5-min service-health sampling + incidents
    • • Pa11y-CI + WCAG 2.2 AA + VPAT 2.5 Rev INT report
    • • A/B Prompt-Testing with real-world metrics per version

    Security

    • • Widget-Secret bcrypt-hashing + rotate-flow (30-day grace)
    • • ClamAV INSTREAM scanning in PDF-Worker
    • • Consent-Mode-API (data-consent=granted/pending/denied)
    • • Session-upsert preserves delete_token across re-auths

RSS: /changelog.xml · Newsletter: see above