[{"data":1,"prerenderedAt":2253},["ShallowReactive",2],{"search-de":3,"content-de-developer\u002Farchitecture":4,"surround-de-\u002Fdeveloper\u002Farchitecture":2244},[],{"id":5,"title":6,"body":7,"description":13,"extension":2238,"meta":2239,"navigation":549,"path":2240,"seo":2241,"stem":2242,"__hash__":2243},"content_de\u002F3.developer\u002F2.architecture.md","Architekturüberblick",{"type":8,"value":9,"toc":2202},"minimark",[10,14,19,22,26,31,176,180,422,426,441,493,497,501,504,656,660,664,668,671,675,678,822,826,829,833,836,844,848,859,863,887,891,962,966,1056,1060,1112,1116,1241,1248,1455,1464,1468,1475,1481,1862,1871,1893,1897,1901,1917,1921,1929,1940,1944,1994,1998,2009,2012,2077,2081,2084,2174,2192,2198],[11,12,13],"p",{},"Owlat folgt einer modernen Serverless-Architektur mit Echtzeitfähigkeiten.",[15,16,18],"h2",{"id":17},"systemarchitektur","Systemarchitektur",[20,21],"arch-system",{},[15,23,25],{"id":24},"monorepo-struktur","Monorepo-Struktur",[27,28,30],"h3",{"id":29},"apps","Apps",[32,33,34,47],"table",{},[35,36,37],"thead",{},[38,39,40,44],"tr",{},[41,42,43],"th",{},"App",[41,45,46],{},"Beschreibung",[48,49,50,62,72,82,92,102,112,129,142,152,166],"tbody",{},[38,51,52,59],{},[53,54,55],"td",{},[56,57,58],"code",{},"apps\u002Fweb",[53,60,61],{},"Haupt-Webanwendung (Nuxt 4 + Vue 3)",[38,63,64,69],{},[53,65,66],{},[56,67,68],{},"apps\u002Fapi",[53,70,71],{},"Backend (Convex — Serverless-Funktionen, Datenbank, Auth)",[38,73,74,79],{},[53,75,76],{},[56,77,78],{},"apps\u002Fdocs",[53,80,81],{},"Entwicklerdokumentation (Nuxt Content)",[38,83,84,89],{},[53,85,86],{},[56,87,88],{},"apps\u002Fmarketing",[53,90,91],{},"Marketing- \u002F Landingpage-Website (Nuxt)",[38,93,94,99],{},[53,95,96],{},[56,97,98],{},"apps\u002Fmta",[53,100,101],{},"Ausgehender Mail Transfer Agent (Hono + GroupMQ + direktes SMTP, Endpunkt für Anhangs-Scans)",[38,103,104,109],{},[53,105,106],{},[56,107,108],{},"apps\u002Fimap",[53,110,111],{},"IMAP4rev1-Server für die Postbox-Funktion (Port 993, implizites TLS — RFC 8314, kein STARTTLS), gestützt auf Convex",[38,113,114,119],{},[53,115,116],{},[56,117,118],{},"apps\u002Fmail-sync",[53,120,121,122,125,126],{},"Worker, der sich nach außen mit den externen IMAP-\u002FSMTP-Konten der Benutzer verbindet: synchronisiert eingehende Mail nahezu in Echtzeit (IMAP IDLE) und leitet ausgehende Sendungen weiter. Trägt die Tabellen ",[56,123,124],{},"externalMailAccounts"," \u002F ",[56,127,128],{},"externalMailFolderSync",[38,130,131,136],{},[53,132,133],{},[56,134,135],{},"apps\u002Fsetup-cli",[53,137,138,141],{},[56,139,140],{},"owlat-setup"," — Assistent, Verwaltung von Features\u002FPacks\u002FEnv, Doctor-Prüfungen",[38,143,144,149],{},[53,145,146],{},[56,147,148],{},"apps\u002Fupdater",[53,150,151],{},"In-Place-Update-Sidecar, der Compose-Dateien neu schreibt und den Stack erneut deployt",[38,153,154,159],{},[53,155,156],{},[56,157,158],{},"apps\u002Fcode-worker",[53,160,161,162,165],{},"Hintergrund-Worker, der die Queue ",[56,163,164],{},"codeWorkTasks"," abfragt und den OpenCode-Agenten gegen jede eingereihte Aufgabe ausführt (nur manuelle Aufgabenerstellung — die automatische Erstellung aus eingehender Mail ist nicht verdrahtet)",[38,167,168,173],{},[53,169,170],{},[56,171,172],{},"apps\u002Fdesktop",[53,174,175],{},"Tauri-Desktop-Client (Multi-Workspace, Auth über den OS-Keychain, native Benachrichtigungen, Ungelesen-Badge in Dock\u002FTaskleiste, Deep Links). Auto-Update ist nicht produktionsreif; die Distribution stellt der Betreiber bereit",[27,177,179],{"id":178},"packages","Packages",[32,181,182,191],{},[35,183,184],{},[38,185,186,189],{},[41,187,188],{},"Package",[41,190,46],{},[48,192,193,207,217,227,237,247,257,282,292,302,312,322,332,342,352,362,372,388,398,408],{},[38,194,195,200],{},[53,196,197],{},[56,198,199],{},"packages\u002Fshared",[53,201,202,203],{},"Gemeinsame Typen (Block-Typen, Editor-Typen, Kompatibilitätsdaten) ",[204,205,206],"strong",{},"und die Feature-Flag-Registry",[38,208,209,214],{},[53,210,211],{},[56,212,213],{},"packages\u002Fmta-protocol",[53,215,216],{},"Der Wire-Contract zwischen Convex und MTA — Sendeannahme, Routing-Entscheidungen, der IP-Reputations-Snapshot und die Webhook-Events, jeweils einmal deklariert und von beiden Apps importiert",[38,218,219,224],{},[53,220,221],{},[56,222,223],{},"packages\u002Femail-builder",[53,225,226],{},"Vue-Komponenten des E-Mail-Builders (Notion-artiger Editor)",[38,228,229,234],{},[53,230,231],{},[56,232,233],{},"packages\u002Femail-renderer",[53,235,236],{},"Rendering-Engine für E-Mail-HTML (tabellenbasiert, VML, CSS-Inlining)",[38,238,239,244],{},[53,240,241],{},[56,242,243],{},"packages\u002Femail-scanner",[53,245,246],{},"Security-Scanning für E-Mails (Inhaltsanalyse, Dateivalidierung, URL-Reputation, ClamAV-Client)",[38,248,249,254],{},[53,250,251],{},[56,252,253],{},"packages\u002Femail-previewer",[53,255,256],{},"Vorschaukomponenten für E-Mail-Clients (Kompatibilitätsanalyse, Can-I-Email-Daten)",[38,258,259,264],{},[53,260,261],{},[56,262,263],{},"packages\u002Fchannels",[53,265,266,267,270,271,274,275,278,279],{},"Normalisierung eingehender Mail — eine quellenbasierte Registry (",[56,268,269],{},"mta",", ",[56,272,273],{},"resend",", …), die den eingehenden Webhook-Envelope eines Anbieters in eine kanonische ",[56,276,277],{},"InboundEmailMessage"," überführt. Ausgehende Channel-Provider liegen nicht hier: Sie wohnen bei ihrem einzigen Aufrufer unter ",[56,280,281],{},"apps\u002Fapi\u002Fconvex\u002Fchannels\u002Fadapters\u002F",[38,283,284,289],{},[53,285,286],{},[56,287,288],{},"packages\u002Fmail-message",[53,290,291],{},"Hauseigene RFC-5322-\u002FMIME-Nachrichtenbibliothek, zwei Hälften hinter einem Einstiegspunkt: der Parser (Header-Engine, Part-Baum, Charset-Dekodierung, Anhänge) und der Composer (reine RFC-5322-\u002FRFC-2045-Konstruktion). Ersetzt mailparser eingehend und den MIME-Builder von nodemailer ausgehend",[38,293,294,299],{},[53,295,296],{},[56,297,298],{},"packages\u002Fmail-auth",[53,300,301],{},"Hauseigene E-Mail-Authentifizierung — SPF (RFC 7208), DMARC (RFC 7489), DKIM-Verifikation (RFC 6376) sowie ein gecachter, injizierbarer DNS-Resolver",[38,303,304,309],{},[53,305,306],{},[56,307,308],{},"packages\u002Fmail-canon",[53,310,311],{},"Der eine DKIM-Kanonisierer (RFC 6376 §3.4). Ein abhängigkeitsfreies Blatt, damit der eingehende Verifizierer und der ausgehende Signierer ihn ohne Build-Zyklus teilen können",[38,313,314,319],{},[53,315,316],{},[56,317,318],{},"packages\u002Fsmtp-client",[53,320,321],{},"Hauseigener SMTP-Client — die Wire-Rolle, die früher nodemailer innehatte. Reply-Parsing, ESMTP-Aushandlung, TLS und die Sendetransaktion",[38,323,324,329],{},[53,325,326],{},[56,327,328],{},"packages\u002Fsmtp-listener",[53,330,331],{},"Hauseigener SMTP-Listener — Kommandoschleife auf rohem Netz, Byte-Budget und Timeouts, hinter dem Port-25-MX- und dem Submission-Pfad. Ersetzt smtp-server",[38,333,334,339],{},[53,335,336],{},[56,337,338],{},"packages\u002Fprovider-kit",[53,340,341],{},"Runtime-neutrales universelles Send-Provider-Bundle, Trust- und Host-Verifier-Contracts, die Core- und Plugin-Provider gemeinsam nutzen",[38,343,344,349],{},[53,345,346],{},[56,347,348],{},"packages\u002Fplugin-kit",[53,350,351],{},"Öffentliche Contracts zum Bau von Owlat-Plugins: das Manifest, Contribution-Buckets, Capabilities und die Modulformen pro Seam",[38,353,354,359],{},[53,355,356],{},[56,357,358],{},"packages\u002Fplugin-codegen",[53,360,361],{},"Validierte Komposition zur Build-Zeit — prüft Package-Identität, Lockfile-Integrität und Realpath-Containment und gibt anschließend die generierten Kataloge und Registries aus",[38,363,364,369],{},[53,365,366],{},[56,367,368],{},"packages\u002Fplugin-host",[53,370,371],{},"Runtime-neutraler Durchsetzungskern für statisch komponierte Plugins: Flag-, Grant-, Umgebungs- und Scope-Autorisierung vor jedem Aufruf",[38,373,374,379],{},[53,375,376],{},[56,377,378],{},"packages\u002Fplugin-cli",[53,380,381,384,385],{},[56,382,383],{},"owlat plugins"," — create\u002Fadd\u002Fremove\u002Fdev\u002Fcodegen über die eingecheckte ",[56,386,387],{},"plugins.config.ts",[38,389,390,395],{},[53,391,392],{},[56,393,394],{},"packages\u002Fui",[53,396,397],{},"Nuxt-Layer, der gemeinsame UI-Komponenten und Composables bereitstellt",[38,399,400,405],{},[53,401,402],{},[56,403,404],{},"packages\u002Fsdk-js",[53,406,407],{},"JavaScript-SDK für die Owlat-API",[38,409,410,415],{},[53,411,412],{},[56,413,414],{},"packages\u002Fsdk-java",[53,416,417,418,421],{},"Java-SDK für die Owlat-API (kein Workspace-Mitglied — keine ",[56,419,420],{},"package.json",", mit Maven gebaut)",[27,423,425],{"id":424},"beispiele","Beispiele",[11,427,428,429,432,433,436,437,440],{},"Ebenfalls Workspace-Mitglieder (",[56,430,431],{},"examples\u002Fconformance"," und ",[56,434,435],{},"examples\u002Fplugins\u002F*",") und\nkeine Dekoration: Die Referenz-Plugins gibt es eines pro Trust-Stufe, und die\nConformance-Galerie treibt sie durch den ",[204,438,439],{},"ausgelieferten"," Host, Codegen und die CLI —\nso werden die Erweiterungspunkte der Plugin-Plattform durch etwas belegt, das\nweiterhin kompilieren muss.",[32,442,443,452],{},[35,444,445],{},[38,446,447,450],{},[41,448,449],{},"Beispiel",[41,451,46],{},[48,453,454,463,473,483],{},[38,455,456,460],{},[53,457,458],{},[56,459,431],{},[53,461,462],{},"Die Conformance-Galerie der Plugin-Plattform: Lifecycle- und Full-Pipeline-Replay-Suites, die die drei Referenz-Plugins durch den echten Host, Codegen und die CLI treiben, plus der Paritätsnachweis für Plugin-Provider — ein Fixture-ESP-Bundle, das durch die ausgelieferten Module für Routing, Dispatch, Messung, Return-Path und Credential-Formulare geführt wird",[38,464,465,470],{},[53,466,467],{},[56,468,469],{},"examples\u002Fplugins\u002Fescalation-guard",[53,471,472],{},"Referenz-Plugin der Stufe 1: ein In-Process-Eskalationswächter, der einen Agent-Step, eine Draft-Strategie, einen Automations-Trigger\u002F-Step\u002F-Condition, ein Webhook-Event und gebündelte UI-Einträge beisteuert",[38,474,475,480],{},[53,476,477],{},[56,478,479],{},"examples\u002Fplugins\u002Fslack-approvals",[53,481,482],{},"Referenz-Connected-App der Stufe 2: ein reines Restrict-Hold-Gate für Slack-Freigaben über das signierte synchrone Hook-Protokoll",[38,484,485,490],{},[53,486,487],{},[56,488,489],{},"examples\u002Fplugins\u002Fdeliverability-lab",[53,491,492],{},"Protokollreferenz der Stufe 3: Live-Pre-Send-Prüfungen hinter einem reinen Restrict-Gate plus ein Fixture für Seed-List-Worker-Requests; ein Host-Enqueue-Adapter wird nicht ausgeliefert",[15,494,496],{"id":495},"datenfluss","Datenfluss",[27,498,500],{"id":499},"echtzeit-updates","Echtzeit-Updates",[11,502,503],{},"Convex liefert automatische Echtzeit-Updates:",[505,506,511],"pre",{"className":507,"code":508,"language":509,"meta":510,"style":510},"language-typescript shiki shiki-themes github-light github-dark-dimmed","\u002F\u002F Frontend - automatically re-renders when data changes\nconst contacts = useConvexQuery(api.contacts.contacts.list, {});\n\n\u002F\u002F Backend - changes automatically push to subscribed clients\nexport const create = mutation({\n    handler: async (ctx, args) => {\n        await ctx.db.insert('contacts', { ...args });\n        \u002F\u002F Clients subscribed to list queries automatically update\n    },\n});\n","typescript","",[56,512,513,522,544,551,557,577,610,638,644,650],{"__ignoreMap":510},[514,515,518],"span",{"class":516,"line":517},"line",1,[514,519,521],{"class":520},"sDN9O","\u002F\u002F Frontend - automatically re-renders when data changes\n",[514,523,525,529,533,536,540],{"class":516,"line":524},2,[514,526,528],{"class":527},"s7YZ4","const",[514,530,532],{"class":531},"sviXB"," contacts",[514,534,535],{"class":527}," =",[514,537,539],{"class":538},"sPO5f"," useConvexQuery",[514,541,543],{"class":542},"sYgZi","(api.contacts.contacts.list, {});\n",[514,545,547],{"class":516,"line":546},3,[514,548,550],{"emptyLinePlaceholder":549},true,"\n",[514,552,554],{"class":516,"line":553},4,[514,555,556],{"class":520},"\u002F\u002F Backend - changes automatically push to subscribed clients\n",[514,558,560,563,566,569,571,574],{"class":516,"line":559},5,[514,561,562],{"class":527},"export",[514,564,565],{"class":527}," const",[514,567,568],{"class":531}," create",[514,570,535],{"class":527},[514,572,573],{"class":538}," mutation",[514,575,576],{"class":542},"({\n",[514,578,580,583,586,589,592,596,598,601,604,607],{"class":516,"line":579},6,[514,581,582],{"class":538},"    handler",[514,584,585],{"class":542},": ",[514,587,588],{"class":527},"async",[514,590,591],{"class":542}," (",[514,593,595],{"class":594},"stnAF","ctx",[514,597,270],{"class":542},[514,599,600],{"class":594},"args",[514,602,603],{"class":542},") ",[514,605,606],{"class":527},"=>",[514,608,609],{"class":542}," {\n",[514,611,613,616,619,622,625,629,632,635],{"class":516,"line":612},7,[514,614,615],{"class":527},"        await",[514,617,618],{"class":542}," ctx.db.",[514,620,621],{"class":538},"insert",[514,623,624],{"class":542},"(",[514,626,628],{"class":627},"s-HuK","'contacts'",[514,630,631],{"class":542},", { ",[514,633,634],{"class":527},"...",[514,636,637],{"class":542},"args });\n",[514,639,641],{"class":516,"line":640},8,[514,642,643],{"class":520},"        \u002F\u002F Clients subscribed to list queries automatically update\n",[514,645,647],{"class":516,"line":646},9,[514,648,649],{"class":542},"    },\n",[514,651,653],{"class":516,"line":652},10,[514,654,655],{"class":542},"});\n",[27,657,659],{"id":658},"authentifizierungsablauf","Authentifizierungsablauf",[661,662],"arch-flow",{":steps":663},"[{\"label\":\"Benutzeranmeldung\",\"detail\":\"Zugangsdaten übermittelt\",\"type\":\"action\"},{\"label\":\"BetterAuth\",\"detail\":\"Authentifizierungs-Provider\",\"type\":\"gate\"},{\"label\":\"Session erstellt\",\"detail\":\"JWT-Token ausgestellt\",\"type\":\"result\"},{\"label\":\"Organisation gesetzt\",\"detail\":\"activeOrganizationId in der Session gespeichert\",\"type\":\"result\"},{\"label\":\"Backend-Queries extrahieren organizationId aus der Session\",\"type\":\"action\"},{\"label\":\"Daten werden automatisch auf die Organisation eingegrenzt\",\"type\":\"final\"}]",[27,665,667],{"id":666},"ablauf-des-e-mail-versands","Ablauf des E-Mail-Versands",[661,669],{":steps":670},"[{\"label\":\"Template erstellt\",\"detail\":\"JSON-Blöcke → @owlat\u002Femail-renderer → HTML\",\"type\":\"action\"},{\"label\":\"Domain hinzugefügt\",\"detail\":\"SES-Registrierung → DNS-Records generiert → Benutzer konfiguriert DNS\",\"type\":\"gate\"},{\"label\":\"Kampagne erstellt\",\"detail\":\"Zielgruppe ausgewählt → Domain verifiziert (DNS + SES)\",\"type\":\"action\"},{\"label\":\"Owlat MTA (Standard)\",\"detail\":\"Direktes SMTP · Intelligence-Pipeline · IP-Warming\",\"type\":\"result\"},{\"label\":\"Webhooks → Status-Updates → Analytics\",\"type\":\"final\"}]",[15,672,674],{"id":673},"mandantenfähigkeit","Mandantenfähigkeit",[11,676,677],{},"Innerhalb einer Owlat-Instanz grenzt das Convex-Backend alle Daten über BetterAuth auf Organisationen ein:",[505,679,681],{"className":507,"code":680,"language":509,"meta":510,"style":510},"\u002F\u002F Schema pattern - every table has organizationId\ncontacts: defineTable({\n    organizationId: v.string(),\n    \u002F\u002F ... other fields\n}).index('by_org', ['organizationId']);\n\n\u002F\u002F Query pattern - always filter by organization\nconst contacts = await ctx.db\n    .query('contacts')\n    .withIndex('by_org', (q) => q.eq('organizationId', organizationId))\n    .collect();\n",[56,682,683,688,701,712,717,739,743,748,762,777,811],{"__ignoreMap":510},[514,684,685],{"class":516,"line":517},[514,686,687],{"class":520},"\u002F\u002F Schema pattern - every table has organizationId\n",[514,689,690,694,696,699],{"class":516,"line":524},[514,691,693],{"class":692},"sOLd2","contacts",[514,695,585],{"class":542},[514,697,698],{"class":538},"defineTable",[514,700,576],{"class":542},[514,702,703,706,709],{"class":516,"line":546},[514,704,705],{"class":542},"    organizationId: v.",[514,707,708],{"class":538},"string",[514,710,711],{"class":542},"(),\n",[514,713,714],{"class":516,"line":553},[514,715,716],{"class":520},"    \u002F\u002F ... other fields\n",[514,718,719,722,725,727,730,733,736],{"class":516,"line":559},[514,720,721],{"class":542},"}).",[514,723,724],{"class":538},"index",[514,726,624],{"class":542},[514,728,729],{"class":627},"'by_org'",[514,731,732],{"class":542},", [",[514,734,735],{"class":627},"'organizationId'",[514,737,738],{"class":542},"]);\n",[514,740,741],{"class":516,"line":579},[514,742,550],{"emptyLinePlaceholder":549},[514,744,745],{"class":516,"line":612},[514,746,747],{"class":520},"\u002F\u002F Query pattern - always filter by organization\n",[514,749,750,752,754,756,759],{"class":516,"line":640},[514,751,528],{"class":527},[514,753,532],{"class":531},[514,755,535],{"class":527},[514,757,758],{"class":527}," await",[514,760,761],{"class":542}," ctx.db\n",[514,763,764,767,770,772,774],{"class":516,"line":646},[514,765,766],{"class":542},"    .",[514,768,769],{"class":538},"query",[514,771,624],{"class":542},[514,773,628],{"class":627},[514,775,776],{"class":542},")\n",[514,778,779,781,784,786,788,791,794,796,798,801,804,806,808],{"class":516,"line":652},[514,780,766],{"class":542},[514,782,783],{"class":538},"withIndex",[514,785,624],{"class":542},[514,787,729],{"class":627},[514,789,790],{"class":542},", (",[514,792,793],{"class":594},"q",[514,795,603],{"class":542},[514,797,606],{"class":527},[514,799,800],{"class":542}," q.",[514,802,803],{"class":538},"eq",[514,805,624],{"class":542},[514,807,735],{"class":627},[514,809,810],{"class":542},", organizationId))\n",[514,812,814,816,819],{"class":516,"line":813},11,[514,815,766],{"class":542},[514,817,818],{"class":538},"collect",[514,820,821],{"class":542},"();\n",[15,823,825],{"id":824},"authentifizierungsarchitektur","Authentifizierungsarchitektur",[827,828],"arch-auth",{},[15,830,832],{"id":831},"architektur-des-e-mail-systems","Architektur des E-Mail-Systems",[834,835],"arch-email",{},[837,838,841],"callout",{"title":839,"type":840},"Domain-Verwaltung","info",[11,842,843],{},"Die Domain-Verwaltung (Registrierung, DNS-Verifikation, Einrichtung der SES-Identität) erfolgt über die Dashboard-Oberfläche. Es gibt keine öffentliche API für die Domain-Verwaltung.",[15,845,847],{"id":846},"überblick-über-das-datenbankschema","Überblick über das Datenbankschema",[11,849,850,851,854,855,858],{},"Das Convex-Schema (~97 Tabellen, aufgeteilt in Module pro Domäne unter ",[56,852,853],{},"apps\u002Fapi\u002Fconvex\u002Fschema\u002F"," und in ",[56,856,857],{},"defineSchema()"," hineingespreizt) folgt diesen Mustern:",[27,860,862],{"id":861},"kerntabellen","Kerntabellen",[32,864,865,875],{},[35,866,867],{},[38,868,869,872],{},[41,870,871],{},"Tabelle",[41,873,874],{},"Zweck",[48,876,877],{},[38,878,879,884],{},[53,880,881],{},[56,882,883],{},"userProfiles",[53,885,886],{},"Benutzerprofildaten, verknüpft mit BetterAuth",[27,888,890],{"id":889},"kontaktverwaltung","Kontaktverwaltung",[32,892,893,901],{},[35,894,895],{},[38,896,897,899],{},[41,898,871],{},[41,900,874],{},[48,902,903,912,922,932,942,952],{},[38,904,905,909],{},[53,906,907],{},[56,908,693],{},[53,910,911],{},"E-Mail-Kontakte",[38,913,914,919],{},[53,915,916],{},[56,917,918],{},"contactProperties",[53,920,921],{},"Definitionen benutzerdefinierter Felder",[38,923,924,929],{},[53,925,926],{},[56,927,928],{},"contactPropertyValues",[53,930,931],{},"Werte benutzerdefinierter Felder pro Kontakt",[38,933,934,939],{},[53,935,936],{},[56,937,938],{},"topics",[53,940,941],{},"Kontaktgruppierungen",[38,943,944,949],{},[53,945,946],{},[56,947,948],{},"contactTopics",[53,950,951],{},"Many-to-many mit DOI-Status",[38,953,954,959],{},[53,955,956],{},[56,957,958],{},"segments",[53,960,961],{},"Gespeicherte Filterkonfigurationen",[27,963,965],{"id":964},"e-mail-system","E-Mail-System",[32,967,968,976],{},[35,969,970],{},[38,971,972,974],{},[41,973,871],{},[41,975,874],{},[48,977,978,988,998,1026,1036,1046],{},[38,979,980,985],{},[53,981,982],{},[56,983,984],{},"emailTemplates",[53,986,987],{},"Marketing-\u002FTransaktions-Templates",[38,989,990,995],{},[53,991,992],{},[56,993,994],{},"emailBlocks",[53,996,997],{},"Wiederverwendbare Inhaltsblöcke",[38,999,1000,1005],{},[53,1001,1002],{},[56,1003,1004],{},"campaigns",[53,1006,1007,1008,270,1011,1014,1015,1018,1019,270,1022,1025],{},"Einmalige E-Mail-Sendungen (enthält ",[56,1009,1010],{},"archiveToken",[56,1012,1013],{},"archiveHtmlContent"," sowie die ",[56,1016,1017],{},"stats*","-Familie — z. B. ",[56,1020,1021],{},"statsHardBounced",[56,1023,1024],{},"statsSoftBounced",")",[38,1027,1028,1033],{},[53,1029,1030],{},[56,1031,1032],{},"emailSends",[53,1034,1035],{},"Tracking pro Empfänger",[38,1037,1038,1043],{},[53,1039,1040],{},[56,1041,1042],{},"transactionalEmails",[53,1044,1045],{},"Über die API ausgelöste Templates",[38,1047,1048,1053],{},[53,1049,1050],{},[56,1051,1052],{},"transactionalSends",[53,1054,1055],{},"Zustell-Tracking für Transaktionsmails",[27,1057,1059],{"id":1058},"automatisierungen","Automatisierungen",[32,1061,1062,1070],{},[35,1063,1064],{},[38,1065,1066,1068],{},[41,1067,871],{},[41,1069,874],{},[48,1071,1072,1082,1092,1102],{},[38,1073,1074,1079],{},[53,1075,1076],{},[56,1077,1078],{},"automations",[53,1080,1081],{},"Workflow-Definitionen",[38,1083,1084,1089],{},[53,1085,1086],{},[56,1087,1088],{},"automationSteps",[53,1090,1091],{},"Schritte innerhalb von Workflows",[38,1093,1094,1099],{},[53,1095,1096],{},[56,1097,1098],{},"automationRuns",[53,1100,1101],{},"Fortschritt eines Kontakts durch Workflows",[38,1103,1104,1109],{},[53,1105,1106],{},[56,1107,1108],{},"automationStepRuns",[53,1110,1111],{},"Ausführung einzelner Schritte",[27,1113,1115],{"id":1114},"einstellungen-sicherheit","Einstellungen & Sicherheit",[32,1117,1118,1126],{},[35,1119,1120],{},[38,1121,1122,1124],{},[41,1123,871],{},[41,1125,874],{},[48,1127,1128,1138,1148,1158,1168,1178,1188,1198,1208,1218,1228],{},[38,1129,1130,1135],{},[53,1131,1132],{},[56,1133,1134],{},"domains",[53,1136,1137],{},"Eigene Versanddomains",[38,1139,1140,1145],{},[53,1141,1142],{},[56,1143,1144],{},"apiKeys",[53,1146,1147],{},"API-Authentifizierung",[38,1149,1150,1155],{},[53,1151,1152],{},[56,1153,1154],{},"webhooks",[53,1156,1157],{},"Ereignisbenachrichtigungen",[38,1159,1160,1165],{},[53,1161,1162],{},[56,1163,1164],{},"webhookDeliveryLogs",[53,1166,1167],{},"Zustell-Tracking",[38,1169,1170,1175],{},[53,1171,1172],{},[56,1173,1174],{},"blockedEmails",[53,1176,1177],{},"Blockliste für Bounces\u002FBeschwerden",[38,1179,1180,1185],{},[53,1181,1182],{},[56,1183,1184],{},"auditLogs",[53,1186,1187],{},"Aktionshistorie",[38,1189,1190,1195],{},[53,1191,1192],{},[56,1193,1194],{},"formEndpoints",[53,1196,1197],{},"Konfiguration öffentlicher Formulare",[38,1199,1200,1205],{},[53,1201,1202],{},[56,1203,1204],{},"formSubmissions",[53,1206,1207],{},"Datensätze eingereichter Formulare",[38,1209,1210,1215],{},[53,1211,1212],{},[56,1213,1214],{},"mediaAssets",[53,1216,1217],{},"Dateien der Medienbibliothek",[38,1219,1220,1225],{},[53,1221,1222],{},[56,1223,1224],{},"contactActivities",[53,1226,1227],{},"Tracking der Kontaktaktivität",[38,1229,1230,1235],{},[53,1231,1232],{},[56,1233,1234],{},"instanceSettings",[53,1236,1237,1238],{},"Schalter pro Deployment inkl. ",[56,1239,1240],{},"featureFlags",[27,1242,1244,1245,1025],{"id":1243},"postbox-persönliche-mail-flag-postbox","Postbox (persönliche Mail · Flag: ",[56,1246,1247],{},"postbox",[32,1249,1250,1258],{},[35,1251,1252],{},[38,1253,1254,1256],{},[41,1255,871],{},[41,1257,874],{},[48,1259,1260,1274,1285,1294,1304,1314,1331,1341,1355,1365,1375,1385,1395,1405,1415,1425,1435,1445],{},[38,1261,1262,1267],{},[53,1263,1264],{},[56,1265,1266],{},"mailboxes",[53,1268,1269,1270,1273],{},"Postfach pro Benutzer, gehostet oder ",[56,1271,1272],{},"external"," (ein BetterAuth-Benutzer kann viele besitzen)",[38,1275,1276,1280],{},[53,1277,1278],{},[56,1279,124],{},[53,1281,1282,1283],{},"Zugangsdaten externer IMAP-\u002FSMTP-Konten + Sync-Konfiguration, synchronisiert von ",[56,1284,118],{},[38,1286,1287,1291],{},[53,1288,1289],{},[56,1290,128],{},[53,1292,1293],{},"Sync-Cursor pro Ordner für externe Konten",[38,1295,1296,1301],{},[53,1297,1298],{},[56,1299,1300],{},"mailThreads",[53,1302,1303],{},"Konversationsgruppierung über Ordner hinweg",[38,1305,1306,1311],{},[53,1307,1308],{},[56,1309,1310],{},"mailFolders",[53,1312,1313],{},"Systemordner (INBOX\u002FSent\u002FDrafts\u002FTrash\u002FSpam\u002FArchive) + Benutzerordner",[38,1315,1316,1321],{},[53,1317,1318],{},[56,1319,1320],{},"mailMessages",[53,1322,1323,1324,1327,1328,1025],{},"Eingehende\u002Fgesendete Nachrichten mit Envelope + Body-Parts (Snooze über das Feld ",[56,1325,1326],{},"snoozedUntil","; ausgehender Zustand im Objekt ",[56,1329,1330],{},"outbound",[38,1332,1333,1338],{},[53,1334,1335],{},[56,1336,1337],{},"mailLabels",[53,1339,1340],{},"Benutzererstellte Labels (zusätzlich zu den Systemordnern)",[38,1342,1343,1348],{},[53,1344,1345],{},[56,1346,1347],{},"mailDrafts",[53,1349,1350,1351,1354],{},"Entwürfe im Editor (zugleich die Ausgangs-Queue — ",[56,1352,1353],{},"mail\u002FoutboundCron"," versendet geplante\u002Fausstehende Entwürfe)",[38,1356,1357,1362],{},[53,1358,1359],{},[56,1360,1361],{},"mailAliases",[53,1363,1364],{},"Adressaliase, die in ein Postfach routen",[38,1366,1367,1372],{},[53,1368,1369],{},[56,1370,1371],{},"mailForwarding",[53,1373,1374],{},"Weiterleitungsregeln",[38,1376,1377,1382],{},[53,1378,1379],{},[56,1380,1381],{},"mailFilters",[53,1383,1384],{},"Sieve-artige Regeln (Treffer → Aktionen)",[38,1386,1387,1392],{},[53,1388,1389],{},[56,1390,1391],{},"mailSignatures",[53,1393,1394],{},"Signaturen pro Postfach",[38,1396,1397,1402],{},[53,1398,1399],{},[56,1400,1401],{},"mailContacts",[53,1403,1404],{},"Adressbuch pro Postfach",[38,1406,1407,1412],{},[53,1408,1409],{},[56,1410,1411],{},"mailVacationResponders",[53,1413,1414],{},"Zeitfenster für Abwesenheitsantworten",[38,1416,1417,1422],{},[53,1418,1419],{},[56,1420,1421],{},"mailVacationLog",[53,1423,1424],{},"Anti-Schleifen-Datensatz pro Absender für die Abwesenheitsantwort",[38,1426,1427,1432],{},[53,1428,1429],{},[56,1430,1431],{},"mailAppPasswords",[53,1433,1434],{},"Scrypt-gehashte Zugangsdaten für native IMAP-\u002FSMTP-Clients",[38,1436,1437,1442],{},[53,1438,1439],{},[56,1440,1441],{},"mailAuditLog",[53,1443,1444],{},"Ereignisprotokoll auf Postfachebene (Zustellung, IMAP-Login, …)",[38,1446,1447,1452],{},[53,1448,1449],{},[56,1450,1451],{},"mailAuthFailures",[53,1453,1454],{},"Protokoll fehlgeschlagener Authentifizierungen im Gleitfenster, das das SMTP-Rate-Limit trägt",[11,1456,1457,1458,1463],{},"Die Schemabeziehungen, den IMAP-Kommandofluss und das Routing der eingehenden Zustellung finden Sie unter ",[1459,1460,1462],"a",{"href":1461},"\u002Fdeveloper\u002Fpostbox-architecture","Postbox-Architektur",".",[15,1465,1467],{"id":1466},"hintergrundjobs","Hintergrundjobs",[27,1469,1471,1472,1025],{"id":1470},"backend-appsapiconvexcronsts","Backend (",[56,1473,1474],{},"apps\u002Fapi\u002Fconvex\u002Fcrons.ts",[11,1476,1477,1478,1480],{},"Alle geplanten Jobs sind in ",[56,1479,1474],{}," registriert — die maßgebliche Liste (34 Jobs). Eine repräsentative Auswahl:",[32,1482,1483,1495],{},[35,1484,1485],{},[38,1486,1487,1490,1493],{},[41,1488,1489],{},"Job",[41,1491,1492],{},"Intervall",[41,1494,874],{},[48,1496,1497,1508,1526,1537,1548,1559,1570,1580,1590,1600,1611,1621,1631,1645,1655,1665,1675,1694,1704,1714,1727,1737,1751,1761,1771,1781,1791,1801,1811,1821,1831,1841,1851],{},[38,1498,1499,1502,1505],{},[53,1500,1501],{},"Geplante Kampagnen verarbeiten",[53,1503,1504],{},"1 Min.",[53,1506,1507],{},"Absicherung für scheduler-basierte Sendungen",[38,1509,1510,1513,1515],{},[53,1511,1512],{},"Sendende Kampagnen abgleichen",[53,1514,1504],{},[53,1516,1517,1518,1521,1522,1525],{},"Sicherheitsnetz, das ",[56,1519,1520],{},"sending"," → ",[56,1523,1524],{},"sent"," fortschreibt, wenn keine eingereihten Sendungen mehr offen sind",[38,1527,1528,1531,1534],{},[53,1529,1530],{},"Ausstehende Verzögerungen verarbeiten",[53,1532,1533],{},"5 Min.",[53,1535,1536],{},"Verpasste Verzögerungsschritte in Automatisierungen nachholen",[38,1538,1539,1542,1545],{},[53,1540,1541],{},"Kontolöschungen verarbeiten",[53,1543,1544],{},"24 Stunden",[53,1546,1547],{},"Konten nach Ablauf ihrer 30-tägigen Karenzzeit behandeln",[38,1549,1550,1553,1556],{},[53,1551,1552],{},"Webhook-Logs aufräumen",[53,1554,1555],{},"7 Tage",[53,1557,1558],{},"Zustellprotokolle löschen, die älter als 30 Tage sind",[38,1560,1561,1564,1567],{},[53,1562,1563],{},"Segmentzähler aktualisieren",[53,1565,1566],{},"30 Min.",[53,1568,1569],{},"Gecachte Segmentzähler frisch halten",[38,1571,1572,1575,1577],{},[53,1573,1574],{},"Kontaktzähler abgleichen",[53,1576,1544],{},[53,1578,1579],{},"Drift in gecachten Kontaktzählern korrigieren",[38,1581,1582,1585,1587],{},[53,1583,1584],{},"Themen-Mitgliederzähler abgleichen",[53,1586,1544],{},[53,1588,1589],{},"Drift in gecachten Themen-Mitgliederzählern korrigieren",[38,1591,1592,1595,1597],{},[53,1593,1594],{},"Warming-Zustand synchronisieren",[53,1596,1533],{},[53,1598,1599],{},"IP-Warming-Zustand vom MTA abholen",[38,1601,1602,1605,1608],{},[53,1603,1604],{},"Sende-Reputation aufräumen",[53,1606,1607],{},"1 Stunde",[53,1609,1610],{},"Reputations-Buckets älter als 60 Tage verwerfen (das Risiko wird beim Lesen abgeleitet, ADR-0042)",[38,1612,1613,1616,1618],{},[53,1614,1615],{},"Wartung des Knowledge Graph",[53,1617,1544],{},[53,1619,1620],{},"Konfidenzabfall + Bereinigung abgelaufener Einträge",[38,1622,1623,1626,1628],{},[53,1624,1625],{},"Fehlgeschlagene Agent-Aktionen wiederholen",[53,1627,1533],{},[53,1629,1630],{},"Aktionen der Agent-Pipeline unterhalb des Retry-Limits erneut ausführen",[38,1632,1633,1636,1638],{},[53,1634,1635],{},"Channel-Health-Checks",[53,1637,1533],{},[53,1639,1640,1641,1644],{},"Konnektivität der Channels SMS \u002F WhatsApp \u002F ",[56,1642,1643],{},"generic"," prüfen",[38,1646,1647,1650,1652],{},[53,1648,1649],{},"Rollup der Agent-Metriken",[53,1651,1533],{},[53,1653,1654],{},"Queue-Tiefe, Latenz, Fehlerraten; Circuit Breaker auswerten",[38,1656,1657,1660,1662],{},[53,1658,1659],{},"Tageszähler der Autonomie zurücksetzen",[53,1661,1544],{},[53,1663,1664],{},"Die täglichen Autonomie-Aktionszähler zurücksetzen",[38,1666,1667,1670,1672],{},[53,1668,1669],{},"Autonomie-Schwellwerte anpassen",[53,1671,1555],{},[53,1673,1674],{},"Zieht eine Kategorie bei einem Ablehnungsanstieg automatisch enger; bei niedriger Ablehnungsquote wird ein Graduierungsvorschlag festgehalten (eine Lockerung erfordert die ausdrückliche Zustimmung des Benutzers, nie automatisch)",[38,1676,1677,1680,1683],{},[53,1678,1679],{},"Analytics melden",[53,1681,1682],{},"15 Min.",[53,1684,1685,1686,1689,1690,1693],{},"Optional Instanzmetriken an eine externe Control Plane POSTen; ohne gesetzte ",[56,1687,1688],{},"CONTROL_PLANE_URL"," + ",[56,1691,1692],{},"INSTANCE_SECRET"," ein No-Op (wird mit dem OSS-Self-Host nicht ausgeliefert)",[38,1695,1696,1699,1701],{},[53,1697,1698],{},"Zähler für Transaktionssendungen abgleichen",[53,1700,1544],{},[53,1702,1703],{},"Drift im gecachten Zähler der Transaktionssendungen korrigieren",[38,1705,1706,1709,1711],{},[53,1707,1708],{},"Postbox: überfällige Entwürfe versenden",[53,1710,1504],{},[53,1712,1713],{},"Überfällige geplante\u002Fausstehende Postbox-Entwürfe versenden, die der Scheduler pro Entwurf verpasst haben könnte",[38,1715,1716,1719,1721],{},[53,1717,1718],{},"Postbox: zurückgestellte Nachrichten wecken",[53,1720,1504],{},[53,1722,1723,1724,1726],{},"Nachrichten zurückholen, deren ",[56,1725,1326],{}," verstrichen ist",[38,1728,1729,1732,1734],{},[53,1730,1731],{},"Soft-gelöschte Kontakte aufräumen",[53,1733,1544],{},[53,1735,1736],{},"Kontakte nach Ablauf ihrer 30-tägigen Aufbewahrung endgültig löschen",[38,1738,1739,1742,1745],{},[53,1740,1741],{},"Rollup der Statistiken gesendeter Kampagnen",[53,1743,1744],{},"2 Min.",[53,1746,1747,1748,1750],{},"Ereignisse pro Empfänger zu den ",[56,1749,1017],{},"-Summen der Kampagne aggregieren",[38,1752,1753,1756,1758],{},[53,1754,1755],{},"Rollup der Automatisierungsstatistiken",[53,1757,1504],{},[53,1759,1760],{},"Zähler der Automatisierungs-Step-Runs aggregieren",[38,1762,1763,1766,1768],{},[53,1764,1765],{},"Webhook-Payloads aufräumen",[53,1767,1555],{},[53,1769,1770],{},"Gespeicherte Webhook-Payloads nach Ablauf der Aufbewahrung verwerfen",[38,1772,1773,1776,1778],{},[53,1774,1775],{},"Aufbewahrung: Audit-Logs",[53,1777,1544],{},[53,1779,1780],{},"Audit-Logs nach Ablauf ihres Aufbewahrungsfensters löschen",[38,1782,1783,1786,1788],{},[53,1784,1785],{},"Aufbewahrung: Mail-Audit-Log",[53,1787,1544],{},[53,1789,1790],{},"Einträge des Postfach-Audit-Logs nach Ablauf der Aufbewahrung löschen",[38,1792,1793,1796,1798],{},[53,1794,1795],{},"Aufbewahrung: Metadaten von Formulareinreichungen",[53,1797,1544],{},[53,1799,1800],{},"Metadaten von Formulareinreichungen nach Ablauf der Aufbewahrung entfernen",[38,1802,1803,1806,1808],{},[53,1804,1805],{},"Aufbewahrung: fehlgeschlagene Mail-Authentifizierungen",[53,1807,1544],{},[53,1809,1810],{},"SMTP-Auth-Fehlerdatensätze nach Ablauf der Aufbewahrung löschen",[38,1812,1813,1816,1818],{},[53,1814,1815],{},"Reputationsbasierte Auto-Durchsetzung auswerten",[53,1817,1607],{},[53,1819,1820],{},"Reputationsbasierte Auto-Durchsetzungsmaßnahmen anwenden",[38,1822,1823,1826,1828],{},[53,1824,1825],{},"Dedup im Knowledge Graph",[53,1827,1544],{},[53,1829,1830],{},"Doppelte Entitäten im Knowledge Graph zusammenführen",[38,1832,1833,1836,1838],{},[53,1834,1835],{},"Nicht verarbeitete Dateien nachziehen",[53,1837,1682],{},[53,1839,1840],{},"Dateien verarbeiten, die noch nicht indexiert wurden",[38,1842,1843,1846,1848],{},[53,1844,1845],{},"Feststeckende freigegebene Inbox-Nachrichten abgleichen",[53,1847,1533],{},[53,1849,1850],{},"Freigegebene Inbox-Nachrichten weiterschieben, die in der Pipeline feststecken",[38,1852,1853,1856,1859],{},[53,1854,1855],{},"Doppelte Kontakte automatisch zusammenführen",[53,1857,1858],{},"6 Stunden",[53,1860,1861],{},"Erkannte doppelte Kontakte zusammenführen",[837,1863,1865],{"title":1864,"type":840},"Single Source of Truth",[11,1866,1867,1868,1870],{},"Die obige Tabelle ist illustrativ. ",[56,1869,1474],{}," registriert 34 Jobs und ist der maßgebliche, aktuelle Bestand — ziehen Sie diese Datei statt dieser Liste heran.",[837,1872,1875],{"title":1873,"type":1874},"Noch nicht aktiv: graduierte Autonomie","warning",[11,1876,1877,1878,432,1881,1884,1885,1888,1889,1892],{},"Die Crons ",[56,1879,1880],{},"reset autonomy daily counts",[56,1882,1883],{},"adjust autonomy thresholds"," pflegen die Tabellen für Autonomieregeln und Feedback, aber die Entscheidungsschleife der graduierten Autonomie hat noch keine produktiven Aufrufer — live sind nur das Tageslimit des Agenten, der Konfidenz-Schwellwert und der Circuit Breaker ",[56,1886,1887],{},"llm_failure",". Ebenso sind mehrere ",[56,1890,1891],{},"agentMetrics","-Felder, die der Metrik-Rollup ausweist, noch nicht befüllt.",[15,1894,1896],{"id":1895},"frontend-architektur","Frontend-Architektur",[27,1898,1900],{"id":1899},"layouts","Layouts",[1902,1903,1904,1911],"ul",{},[1905,1906,1907,1910],"li",{},[56,1908,1909],{},"default"," - Öffentliche Seiten (Landingpage, Auth)",[1905,1912,1913,1916],{},[56,1914,1915],{},"dashboard"," - Authentifizierte Seiten mit Seitenleiste",[27,1918,1920],{"id":1919},"routen-struktur","Routen-Struktur",[505,1922,1927],{"className":1923,"code":1925,"language":1926},[1924],"language-text","\u002F                               # Landing page\n\u002Fauth\u002Flogin                     # Login\n\u002Fauth\u002Fregister                  # Registration\n\u002Fauth\u002Fforgot-password           # Password reset request\n\u002Fauth\u002Freset-password            # Password reset form\n\u002Fdashboard                      # Main dashboard\n\u002Fdashboard\u002Fsend\u002F*               # Email templates, blocks, media library\n\u002Fdashboard\u002Fsend\u002Fmedia           # Media library\n\u002Fdashboard\u002Fsend\u002Femails\u002F*             # Email editor\n\u002Fdashboard\u002Fcampaigns\u002F*          # Campaign management            (flag: campaigns)\n\u002Fdashboard\u002Fautomations\u002F*        # Automation workflows            (flag: automations)\n\u002Fdashboard\u002Fsend\u002Ftransactional\u002F*      # Transactional templates         (flag: transactional)\n\u002Fdashboard\u002Faudience\u002F*           # Contacts, topics, segments\n\u002Fdashboard\u002Finbox\u002F*              # Shared team inbox + triage      (flag: inbox)\n\u002Fdashboard\u002Fchat\u002F*               # Real-time chat                  (flag: chat)\n\u002Fdashboard\u002Fpostbox\u002F*            # Personal mailbox webmail UI     (flag: postbox)\n\u002Fdashboard\u002Fpreferences\u002F*   # Aliases, filters, app passwords (flag: postbox)\n\u002Fdashboard\u002Fknowledge\u002F*          # Knowledge graph                 (flag: ai.knowledge)\n\u002Fdashboard\u002Fvisualizations       # AI dashboards                   (flag: ai.visualizations)\n\u002Fdashboard\u002Ffiles\u002F*              # File browser\n\u002Farchive\u002F:token                 # Campaign archive (public)\n\u002Fdashboard\u002Fadmin\u002F*           # Organization settings (incl. Features)\n","text",[56,1928,1925],{"__ignoreMap":510},[11,1930,1931,1932,1935,1936,1939],{},"Seiten, die zu einem umschaltbaren Bereich gehören, deklarieren ",[56,1933,1934],{},"requiresFeature: '\u003CflagKey>'"," in ihrem ",[56,1937,1938],{},"definePageMeta","-Block. Die Auth-Middleware leitet auf einen Platzhalter „Feature deaktiviert“ um, wenn das Flag ausgeschaltet ist, und Convex-Queries erzwingen dieselbe Prüfung serverseitig.",[27,1941,1943],{"id":1942},"state-management","State Management",[1902,1945,1946,1949,1955,1964,1970,1976,1982,1988],{},[1905,1947,1948],{},"Convex-Queries liefern reaktive Daten",[1905,1950,1951,1954],{},[56,1952,1953],{},"useAuth()"," - Authentifizierungszustand",[1905,1956,1957,125,1960,1963],{},[56,1958,1959],{},"useOrganization()",[56,1961,1962],{},"useOrganizationContext()"," - Aktueller Organisationskontext",[1905,1965,1966,1969],{},[56,1967,1968],{},"useMediaLibrary()"," - Verwaltung von Medien-Assets",[1905,1971,1972,1975],{},[56,1973,1974],{},"useToast()"," - Globale Toast-Benachrichtigungen",[1905,1977,1978,1981],{},[56,1979,1980],{},"useFocusMode()"," - Fokusmodus des Editors",[1905,1983,1984,1987],{},[56,1985,1986],{},"usePostHog()"," - Produktanalytik (Events erfassen, Benutzer identifizieren)",[1905,1989,1990,1993],{},[56,1991,1992],{},"usePostHogIdentity()"," - Synchronisiert Auth-\u002FOrg-Zustand automatisch zu PostHog",[15,1995,1997],{"id":1996},"feature-flags","Feature-Flags",[11,1999,2000,2001,2004,2005,1463],{},"Jede umschaltbare Produktoberfläche wird genau einmal in ",[56,2002,2003],{},"packages\u002Fshared\u002Fsrc\u002FfeatureFlags.ts"," deklariert — die Single Source of Truth, die das Setup-CLI, die Admin-Oberfläche, das Convex-Backend und die Nuxt-Route-Middleware lesen. Die vollständige Registry und die Helfer-APIs finden Sie unter ",[1459,2006,2008],{"href":2007},"\u002Fdeveloper\u002Ffeature-flags","Feature-Flags — Entwicklerreferenz",[11,2010,2011],{},"Das Laufzeitmuster:",[2013,2014,2015,2032,2041,2050,2063],"ol",{},[1905,2016,2017,2020,2021,2024,2025,270,2028,2031],{},[204,2018,2019],{},"Registry"," — ",[56,2022,2023],{},"FEATURE_FLAGS"," deklariert für jedes Flag Kategorie, Standardzustand, Abhängigkeiten (",[56,2026,2027],{},"requires",[56,2029,2030],{},"cascadesOff","), benötigte Umgebungsvariablen und das Docker-Compose-Profil.",[1905,2033,2034,2037,2038,1463],{},[204,2035,2036],{},"Speicherung"," — der aktuelle Zustand liegt in der Convex-Zeile ",[56,2039,2040],{},"instanceSettings.featureFlags",[1905,2042,2043,2020,2046,2049],{},[204,2044,2045],{},"Auflösung",[56,2047,2048],{},"resolveFlags(stored)"," wendet die Abhängigkeitsregeln an und liefert den effektiven Zustand. Nutzen Sie das immer, bevor Sie ein Flag lesen.",[1905,2051,2052,2055,2056,2058,2059,2062],{},[204,2053,2054],{},"Aktivierung"," — ein Flag einzuschalten aktiviert sein Docker-Compose-Profil (von ",[56,2057,140],{}," in die ",[56,2060,2061],{},"docker-compose.override.yml"," neu kompiliert) und validiert die dafür nötigen Umgebungsvariablen.",[1905,2064,2065,2068,2069,2072,2073,2076],{},[204,2066,2067],{},"Durchsetzung"," — die Page-Meta ",[56,2070,2071],{},"requiresFeature"," sperrt Routen; Convex-Queries rufen serverseitig ",[56,2074,2075],{},"isFlagEnabled()"," auf.",[15,2078,2080],{"id":2079},"provider","Provider",[11,2082,2083],{},"Wo Owlat mit einem externen System spricht, geschieht das über eine Provider-Factory, die an einer Umgebungsvariable hängt. Damit können Self-Hoster Implementierungen ohne Codeänderungen austauschen. Heute ist das für LLM und E-Mail-Versand verdrahtet; Benachrichtigungen und der Vector Store sind deklarierte Env-Schlüssel ohne bislang implementierte Factory.",[32,2085,2086,2102],{},[35,2087,2088],{},[38,2089,2090,2093,2096,2099],{},[41,2091,2092],{},"System",[41,2094,2095],{},"Factory",[41,2097,2098],{},"Umgebungsvariable",[41,2100,2101],{},"Implementierungen",[48,2103,2104,2136],{},[38,2105,2106,2109,2114,2119],{},[53,2107,2108],{},"LLM",[53,2110,2111],{},[56,2112,2113],{},"lib\u002FllmProvider.ts",[53,2115,2116],{},[56,2117,2118],{},"LLM_PROVIDER",[53,2120,2121,2124,2125,270,2128,2131,2132,2135],{},[56,2122,2123],{},"openai"," (Standard), ",[56,2126,2127],{},"openrouter",[56,2129,2130],{},"ollama",". Claude \u002F jeder OpenAI-kompatible Endpunkt wird über ",[56,2133,2134],{},"LLM_BASE_URL"," erreicht, nicht über einen eigenen Provider-Wert",[38,2137,2138,2141,2150,2155],{},[53,2139,2140],{},"E-Mail-Versand",[53,2142,2143,2146,2147,1025],{},[56,2144,2145],{},"providers\u002Fcomposition.ts"," (universelle Bundles; Routing\u002FFallback in ",[56,2148,2149],{},"lib\u002FsendProviders\u002Frouting.ts",[53,2151,2152],{},[56,2153,2154],{},"EMAIL_PROVIDER",[53,2156,2157,270,2159,270,2162,270,2164,270,2167,270,2170,2173],{},[56,2158,269],{},[56,2160,2161],{},"ses",[56,2163,273],{},[56,2165,2166],{},"smtp",[56,2168,2169],{},"mandrill",[56,2171,2172],{},"emailit"," (die Kinds des Katalogs) — kein impliziter Standard; nicht gesetzt bedeutet „nicht konfiguriert“",[11,2175,2176,2177,2180,2181,125,2184,2187,2188,2191],{},"Es gibt keine Env-Schlüssel für Notification-Provider oder Vector Store: Benachrichtigungen werden clientseitig von der Desktop-App erledigt, und der Knowledge-Abruf nutzt direkt den eingebauten Vektorindex von Convex (",[56,2178,2179],{},"ctx.vectorSearch","). Für Analytics kommt PostHog zum Einsatz, konfiguriert über ",[56,2182,2183],{},"POSTHOG_API_KEY",[56,2185,2186],{},"POSTHOG_HOST"," — es gibt weder eine Provider-Factory-Abstraktion noch einen ",[56,2189,2190],{},"ANALYTICS_PROVIDER","-Schalter.",[11,2193,2194,2195,1463],{},"Interface-Contracts und die Vorgehensweise beim Hinzufügen eines neuen Providers finden Sie unter ",[1459,2196,2080],{"href":2197},"\u002Fdeveloper\u002Fproviders",[2199,2200,2201],"style",{},"html pre.shiki code .sDN9O, html code.shiki .sDN9O{--shiki-default:#6A737D;--shiki-dark:#768390}html pre.shiki code .s7YZ4, html code.shiki .s7YZ4{--shiki-default:#D73A49;--shiki-dark:#F47067}html pre.shiki code .sviXB, html code.shiki .sviXB{--shiki-default:#005CC5;--shiki-dark:#6CB6FF}html pre.shiki code .sPO5f, html code.shiki .sPO5f{--shiki-default:#6F42C1;--shiki-dark:#DCBDFB}html pre.shiki code .sYgZi, html code.shiki .sYgZi{--shiki-default:#24292E;--shiki-dark:#ADBAC7}html pre.shiki code .stnAF, html code.shiki .stnAF{--shiki-default:#E36209;--shiki-dark:#F69D50}html pre.shiki code .s-HuK, html code.shiki .s-HuK{--shiki-default:#032F62;--shiki-dark:#96D0FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sOLd2, html code.shiki .sOLd2{--shiki-default:#6F42C1;--shiki-dark:#F69D50}",{"title":510,"searchDepth":524,"depth":524,"links":2203},[2204,2205,2210,2215,2216,2217,2218,2227,2231,2236,2237],{"id":17,"depth":524,"text":18},{"id":24,"depth":524,"text":25,"children":2206},[2207,2208,2209],{"id":29,"depth":546,"text":30},{"id":178,"depth":546,"text":179},{"id":424,"depth":546,"text":425},{"id":495,"depth":524,"text":496,"children":2211},[2212,2213,2214],{"id":499,"depth":546,"text":500},{"id":658,"depth":546,"text":659},{"id":666,"depth":546,"text":667},{"id":673,"depth":524,"text":674},{"id":824,"depth":524,"text":825},{"id":831,"depth":524,"text":832},{"id":846,"depth":524,"text":847,"children":2219},[2220,2221,2222,2223,2224,2225],{"id":861,"depth":546,"text":862},{"id":889,"depth":546,"text":890},{"id":964,"depth":546,"text":965},{"id":1058,"depth":546,"text":1059},{"id":1114,"depth":546,"text":1115},{"id":1243,"depth":546,"text":2226},"Postbox (persönliche Mail · Flag: postbox)",{"id":1466,"depth":524,"text":1467,"children":2228},[2229],{"id":1470,"depth":546,"text":2230},"Backend (apps\u002Fapi\u002Fconvex\u002Fcrons.ts)",{"id":1895,"depth":524,"text":1896,"children":2232},[2233,2234,2235],{"id":1899,"depth":546,"text":1900},{"id":1919,"depth":546,"text":1920},{"id":1942,"depth":546,"text":1943},{"id":1996,"depth":524,"text":1997},{"id":2079,"depth":524,"text":2080},"md",{},"\u002Fdeveloper\u002Farchitecture",{"title":6,"description":13},"3.developer\u002F2.architecture","sHTPQiIgb-8ynfIl9Ssda1w5ilq05nXNxlxF08F1JDM",[2245,2249],{"title":2246,"path":2247,"stem":2248,"children":-1},"Zustellbarkeits-Infrastruktur","\u002Fdeveloper\u002Fdeliverability-infrastructure","3.developer\u002F19.deliverability-infrastructure",{"title":2250,"path":2251,"stem":2252,"children":-1},"Plattformbetrieb","\u002Fdeveloper\u002Fplatform-operations","3.developer\u002F20.platform-operations",1786915107271]