[{"data":1,"prerenderedAt":6684},["ShallowReactive",2],{"search-de":3,"content-de-developer\u002Fenvironment-variables":4,"surround-de-\u002Fdeveloper\u002Fenvironment-variables":6675},[],{"id":5,"title":6,"body":7,"description":6668,"extension":6669,"meta":6670,"navigation":4179,"path":6671,"seo":6672,"stem":6673,"__hash__":6674},"content_de\u002F3.developer\u002F8.environment-variables.md","Umgebungsvariablen",{"type":8,"value":9,"toc":6611},"minimark",[10,31,67,88,93,99,124,130,135,268,272,348,352,732,753,757,792,857,861,864,911,915,930,938,945,1003,1008,1031,1119,1126,1136,1175,1209,1239,1246,1263,1314,1318,1330,1410,1414,1420,2034,2037,2056,2060,2074,2101,2111,2119,2154,2158,2162,2190,2397,2421,2430,2448,2480,2483,2551,2555,2788,2790,2824,2827,2917,2919,2957,2977,3028,3032,3039,3114,3117,3120,3130,3178,3219,3239,3243,3267,3301,3322,3389,3412,3415,3516,3520,3531,3606,3636,3639,3724,3728,3731,3818,3822,3828,3832,3838,3873,3879,3929,3932,3997,4002,4006,4015,4018,4023,4063,4069,4102,4105,4204,4208,4214,4237,4243,4274,4281,4285,4293,4296,4468,4471,4545,4548,4614,4618,4625,4631,4636,4797,4826,4830,4870,4875,4911,4914,4919,4968,4972,4979,6198,6205,6311,6317,6394,6400,6409,6597,6607],[11,12,13,14,22,23,26,27,30],"p",{},"Owlat nutzt Umgebungsvariablen, um Provider, Sicherheitsprüfungen, Authentifizierung und die Voraussetzungen von Feature-Flags zu konfigurieren. Variablen des Convex-Backends (alles, was über ",[15,16,18],"a",{"href":17},"\u002Fdeveloper\u002Fconvex",[19,20,21],"code",{},"apps\u002Fapi\u002Fconvex\u002Flib\u002Fenv.ts"," gelesen wird) setzen Sie im Convex-Dashboard; Web-App, MTA, IMAP-Server und Mail-Sync-Worker lesen ihre eigene Prozessumgebung (im Self-Hosting stammt alles davon aus einer einzigen ",[19,24,25],{},".env","-Datei, die ",[19,28,29],{},"docker-compose.yml"," einliest).",[32,33,36],"callout",{"type":34,"title":35},"info","Self-Hoster starten hier",[11,37,38,39,43,44,48,49,51,52,55,56,59,60,66],{},"Die meisten Leserinnen und Leser dieser Seite ",[40,41,42],"strong",{},"hosten Owlat selbst",". Der Abschnitt ",[15,45,47],{"href":46},"#self-hosted-configuration","Self-hosted configuration"," weiter unten ist die maßgebliche Referenz dafür, was in Ihre ",[19,50,25],{}," gehört. Variablen sind nur für die Funktionen relevant, die Sie aktiviert haben — der Setup-Assistent erfasst nur diejenigen, die Ihre aktivierten Flags benötigen, und jeden einzelnen Wert können Sie später mit ",[19,53,54],{},"owlat-setup env \u003CKEY> \u003CVALUE>"," setzen. Um genau aufzulisten, welche Variablen Ihr ",[40,57,58],{},"aktueller Flag-Zustand"," benötigt (und welche noch nicht gesetzt sind), führen Sie ",[15,61,63],{"href":62},"\u002Fdeveloper\u002Fsetup-cli#env",[19,64,65],{},"owlat-setup env --show"," aus.",[32,68,70],{"type":34,"title":69},"Von Feature-Flags gesteuerte Umgebungsvariablen",[11,71,72,73,79,80,83,84,87],{},"Jeder Eintrag in ",[15,74,76],{"href":75},"\u002Fdeveloper\u002Ffeature-flags",[19,77,78],{},"packages\u002Fshared\u002Fsrc\u002FfeatureFlags.ts"," kann ",[19,81,82],{},"requiredEnvVars"," deklarieren. Der Setup-Assistent erfasst nur die Variablen, die zu Ihren aktivierten Flags passen — Sie müssen nicht alles setzen. Die vollständige Registry finden Sie in der ",[15,85,86],{"href":75},"Entwicklerreferenz zu Feature-Flags",".",[89,90,92],"h2",{"id":91},"konfiguration-beim-self-hosting","Konfiguration beim Self-Hosting",[11,94,95,96,98],{},"Self-Hoster legen alles in einer einzigen ",[19,97,25],{},"-Datei im Wurzelverzeichnis des Repositorys ab. Beginnen Sie mit der Vorlage:",[100,101,106],"pre",{"className":102,"code":103,"language":104,"meta":105,"style":105},"language-sh shiki shiki-themes github-light github-dark-dimmed","cp .env.selfhost.example .env\n","sh","",[19,107,108],{"__ignoreMap":105},[109,110,113,117,121],"span",{"class":111,"line":112},"line",1,[109,114,116],{"class":115},"sOLd2","cp",[109,118,120],{"class":119},"s-HuK"," .env.selfhost.example",[109,122,123],{"class":119}," .env\n",[11,125,126,127,129],{},"Die Vorlage und ",[19,128,29],{}," verweisen auf diese Variablen:",[131,132,134],"h3",{"id":133},"erforderliche-geheimnisse","Erforderliche Geheimnisse",[136,137,138,154],"table",{},[139,140,141],"thead",{},[142,143,144,148,151],"tr",{},[145,146,147],"th",{},"Variable",[145,149,150],{},"Beschreibung",[145,152,153],{},"Erzeugen mit",[155,156,157,188,218,239,254],"tbody",{},[142,158,159,165,183],{},[160,161,162],"td",{},[19,163,164],{},"INSTANCE_SECRET",[160,166,167,168,171,172,175,176,175,179,182],{},"Root-Geheimnis des Convex-Backends. HKDF-Wurzel für die Verschlüsselung ruhender Zugangsdaten (Passwörter externer Postfächer, ",[19,169,170],{},"lib\u002FcredentialCrypto.ts",") und gemeinsames Geheimnis, das die Dev-\u002FSeed-Endpunkte absichert (",[19,173,174],{},"\u002Fseed\u002Fadmin",", ",[19,177,178],{},"\u002Fseed\u002Fdemo",[19,180,181],{},"\u002Fdev\u002Freset",").",[160,184,185],{},[19,186,187],{},"openssl rand -hex 32",[142,189,190,195,212],{},[160,191,192],{},[19,193,194],{},"INSTANCE_SECRET_PREVIOUS",[160,196,197,198,201,202,204,205,208,209,211],{},"Optional. Das ",[40,199,200],{},"vorherige"," ",[19,203,164],{},", nur während einer Rotation des Geheimnisses aufbewahrt. Ist es gesetzt, lassen sich ruhende Geheimnisse, die noch unter der alten Wurzel versiegelt sind, weiterhin entschlüsseln, während ",[19,206,207],{},"e2ee\u002FlifecycleNode.ts:reSealVault"," jede Zeile unter dem neuen ",[19,210,164],{}," neu versiegelt. Entfernen Sie die Variable, sobald die Neuversiegelungs-Migration abgeschlossen ist.",[160,213,214,215,217],{},"(das alte ",[19,216,164],{}," einfügen)",[142,219,220,225,236],{},[160,221,222],{},[19,223,224],{},"CONVEX_ADMIN_KEY",[160,226,227,228,231,232,235],{},"Admin-Schlüssel zum Deployen von Funktionen. ",[40,229,230],{},"Nach dem ersten Start"," über ",[19,233,234],{},"docker compose exec convex .\u002Fgenerate_admin_key.sh"," erzeugen.",[160,237,238],{},"(siehe oben)",[142,240,241,246,249],{},[160,242,243],{},[19,244,245],{},"MTA_API_KEY",[160,247,248],{},"API-Schlüssel, mit dem die Tenant-App Sendevorgänge in der MTA einreiht.",[160,250,251],{},[19,252,253],{},"openssl rand -base64 32",[142,255,256,261,264],{},[160,257,258],{},[19,259,260],{},"MTA_WEBHOOK_SECRET",[160,262,263],{},"HMAC-Geheimnis für Zustellereignis-Callbacks von der MTA an Convex.",[160,265,266],{},[19,267,253],{},[131,269,271],{"id":270},"öffentliche-urls","Öffentliche URLs",[136,273,274,285],{},[139,275,276],{},[142,277,278,280,282],{},[145,279,147],{},[145,281,150],{},[145,283,284],{},"Standard",[155,286,287,302,317,333],{},[142,288,289,294,297],{},[160,290,291],{},[19,292,293],{},"NUXT_PUBLIC_CONVEX_URL",[160,295,296],{},"Browserseitige Convex-URL. Muss dem entsprechen, was Sie über den Reverse Proxy veröffentlichen.",[160,298,299],{},[19,300,301],{},"http:\u002F\u002Flocalhost:3210",[142,303,304,309,312],{},[160,305,306],{},[19,307,308],{},"NUXT_PUBLIC_CONVEX_SITE_URL",[160,310,311],{},"Browserseitige URL der Convex-HTTP-Actions.",[160,313,314],{},[19,315,316],{},"http:\u002F\u002Flocalhost:3211",[142,318,319,324,327],{},[160,320,321],{},[19,322,323],{},"NUXT_PUBLIC_CONVEX_DASHBOARD_URL",[160,325,326],{},"Optional. Explizite URL des Convex-Admin-Dashboards (Port 6791), das aus dem Onboarding-Banner beim Self-Hosting verlinkt wird. Lassen Sie den Wert leer, wenn Sie das Dashboard über einen SSH-Tunnel erreichen — das Banner errät dann einen Standard, den der Betreiber in der App überschreiben kann.",[160,328,329],{},[330,331,332],"em",{},"(leer)",[142,334,335,340,343],{},[160,336,337],{},[19,338,339],{},"NUXT_PUBLIC_SITE_URL",[160,341,342],{},"Öffentliche URL der Web-App.",[160,344,345],{},[19,346,347],{},"http:\u002F\u002Flocalhost:3000",[131,349,351],{"id":350},"mta-e-mail-versand","MTA (E-Mail-Versand)",[136,353,354,364],{},[139,355,356],{},[142,357,358,360,362],{},[145,359,147],{},[145,361,150],{},[145,363,284],{},[155,365,366,385,398,410,425,443,461,477,492,506,524,539,560,580,614,690],{},[142,367,368,373,379],{},[160,369,370],{},[19,371,372],{},"EHLO_HOSTNAME",[160,374,375,376,66],{},"Muss dem rDNS-PTR-Eintrag Ihres Servers entsprechen. Die Vorlage liefert ",[19,377,378],{},"mail.example.com",[160,380,381,384],{},[19,382,383],{},"mail.localhost"," (Compose-Fallback)",[142,386,387,392,395],{},[160,388,389],{},[19,390,391],{},"EHLO_HOSTNAMES",[160,393,394],{},"Optionale JSON-Zuordnung von jeder sendenden IP zu ihrem PTR-passenden EHLO-Hostnamen.",[160,396,397],{},"—",[142,399,400,405,408],{},[160,401,402],{},[19,403,404],{},"MTA_GENERIC_PTR_SUFFIXES",[160,406,407],{},"Zusätzliche, kommagetrennte PTR-Standardsuffixe von Providern, vor denen gewarnt werden soll.",[160,409,397],{},[142,411,412,417,420],{},[160,413,414],{},[19,415,416],{},"MTA_ALLOW_UNVERIFIED_FCRDNS",[160,418,419],{},"Umgehung der harten FCrDNS-Quarantäne, nur für Laborumgebungen. Der fehlgeschlagene Status bleibt sichtbar.",[160,421,422],{},[19,423,424],{},"false",[142,426,427,432,439],{},[160,428,429],{},[19,430,431],{},"MTA_IPV6_ENABLED",[160,433,434,435,438],{},"Explizites Opt-in für ausgehendes IPv6. Lassen Sie den Wert auf false, bis die geroutete Adresse, die IPv4-Identität, PTR\u002FAAAA und der exakte ",[19,436,437],{},"ip6:","-Mechanismus im Return-Path verifiziert sind.",[160,440,441],{},[19,442,424],{},[142,444,445,450,456],{},[160,446,447],{},[19,448,449],{},"RETURN_PATH_DOMAIN",[160,451,452,453,66],{},"Domain für VERP-Return-Path-Adressen von Bounces. Die Vorlage liefert ",[19,454,455],{},"bounces.example.com",[160,457,458,384],{},[19,459,460],{},"bounces.localhost",[142,462,463,468,474],{},[160,464,465],{},[19,466,467],{},"BOUNCE_VERP_KEY",[160,469,470,471,473],{},"Erforderliches Geheimnis, das VERP-Return-Path-Token signiert (BATV\u002FHMAC). Eine exakte DSN-\u002FFBL-Zuordnung setzt ein von der MTA signiertes Token voraus und verhindert, dass gefälschtes Feedback die Suppression vergiftet. Das Setup erzeugt es automatisch; bei manuellen Installationen können Sie ",[19,472,253],{}," verwenden. Halten Sie den Wert stabil. Beispieldateien lassen ihn leer, damit eine kopierte, unkonfigurierte Umgebung fail-closed scheitert.",[160,475,476],{},"erforderlich (mindestens 32 Bytes; Platzhalter werden abgelehnt)",[142,478,479,484,487],{},[160,480,481],{},[19,482,483],{},"IP_POOLS_TRANSACTIONAL",[160,485,486],{},"Kommagetrennte IP(s) für transaktionale Sendungen.",[160,488,489],{},[19,490,491],{},"127.0.0.1",[142,493,494,499,502],{},[160,495,496],{},[19,497,498],{},"IP_POOLS_CAMPAIGN",[160,500,501],{},"Kommagetrennte IP(s) für Marketingkampagnen.",[160,503,504],{},[19,505,491],{},[142,507,508,513,519],{},[160,509,510],{},[19,511,512],{},"DKIM_KEYS",[160,514,515,516,87],{},"JSON: ",[19,517,518],{},"{\"example.com\":{\"selector\":\"s1\",\"privateKey\":\"...\"}}",[160,520,521],{},[19,522,523],{},"{}",[142,525,526,531,534],{},[160,527,528],{},[19,529,530],{},"WORKER_CONCURRENCY",[160,532,533],{},"Maximale Anzahl gleichzeitiger SMTP-Zustellungen.",[160,535,536],{},[19,537,538],{},"50",[142,540,541,546,557],{},[160,542,543],{},[19,544,545],{},"FBL_DEDUP_PROTOCOL",[160,547,548,549,552,553,87],{},"Erforderliches, versioniertes Reservierungsprotokoll für Beschwerden. Setzen Sie ",[19,550,551],{},"owned-v2","; einen automatischen Legacy-\u002FShadow-Modus gibt es nicht. Siehe ",[15,554,556],{"href":555},"\u002Fdeveloper\u002Fmta-system#fbl-deduplication-upgrade","FBL deduplication upgrade",[160,558,559],{},"erforderlich",[142,561,562,567,578],{},[160,563,564],{},[19,565,566],{},"FBL_DEDUP_CUTOVER_ACK",[160,568,569,570,573,574,577],{},"Erforderliche betriebliche Bestätigung: ",[19,571,572],{},"fresh-install"," nur bei neuem Redis-\u002FInstallationszustand oder ",[19,575,576],{},"quiesced-v1-intake",", nachdem jeder Legacy-FBL-Worker gestoppt und geleert wurde.",[160,579,559],{},[142,581,582,587,610],{},[160,583,584],{},[19,585,586],{},"MTA_LOG_LEVEL",[160,588,589,590,593,594,593,596,593,599,602,603,605,606,609],{},"Ausführlichkeit des Logs (",[19,591,592],{},"debug","\u002F",[19,595,34],{},[19,597,598],{},"warn",[19,600,601],{},"error","). Dies ist ein Alias in der Host-Umgebung von Compose — ",[19,604,29],{}," bildet ihn auf ",[19,607,608],{},"LOG_LEVEL"," ab, und das ist der Wert, den der MTA-Prozess tatsächlich liest.",[160,611,612],{},[19,613,34],{},[142,615,616,621,686],{},[160,617,618],{},[19,619,620],{},"DANE_MODE",[160,622,623,624,627,628,631,632,635,636,638,639,641,642,645,646,649,650,593,653,656,657,660,661,663,664,666,667,669,670,673,674,677,678,681,682,685],{},"DANE-Haltung (RFC 7672) zur Sendezeit — ",[19,625,626],{},"off"," (Standard), ",[19,629,630],{},"report"," oder ",[19,633,634],{},"enforce",". ",[19,637,626],{}," ist Byte für Byte identisch mit dem bisherigen Verhalten (keine TLSA-Abfragen). ",[19,640,630],{}," fragt das DNSSEC-validierte TLSA-RRset jedes empfangenden MX ab (",[19,643,644],{},"_25._tcp.\u003Cmx>","), bewertet das Zertifikat dagegen und ",[40,647,648],{},"gibt das TLS-RPT-Ergebnis aus"," (",[19,651,652],{},"success",[19,654,655],{},"validation-failure"," unter der Policy ",[19,658,659],{},"tlsa","), erzwingt aber niemals TLS und erzeugt keine Bounces. ",[19,662,634],{}," authentifiziert das Zertifikat zusätzlich gegen das RRset (hat Vorrang vor MTA-STS; bei fehlender Übereinstimmung wird die Nachricht zurückgestellt, niemals im Klartext gesendet). ",[19,665,630],{}," und ",[19,668,634],{}," benötigen ",[19,671,672],{},"DANE_RESOLVER_URL",". Wird aus der eigenen Prozessumgebung der MTA gelesen (",[19,675,676],{},"apps\u002Fmta\u002Fsrc\u002Fconfig.ts","), ",[40,679,680],{},"nicht"," aus dem Convex-Dashboard (",[19,683,684],{},"apps\u002Fmta\u002Fsrc\u002Fsmtp\u002FdaneVerify.ts","). Ein unbekannter Wert lässt den Start fehlschlagen.",[160,687,688],{},[19,689,626],{},[142,691,692,696,729],{},[160,693,694],{},[19,695,672],{},[160,697,698,699,593,701,703,704,707,708,711,712,715,716,719,720,722,723,725,726,728],{},"Resolver-URL für DoH (DNS-over-HTTPS, RFC 8484 JSON) zur DNSSEC-fähigen MX-\u002FAdressermittlung und für DANE-TLSA-Abfragen. Erforderlich, damit ",[19,700,630],{},[19,702,634],{}," laufen — ",[40,705,706],{},"ist sie nicht gesetzt, bleibt DANE in jedem Modus wirkungslos"," (keine Abfragen, historischer Pfad). Ist sie gesetzt, muss sie ",[19,709,710],{},"https:\u002F\u002F"," sein (einfaches ",[19,713,714],{},"http:\u002F\u002F"," wird nur für einen Loopback-Resolver akzeptiert, da das vertrauenswürdige DNSSEC-AD-Bit über einen Kanal übertragen werden muss, den ein On-Path-Angreifer nicht fälschen kann); die MTA validiert die URL beim Start in jedem Modus. Es muss ein ",[40,717,718],{},"validierender"," Resolver sein: Dem AD-Bit wird vertraut, DANE wird nicht über eine unsichere Adresskette angewendet, und eine Abfrage, die nicht abgeschlossen werden kann (SERVFAIL\u002FTimeout), stellt die Zustellung im Modus ",[19,721,634],{}," zurück (und ist in ",[19,724,630],{}," wirkungslos), statt herabzustufen. Ein lokaler validierender Resolver (z. B. Unbound auf ",[19,727,491],{},") ist die empfohlene Produktionskonfiguration.",[160,730,731],{},"nicht gesetzt",[32,733,734],{"type":34},[11,735,736,737,739,740,742,743,746,747,749,750,752],{},"Die Spalte ",[19,738,284],{}," gibt den Fallback aus ",[19,741,29],{}," wieder, der greift, wenn eine Variable nicht gesetzt ist. Die in ",[19,744,745],{},".env.selfhost.example"," ausgelieferten Werte weichen bei den beiden Domain-Variablen oben ab (",[19,748,378],{}," \u002F ",[19,751,455],{},"), denn das ist es, was Sie tatsächlich kopieren und bearbeiten.",[131,754,756],{"id":755},"deployment-modus-web-app-compose","Deployment-Modus (Web-App & Compose)",[11,758,759,760,763,764,767,768,771,772,775,776,779,780,782,783,786,787,789,790,87],{},"Dies sind ",[40,761,762],{},"keine"," Convex-Backend-Variablen — sie werden nicht über ",[19,765,766],{},"lib\u002Fenv.ts"," gelesen. ",[19,769,770],{},"OWLAT_DEPLOYMENT_MODE"," wird von der Web-App verwendet (",[19,773,774],{},"apps\u002Fweb\u002Fnuxt.config.ts",", veröffentlicht als ",[19,777,778],{},"runtimeConfig.public.deploymentMode",") und von ",[19,781,29],{}," an den Web-Container übergeben. ",[19,784,785],{},"OWLAT_HOSTED_MODE"," ist ein ",[19,788,25],{},"-Flag, das das Setup-CLI anhand des gewählten Deployment-Modus schreibt; in diesem OSS-Repository ist es wirkungslos (kein Dienst liest es), Self-Hoster lassen es also auf ",[19,791,424],{},[136,793,794,804],{},[139,795,796],{},[142,797,798,800,802],{},[145,799,147],{},[145,801,150],{},[145,803,284],{},[155,805,806,825,842],{},[142,807,808,812,821],{},[160,809,810],{},[19,811,770],{},[160,813,814,631,817,820],{},[19,815,816],{},"selfhost",[19,818,819],{},"hosted",". Steuert die Onboarding-UX beim ersten Start und blendet nur für Hosted gedachte UI (Abrechnung, Upgrade-Hinweise) in der Web-App aus.",[160,822,823],{},[19,824,816],{},[142,826,827,831,838],{},[160,828,829],{},[19,830,785],{},[160,832,833,835,836,87],{},[19,834,25],{},"-Flag, das das Setup-CLI aus dem gewählten Deployment-Modus schreibt. In diesem OSS-Repository wirkungslos — kein Dienst liest es. Self-Hoster lassen es auf ",[19,837,424],{},[160,839,840],{},[19,841,424],{},[142,843,844,849,852],{},[160,845,846],{},[19,847,848],{},"OWLAT_VERSION",[160,850,851],{},"Zur Build-Zeit in die Images eingebettete Version für In-App-Update-Prüfungen. Wird von der CI automatisch gesetzt.",[160,853,854],{},[19,855,856],{},"dev",[131,858,860],{"id":859},"port-overrides-optional","Port-Overrides (optional)",[11,862,863],{},"Alle Ports haben sinnvolle Standardwerte. Überschreiben Sie sie nur, wenn die Standardwerte kollidieren:",[100,865,867],{"className":102,"code":866,"language":104,"meta":105,"style":105},"# CONVEX_PORT=3210\n# CONVEX_SITE_PORT=3211\n# DASHBOARD_PORT=6791\n# WEB_PORT=3000\n# MTA_HTTP_PORT=3100\n# MTA_SMTP_PORT=25\n# IMAP_PORT=993\n",[19,868,869,875,881,887,893,899,905],{"__ignoreMap":105},[109,870,871],{"class":111,"line":112},[109,872,874],{"class":873},"sDN9O","# CONVEX_PORT=3210\n",[109,876,878],{"class":111,"line":877},2,[109,879,880],{"class":873},"# CONVEX_SITE_PORT=3211\n",[109,882,884],{"class":111,"line":883},3,[109,885,886],{"class":873},"# DASHBOARD_PORT=6791\n",[109,888,890],{"class":111,"line":889},4,[109,891,892],{"class":873},"# WEB_PORT=3000\n",[109,894,896],{"class":111,"line":895},5,[109,897,898],{"class":873},"# MTA_HTTP_PORT=3100\n",[109,900,902],{"class":111,"line":901},6,[109,903,904],{"class":873},"# MTA_SMTP_PORT=25\n",[109,906,908],{"class":111,"line":907},7,[109,909,910],{"class":873},"# IMAP_PORT=993\n",[131,912,914],{"id":913},"optional-posthog-analytics","Optional: PostHog-Analytics",[100,916,918],{"className":102,"code":917,"language":104,"meta":105,"style":105},"# NUXT_PUBLIC_POSTHOG_API_KEY=\n# NUXT_PUBLIC_POSTHOG_HOST=https:\u002F\u002Feu.i.posthog.com\n",[19,919,920,925],{"__ignoreMap":105},[109,921,922],{"class":111,"line":112},[109,923,924],{"class":873},"# NUXT_PUBLIC_POSTHOG_API_KEY=\n",[109,926,927],{"class":111,"line":877},[109,928,929],{"class":873},"# NUXT_PUBLIC_POSTHOG_HOST=https:\u002F\u002Feu.i.posthog.com\n",[131,931,933,934,937],{"id":932},"optional-llm-provider-flag-ai","Optional: LLM-Provider (Flag ",[19,935,936],{},"ai",")",[11,939,940,941,87],{},"Nur nötig, wenn ein KI-Flag aktiv ist. Alle Details finden Sie unter ",[15,942,944],{"href":943},"\u002Fdeveloper\u002Fproviders#llm-provider","Providers → LLM provider",[100,946,948],{"className":102,"code":947,"language":104,"meta":105,"style":105},"# LLM_PROVIDER=openai          # openai | openrouter | ollama  (Claude works via openai + an OpenAI-compatible LLM_BASE_URL)\n# LLM_API_KEY=sk-...\n# LLM_MODEL_FAST=gpt-4o-mini   # used for classify\u002Fextract\u002Fguard\u002Fsummarize\n# LLM_MODEL_CAPABLE=gpt-4o     # used for draft tasks\n# LLM_MODEL=                   # single-model fallback for both tiers when *_FAST\u002F*_CAPABLE are unset\n# LLM_EMBEDDING_MODEL=text-embedding-3-small\n# LLM_BASE_URL=                # override for ollama \u002F vLLM \u002F LM Studio\n# --- Local-by-default embedding plane (optional) ---\n# LOCAL_EMBEDDING_BASE_URL=http:\u002F\u002Follama:11434\u002Fv1   # an OpenAI-compatible \u002Fembeddings sidecar\n# LOCAL_EMBEDDING_MODEL=nomic-embed-text            # NOTE: its width must match the vector index\n",[19,949,950,955,960,965,970,975,980,985,991,997],{"__ignoreMap":105},[109,951,952],{"class":111,"line":112},[109,953,954],{"class":873},"# LLM_PROVIDER=openai          # openai | openrouter | ollama  (Claude works via openai + an OpenAI-compatible LLM_BASE_URL)\n",[109,956,957],{"class":111,"line":877},[109,958,959],{"class":873},"# LLM_API_KEY=sk-...\n",[109,961,962],{"class":111,"line":883},[109,963,964],{"class":873},"# LLM_MODEL_FAST=gpt-4o-mini   # used for classify\u002Fextract\u002Fguard\u002Fsummarize\n",[109,966,967],{"class":111,"line":889},[109,968,969],{"class":873},"# LLM_MODEL_CAPABLE=gpt-4o     # used for draft tasks\n",[109,971,972],{"class":111,"line":895},[109,973,974],{"class":873},"# LLM_MODEL=                   # single-model fallback for both tiers when *_FAST\u002F*_CAPABLE are unset\n",[109,976,977],{"class":111,"line":901},[109,978,979],{"class":873},"# LLM_EMBEDDING_MODEL=text-embedding-3-small\n",[109,981,982],{"class":111,"line":907},[109,983,984],{"class":873},"# LLM_BASE_URL=                # override for ollama \u002F vLLM \u002F LM Studio\n",[109,986,988],{"class":111,"line":987},8,[109,989,990],{"class":873},"# --- Local-by-default embedding plane (optional) ---\n",[109,992,994],{"class":111,"line":993},9,[109,995,996],{"class":873},"# LOCAL_EMBEDDING_BASE_URL=http:\u002F\u002Follama:11434\u002Fv1   # an OpenAI-compatible \u002Fembeddings sidecar\n",[109,998,1000],{"class":111,"line":999},10,[109,1001,1002],{"class":873},"# LOCAL_EMBEDDING_MODEL=nomic-embed-text            # NOTE: its width must match the vector index\n",[1004,1005,1007],"h4",{"id":1006},"ki-ausgabenbudget-dollar-obergrenze-je-organisation","KI-Ausgabenbudget (Dollar-Obergrenze je Organisation)",[11,1009,1010,1011,1014,1015,1018,1019,1022,1023,1026,1027,1030],{},"Ein Gate vor dem Aufruf (",[19,1012,1013],{},"convex\u002Fanalytics\u002FspendBudget.ts","), das die LLM-Ausgaben in Dollar je Organisation deckelt — zusätzlich zu den Rate Limits nach Aufrufanzahl. Die Ausgaben werden aus ",[19,1016,1017],{},"analytics\u002FllmUsage"," + ",[19,1020,1021],{},"lib\u002Fllm\u002Fpricing"," aggregiert. Ist eine Obergrenze erreicht, schaltet das Gate ",[40,1024,1025],{},"fail-closed",": Der autonome Agent fällt auf reine Entwürfe zurück (E-Mail geht nie verloren — sie wird zur menschlichen Prüfung geleitet), und beratende, von Nutzenden ausgelöste KI wird pausiert, sobald der verbleibende Spielraum in die Reserve rutscht. Alle vier Variablen sind standardmäßig nicht gesetzt bzw. ",[19,1028,1029],{},"0",", wodurch das Gate wirkungslos ist.",[136,1032,1033,1044],{},[139,1034,1035],{},[142,1036,1037,1039,1042],{},[145,1038,147],{},[145,1040,1041],{},"Bedeutung",[145,1043,284],{},[155,1045,1046,1062,1077,1099],{},[142,1047,1048,1053,1059],{},[160,1049,1050],{},[19,1051,1052],{},"AI_SPEND_DAILY_BUDGET_USD",[160,1054,1055,1056,1058],{},"Tägliche USD-Obergrenze für alle LLM-Ausgaben einer Organisation. Nicht gesetzt oder ",[19,1057,1029],{}," ⇒ kein Tageslimit (das Gate ist für den Tag wirkungslos).",[160,1060,1061],{},"nicht gesetzt (kein Limit)",[142,1063,1064,1069,1075],{},[160,1065,1066],{},[19,1067,1068],{},"AI_SPEND_MONTHLY_BUDGET_USD",[160,1070,1071,1072,1074],{},"Monatliche USD-Obergrenze für alle LLM-Ausgaben einer Organisation. Nicht gesetzt oder ",[19,1073,1029],{}," ⇒ kein Monatslimit.",[160,1076,1061],{},[142,1078,1079,1084,1094],{},[160,1080,1081],{},[19,1082,1083],{},"AI_SPEND_WARN_FRACTION",[160,1085,1086,1087,1089,1090,1093],{},"Anteil einer Obergrenze (",[19,1088,1029],{},"–",[19,1091,1092],{},"1","], ab dem im Admin-Dashboard vor der harten Sperre gewarnt wird.",[160,1095,1096],{},[19,1097,1098],{},"0.8",[142,1100,1101,1106,1114],{},[160,1102,1103],{},[19,1104,1105],{},"AI_SPEND_ADVISORY_RESERVE_FRACTION",[160,1107,1108,1109,1089,1111,1113],{},"Anteil einer Obergrenze [",[19,1110,1029],{},[19,1112,1092],{},"), der für das autonome Entwerfen reserviert ist; beratende (von Nutzenden ausgelöste) KI wird pausiert, sobald der verbleibende Spielraum in diese Reserve rutscht, während der autonome Pfad weiter entwirft.",[160,1115,1116],{},[19,1117,1118],{},"0.2",[131,1120,1122,1123,937],{"id":1121},"optional-private-e-mail-imap-flag-postbox","Optional: Private E-Mail \u002F IMAP (Flag ",[19,1124,1125],{},"postbox",[11,1127,1128,1129,1132,1133,1135],{},"Der IMAP-Server (",[19,1130,1131],{},"apps\u002Fimap",") liest diese Werte beim Start. Nur relevant, wenn das Flag ",[19,1134,1125],{}," aktiv ist.",[100,1137,1139],{"className":102,"code":1138,"language":104,"meta":105,"style":105},"# IMAP_PORT=993\n# IMAP_LISTEN=0.0.0.0\n# IMAP_GREETING_HOST=mail.example.com\n# IMAP_TLS_CERT_FILE=\u002Fopt\u002Fowlat\u002Fcerts\u002Fdefault.crt\n# IMAP_TLS_KEY_FILE=\u002Fopt\u002Fowlat\u002Fcerts\u002Fdefault.key\n# TLS_CERT_DIR=\u002Fopt\u002Fowlat\u002Fcerts        # fallback if IMAP_TLS_* not set\n# REDIS_URL=                           # see note below\n",[19,1140,1141,1145,1150,1155,1160,1165,1170],{"__ignoreMap":105},[109,1142,1143],{"class":111,"line":112},[109,1144,910],{"class":873},[109,1146,1147],{"class":111,"line":877},[109,1148,1149],{"class":873},"# IMAP_LISTEN=0.0.0.0\n",[109,1151,1152],{"class":111,"line":883},[109,1153,1154],{"class":873},"# IMAP_GREETING_HOST=mail.example.com\n",[109,1156,1157],{"class":111,"line":889},[109,1158,1159],{"class":873},"# IMAP_TLS_CERT_FILE=\u002Fopt\u002Fowlat\u002Fcerts\u002Fdefault.crt\n",[109,1161,1162],{"class":111,"line":895},[109,1163,1164],{"class":873},"# IMAP_TLS_KEY_FILE=\u002Fopt\u002Fowlat\u002Fcerts\u002Fdefault.key\n",[109,1166,1167],{"class":111,"line":901},[109,1168,1169],{"class":873},"# TLS_CERT_DIR=\u002Fopt\u002Fowlat\u002Fcerts        # fallback if IMAP_TLS_* not set\n",[109,1171,1172],{"class":111,"line":907},[109,1173,1174],{"class":873},"# REDIS_URL=                           # see note below\n",[11,1176,1177,1178,1181,1182,1184,1185,1188,1189,1192,1193,1196,1197,201,1199,1201,1202,1204,1205,1208],{},"Der IMAP-Server authentifiziert sich ",[40,1179,1180],{},"gegenüber Convex"," mit ",[19,1183,224],{}," (er setzt die Admin-Authentifizierung an einem ",[19,1186,1187],{},"ConvexHttpClient"," und ruft die Funktion ",[19,1190,1191],{},"mail\u002FappPasswords:verify"," direkt auf — ",[19,1194,1195],{},"apps\u002Fimap\u002Fsrc\u002Fconvex.ts","). Er liest ",[19,1198,260],{},[40,1200,680],{},". Sein Log-Level stammt aus ",[19,1203,608],{}," (die VPS-Compose-Datei bildet ",[19,1206,1207],{},"IMAP_LOG_LEVEL"," darauf ab).",[32,1210,1213],{"type":1211,"title":1212},"warning","IMAP-Rate-Limiting scheitert ohne Redis fail-open",[11,1214,1215,1218,1219,1222,1223,201,1226,1228,1229,649,1232,1235,1236,1238],{},[19,1216,1217],{},"REDIS_URL"," ist am ausgelieferten ",[19,1220,1221],{},"imap","-Dienst in ",[19,1224,1225],{},"infra\u002Ftemplates\u002Fdocker-compose.vps.yml",[40,1227,680],{}," gesetzt. Ist die Variable nicht gesetzt, ist der Rate Limiter für die IMAP-Authentifizierung deaktiviert und schaltet ",[40,1230,1231],{},"fail-open",[19,1233,1234],{},"apps\u002Fimap\u002Fsrc\u002Findex.ts","). Setzen Sie ",[19,1237,1217],{}," ausdrücklich, wenn Sie eine Drosselung der Anmeldungen am IMAP-Listener benötigen.",[131,1240,1242,1243,937],{"id":1241},"optional-mail-sync-externe-postfächer-flag-mailexternal","Optional: Mail-Sync — externe Postfächer (Flag ",[19,1244,1245],{},"mail.external",[11,1247,1248,1249,1251,1252,1255,1256,1258,1259,1262],{},"Ist das Flag ",[19,1250,1245],{}," aktiv, können Nutzerinnen und Nutzer eigene IMAP-\u002FSMTP-Konten verbinden. Convex übergibt diese an einen separaten ",[40,1253,1254],{},"Mail-Sync","-Worker (",[19,1257,1225],{},", Compose-Profil ",[19,1260,1261],{},"external-mail","). Convex erreicht den Worker auf demselben Weg wie die MTA — über Deployment-Umgebungsvariablen, die im Convex-Dashboard gesetzt werden:",[136,1264,1265,1273],{},[139,1266,1267],{},[142,1268,1269,1271],{},[145,1270,147],{},[145,1272,150],{},[155,1274,1275,1304],{},[142,1276,1277,1282],{},[160,1278,1279],{},[19,1280,1281],{},"MAIL_SYNC_API_URL",[160,1283,1284,1285,1288,1289,1292,1293,1296,1297,1300,1301,182],{},"Basis-URL der internen ",[19,1286,1287],{},"\u002Fsend","- + ",[19,1290,1291],{},"\u002Ftest","-API des Mail-Sync-Workers (z. B. ",[19,1294,1295],{},"http:\u002F\u002Fmail-sync:3200","). Ist sie nicht gesetzt, wird jede Empfängerin und jeder Empfänger eines Versands über ein externes Konto auf einen Zustellfehler überführt (errorCode ",[19,1298,1299],{},"EXTERNAL_NOT_CONFIGURED","), statt versendet zu werden (",[19,1302,1303],{},"apps\u002Fapi\u002Fconvex\u002Fmail\u002Foutbound.ts",[142,1305,1306,1311],{},[160,1307,1308],{},[19,1309,1310],{},"MAIL_SYNC_API_KEY",[160,1312,1313],{},"Gemeinsamer API-Schlüssel, mit dem sich Convex gegenüber dem Mail-Sync-Worker authentifiziert.",[131,1315,1317],{"id":1316},"optional-eingehende-kanal-webhooks-sms-whatsapp-generisch","Optional: Eingehende Kanal-Webhooks (SMS \u002F WhatsApp \u002F generisch)",[11,1319,1320,1321,1324,1325,1329],{},"Diese Geheimnisse authentifizieren eingehende Webhook-Callbacks von Drittanbieter-Kanalprovidern. Sie werden von den Webhook-Adaptern in ",[19,1322,1323],{},"apps\u002Fapi\u002Fconvex\u002Fwebhooks\u002Fadapters\u002F"," gelesen. (Nur eingehend — der ausgehende SMS-\u002FWhatsApp-Versand ist nicht durchgängig verdrahtet; siehe ",[15,1326,1328],{"href":1327},"\u002Fguide\u002Fchannels","Communication Channels",".)",[136,1331,1332,1340],{},[139,1333,1334],{},[142,1335,1336,1338],{},[145,1337,147],{},[145,1339,150],{},[155,1341,1342,1360,1377,1393],{},[142,1343,1344,1349],{},[160,1345,1346],{},[19,1347,1348],{},"TWILIO_AUTH_TOKEN",[160,1350,1351,1352,1355,1356,1359],{},"Validiert ",[19,1353,1354],{},"X-Twilio-Signature"," bei eingehenden SMS-\u002FVoice-Webhooks (",[19,1357,1358],{},"webhooks\u002Fadapters\u002Ftwilio.ts","). Der Endpunkt weist Anfragen ab, wenn der Wert fehlt.",[142,1361,1362,1367],{},[160,1363,1364],{},[19,1365,1366],{},"META_APP_SECRET",[160,1368,1369,1370,1373,1374,182],{},"Validiert den HMAC ",[19,1371,1372],{},"X-Hub-Signature-256"," bei eingehenden WhatsApp-\u002FMessenger-Webhooks (",[19,1375,1376],{},"webhooks\u002Fadapters\u002Fmeta.ts",[142,1378,1379,1384],{},[160,1380,1381],{},[19,1382,1383],{},"META_VERIFY_TOKEN",[160,1385,1386,1387,1390,1391,182],{},"Muss beim Webhook-Abonnement-Challenge von Meta mit ",[19,1388,1389],{},"hub.verify_token"," übereinstimmen (",[19,1392,1376],{},[142,1394,1395,1400],{},[160,1396,1397],{},[19,1398,1399],{},"GENERIC_WEBHOOK_SECRET",[160,1401,1402,1403,1406,1407,182],{},"Wird mit dem Header ",[19,1404,1405],{},"x-webhook-secret"," am generischen Adapter für eingehende Kanäle verglichen (",[19,1408,1409],{},"webhooks\u002Fadapters\u002Fgeneric.ts",[131,1411,1413],{"id":1412},"optional-weitere-convex-backend-variablen","Optional: Weitere Convex-Backend-Variablen",[11,1415,1416,1417,1419],{},"Einige weitere Variablen werden über ",[19,1418,766],{}," gelesen und im Convex-Dashboard gesetzt. Keine davon ist für ein einfaches Self-Hosting erforderlich:",[136,1421,1422,1432],{},[139,1423,1424],{},[142,1425,1426,1428,1430],{},[145,1427,147],{},[145,1429,150],{},[145,1431,284],{},[155,1433,1434,1469,1486,1501,1520,1559,1583,1604,1643,1660,1695,1718,1753,1792,1823,1841,1860,1896,1931,1946,1970,1987,2015],{},[142,1435,1436,1441,1466],{},[160,1437,1438],{},[19,1439,1440],{},"OWLAT_DEV_MODE",[160,1442,1443,1444,175,1446,175,1448,1451,1452,1455,1456,1459,1460,649,1463,182],{},"Schaltet die nur für die Entwicklung gedachten Endpunkte frei (",[19,1445,178],{},[19,1447,181],{},[19,1449,1450],{},"forceVerifyDomain","). ",[40,1453,1454],{},"Fail-closed",": Bleibt die Variable in einem Produktions-Deployment ungesetzt, weisen diese Endpunkte Anfragen ab (",[19,1457,1458],{},"devShortcuts\u002F_guard.ts","). Für Demo-Inhalte in einer echten Installation wird sie nicht benötigt — verwenden Sie ",[19,1461,1462],{},"owlat sample-data install",[19,1464,1465],{},"\u002Fsample-data\u002F*",[160,1467,1468],{},"nicht gesetzt (aus)",[142,1470,1471,1476,1482],{},[160,1472,1473],{},[19,1474,1475],{},"ALLOWED_ORIGINS",[160,1477,1478,1479,182],{},"Kommagetrennte CORS-Allowlist für die Convex-HTTP-API (",[19,1480,1481],{},"lib\u002Fcors.ts",[160,1483,1484],{},[19,1485,347],{},[142,1487,1488,1493,1499],{},[160,1489,1490],{},[19,1491,1492],{},"ADMIN_SITE_URL",[160,1494,1495,1496,182],{},"Optionale alternative Site-URL, der für Auth-Weiterleitungen vertraut wird (",[19,1497,1498],{},"auth\u002Fauth.ts",[160,1500,397],{},[142,1502,1503,1508,1518],{},[160,1504,1505],{},[19,1506,1507],{},"MTA_SPF_INCLUDE",[160,1509,1510,1511,1514,1515,182],{},"SPF-",[19,1512,1513],{},"include:","-Host, der in den generierten DNS-Einträgen ausgegeben wird. Ist die Variable nicht gesetzt, entfällt der SPF-Eintrag (die DKIM+DMARC-Ausrichtung funktioniert weiterhin) (",[19,1516,1517],{},"domains\u002Fproviders\u002Fmta\u002Findex.ts",[160,1519,397],{},[142,1521,1522,1527,1555],{},[160,1523,1524],{},[19,1525,1526],{},"SPF_QUALIFIER",[160,1528,1529,1530,1533,1534,1537,1538,1541,1542,631,1545,1548,1549,1551,1552,182],{},"Qualifizierer des abschließenden ",[19,1531,1532],{},"all","-Mechanismus in den generierten SPF-Einträgen: ",[19,1535,1536],{},"~all"," (Soft-Fail, der sichere Standard, solange sich Ihr autorisierter IP-Bestand noch einpendelt), ",[19,1539,1540],{},"-all"," (Hard-Fail, sobald der IP-Bestand stabil ist), ",[19,1543,1544],{},"?all",[19,1546,1547],{},"+all",". Ungültig oder nicht gesetzt fällt auf ",[19,1550,1536],{}," zurück (RFC 7208 §5.1) (",[19,1553,1554],{},"domains\u002Fspf.ts",[160,1556,1557],{},[19,1558,1536],{},[142,1560,1561,1566,1581],{},[160,1562,1563],{},[19,1564,1565],{},"MTA_RETURN_PATH_DOMAIN",[160,1567,1568,1569,1571,1572,1574,1575,1578,1579,182],{},"VERP-Return-Path-Domain für Bounces (entspricht ",[19,1570,449],{}," der MTA, z. B. ",[19,1573,455],{},"). Gemeinsam mit ",[19,1576,1577],{},"MTA_IP_POOLS"," gesetzt, enthält das generierte DNS-Bündel einen Return-Path-SPF-TXT-Eintrag, der die Pool-IPs autorisiert, sodass der Bounce-Envelope SPF besteht (",[19,1580,1517],{},[160,1582,397],{},[142,1584,1585,1590,1602],{},[160,1586,1587],{},[19,1588,1589],{},"MTA_BOUNCE_VERP_KEY",[160,1591,1592,1593,1595,1596,1598,1599,182],{},"Der VERP-Signierschlüssel der MTA (derselbe Wert wie ",[19,1594,467],{}," der MTA). Setzen Sie ihn zusammen mit ",[19,1597,1565],{},", damit RELAY-Sendungen Owlats eigenen VERP-Envelope-Absender tragen; so kommen Bounces, die ein Drittanbieter-Relay erzeugt, beim Bounce-Server der eingebauten MTA an, und der Relay-Arm liefert Bounce-Daten, die mit der direkten MX-Zustellung vergleichbar sind. Additiv: Ist die Variable nicht gesetzt (oder ist nicht erwiesen, dass das Relay einen eigenen Return-Path respektiert), behalten Relay-Sendungen den Envelope-Absender des Composers, und dieser Transport wird schlicht als „degraded measurement“ bewertet — blockiert wird nichts (",[19,1600,1601],{},"lib\u002FsendProviders\u002Fsmtp\u002Findex.ts",[160,1603,397],{},[142,1605,1606,1611,1641],{},[160,1607,1608],{},[19,1609,1610],{},"MTA_RETURN_PATH_RELAY_SPF",[160,1612,1613,1614,593,1616,593,1619,593,1622,593,1625,1627,1628,1631,1632,1635,1636,1638,1639,182],{},"SPF-Mechanismus-Terme (durch Leerzeichen oder Kommas getrennt; nur ",[19,1615,1513],{},[19,1617,1618],{},"a:",[19,1620,1621],{},"mx:",[19,1623,1624],{},"ip4:",[19,1626,437],{},"), die Ihr RELAY autorisieren, mit einem Envelope-Absender ",[19,1629,1630],{},"bounce+…@\u003Creturn-path host>"," zu senden. Sie werden in den generierten Return-Path-SPF-Eintrag ausgegeben und sind erforderlich — veröffentlicht und verifiziert —, bevor eine Relay-Sendung unsere VERP-Adresse trägt: Andernfalls autorisiert der Eintrag nur den MTA-Pool, sodass ein Aufprägen auf eine Relay-Sendung genau auf dem gemessenen Arm SPF scheitern ließe und das SPF-Bein von DMARC entfernen würde. Es werden höchstens 5 Terme akzeptiert (RFC 7208 §4.6.4 veranschlagt zehn DNS-Abfragen je Auswertung, und der Eintrag verbraucht bereits einige) — Überzähliges wird verworfen, nie abgelehnt. Diese Terme ",[40,1633,1634],{},"ergänzen"," die Pool-Autorisierung, statt sie zu ersetzen, und werden daher nur ausgegeben, wenn auch ",[19,1637,1577],{}," gesetzt ist; für sich allein veröffentlicht der Wert nichts. Nicht gesetzt ⇒ keine Relay-Prägung, degradierte Messung, nichts blockiert (",[19,1640,1554],{},[160,1642,397],{},[142,1644,1645,1649,1658],{},[160,1646,1647],{},[19,1648,1577],{},[160,1650,1651,1652,1654,1655,1657],{},"Kommagetrennte Liste der kanonischen IP-Pool-Adressen, aus denen der Return-Path-SPF erzeugt wird (",[19,1653,1624],{}," für IPv4 und ",[19,1656,437],{}," für IPv6). Ungültige Token werden abgelehnt.",[160,1659,397],{},[142,1661,1662,1667,1693],{},[160,1663,1664],{},[19,1665,1666],{},"SNDS_DATA_FEED_URLS",[160,1668,1669,1670,1673,1674,1677,1678,1681,1682,1685,1686,1689,1690,1692],{},"Durch Kommas oder Leerraum getrennte Feed-URLs des ",[40,1671,1672],{},"Automated Data Access"," von Microsoft SNDS (nur ",[19,1675,1676],{},"https","), eine je registriertem IP-Bereich. Werden alle sechs Stunden abgefragt und in ",[40,1679,1680],{},"Bänder"," von Beschwerden je IP und Tag, Filterergebnisse und Spamtrap-Treffer überführt (",[19,1683,1684],{},"delivery\u002FsndsPoll.ts","). Jede URL ist eine Bearer-Berechtigung für Ihre SNDS-Daten — halten Sie sie geheim. ",[40,1687,1688],{},"Rein additiv",": Nicht gesetzt ist eine unterstützte Konfiguration; die Microsoft-Rampe stützt sich dann auf die Ergebnisse der eigenen Sendungen, mit doppelter Verweildauer und einer um eine Phase niedrigeren Obergrenze, und nichts erzeugt Fehler oder Nachfragen. Ist ",[19,1691,1577],{}," gesetzt, wirkt es als Allowlist, sodass Feed-Zeilen für Adressen, die Ihnen nicht gehören, verworfen werden.",[160,1694,397],{},[142,1696,1697,1702,1716],{},[160,1698,1699],{},[19,1700,1701],{},"OUTBOUND_DKIM_DOMAIN",[160,1703,1704,1705,1708,1709,1712,1713,182],{},"Die DKIM-",[19,1706,1707],{},"d=","-Domain, mit der der AKTIVE Transport signiert, wenn es nicht die From-Domain der jeweiligen Nachricht ist. Die eingebaute MTA signiert je From-Domain (Variable ungesetzt lassen); setzen Sie hier die Signierdomain Ihres Relays (z. B. ",[19,1710,1711],{},"sendgrid.net","), damit der Guard für die ausgehende DMARC-Ausrichtung warnen kann, wenn die Signatur eines Relays nicht zu Ihren Sendedomains passt (",[19,1714,1715],{},"lib\u002FoutboundAlignment.ts",[160,1717,397],{},[142,1719,1720,1725,1751],{},[160,1721,1722],{},[19,1723,1724],{},"MTA_DMARC_RUA",[160,1726,1727,1728,1731,1732,1735,1736,1739,1740,1743,1744,1747,1748,182],{},"Reporting-URI für DMARC-Aggregatberichte (",[19,1729,1730],{},"rua","), die im generierten ",[19,1733,1734],{},"_dmarc","-Eintrag ausgegeben wird, z. B. ",[19,1737,1738],{},"mailto:dmarc-reports@yourdomain.com",". Ist die Variable nicht gesetzt, trägt der Eintrag kein ",[19,1741,1742],{},"rua=","-Tag — Owlat richtet kein kundenspezifisches Postfach ",[19,1745,1746],{},"dmarc@\u003Cdomain>"," ein, sodass Berichte sonst ungelesen blieben (",[19,1749,1750],{},"domains\u002Fdmarc.ts",[160,1752,397],{},[142,1754,1755,1760,1790],{},[160,1756,1757],{},[19,1758,1759],{},"MTA_TLSRPT_RUA",[160,1761,1762,1763,1765,1766,1769,1770,1773,1774,631,1777,1780,1781,1784,1785,649,1787,182],{},"Ziel für SMTP TLS Reporting (",[19,1764,1730],{},"), das im generierten TXT-Eintrag ",[19,1767,1768],{},"_smtp._tls"," ausgegeben wird (",[19,1771,1772],{},"v=TLSRPTv1; rua=…",", RFC 8460 §3), z. B. ",[19,1775,1776],{},"mailto:tls-reports@yourdomain.com",[19,1778,1779],{},"https:\u002F\u002Fyourdomain.com\u002Ftlsrpt",". Ermöglicht es Empfängern, Fehler bei der TLS-Aushandlung bei der Zustellung ",[40,1782,1783],{},"an"," Ihre Domain zu melden. Ist die Variable nicht gesetzt, entfällt der Eintrag ",[19,1786,1768],{},[19,1788,1789],{},"domains\u002FtlsRpt.ts",[160,1791,397],{},[142,1793,1794,1799,1821],{},[160,1795,1796],{},[19,1797,1798],{},"MTA_BIMI_LOGO_URL",[160,1800,1801,1802,1805,1806,1809,1810,1813,1814,1816,1817,1820],{},"HTTPS-URL Ihres Markenlogos im Format SVG Tiny PS, ausgegeben als ",[19,1803,1804],{},"l=","-Tag des BIMI-Eintrags, den der Domain-Assistent ANBIETET, sobald DMARC einer Sendedomain auf ",[19,1807,1808],{},"p=quarantine"," oder strenger steht (",[19,1811,1812],{},"domains\u002Fbimi.ts","). Nicht gesetzt ⇒ der Assistent erklärt BIMI und die VMC-Anforderung und generiert keinen Eintrag; es ist nie ein Blocker, keine Warnung und keine Setup-Mahnung. Ein Wert, der keine schlichte ",[19,1815,710],{},"-URL ist (oder der Leerraum oder ",[19,1818,1819],{},";"," enthält), wird abgelehnt und auf dem Bildschirm benannt, statt veröffentlicht zu werden.",[160,1822,397],{},[142,1824,1825,1830,1839],{},[160,1826,1827],{},[19,1828,1829],{},"MTA_BIMI_VMC_URL",[160,1831,1832,1833,1836,1837,87],{},"HTTPS-URL des PEM Ihres Verified Mark Certificate, ausgegeben als ",[19,1834,1835],{},"a=","-Tag des BIMI-Eintrags. Gmail und Apple Mail zeigen ein BIMI-Logo nur mit VMC; andere Empfänger zeigen es allein aufgrund des Eintrags. Gleiche Validierung und gleiche Optionalität wie bei ",[19,1838,1798],{},[160,1840,397],{},[142,1842,1843,1848,1855],{},[160,1844,1845],{},[19,1846,1847],{},"MTA_BIMI_SELECTOR",[160,1849,1850,1851,1854],{},"Selektor-Label für den Host des BIMI-Eintrags (",[19,1852,1853],{},"\u003Cselector>._bimi.\u003Cdomain>","). Ein Wert, der kein einzelnes DNS-Label ist, fällt auf den Standard zurück.",[160,1856,1857],{},[19,1858,1859],{},"default",[142,1861,1862,1867,1892],{},[160,1863,1864],{},[19,1865,1866],{},"OUTBOUND_TLS_MODE",[160,1868,1869,1870,1873,1874,1877,1878,1881,1882,1885,1886,1889,1890,182],{},"Ausgehende TLS-Haltung für die direkte MX-Zustellung der eingebauten MTA: ",[19,1871,1872],{},"opportunistic"," (verschlüsseln, wenn angeboten, nie bei fehlendem\u002Fungültigem TLS bouncen — der Standard, Byte für Byte identisch mit dem bisherigen Verhalten), ",[19,1875,1876],{},"require"," (STARTTLS-Upgrade verpflichtend) oder ",[19,1879,1880],{},"require-verified"," (TLS ",[40,1883,1884],{},"und"," ein gültiges Zertifikat verpflichtend — kann E-Mails an Empfänger mit defektem TLS bouncen). Wird vom Transport-Editor unter „Zustellung“ geschrieben und ihm über ",[19,1887,1888],{},"delivery\u002Fstatus.ts:getStatus"," schreibgeschützt angezeigt; die MTA liest den Wert aus ihrer eigenen Konfiguration (",[19,1891,676],{},[160,1893,1894],{},[19,1895,1872],{},[142,1897,1898,1903,1928],{},[160,1899,1900],{},[19,1901,1902],{},"RATE_LIMIT_TRUSTED_PROXY",[160,1904,1905,1906,1909,1910,749,1913,1916,1917,1920,1921,1924,1925,182],{},"Welchem Forwarded-Header beim Rate Limiting je IP an öffentlichen Endpunkten vertraut wird: ",[19,1907,1908],{},"cloudflare"," (CF-Connecting-IP), ",[19,1911,1912],{},"xforwarded",[19,1914,1915],{},"xforwarded:\u003Chops>"," (X-Forwarded-For) oder ",[19,1918,1919],{},"xrealip"," (X-Real-IP). ",[40,1922,1923],{},"Sicherheitsrelevant — lassen Sie den Wert ungesetzt, sofern das Convex-Backend nicht hinter einem vertrauenswürdigen Proxy steht."," Ist er nicht gesetzt, wird Forwarded-Headern NICHT vertraut, und alle öffentlichen Aufrufer teilen sich einen Rate-Limit-Bucket, sodass ein gefälschter Header keine Buckets vervielfachen kann (",[19,1926,1927],{},"publicRateLimit.getClientIp",[160,1929,1930],{},"nicht gesetzt (Headern wird nicht vertraut)",[142,1932,1933,1938,1944],{},[160,1934,1935],{},[19,1936,1937],{},"GITHUB_WEBHOOK_SECRET",[160,1939,1940,1941,182],{},"HMAC-Geheimnis, das GitHub-Webhooks zum Mergen von PRs für die Code-Work-Funktion validiert (",[19,1942,1943],{},"webhooks\u002FgithubHttp.ts",[160,1945,397],{},[142,1947,1948,1953,1968],{},[160,1949,1950],{},[19,1951,1952],{},"OPENROUTER_API_KEY",[160,1954,1955,1956,1959,1960,1963,1964,1967],{},"Alternativer API-Schlüssel für den LLM-Provider OpenRouter; wird vom einheitlichen LLM-Resolver (",[19,1957,1958],{},"lib\u002FllmProvider.ts",") nach ",[19,1961,1962],{},"LLM_API_KEY"," und vor ",[19,1965,1966],{},"OPENAI_API_KEY"," verwendet.",[160,1969,397],{},[142,1971,1972,1977,1985],{},[160,1973,1974],{},[19,1975,1976],{},"LLM_COMPLEXITY_ROUTING",[160,1978,1979,1980,1982,1983,182],{},"Auf ",[19,1981,1092],{}," gesetzt, verteilt diese Variable jede LLM-Anfrage anhand der geschätzten Komplexität zwischen dem schnellen und dem leistungsfähigen Modell, statt immer eine Stufe zu verwenden (",[19,1984,1958],{},[160,1986,1468],{},[142,1988,1989,1994,2012],{},[160,1990,1991],{},[19,1992,1993],{},"CALENDAR_FREEBUSY_ICS_URL",[160,1995,1996,1997,2000,2001,175,2004,2007,2008,2011],{},"Schreibgeschützte Frei\u002FBelegt-Quelle für Terminvorschläge in Antworten: eine iCalendar-Abonnement-URL (",[19,1998,1999],{},".ics","), die das Deployment serverseitig abruft, um die offenen Zeitfenster der Inhaberin oder des Inhabers zu berechnen und bei Terminabsicht in Antworten einzufügen (",[19,2002,2003],{},"mail\u002FaiScheduling.ts",[19,2005,2006],{},"mail\u002Favailability.ts","). Wird innerhalb des Deployments abgerufen, um die Datenschutzhaltung zu wahren. ",[40,2009,2010],{},"Fail-soft",": nicht gesetzt, nicht erreichbar oder nicht parsebar → exakt das heutige Verhalten, das allein auf Formulierungen der absendenden Person beruht.",[160,2013,2014],{},"nicht gesetzt (Funktion aus)",[142,2016,2017,2022,2029],{},[160,2018,2019],{},[19,2020,2021],{},"CALENDAR_TIMEZONE",[160,2023,2024,2025,2028],{},"IANA-Zeitzone (z. B. ",[19,2026,2027],{},"Europe\u002FBerlin","), in der die offenen Frei\u002FBelegt-Zeitfenster in Terminantworten dargestellt werden.",[160,2030,2031],{},[19,2032,2033],{},"UTC",[2035,2036],"hr",{},[32,2038,2040],{"type":34,"title":2039},"Keine Abrechnungs- oder Control-Plane-Variablen in diesem Repository",[11,2041,2042,2043,2045,2046,2048,2049,2051,2052,2055],{},"Dieses OSS-Repository enthält ",[40,2044,762],{}," Variablen für Stripe-Abrechnung, Tarifverwaltung oder Provisionierung — diese sind zusammen mit der Nest-Control-Plane in das separate Repository der verwalteten Cloud gewandert. Die einzige nur für Hosted gedachte Variable, die hier überlebt, ist ",[19,2047,785],{}," (ein ",[19,2050,25],{},"-Flag, das das Setup-CLI schreibt und das in diesem OSS-Repository wirkungslos ist) sowie das optionale Analytics-Ziel ",[19,2053,2054],{},"CONTROL_PLANE_URL","; Self-Hoster lassen beide ungesetzt. Die folgenden Abschnitte beschreiben allgemeine Konfiguration, die für jedes Deployment gilt.",[89,2057,2059],{"id":2058},"wo-variablen-gesetzt-werden","Wo Variablen gesetzt werden",[11,2061,2062,2065,2066,2069,2070,2073],{},[40,2063,2064],{},"Convex-Backend"," (alle ",[19,2067,2068],{},"process.env","-Referenzen in ",[19,2071,2072],{},"apps\u002Fapi\u002F","):",[100,2075,2079],{"className":2076,"code":2077,"language":2078,"meta":105,"style":105},"language-bash shiki shiki-themes github-light github-dark-dimmed","npx convex env set VAR_NAME value\n","bash",[19,2080,2081],{"__ignoreMap":105},[109,2082,2083,2086,2089,2092,2095,2098],{"class":111,"line":112},[109,2084,2085],{"class":115},"npx",[109,2087,2088],{"class":119}," convex",[109,2090,2091],{"class":119}," env",[109,2093,2094],{"class":119}," set",[109,2096,2097],{"class":119}," VAR_NAME",[109,2099,2100],{"class":119}," value\n",[11,2102,2103,2104,2110],{},"Oder setzen Sie sie im ",[15,2105,2109],{"href":2106,"rel":2107},"https:\u002F\u002Fdashboard.convex.dev",[2108],"nofollow","Convex-Dashboard"," unter „Settings > Environment Variables“ Ihres Deployments.",[11,2112,2113,649,2116,2073],{},[40,2114,2115],{},"Nuxt-Frontend",[19,2117,2118],{},"apps\u002Fweb\u002F.env",[100,2120,2122],{"className":102,"code":2121,"language":104,"meta":105,"style":105},"NUXT_PUBLIC_CONVEX_URL=https:\u002F\u002Fyour-deployment.convex.cloud\nNUXT_PUBLIC_CONVEX_SITE_URL=https:\u002F\u002Fyour-deployment.convex.site\nNUXT_PUBLIC_SITE_URL=http:\u002F\u002Flocalhost:3000\n",[19,2123,2124,2136,2145],{"__ignoreMap":105},[109,2125,2126,2129,2133],{"class":111,"line":112},[109,2127,293],{"class":2128},"sYgZi",[109,2130,2132],{"class":2131},"s7YZ4","=",[109,2134,2135],{"class":119},"https:\u002F\u002Fyour-deployment.convex.cloud\n",[109,2137,2138,2140,2142],{"class":111,"line":877},[109,2139,308],{"class":2128},[109,2141,2132],{"class":2131},[109,2143,2144],{"class":119},"https:\u002F\u002Fyour-deployment.convex.site\n",[109,2146,2147,2149,2151],{"class":111,"line":883},[109,2148,339],{"class":2128},[109,2150,2132],{"class":2131},[109,2152,2153],{"class":119},"http:\u002F\u002Flocalhost:3000\n",[89,2155,2157],{"id":2156},"e-mail-versand","E-Mail-Versand",[131,2159,2161],{"id":2160},"providerauswahl","Providerauswahl",[11,2163,2164,2165,2168,2169,2172,2173,2176,2177,2180,2181,2185,2186,2189],{},"Welche Sendetransporte existieren, was jeder von ihnen benötigt und was er kann, wird ",[40,2166,2167],{},"genau einmal"," deklariert, in ",[19,2170,2171],{},"packages\u002Fshared\u002Fsrc\u002FsendProviderCatalog.ts"," (ADR-0055). Dieser Abschnitt gibt diese Deklaration wieder und nichts sonst: ",[19,2174,2175],{},"apps\u002Fdocs\u002F__tests__\u002FproviderCatalogDocs.test.ts"," liest beides und schlägt fehl, wenn ein Kind, eine erforderliche Variable — oder ein ganzer Provider — hier fehlt. Setzen Sie ",[19,2178,2179],{},"EMAIL_PROVIDER"," auf einen Wert aus der ersten Spalte, um jede Sendung über dieses Kind zu leiten; eine ",[15,2182,2184],{"href":2183},"\u002Fdeveloper\u002Fproviders#routing--health","Provider-Route"," je Organisation überschreibt das pro Nachrichtentyp. Es gibt ",[40,2187,2188],{},"keinen impliziten Standard",": Die Variable ungesetzt zu lassen bedeutet nicht „die MTA verwenden“ — die Auflösung ist fail-closed, sodass eine Instanz ohne Routenkonfiguration und ohne Wert hier ihre Sendungen verweigert, statt an eine Phantom-MTA zu übergeben.",[136,2191,2192,2212],{},[139,2193,2194],{},[142,2195,2196,2200,2203,2206,2209],{},[145,2197,2198],{},[19,2199,2179],{},[145,2201,2202],{},"Provider",[145,2204,2205],{},"Erforderlich",[145,2207,2208],{},"Optional",[145,2210,2211],{},"Einrichtung",[155,2213,2214,2246,2281,2306,2341,2372],{},[142,2215,2216,2221,2227,2234,2240],{},[160,2217,2218],{},[19,2219,2220],{},"mta",[160,2222,2223,2224,2226],{},"Owlat MTA — der eingebaute Sender; damit wird ",[19,2225,745],{}," ausgeliefert",[160,2228,2229,175,2232],{},[19,2230,2231],{},"MTA_API_URL",[19,2233,245],{},[160,2235,2236,175,2238],{},[19,2237,1866],{},[19,2239,260],{},[160,2241,2242],{},[15,2243,2245],{"href":2244},"#custom-mta","Custom MTA",[142,2247,2248,2253,2256,2267,2275],{},[160,2249,2250],{},[19,2251,2252],{},"ses",[160,2254,2255],{},"Amazon SES",[160,2257,2258,175,2261,175,2264],{},[19,2259,2260],{},"AWS_SES_REGION",[19,2262,2263],{},"AWS_SES_ACCESS_KEY_ID",[19,2265,2266],{},"AWS_SES_SECRET_ACCESS_KEY",[160,2268,2269,175,2272],{},[19,2270,2271],{},"SES_CONFIGURATION_SET",[19,2273,2274],{},"SES_SNS_TOPIC_ARN",[160,2276,2277],{},[15,2278,2280],{"href":2279},"#aws-ses","AWS SES",[142,2282,2283,2288,2291,2296,2301],{},[160,2284,2285],{},[19,2286,2287],{},"resend",[160,2289,2290],{},"Resend",[160,2292,2293],{},[19,2294,2295],{},"RESEND_API_KEY",[160,2297,2298],{},[19,2299,2300],{},"RESEND_WEBHOOK_SECRET",[160,2302,2303],{},[15,2304,2290],{"href":2305},"#resend",[142,2307,2308,2313,2316,2327,2335],{},[160,2309,2310],{},[19,2311,2312],{},"smtp",[160,2314,2315],{},"SMTP-Relay — Mailgun, Postmark, SendGrid, Brevo oder Ihr eigener Submission-Host",[160,2317,2318,175,2321,175,2324],{},[19,2319,2320],{},"SMTP_RELAY_HOST",[19,2322,2323],{},"SMTP_RELAY_USERNAME",[19,2325,2326],{},"SMTP_RELAY_PASSWORD",[160,2328,2329,175,2332],{},[19,2330,2331],{},"SMTP_RELAY_PORT",[19,2333,2334],{},"SMTP_RELAY_SECURE",[160,2336,2337],{},[15,2338,2340],{"href":2339},"#generic-smtp-relay","Generic SMTP relay",[142,2342,2343,2348,2351,2356,2367],{},[160,2344,2345],{},[19,2346,2347],{},"mandrill",[160,2349,2350],{},"Mailchimp Transactional (Mandrill)",[160,2352,2353],{},[19,2354,2355],{},"MANDRILL_API_KEY",[160,2357,2358,175,2361,175,2364],{},[19,2359,2360],{},"MANDRILL_WEBHOOK_KEY",[19,2362,2363],{},"MANDRILL_SUBACCOUNT",[19,2365,2366],{},"MANDRILL_IP_POOL",[160,2368,2369],{},[15,2370,2350],{"href":2371},"#mailchimp-transactional-mandrill",[142,2373,2374,2379,2382,2387,2392],{},[160,2375,2376],{},[19,2377,2378],{},"emailit",[160,2380,2381],{},"Emailit",[160,2383,2384],{},[19,2385,2386],{},"EMAILIT_API_KEY",[160,2388,2389],{},[19,2390,2391],{},"EMAILIT_WEBHOOK_SECRET",[160,2393,2394],{},[15,2395,2381],{"href":2396},"#emailit",[100,2398,2400],{"className":2076,"code":2399,"language":2078,"meta":105,"style":105},"npx convex env set EMAIL_PROVIDER mandrill   # or any other value from the table above\n",[19,2401,2402],{"__ignoreMap":105},[109,2403,2404,2406,2408,2410,2412,2415,2418],{"class":111,"line":112},[109,2405,2085],{"class":115},[109,2407,2088],{"class":119},[109,2409,2091],{"class":119},[109,2411,2094],{"class":119},[109,2413,2414],{"class":119}," EMAIL_PROVIDER",[109,2416,2417],{"class":119}," mandrill",[109,2419,2420],{"class":873},"   # or any other value from the table above\n",[11,2422,2423,2425,2426,2429],{},[40,2424,2205],{}," ist das Vorhandensein-Gate, das der Rest des Systems liest: Solange nicht jede Variable in dieser Zelle gesetzt ist, gilt das Kind als nicht konfiguriert — es kann nicht angesteuert werden und kommt auch nicht als Fallback-Relay für die Zustellbarkeit infrage. ",[40,2427,2428],{},"Optionale"," Variablen verfeinern einen bereits funktionierenden Transport (ein Signierschlüssel für Feedback, eine TLS-Untergrenze, ein dedizierter IP-Pool), sodass ein Convex-Deployment, das nie eine davon setzt, dennoch versendet.",[11,2431,2432,2433,2436,2437,2439,2440,2443,2444,2447],{},"Beide Spalten beschreiben die ",[40,2434,2435],{},"Convex","-Seite, die einzige Seite, von der der Katalog weiß. Ein selbst betriebener Dienst kann darüber hinaus einen eigenen Vertrag haben: ",[19,2438,260],{}," ist für das obige Gate optional und für ",[19,2441,2442],{},"apps\u002Fmta"," verpflichtend, dessen ",[19,2445,2446],{},"loadConfig()"," ohne den Wert den Start verweigert — setzen Sie ihn in einem selbst gehosteten Stack also dort, wo es die eigene Referenz der MTA weiter unten verlangt.",[11,2449,2450,2451,2454,2455,2457,2458,2461,2462,2464,2465,2468,2469,2472,2473,2476,2477,2479],{},"Die optionale Spalte darf ",[40,2452,2453],{},"mehr"," nennen als der Katalog, nie weniger, und bei SES stehen beide Fälle nebeneinander. ",[19,2456,2271],{}," wird ",[40,2459,2460],{},"vom Transport bei jeder Sendung"," gelesen: Der Adapter prägt es dem SendEmail-\u002FSendRawEmail-Befehl auf, damit die Ereignisveröffentlichung von SES das entstehende Feedback zuordnen kann — deshalb deklariert der Katalog es als optional (eine Sendung ohne den Wert funktioniert; verloren geht nur die Zuordnung, und ein späteres Setzen wirkt nur auf spätere Sendungen, nie rückwirkend). ",[19,2463,2274],{}," wird ausschließlich vom ",[40,2466,2467],{},"Feedback-Verifizierer"," gelesen (",[19,2470,2471],{},"webhooks\u002Fadapters\u002Fses.ts",") — der Sendepfad sieht es nie an, und ein Signierschlüssel ist es auch nicht, da SNS mit einem Zertifikat signiert —, weshalb kein Katalogfeld es beschreibt und diese Referenz der einzige Ort ist, an dem es festgehalten wird. Keine der beiden Variablen entscheidet darüber, ob SES senden kann, weshalb keine im Vorhandensein-Gate steht. Ein mitgelieferter Plugin-Transport deklariert seine eigenen Variablen stattdessen in seinem Contribution — sie tragen das Präfix ",[19,2474,2475],{},"PLUGIN_",", erreichen ",[19,2478,766],{}," nie und werden daher in der README des Plugins dokumentiert, nicht hier.",[131,2481,2280],{"id":2482},"aws-ses",[136,2484,2485,2493],{},[139,2486,2487],{},[142,2488,2489,2491],{},[145,2490,147],{},[145,2492,150],{},[155,2494,2495,2511,2520,2529,2538],{},[142,2496,2497,2501],{},[160,2498,2499],{},[19,2500,2260],{},[160,2502,2503,2504,175,2507,2510],{},"AWS-Region für SES (z. B. ",[19,2505,2506],{},"eu-west-1",[19,2508,2509],{},"us-east-1","). Erforderlich.",[142,2512,2513,2517],{},[160,2514,2515],{},[19,2516,2263],{},[160,2518,2519],{},"IAM-Access-Key-ID mit SES-Berechtigungen. Erforderlich.",[142,2521,2522,2526],{},[160,2523,2524],{},[19,2525,2266],{},[160,2527,2528],{},"Geheimer IAM-Access-Key. Erforderlich.",[142,2530,2531,2535],{},[160,2532,2533],{},[19,2534,2271],{},[160,2536,2537],{},"Optional. Name eines SES Configuration Set, das auf jede Sendung angewendet wird, damit dessen Ereignisveröffentlichung Bounce-, Beschwerde- und Zustellfeedback der ursprünglichen Nachricht zuordnet. Empfohlen, wenn Sie den unten beschriebenen Feedback Loop aktivieren.",[142,2539,2540,2544],{},[160,2541,2542],{},[19,2543,2274],{},[160,2545,2546,2547,2550],{},"Erforderlich, um den unten beschriebenen Feedback Loop zu aktivieren. Der exakte ARN des SNS-Topics, das SES-Feedback an ",[19,2548,2549],{},"\u002Fwebhooks\u002Fses"," zustellt. Eine gültige SNS-Signatur belegt nur, dass die Nachricht von AWS stammt, nicht aus Ihrem Topic — deshalb weist Owlat Feedback aus jedem anderen Topic ab und hält den Endpunkt geschlossen, bis dieser Wert gesetzt ist.",[1004,2552,2554],{"id":2553},"einrichtungsschritte","Einrichtungsschritte",[2556,2557,2558,2576,2582,2588,2662],"ol",{},[2559,2560,2561,2564,2565,2568,2569,666,2572,2575],"li",{},[40,2562,2563],{},"Legen Sie in AWS einen IAM-Benutzer"," mit programmatischem Zugriff und der Policy ",[19,2566,2567],{},"AmazonSESFullAccess"," an (oder mit einer eingeschränkten Policy, die ",[19,2570,2571],{},"ses:SendEmail",[19,2573,2574],{},"ses:SendRawEmail"," erlaubt).",[2559,2577,2578,2581],{},[40,2579,2580],{},"Verifizieren Sie Ihre Sendedomain"," in der SES-Konsole. SES verlangt die Domain-Verifizierung, bevor Sie E-Mails senden können.",[2559,2583,2584,2587],{},[40,2585,2586],{},"Beantragen Sie den Produktionszugang",", falls sich Ihr SES-Konto im Sandbox-Modus befindet. Der Sandbox-Modus erlaubt den Versand ausschließlich an verifizierte Adressen.",[2559,2589,2590,2593,2594],{},[40,2591,2592],{},"Setzen Sie die Umgebungsvariablen",":",[100,2595,2597],{"className":2076,"code":2596,"language":2078,"meta":105,"style":105},"npx convex env set EMAIL_PROVIDER ses\nnpx convex env set AWS_SES_REGION eu-west-1\nnpx convex env set AWS_SES_ACCESS_KEY_ID AKIA...\nnpx convex env set AWS_SES_SECRET_ACCESS_KEY ...\n",[19,2598,2599,2614,2630,2646],{"__ignoreMap":105},[109,2600,2601,2603,2605,2607,2609,2611],{"class":111,"line":112},[109,2602,2085],{"class":115},[109,2604,2088],{"class":119},[109,2606,2091],{"class":119},[109,2608,2094],{"class":119},[109,2610,2414],{"class":119},[109,2612,2613],{"class":119}," ses\n",[109,2615,2616,2618,2620,2622,2624,2627],{"class":111,"line":877},[109,2617,2085],{"class":115},[109,2619,2088],{"class":119},[109,2621,2091],{"class":119},[109,2623,2094],{"class":119},[109,2625,2626],{"class":119}," AWS_SES_REGION",[109,2628,2629],{"class":119}," eu-west-1\n",[109,2631,2632,2634,2636,2638,2640,2643],{"class":111,"line":883},[109,2633,2085],{"class":115},[109,2635,2088],{"class":119},[109,2637,2091],{"class":119},[109,2639,2094],{"class":119},[109,2641,2642],{"class":119}," AWS_SES_ACCESS_KEY_ID",[109,2644,2645],{"class":119}," AKIA...\n",[109,2647,2648,2650,2652,2654,2656,2659],{"class":111,"line":889},[109,2649,2085],{"class":115},[109,2651,2088],{"class":119},[109,2653,2091],{"class":119},[109,2655,2094],{"class":119},[109,2657,2658],{"class":119}," AWS_SES_SECRET_ACCESS_KEY",[109,2660,2661],{"class":119}," ...\n",[2559,2663,2664,2667,2668,2765,2768,2769,2772,2773,2776,2777,2780,2781,2784,2785,2787],{},[40,2665,2666],{},"(Empfohlen) Aktivieren Sie den Feedback Loop für Bounces und Beschwerden."," Ohne ihn\nnimmt SES Ihre E-Mails an, teilt Owlat aber nie mit, wenn eine Nachricht hart bounct oder\nals Spam markiert wird; diese Adressen werden dann nicht unterdrückt und Ihre\nAbsenderreputation verfällt still und leise. Owlat empfängt SES-Feedback über ein\nAmazon-SNS-Topic:",[2669,2670,2671,2690,2717,2762],"ul",{},[2559,2672,2673,2674,2677,2678,2681,2682,2685,2686,2689],{},"Legen Sie ein SNS-Topic an (z. B. ",[19,2675,2676],{},"owlat-ses-feedback",") und fügen Sie ein ",[40,2679,2680],{},"HTTPS-\nAbonnement"," hinzu, das auf ",[19,2683,2684],{},"https:\u002F\u002F\u003Cyour-convex-site-url>\u002Fwebhooks\u002Fses"," zeigt.\nOwlat bestätigt das Abonnement automatisch (es prüft die Signatur der SNS-Nachricht\nund ruft anschließend die ",[19,2687,2688],{},"SubscribeURL"," auf).",[2559,2691,2692,2693,2695,2696],{},"Setzen Sie ",[19,2694,2274],{}," auf den ARN dieses Topics, damit Owlat Feedback nur\naus Ihrem Topic akzeptiert (bis der Wert gesetzt ist, bleibt der Endpunkt geschlossen):\n",[100,2697,2699],{"className":2076,"code":2698,"language":2078,"meta":105,"style":105},"npx convex env set SES_SNS_TOPIC_ARN arn:aws:sns:eu-west-1:123456789012:owlat-ses-feedback\n",[19,2700,2701],{"__ignoreMap":105},[109,2702,2703,2705,2707,2709,2711,2714],{"class":111,"line":112},[109,2704,2085],{"class":115},[109,2706,2088],{"class":119},[109,2708,2091],{"class":119},[109,2710,2094],{"class":119},[109,2712,2713],{"class":119}," SES_SNS_TOPIC_ARN",[109,2715,2716],{"class":119}," arn:aws:sns:eu-west-1:123456789012:owlat-ses-feedback\n",[2559,2718,2719,2720,2723,2724,2727,2728,175,2731,666,2734,2737,2738,2740,2741],{},"Legen Sie in der SES-Konsole ein ",[40,2721,2722],{},"Configuration Set"," an, fügen Sie ein ",[40,2725,2726],{},"Event\nDestination"," hinzu, das die Ereignisse ",[19,2729,2730],{},"Bounce",[19,2732,2733],{},"Complaint",[19,2735,2736],{},"Delivery"," an dieses\nSNS-Topic veröffentlicht, und setzen Sie ",[19,2739,2271],{}," auf dessen Namen,\ndamit jede Sendung zugeordnet wird:\n",[100,2742,2744],{"className":2076,"code":2743,"language":2078,"meta":105,"style":105},"npx convex env set SES_CONFIGURATION_SET owlat-ses\n",[19,2745,2746],{"__ignoreMap":105},[109,2747,2748,2750,2752,2754,2756,2759],{"class":111,"line":112},[109,2749,2085],{"class":115},[109,2751,2088],{"class":119},[109,2753,2091],{"class":119},[109,2755,2094],{"class":119},[109,2757,2758],{"class":119}," SES_CONFIGURATION_SET",[109,2760,2761],{"class":119}," owlat-ses\n",[2559,2763,2764],{},"Die Zustellungsseite (Einstellungen → Zustellung) zeigt eine Live-Zeile „zuletzt\nempfangenes Ereignis“, an der Sie erkennen, dass Feedback eintrifft.",[2766,2767],"br",{},"Jede SNS-Anfrage wird fail-closed signaturgeprüft: Ihre ",[19,2770,2771],{},"SigningCertURL"," ist auf einen\nHost ",[19,2774,2775],{},"sns.*.amazonaws.com"," festgelegt, ihr ",[19,2778,2779],{},"Timestamp"," muss aktuell sein und ihr\n",[19,2782,2783],{},"TopicArn"," muss ",[19,2786,2274],{}," entsprechen, sodass gefälschtes oder erneut\neingespieltes Feedback abgewiesen wird.",[131,2789,2290],{"id":2287},[136,2791,2792,2800],{},[139,2793,2794],{},[142,2795,2796,2798],{},[145,2797,147],{},[145,2799,150],{},[155,2801,2802,2811],{},[142,2803,2804,2808],{},[160,2805,2806],{},[19,2807,2295],{},[160,2809,2810],{},"Resend-API-Schlüssel. Bei Verwendung von Resend erforderlich.",[142,2812,2813,2817],{},[160,2814,2815],{},[19,2816,2300],{},[160,2818,2819,2820,2823],{},"Signiergeheimnis für Webhooks (Format: ",[19,2821,2822],{},"whsec_\u003Cbase64>","). Für die Verfolgung von Zustellereignissen erforderlich.",[1004,2825,2554],{"id":2826},"einrichtungsschritte-1",[2556,2828,2829,2841,2847,2861],{},[2559,2830,2831,2834,2835,2840],{},[40,2832,2833],{},"Legen Sie ein Resend-Konto"," auf ",[15,2836,2839],{"href":2837,"rel":2838},"https:\u002F\u002Fresend.com",[2108],"resend.com"," an und fügen Sie Ihre Sendedomain hinzu.",[2559,2842,2843,2846],{},[40,2844,2845],{},"Erzeugen Sie einen API-Schlüssel"," im Resend-Dashboard.",[2559,2848,2849,2852,2853],{},[40,2850,2851],{},"(Optional) Richten Sie Webhooks"," für die Zustellverfolgung ein:",[2669,2854,2855,2858],{},[2559,2856,2857],{},"Legen Sie in Resend einen Webhook an, der auf den Webhook-Endpunkt Ihrer Convex-Site-URL zeigt",[2559,2859,2860],{},"Kopieren Sie das Signiergeheimnis des Webhooks",[2559,2862,2863,2593,2865],{},[40,2864,2592],{},[100,2866,2868],{"className":2076,"code":2867,"language":2078,"meta":105,"style":105},"npx convex env set EMAIL_PROVIDER resend\nnpx convex env set RESEND_API_KEY re_...\nnpx convex env set RESEND_WEBHOOK_SECRET whsec_...\n",[19,2869,2870,2885,2901],{"__ignoreMap":105},[109,2871,2872,2874,2876,2878,2880,2882],{"class":111,"line":112},[109,2873,2085],{"class":115},[109,2875,2088],{"class":119},[109,2877,2091],{"class":119},[109,2879,2094],{"class":119},[109,2881,2414],{"class":119},[109,2883,2884],{"class":119}," resend\n",[109,2886,2887,2889,2891,2893,2895,2898],{"class":111,"line":877},[109,2888,2085],{"class":115},[109,2890,2088],{"class":119},[109,2892,2091],{"class":119},[109,2894,2094],{"class":119},[109,2896,2897],{"class":119}," RESEND_API_KEY",[109,2899,2900],{"class":119}," re_...\n",[109,2902,2903,2905,2907,2909,2911,2914],{"class":111,"line":883},[109,2904,2085],{"class":115},[109,2906,2088],{"class":119},[109,2908,2091],{"class":119},[109,2910,2094],{"class":119},[109,2912,2913],{"class":119}," RESEND_WEBHOOK_SECRET",[109,2915,2916],{"class":119}," whsec_...\n",[131,2918,2381],{"id":2378},[136,2920,2921,2929],{},[139,2922,2923],{},[142,2924,2925,2927],{},[145,2926,147],{},[145,2928,150],{},[155,2930,2931,2940],{},[142,2932,2933,2937],{},[160,2934,2935],{},[19,2936,2386],{},[160,2938,2939],{},"Bearer-Token für die Send- und Setup-Probe-APIs von Emailit v2. Bei Verwendung von Emailit erforderlich.",[142,2941,2942,2946],{},[160,2943,2944],{},[19,2945,2391],{},[160,2947,2948,2949,2952,2953,2956],{},"Vollständiges Signiergeheimnis ",[19,2950,2951],{},"whsec_…"," für ",[19,2954,2955],{},"POST \u002Fwebhooks\u002Femailit",". Für verifiziertes Zustellfeedback erforderlich.",[11,2958,2692,2959,666,2962,2964,2965,2968,2969,2972,2973,2976],{},[19,2960,2961],{},"EMAIL_PROVIDER=emailit",[19,2963,2386],{}," und legen Sie dann einen Emailit-Webhook an, der auf ",[19,2966,2967],{},"\u003CCONVEX_SITE_URL>\u002Fwebhooks\u002Femailit"," zeigt. Aktivieren Sie die E-Mail-Ereignisse accepted, attempted, delivered, bounced, complained, failed, rejected und suppressed. Owlat prüft ",[19,2970,2971],{},"X-Emailit-Signature"," als HMAC-SHA256 über ",[19,2974,2975],{},"\u003CX-Emailit-Timestamp>.\u003Craw body>"," mit einer Frischegrenze von fünf Minuten. Das Öffnungs- und Klick-Tracking des Providers bleibt bei Sendungen deaktiviert, weil Owlats First-Party-Tracking maßgeblich bleibt.",[100,2978,2980],{"className":2076,"code":2979,"language":2078,"meta":105,"style":105},"npx convex env set EMAIL_PROVIDER emailit\nnpx convex env set EMAILIT_API_KEY em_...\nnpx convex env set EMAILIT_WEBHOOK_SECRET whsec_...\n",[19,2981,2982,2997,3013],{"__ignoreMap":105},[109,2983,2984,2986,2988,2990,2992,2994],{"class":111,"line":112},[109,2985,2085],{"class":115},[109,2987,2088],{"class":119},[109,2989,2091],{"class":119},[109,2991,2094],{"class":119},[109,2993,2414],{"class":119},[109,2995,2996],{"class":119}," emailit\n",[109,2998,2999,3001,3003,3005,3007,3010],{"class":111,"line":877},[109,3000,2085],{"class":115},[109,3002,2088],{"class":119},[109,3004,2091],{"class":119},[109,3006,2094],{"class":119},[109,3008,3009],{"class":119}," EMAILIT_API_KEY",[109,3011,3012],{"class":119}," em_...\n",[109,3014,3015,3017,3019,3021,3023,3026],{"class":111,"line":883},[109,3016,2085],{"class":115},[109,3018,2088],{"class":119},[109,3020,2091],{"class":119},[109,3022,2094],{"class":119},[109,3024,3025],{"class":119}," EMAILIT_WEBHOOK_SECRET",[109,3027,2916],{"class":119},[131,3029,3031],{"id":3030},"generisches-smtp-relay","Generisches SMTP-Relay",[11,3033,3034,3035,3038],{},"Wenn Sie bereits einen SMTP-Submission-Host haben — Mailgun, Postmark, SendGrid, Brevo oder ein selbst betriebenes Relay —, setzen Sie ",[19,3036,3037],{},"EMAIL_PROVIDER=smtp"," und richten Owlat darauf aus. Es gibt keinen API-Adapter je Provider: Jedes Relay, das SMTP spricht, funktioniert.",[136,3040,3041,3049],{},[139,3042,3043],{},[142,3044,3045,3047],{},[145,3046,147],{},[145,3048,150],{},[155,3050,3051,3064,3081,3096,3105],{},[142,3052,3053,3057],{},[160,3054,3055],{},[19,3056,2320],{},[160,3058,3059,3060,3063],{},"Hostname des Relays (z. B. ",[19,3061,3062],{},"smtp.mailgun.org","). Bei Verwendung eines SMTP-Relays erforderlich.",[142,3065,3066,3070],{},[160,3067,3068],{},[19,3069,2331],{},[160,3071,3072,3073,3076,3077,3080],{},"Submission-Port. Optional — Standard ist ",[19,3074,3075],{},"587"," (STARTTLS). Verwenden Sie ",[19,3078,3079],{},"465"," für implizites TLS.",[142,3082,3083,3087],{},[160,3084,3085],{},[19,3086,2334],{},[160,3088,3089,3092,3093,3095],{},[19,3090,3091],{},"true"," für eine Verbindung mit implizitem TLS (Port 465); nicht gesetzt bzw. ",[19,3094,424],{}," verbindet und aktualisiert über STARTTLS (Port 587). Optional.",[142,3097,3098,3102],{},[160,3099,3100],{},[19,3101,2323],{},[160,3103,3104],{},"Benutzername für die SMTP-Authentifizierung. Bei Verwendung eines SMTP-Relays erforderlich.",[142,3106,3107,3111],{},[160,3108,3109],{},[19,3110,2326],{},[160,3112,3113],{},"Passwort für die SMTP-Authentifizierung. Bei Verwendung eines SMTP-Relays erforderlich.",[11,3115,3116],{},"Bei einem Relay gehören die sendenden IPs und die DKIM-Signierung dem Relay-Provider — konfigurieren Sie SPF und DKIM für Ihre From-Domain im Dashboard des Relays, nicht über das DNS-Bündel der eingebauten MTA.",[131,3118,2350],{"id":3119},"mailchimp-transactional-mandrill",[11,3121,2692,3122,3125,3126,3129],{},[19,3123,3124],{},"EMAIL_PROVIDER=mandrill",", um über ein bestehendes Mailchimp-Transactional-Konto zu senden. Das ist der ",[40,3127,3128],{},"Migrationsarm",": Ein Team, das von Mailchimp kommt, behält am ersten Tag seine bisherige Zustellbarkeit, und Owlats Ramp-Controller verschiebt den Traffic anschließend Zelle für Zelle auf die eingebaute MTA, so wie es die Messungen zulassen.",[136,3131,3132,3140],{},[139,3133,3134],{},[142,3135,3136,3138],{},[145,3137,147],{},[145,3139,150],{},[155,3141,3142,3151,3160,3169],{},[142,3143,3144,3148],{},[160,3145,3146],{},[19,3147,2355],{},[160,3149,3150],{},"Mandrill-API-Schlüssel (Settings → API keys). Bei Verwendung von Mandrill erforderlich.",[142,3152,3153,3157],{},[160,3154,3155],{},[19,3156,2360],{},[160,3158,3159],{},"Signierschlüssel je Webhook, der nach dem Anlegen des Webhooks angezeigt wird. Für die Verfolgung von Zustell- und Bounce-Ereignissen erforderlich.",[142,3161,3162,3166],{},[160,3163,3164],{},[19,3165,2363],{},[160,3167,3168],{},"Subaccount, der Owlats Traffic — und dessen Reputation — innerhalb eines gemeinsam genutzten Mandrill-Kontos isoliert. Optional.",[142,3170,3171,3175],{},[160,3172,3173],{},[19,3174,2366],{},[160,3176,3177],{},"Standardname des Pools dedizierter IPs. Der eigene IP-Pool einer Provider-Route überschreibt ihn je Sendung. Optional.",[11,3179,3180,3181,3184,3185,3188,3189,175,3192,175,3195,175,3198,175,3201,175,3204,666,3207,3210,3211,201,3213,593,3216,87],{},"Owlat baut die gesamte MIME-Nachricht selbst zusammen und schickt sie an Mandrills ",[19,3182,3183],{},"messages\u002Fsend-raw",", wobei Mandrills Öffnungs- und Klick-Tracking, Link-Rewriting und automatische Textgenerierung ausdrücklich ",[40,3186,3187],{},"aus"," sind. Das Tracking bleibt First Party, sodass beide Sendearme mit identischer Instrumentierung gemessen werden — aktivieren Sie am Webhook ",[19,3190,3191],{},"send",[19,3193,3194],{},"deferral",[19,3196,3197],{},"hard_bounce",[19,3199,3200],{},"soft_bounce",[19,3202,3203],{},"spam",[19,3205,3206],{},"unsub",[19,3208,3209],{},"reject",", aber ",[40,3212,680],{},[19,3214,3215],{},"open",[19,3217,3218],{},"click",[11,3220,3221,3222,3225,3226,3229,3230,3232,3233,3235,3236,3238],{},"Legen Sie den Webhook unter Mailchimp Transactional → Settings → Webhooks an und richten Sie ihn auf ",[19,3223,3224],{},"\u003CCONVEX_SITE_URL>\u002Fwebhooks\u002Fmandrill",". Mandrill zeigt den Signierschlüssel ",[40,3227,3228],{},"einmalig"," an, direkt nach dem Speichern — dieser Wert ist ",[19,3231,2360],{},". Bis er gesetzt ist, weist Owlat jeden übermittelten Batch ab, statt einem unsignierten zu vertrauen; der Versand wirkt dann gesund, während Bounces, Beschwerden und Treffer der Reject-Liste stillschweigend nie eintreffen. Unter Zustellung → Provider sehen Sie die exakte URL, die Ereignisliste und ob der Schlüssel vorhanden ist. Nur ",[19,3234,2355],{}," wird vom Transport-Editor in der App geschrieben; die anderen drei sind ausschließlich ",[19,3237,25],{},"-seitig, sodass das Rotieren des Sendeschlüssels niemals einen funktionierenden Feedback Loop deaktivieren kann.",[1004,3240,3242],{"id":3241},"zwei-transporte-desselben-kinds","Zwei Transporte desselben Kinds",[11,3244,3245,3246,3249,3250,175,3252,175,3254,175,3256,175,3258,175,3260,3262,3263,3266],{},"Jedes Transport-Kind oben erhält kostenlos eine ",[40,3247,3248],{},"Standardinstanz",", deren Id das Kind selbst ist (",[19,3251,2220],{},[19,3253,2252],{},[19,3255,2287],{},[19,3257,2312],{},[19,3259,2347],{},[19,3261,2378],{},") und die die unsuffigierten Variablen liest. Deklarieren Sie ",[40,3264,3265],{},"benannte Instanzen",", wenn Sie zwei Konfigurationen desselben Kinds nebeneinander betreiben wollen — etwa um ein warmes Fallback-Relay zu behalten, während Sie ein zweites erproben.",[136,3268,3269,3277],{},[139,3270,3271],{},[142,3272,3273,3275],{},[145,3274,147],{},[145,3276,150],{},[155,3278,3279],{},[142,3280,3281,3286],{},[160,3282,3283],{},[19,3284,3285],{},"SEND_TRANSPORT_INSTANCES",[160,3287,3288,3289,3292,3293,3296,3297,3300],{},"Kommagetrennte Liste zusätzlicher Transportinstanzen, jeweils ",[19,3290,3291],{},"\u003Ckind>#\u003CinstanceKey>"," (z. B. ",[19,3294,3295],{},"smtp#backup,resend#trial","). Instanzschlüssel sind kleingeschrieben ",[19,3298,3299],{},"[a-z0-9][a-z0-9_-]{0,31}",". Optional — nicht gesetzt bedeutet genau ein Transport je Kind.",[11,3302,3303,3304,3307,3308,3311,3312,175,3315,666,3318,3321],{},"Eine benannte Instanz liest die Variablen ihres Kinds mit dem Suffix ",[19,3305,3306],{},"__\u003CINSTANCEKEY>",", sodass ",[19,3309,3310],{},"smtp#backup"," die Werte ",[19,3313,3314],{},"SMTP_RELAY_HOST__BACKUP",[19,3316,3317],{},"SMTP_RELAY_USERNAME__BACKUP",[19,3319,3320],{},"SMTP_RELAY_PASSWORD__BACKUP"," liest:",[100,3323,3325],{"className":2076,"code":3324,"language":2078,"meta":105,"style":105},"npx convex env set SEND_TRANSPORT_INSTANCES smtp#backup\nnpx convex env set SMTP_RELAY_HOST__BACKUP smtp.postmarkapp.com\nnpx convex env set SMTP_RELAY_USERNAME__BACKUP ...\nnpx convex env set SMTP_RELAY_PASSWORD__BACKUP ...\n",[19,3326,3327,3343,3359,3374],{"__ignoreMap":105},[109,3328,3329,3331,3333,3335,3337,3340],{"class":111,"line":112},[109,3330,2085],{"class":115},[109,3332,2088],{"class":119},[109,3334,2091],{"class":119},[109,3336,2094],{"class":119},[109,3338,3339],{"class":119}," SEND_TRANSPORT_INSTANCES",[109,3341,3342],{"class":119}," smtp#backup\n",[109,3344,3345,3347,3349,3351,3353,3356],{"class":111,"line":877},[109,3346,2085],{"class":115},[109,3348,2088],{"class":119},[109,3350,2091],{"class":119},[109,3352,2094],{"class":119},[109,3354,3355],{"class":119}," SMTP_RELAY_HOST__BACKUP",[109,3357,3358],{"class":119}," smtp.postmarkapp.com\n",[109,3360,3361,3363,3365,3367,3369,3372],{"class":111,"line":883},[109,3362,2085],{"class":115},[109,3364,2088],{"class":119},[109,3366,2091],{"class":119},[109,3368,2094],{"class":119},[109,3370,3371],{"class":119}," SMTP_RELAY_USERNAME__BACKUP",[109,3373,2661],{"class":119},[109,3375,3376,3378,3380,3382,3384,3387],{"class":111,"line":889},[109,3377,2085],{"class":115},[109,3379,2088],{"class":119},[109,3381,2091],{"class":119},[109,3383,2094],{"class":119},[109,3385,3386],{"class":119}," SMTP_RELAY_PASSWORD__BACKUP",[109,3388,2661],{"class":119},[11,3390,3391,3392,3394,3395,666,3398,3401,3402,3405,3406,3408,3409,3411],{},"Entfernen Sie eine Instanz aus der Liste oder entfernen Sie deren Variablen, scheitern Sendungen an diese Transport-Id ",[40,3393,1025],{}," — sie fallen nie stillschweigend auf die Zugangsdaten eines anderen Transports zurück. Fehlerhafte Einträge werden ignoriert, statt den Dispatch abstürzen zu lassen; dasselbe gilt für einen zweiten Eintrag, dessen Schlüssel dasselbe Variablensuffix ergibt wie ein früherer (",[19,3396,3397],{},"a-b",[19,3399,3400],{},"a_b"," ergeben beide ",[19,3403,3404],{},"__A_B","). Auch ein von einem Plugin beigesteuerter Transport kann benannte Instanzen haben, zu denselben Bedingungen, sofern sein Contribution eigene Konfigurationsvariablen deklariert — diese tragen das Präfix ",[19,3407,2475],{}," und lesen dasselbe Suffix ",[19,3410,3306],{},". Ein Transport, der keine deklariert, liest die deployment-weiten Variablen des Plugins, die kein Suffix erreicht; eine Instanz davon zu deklarieren wird deshalb abgelehnt, statt stillschweigend mit den Zugangsdaten der Standardinstanz zu senden.",[1004,3413,2554],{"id":3414},"einrichtungsschritte-2",[2556,3416,3417,3423,3428],{},[2559,3418,3419,3422],{},[40,3420,3421],{},"Legen Sie im Dashboard Ihres Relay-Providers SMTP-Zugangsdaten an"," (einen domain- oder kontobezogenen SMTP-Benutzernamen samt Passwort).",[2559,3424,3425,3427],{},[40,3426,2580],{}," beim Relay (veröffentlichen Sie dessen SPF-\u002FDKIM-Einträge), damit Ihre E-Mails authentifiziert werden.",[2559,3429,3430,2593,3432],{},[40,3431,2592],{},[100,3433,3435],{"className":2076,"code":3434,"language":2078,"meta":105,"style":105},"npx convex env set EMAIL_PROVIDER smtp\nnpx convex env set SMTP_RELAY_HOST smtp.mailgun.org\nnpx convex env set SMTP_RELAY_PORT 587\nnpx convex env set SMTP_RELAY_USERNAME postmaster@mg.example.com\nnpx convex env set SMTP_RELAY_PASSWORD ...\n",[19,3436,3437,3452,3468,3485,3501],{"__ignoreMap":105},[109,3438,3439,3441,3443,3445,3447,3449],{"class":111,"line":112},[109,3440,2085],{"class":115},[109,3442,2088],{"class":119},[109,3444,2091],{"class":119},[109,3446,2094],{"class":119},[109,3448,2414],{"class":119},[109,3450,3451],{"class":119}," smtp\n",[109,3453,3454,3456,3458,3460,3462,3465],{"class":111,"line":877},[109,3455,2085],{"class":115},[109,3457,2088],{"class":119},[109,3459,2091],{"class":119},[109,3461,2094],{"class":119},[109,3463,3464],{"class":119}," SMTP_RELAY_HOST",[109,3466,3467],{"class":119}," smtp.mailgun.org\n",[109,3469,3470,3472,3474,3476,3478,3481],{"class":111,"line":883},[109,3471,2085],{"class":115},[109,3473,2088],{"class":119},[109,3475,2091],{"class":119},[109,3477,2094],{"class":119},[109,3479,3480],{"class":119}," SMTP_RELAY_PORT",[109,3482,3484],{"class":3483},"sviXB"," 587\n",[109,3486,3487,3489,3491,3493,3495,3498],{"class":111,"line":889},[109,3488,2085],{"class":115},[109,3490,2088],{"class":119},[109,3492,2091],{"class":119},[109,3494,2094],{"class":119},[109,3496,3497],{"class":119}," SMTP_RELAY_USERNAME",[109,3499,3500],{"class":119}," postmaster@mg.example.com\n",[109,3502,3503,3505,3507,3509,3511,3514],{"class":111,"line":895},[109,3504,2085],{"class":115},[109,3506,2088],{"class":119},[109,3508,2091],{"class":119},[109,3510,2094],{"class":119},[109,3512,3513],{"class":119}," SMTP_RELAY_PASSWORD",[109,3515,2661],{"class":119},[131,3517,3519],{"id":3518},"eigene-mta","Eigene MTA",[11,3521,3522,3523,3526,3527,87],{},"Bei Verwendung der eigenen MTA (",[19,3524,3525],{},"EMAIL_PROVIDER=mta",") verbindet sich das Convex-Backend über HTTP mit dem MTA-Dienst. Alle Architekturdetails finden Sie in der Dokumentation zum ",[15,3528,3530],{"href":3529},"\u002Fdeveloper\u002Fmta-system","MTA System",[136,3532,3533,3541],{},[139,3534,3535],{},[142,3536,3537,3539],{},[145,3538,147],{},[145,3540,150],{},[155,3542,3543,3556,3565],{},[142,3544,3545,3549],{},[160,3546,3547],{},[19,3548,2231],{},[160,3550,3551,3552,3555],{},"URL des MTA-Dienstes (z. B. ",[19,3553,3554],{},"http:\u002F\u002Fmta.internal:3100","). Bei Verwendung der MTA erforderlich.",[142,3557,3558,3562],{},[160,3559,3560],{},[19,3561,245],{},[160,3563,3564],{},"Gemeinsamer API-Schlüssel für die MTA-Authentifizierung (Bearer-Token). Bei Verwendung der MTA erforderlich.",[142,3566,3567,3571],{},[160,3568,3569],{},[19,3570,260],{},[160,3572,3573,3574,3576,3577,649,3580,175,3583,3586,3587,3590,3591,3593,3594,3596,3597,3599,3600,3603,3604,1135],{},"Gemeinsames HMAC-Geheimnis. Authentifiziert Zustellereignis-Callbacks von der MTA an Convex und signiert — wenn das Flag ",[19,3575,1125],{}," aktiv ist — die Prüfungen der SMTP-Submission-Zugangsdaten der MTA gegen den Endpunkt ",[19,3578,3579],{},"\u002Fwebhooks\u002Fmta-verify-credential",[19,3581,3582],{},"apps\u002Fmta\u002Fsrc\u002Fauth\u002FpostboxAuth.ts",[19,3584,3585],{},"apps\u002Fapi\u002Fconvex\u002Fmail\u002FauthHttp.ts","). Setzen Sie es auf ",[40,3588,3589],{},"beiden"," Seiten. Es liegt außerhalb des Vorhandensein-Gates auf Convex-Seite — der Katalog deklariert es neben ",[19,3592,1866],{},", es entscheidet also nicht darüber, ob ",[19,3595,2220],{}," als konfiguriert gilt —, wird aber vom MTA-Dienst selbst beim Start benötigt (",[19,3598,676],{}," liest es über ",[19,3601,3602],{},"requiredEnv",", sodass der Container bei einem nicht gesetzten oder leeren Wert beendet wird), ist für den Empfang von Zustellereignis-Callbacks erforderlich und immer dann erforderlich, wenn das Flag ",[19,3605,1125],{},[32,3607,3609],{"type":34,"title":3608},"Authentifizierung der Postbox-SMTP-Submission",[11,3610,3611,3612,3615,3616,3618,3619,3621,3622,3625,3626,3628,3629,3631,3632,87],{},"Wenn ein Desktop-Mailclient (Apple Mail, Thunderbird, …) E-Mails über SMTP einliefert, verifiziert die MTA das Paar ",[19,3613,3614],{},"(mailbox-address, app-password)",", indem sie eine Anfrage (mit ",[19,3617,260],{},") HMAC-signiert an den Convex-Endpunkt ",[19,3620,3579],{}," schickt. Das ist die SMTP-Submission-Prüfung ",[40,3623,3624],{},"der MTA"," — sie unterscheidet sich vom Auth-Pfad des IMAP-Servers, der ",[19,3627,224],{}," verwendet, um ",[19,3630,1191],{}," direkt aufzurufen. Siehe ",[15,3633,3635],{"href":3634},"\u002Fdeveloper\u002Fpostbox-architecture#app-password-auth-flow","Postbox Architecture",[1004,3637,2554],{"id":3638},"einrichtungsschritte-3",[2556,3640,3641,3651],{},[2559,3642,3643,3646,3647,3650],{},[40,3644,3645],{},"Deployen Sie den MTA-Dienst"," aus ",[19,3648,3649],{},"apps\u002Fmta\u002F"," (Konfigurationsdetails in der MTA-System-Dokumentation).",[2559,3652,3653,3655,3656],{},[40,3654,2592],{}," im Convex-Dashboard:",[100,3657,3659],{"className":2076,"code":3658,"language":2078,"meta":105,"style":105},"npx convex env set EMAIL_PROVIDER mta\nnpx convex env set MTA_API_URL http:\u002F\u002Fmta.internal:3100\nnpx convex env set MTA_API_KEY your-shared-api-key\nnpx convex env set MTA_WEBHOOK_SECRET your-webhook-secret\n",[19,3660,3661,3676,3692,3708],{"__ignoreMap":105},[109,3662,3663,3665,3667,3669,3671,3673],{"class":111,"line":112},[109,3664,2085],{"class":115},[109,3666,2088],{"class":119},[109,3668,2091],{"class":119},[109,3670,2094],{"class":119},[109,3672,2414],{"class":119},[109,3674,3675],{"class":119}," mta\n",[109,3677,3678,3680,3682,3684,3686,3689],{"class":111,"line":877},[109,3679,2085],{"class":115},[109,3681,2088],{"class":119},[109,3683,2091],{"class":119},[109,3685,2094],{"class":119},[109,3687,3688],{"class":119}," MTA_API_URL",[109,3690,3691],{"class":119}," http:\u002F\u002Fmta.internal:3100\n",[109,3693,3694,3696,3698,3700,3702,3705],{"class":111,"line":883},[109,3695,2085],{"class":115},[109,3697,2088],{"class":119},[109,3699,2091],{"class":119},[109,3701,2094],{"class":119},[109,3703,3704],{"class":119}," MTA_API_KEY",[109,3706,3707],{"class":119}," your-shared-api-key\n",[109,3709,3710,3712,3714,3716,3718,3721],{"class":111,"line":889},[109,3711,2085],{"class":115},[109,3713,2088],{"class":119},[109,3715,2091],{"class":119},[109,3717,2094],{"class":119},[109,3719,3720],{"class":119}," MTA_WEBHOOK_SECRET",[109,3722,3723],{"class":119}," your-webhook-secret\n",[131,3725,3727],{"id":3726},"allgemeine-e-mail-konfiguration","Allgemeine E-Mail-Konfiguration",[11,3729,3730],{},"Diese Variablen gelten unabhängig davon, welchen Provider Sie verwenden:",[136,3732,3733,3743],{},[139,3734,3735],{},[142,3736,3737,3739,3741],{},[145,3738,147],{},[145,3740,150],{},[145,3742,284],{},[155,3744,3745,3760,3775,3794,3806],{},[142,3746,3747,3752,3755],{},[160,3748,3749],{},[19,3750,3751],{},"DEFAULT_FROM_EMAIL",[160,3753,3754],{},"Standard-Absenderadresse für transaktionale E-Mails",[160,3756,3757],{},[19,3758,3759],{},"noreply@example.com",[142,3761,3762,3767,3770],{},[160,3763,3764],{},[19,3765,3766],{},"DEFAULT_FROM_NAME",[160,3768,3769],{},"Standard-Anzeigename des Absenders",[160,3771,3772],{},[19,3773,3774],{},"Owlat",[142,3776,3777,3782,3789],{},[160,3778,3779],{},[19,3780,3781],{},"DEFAULT_FROM_DOMAIN",[160,3783,3784,3785,3788],{},"Domain für System-E-Mails (z. B. Einladungs-E-Mails). Wird ",[19,3786,3787],{},"noreply@"," vorangestellt.",[160,3790,3791],{},[19,3792,3793],{},"mail.owlat.app",[142,3795,3796,3801,3804],{},[160,3797,3798],{},[19,3799,3800],{},"CONVEX_SITE_URL",[160,3802,3803],{},"Ihre Convex-Site-URL. Wird für Tracking-Pixel und Abmeldelinks in Kampagnen-E-Mails verwendet.",[160,3805,397],{},[142,3807,3808,3813,3816],{},[160,3809,3810],{},[19,3811,3812],{},"UNSUBSCRIBE_SECRET",[160,3814,3815],{},"Geheimer Schlüssel zum Erzeugen HMAC-signierter Abmelde-Token. Erforderlich.",[160,3817,397],{},[89,3819,3821],{"id":3820},"e-mail-sicherheit","E-Mail-Sicherheit",[11,3823,3824,3825,87],{},"Optionale Umgebungsvariablen für die Prüfung von E-Mail-Inhalten und Anhängen. Details zur Prüf-Pipeline finden Sie in der Dokumentation zur ",[15,3826,3821],{"href":3827},"\u002Fdeveloper\u002Femail-security",[131,3829,3831],{"id":3830},"variablen","Variablen",[11,3833,3834,3835,3837],{},"Im ",[40,3836,2109],{}," setzen:",[136,3839,3840,3848],{},[139,3841,3842],{},[142,3843,3844,3846],{},[145,3845,147],{},[145,3847,150],{},[155,3849,3850,3860],{},[142,3851,3852,3857],{},[160,3853,3854],{},[19,3855,3856],{},"GOOGLE_SAFE_BROWSING_API_KEY",[160,3858,3859],{},"Schlüssel für die Google Safe Browsing API v4 zur Prüfung der URL-Reputation. Kostenlose Stufe: 10.000 Anfragen\u002FTag.",[142,3861,3862,3867],{},[160,3863,3864],{},[19,3865,3866],{},"MTA_INTERNAL_URL",[160,3868,3869,3870,3872],{},"Interne MTA-URL für die Prüfung von Anhängen (z. B. ",[19,3871,3554],{},"). Für die ClamAV-Integration erforderlich.",[11,3874,3875,3876,3837],{},"In der ",[40,3877,3878],{},"MTA-Umgebung",[136,3880,3881,3891],{},[139,3882,3883],{},[142,3884,3885,3887,3889],{},[145,3886,147],{},[145,3888,284],{},[145,3890,150],{},[155,3892,3893,3914],{},[142,3894,3895,3900,3905],{},[160,3896,3897],{},[19,3898,3899],{},"CLAMAV_HOST",[160,3901,3902],{},[19,3903,3904],{},"clamav",[160,3906,3907,3908,3910,3911,3913],{},"Hostname des ClamAV-Daemons (entspricht dem Namen des ",[19,3909,3904],{},"-Sidecar-Dienstes; ",[19,3912,29],{}," verdrahtet ihn fest)",[142,3915,3916,3921,3926],{},[160,3917,3918],{},[19,3919,3920],{},"CLAMAV_PORT",[160,3922,3923],{},[19,3924,3925],{},"3310",[160,3927,3928],{},"Port des ClamAV-Daemons",[131,3930,2554],{"id":3931},"einrichtungsschritte-4",[2556,3933,3934,3966],{},[2559,3935,3936,3939,3940,2593,3945],{},[40,3937,3938],{},"(Optional) Prüfung der URL-Reputation aktivieren"," — holen Sie sich einen Google-Safe-Browsing-API-Schlüssel aus der ",[15,3941,3944],{"href":3942,"rel":3943},"https:\u002F\u002Fconsole.cloud.google.com\u002Fapis\u002Flibrary\u002Fsafebrowsing.googleapis.com",[2108],"Google Cloud Console",[100,3946,3948],{"className":2076,"code":3947,"language":2078,"meta":105,"style":105},"npx convex env set GOOGLE_SAFE_BROWSING_API_KEY AIza...\n",[19,3949,3950],{"__ignoreMap":105},[109,3951,3952,3954,3956,3958,3960,3963],{"class":111,"line":112},[109,3953,2085],{"class":115},[109,3955,2088],{"class":119},[109,3957,2091],{"class":119},[109,3959,2094],{"class":119},[109,3961,3962],{"class":119}," GOOGLE_SAFE_BROWSING_API_KEY",[109,3964,3965],{"class":119}," AIza...\n",[2559,3967,3968,3971,3972,3976,3977],{},[40,3969,3970],{},"(Optional) ClamAV-Malware-Prüfung aktivieren"," — deployen Sie ClamAV neben der MTA (siehe ",[15,3973,3975],{"href":3974},"\u002Fdeveloper\u002Fmta-system#clamav-sidecar-docker","MTA System > ClamAV Sidecar",") und setzen Sie die interne URL:",[100,3978,3980],{"className":2076,"code":3979,"language":2078,"meta":105,"style":105},"npx convex env set MTA_INTERNAL_URL http:\u002F\u002Fmta.internal:3100\n",[19,3981,3982],{"__ignoreMap":105},[109,3983,3984,3986,3988,3990,3992,3995],{"class":111,"line":112},[109,3985,2085],{"class":115},[109,3987,2088],{"class":119},[109,3989,2091],{"class":119},[109,3991,2094],{"class":119},[109,3993,3994],{"class":119}," MTA_INTERNAL_URL",[109,3996,3691],{"class":119},[32,3998,3999],{"type":34},[11,4000,4001],{},"Die Inhaltsprüfung (Spam-Schlüsselwörter, Phishing-URLs, Homoglyphen) und die Dateitypvalidierung (Magic Bytes, doppelte Endungen) funktionieren ohne zusätzliche Konfiguration sofort. Nur URL-Reputation und ClamAV benötigen Umgebungsvariablen.",[89,4003,4005],{"id":4004},"analytics-posthog","Analytics (PostHog)",[11,4007,4008,4009,4014],{},"Owlat integriert ",[15,4010,4013],{"href":4011,"rel":4012},"https:\u002F\u002Fposthog.com",[2108],"PostHog"," für Produktanalytik und Fehlererfassung. Die Integration ist optional — alles funktioniert auch ohne sie.",[131,4016,3831],{"id":4017},"variablen-1",[11,4019,4020],{},[40,4021,4022],{},"Convex-Dashboard:",[136,4024,4025,4033],{},[139,4026,4027],{},[142,4028,4029,4031],{},[145,4030,147],{},[145,4032,150],{},[155,4034,4035,4049],{},[142,4036,4037,4042],{},[160,4038,4039],{},[19,4040,4041],{},"POSTHOG_API_KEY",[160,4043,4044,4045,4048],{},"Projekt-API-Schlüssel von PostHog (beginnt mit ",[19,4046,4047],{},"phc_","). Erforderlich, um serverseitiges Tracking zu aktivieren.",[142,4050,4051,4056],{},[160,4052,4053],{},[19,4054,4055],{},"POSTHOG_HOST",[160,4057,4058,4059,4062],{},"URL der PostHog-Instanz. Standard ist ",[19,4060,4061],{},"https:\u002F\u002Feu.i.posthog.com"," (EU-Cloud).",[11,4064,4065,649,4067,2073],{},[40,4066,2115],{},[19,4068,2118],{},[136,4070,4071,4079],{},[139,4072,4073],{},[142,4074,4075,4077],{},[145,4076,147],{},[145,4078,150],{},[155,4080,4081,4091],{},[142,4082,4083,4088],{},[160,4084,4085],{},[19,4086,4087],{},"NUXT_PUBLIC_POSTHOG_API_KEY",[160,4089,4090],{},"Projekt-API-Schlüssel von PostHog. Erforderlich, um clientseitiges Tracking zu aktivieren.",[142,4092,4093,4098],{},[160,4094,4095],{},[19,4096,4097],{},"NUXT_PUBLIC_POSTHOG_HOST",[160,4099,4058,4100,87],{},[19,4101,4061],{},[131,4103,2554],{"id":4104},"einrichtungsschritte-5",[2556,4106,4107,4117,4129],{},[2559,4108,4109,2834,4112,4116],{},[40,4110,4111],{},"Legen Sie ein PostHog-Projekt",[15,4113,4115],{"href":4011,"rel":4114},[2108],"posthog.com"," an und kopieren Sie den Projekt-API-Schlüssel.",[2559,4118,4119,4125,4126,4128],{},[40,4120,4121,4122],{},"Fügen Sie den Gruppentyp ",[19,4123,4124],{},"organization"," in PostHog hinzu: Gehen Sie zu Settings → Groups und legen Sie einen Gruppentyp namens ",[19,4127,4124],{}," an. Damit wird Analytik auf Organisationsebene möglich.",[2559,4130,4131,2593,4133],{},[40,4132,2592],{},[100,4134,4136],{"className":2076,"code":4135,"language":2078,"meta":105,"style":105},"# Convex (server-side events)\nnpx convex env set POSTHOG_API_KEY phc_...\nnpx convex env set POSTHOG_HOST https:\u002F\u002Feu.i.posthog.com\n\n# apps\u002Fweb\u002F.env (client-side events)\nNUXT_PUBLIC_POSTHOG_API_KEY=phc_...\nNUXT_PUBLIC_POSTHOG_HOST=https:\u002F\u002Feu.i.posthog.com\n",[19,4137,4138,4143,4159,4175,4181,4186,4195],{"__ignoreMap":105},[109,4139,4140],{"class":111,"line":112},[109,4141,4142],{"class":873},"# Convex (server-side events)\n",[109,4144,4145,4147,4149,4151,4153,4156],{"class":111,"line":877},[109,4146,2085],{"class":115},[109,4148,2088],{"class":119},[109,4150,2091],{"class":119},[109,4152,2094],{"class":119},[109,4154,4155],{"class":119}," POSTHOG_API_KEY",[109,4157,4158],{"class":119}," phc_...\n",[109,4160,4161,4163,4165,4167,4169,4172],{"class":111,"line":883},[109,4162,2085],{"class":115},[109,4164,2088],{"class":119},[109,4166,2091],{"class":119},[109,4168,2094],{"class":119},[109,4170,4171],{"class":119}," POSTHOG_HOST",[109,4173,4174],{"class":119}," https:\u002F\u002Feu.i.posthog.com\n",[109,4176,4177],{"class":111,"line":889},[109,4178,4180],{"emptyLinePlaceholder":4179},true,"\n",[109,4182,4183],{"class":111,"line":895},[109,4184,4185],{"class":873},"# apps\u002Fweb\u002F.env (client-side events)\n",[109,4187,4188,4190,4192],{"class":111,"line":901},[109,4189,4087],{"class":2128},[109,4191,2132],{"class":2131},[109,4193,4194],{"class":119},"phc_...\n",[109,4196,4197,4199,4201],{"class":111,"line":907},[109,4198,4097],{"class":2128},[109,4200,2132],{"class":2131},[109,4202,4203],{"class":119},"https:\u002F\u002Feu.i.posthog.com\n",[131,4205,4207],{"id":4206},"erfasste-ereignisse","Erfasste Ereignisse",[11,4209,4210,4213],{},[40,4211,4212],{},"Clientseitig"," (automatisch):",[2669,4215,4216,4222,4228,4234],{},[2559,4217,4218,4221],{},[19,4219,4220],{},"$pageview"," — SPA-Seitennavigationen",[2559,4223,4224,4227],{},[19,4225,4226],{},"$pageleave"," — Ereignisse beim Verlassen einer Seite",[2559,4229,4230,4233],{},[19,4231,4232],{},"$exception"," — Vue-Fehler und unbehandelte Promise-Rejections",[2559,4235,4236],{},"Nutzeridentifikation und Zuordnung zur Organisationsgruppe",[11,4238,4239,4242],{},[40,4240,4241],{},"Serverseitig"," (Fire-and-forget aus Mutations):",[2669,4244,4245,4253,4258,4269],{},[2559,4246,4247,175,4250],{},[19,4248,4249],{},"campaign_created",[19,4251,4252],{},"campaign_sent",[2559,4254,4255],{},[19,4256,4257],{},"contact_created",[2559,4259,4260,175,4263,175,4266],{},[19,4261,4262],{},"automation_created",[19,4264,4265],{},"automation_activated",[19,4267,4268],{},"automation_paused",[2559,4270,4271],{},[19,4272,4273],{},"topic_created",[11,4275,4276,4277,4280],{},"Alle Serverereignisse enthalten ",[19,4278,4279],{},"organizationId"," als Eigenschaft und als PostHog-Gruppe.",[89,4282,4284],{"id":4283},"llm-provider-ki-funktionen","LLM-Provider (KI-Funktionen)",[11,4286,4287,4288,4290,4291,87],{},"Das Flag ",[19,4289,936],{}," und jedes davon abhängige Flag benötigen einen LLM-Provider. Derselbe Provider treibt Übersetzungen von E-Mail-Templates, den KI-Agenten, die Embeddings des Wissensgraphen und die Dashboard-Generierung an. Den Interface-Vertrag und die Schritte zum Hinzufügen eines neuen Providers finden Sie unter ",[15,4292,944],{"href":943},[131,4294,3831],{"id":4295},"variablen-2",[136,4297,4298,4308],{},[139,4299,4300],{},[142,4301,4302,4304,4306],{},[145,4303,147],{},[145,4305,150],{},[145,4307,284],{},[155,4309,4310,4344,4361,4374,4386,4403,4415,4426,4446],{},[142,4311,4312,4317,4340],{},[160,4313,4314],{},[19,4315,4316],{},"LLM_PROVIDER",[160,4318,4319,627,4322,631,4325,4328,4329,4331,4332,4335,4336,4339],{},[19,4320,4321],{},"openai",[19,4323,4324],{},"openrouter",[19,4326,4327],{},"ollama",". Claude funktioniert nur über ",[19,4330,4321],{}," mit einer OpenAI-kompatiblen ",[19,4333,4334],{},"LLM_BASE_URL"," — ",[19,4337,4338],{},"anthropic"," ist kein anerkannter Wert.",[160,4341,4342],{},[19,4343,4321],{},[142,4345,4346,4350,4359],{},[160,4347,4348],{},[19,4349,1962],{},[160,4351,4352,4353,175,4355,175,4357,87],{},"API-Schlüssel für den gewählten Provider. Akzeptierte Fallback-Schlüssel in dieser Reihenfolge: ",[19,4354,1962],{},[19,4356,1952],{},[19,4358,1966],{},[160,4360,397],{},[142,4362,4363,4368,4371],{},[160,4364,4365],{},[19,4366,4367],{},"LLM_MODEL_FAST",[160,4369,4370],{},"Modell-Id für Aufgaben vom Typ classify\u002Fextract\u002Fguard\u002Fsummarize",[160,4372,4373],{},"providerabhängig",[142,4375,4376,4381,4384],{},[160,4377,4378],{},[19,4379,4380],{},"LLM_MODEL_CAPABLE",[160,4382,4383],{},"Modell-Id für Entwurfsaufgaben",[160,4385,4373],{},[142,4387,4388,4393,4401],{},[160,4389,4390],{},[19,4391,4392],{},"LLM_MODEL",[160,4394,4395,4396,593,4398,4400],{},"Einzelmodell-Fallback für beide Stufen, wenn ",[19,4397,4367],{},[19,4399,4380],{}," nicht gesetzt sind",[160,4402,397],{},[142,4404,4405,4410,4413],{},[160,4406,4407],{},[19,4408,4409],{},"LLM_EMBEDDING_MODEL",[160,4411,4412],{},"Modell-Id für Embeddings im Wissensgraphen (Env-Fallback)",[160,4414,4373],{},[142,4416,4417,4421,4424],{},[160,4418,4419],{},[19,4420,4334],{},[160,4422,4423],{},"Override für OpenAI-kompatible Endpunkte (Ollama, vLLM, LM Studio)",[160,4425,397],{},[142,4427,4428,4433,4440],{},[160,4429,4430],{},[19,4431,4432],{},"LOCAL_EMBEDDING_BASE_URL",[160,4434,4435,4436,4439],{},"Basis-URL eines lokalen, OpenAI-kompatiblen ",[19,4437,4438],{},"\u002Fembeddings","-Sidecars (z. B. Ollama). Die Embedding-Ebene ist standardmäßig lokal, damit das Retrieval mit jedem Sprachprovider funktioniert.",[160,4441,4442,4443,937],{},"Adapterstandard (",[19,4444,4445],{},"http:\u002F\u002Flocalhost:11434\u002Fv1",[142,4447,4448,4453,4464],{},[160,4449,4450],{},[19,4451,4452],{},"LOCAL_EMBEDDING_MODEL",[160,4454,4455,4456,4459,4460,4463],{},"Id des lokalen Embedding-Modells (z. B. ",[19,4457,4458],{},"nomic-embed-text","). Seine native Vektorbreite muss zum Vektorindex passen (",[19,4461,4462],{},"EMBEDDING_DIMENSIONS","), sonst weist der Dimensions-Guard Schreibvorgänge ab.",[160,4465,4466],{},[19,4467,4458],{},[131,4469,2211],{"id":4470},"einrichtung",[100,4472,4474],{"className":2076,"code":4473,"language":2078,"meta":105,"style":105},"npx convex env set LLM_PROVIDER openai\nnpx convex env set LLM_API_KEY sk-...\n# Override defaults if you want a specific model:\nnpx convex env set LLM_MODEL_FAST gpt-4o-mini\nnpx convex env set LLM_MODEL_CAPABLE gpt-4o\n",[19,4475,4476,4492,4508,4513,4529],{"__ignoreMap":105},[109,4477,4478,4480,4482,4484,4486,4489],{"class":111,"line":112},[109,4479,2085],{"class":115},[109,4481,2088],{"class":119},[109,4483,2091],{"class":119},[109,4485,2094],{"class":119},[109,4487,4488],{"class":119}," LLM_PROVIDER",[109,4490,4491],{"class":119}," openai\n",[109,4493,4494,4496,4498,4500,4502,4505],{"class":111,"line":877},[109,4495,2085],{"class":115},[109,4497,2088],{"class":119},[109,4499,2091],{"class":119},[109,4501,2094],{"class":119},[109,4503,4504],{"class":119}," LLM_API_KEY",[109,4506,4507],{"class":119}," sk-...\n",[109,4509,4510],{"class":111,"line":883},[109,4511,4512],{"class":873},"# Override defaults if you want a specific model:\n",[109,4514,4515,4517,4519,4521,4523,4526],{"class":111,"line":889},[109,4516,2085],{"class":115},[109,4518,2088],{"class":119},[109,4520,2091],{"class":119},[109,4522,2094],{"class":119},[109,4524,4525],{"class":119}," LLM_MODEL_FAST",[109,4527,4528],{"class":119}," gpt-4o-mini\n",[109,4530,4531,4533,4535,4537,4539,4542],{"class":111,"line":895},[109,4532,2085],{"class":115},[109,4534,2088],{"class":119},[109,4536,2091],{"class":119},[109,4538,2094],{"class":119},[109,4540,4541],{"class":119}," LLM_MODEL_CAPABLE",[109,4543,4544],{"class":119}," gpt-4o\n",[11,4546,4547],{},"Für ein lokales Ollama:",[100,4549,4551],{"className":2076,"code":4550,"language":2078,"meta":105,"style":105},"npx convex env set LLM_PROVIDER ollama\nnpx convex env set LLM_BASE_URL http:\u002F\u002Fhost.docker.internal:11434\u002Fv1\nnpx convex env set LLM_MODEL_FAST llama3.1:8b\nnpx convex env set LLM_MODEL_CAPABLE llama3.1:70b\n",[19,4552,4553,4568,4584,4599],{"__ignoreMap":105},[109,4554,4555,4557,4559,4561,4563,4565],{"class":111,"line":112},[109,4556,2085],{"class":115},[109,4558,2088],{"class":119},[109,4560,2091],{"class":119},[109,4562,2094],{"class":119},[109,4564,4488],{"class":119},[109,4566,4567],{"class":119}," ollama\n",[109,4569,4570,4572,4574,4576,4578,4581],{"class":111,"line":877},[109,4571,2085],{"class":115},[109,4573,2088],{"class":119},[109,4575,2091],{"class":119},[109,4577,2094],{"class":119},[109,4579,4580],{"class":119}," LLM_BASE_URL",[109,4582,4583],{"class":119}," http:\u002F\u002Fhost.docker.internal:11434\u002Fv1\n",[109,4585,4586,4588,4590,4592,4594,4596],{"class":111,"line":883},[109,4587,2085],{"class":115},[109,4589,2088],{"class":119},[109,4591,2091],{"class":119},[109,4593,2094],{"class":119},[109,4595,4525],{"class":119},[109,4597,4598],{"class":119}," llama3.1:8b\n",[109,4600,4601,4603,4605,4607,4609,4611],{"class":111,"line":889},[109,4602,2085],{"class":115},[109,4604,2088],{"class":119},[109,4606,2091],{"class":119},[109,4608,2094],{"class":119},[109,4610,4541],{"class":119},[109,4612,4613],{"class":119}," llama3.1:70b\n",[89,4615,4617],{"id":4616},"benachrichtigungen","Benachrichtigungen",[11,4619,4620,4621,4624],{},"Benachrichtigungen werden clientseitig von der Desktop-App abgewickelt; eine\nserverseitige Umgebungsvariable für einen Benachrichtigungsprovider gibt es nicht. Das gesamte\nWissens-Retrieval nutzt den eingebauten Vektorindex von Convex (",[19,4622,4623],{},"ctx.vectorSearch","),\nsodass es auch keine Umgebungsvariable für einen Vektorspeicher gibt.",[89,4626,4628,4629,937],{"id":4627},"private-e-mail-imap-appsimap","Private E-Mail \u002F IMAP (",[19,4630,1131],{},[11,4632,4633,4634,1135],{},"Diese Werte liest der IMAP-Server, nicht das Convex-Backend. Nur relevant, wenn das Flag ",[19,4635,1125],{},[136,4637,4638,4648],{},[139,4639,4640],{},[142,4641,4642,4644,4646],{},[145,4643,147],{},[145,4645,150],{},[145,4647,284],{},[155,4649,4650,4665,4680,4696,4711,4726,4747,4759,4770,4786],{},[142,4651,4652,4657,4660],{},[160,4653,4654],{},[19,4655,4656],{},"IMAP_PORT",[160,4658,4659],{},"TCP-Port, auf dem gelauscht wird",[160,4661,4662],{},[19,4663,4664],{},"993",[142,4666,4667,4672,4675],{},[160,4668,4669],{},[19,4670,4671],{},"IMAP_LISTEN",[160,4673,4674],{},"Bind-Adresse",[160,4676,4677],{},[19,4678,4679],{},"0.0.0.0",[142,4681,4682,4687,4693],{},[160,4683,4684],{},[19,4685,4686],{},"IMAP_GREETING_HOST",[160,4688,4689,4690],{},"Hostname in der Begrüßung ",[19,4691,4692],{},"* OK",[160,4694,4695],{},"Hostname des Betriebssystems",[142,4697,4698,4706,4709],{},[160,4699,4700,749,4703],{},[19,4701,4702],{},"IMAP_TLS_CERT",[19,4704,4705],{},"IMAP_TLS_CERT_FILE",[160,4707,4708],{},"TLS-Zertifikat (Inline-PEM oder Pfad)",[160,4710,397],{},[142,4712,4713,4721,4724],{},[160,4714,4715,749,4718],{},[19,4716,4717],{},"IMAP_TLS_KEY",[19,4719,4720],{},"IMAP_TLS_KEY_FILE",[160,4722,4723],{},"Privater TLS-Schlüssel (Inline-PEM oder Pfad)",[160,4725,397],{},[142,4727,4728,4733,4742],{},[160,4729,4730],{},[19,4731,4732],{},"TLS_CERT_DIR",[160,4734,4735,4736,666,4739],{},"Fallback-Verzeichnis mit ",[19,4737,4738],{},"default.crt",[19,4740,4741],{},"default.key",[160,4743,4744],{},[19,4745,4746],{},"\u002Fopt\u002Fowlat\u002Fcerts",[142,4748,4749,4754,4757],{},[160,4750,4751],{},[19,4752,4753],{},"CONVEX_URL",[160,4755,4756],{},"URL des Convex-Deployments (erforderlich)",[160,4758,397],{},[142,4760,4761,4765,4768],{},[160,4762,4763],{},[19,4764,224],{},[160,4766,4767],{},"Convex-Admin-Schlüssel, mit dem sich der IMAP-Server gegenüber Convex authentifiziert (erforderlich)",[160,4769,397],{},[142,4771,4772,4776,4782],{},[160,4773,4774],{},[19,4775,608],{},[160,4777,4778,4779,4781],{},"Ausführlichkeit des Logs. Die VPS-Compose-Datei bildet ",[19,4780,1207],{}," darauf ab.",[160,4783,4784],{},[19,4785,34],{},[142,4787,4788,4792,4795],{},[160,4789,4790],{},[19,4791,1217],{},[160,4793,4794],{},"Optionale Redis-URL für die Speicherung der Rate Limits. Am ausgelieferten Compose-Dienst nicht gesetzt → Rate Limiting schaltet fail-open.",[160,4796,397],{},[11,4798,1177,4799,1181,4801,1184,4803,4805,4806,1192,4808,1196,4810,201,4812,4814,4815,4817,4818,4820,4821,4823,4824,182],{},[40,4800,1180],{},[19,4802,224],{},[19,4804,1187],{}," und ruft ",[19,4807,1191],{},[19,4809,1195],{},[19,4811,260],{},[40,4813,680],{},". Der HMAC-Endpunkt ",[19,4816,3579],{}," ist demgegenüber die Prüfung der SMTP-Submission-Zugangsdaten ",[40,4819,3624],{}," (siehe den Abschnitt ",[15,4822,2245],{"href":2244}," oben sowie ",[15,4825,3635],{"href":3634},[89,4827,4829],{"id":4828},"authentifizierung","Authentifizierung",[136,4831,4832,4842],{},[139,4833,4834],{},[142,4835,4836,4838,4840],{},[145,4837,147],{},[145,4839,150],{},[145,4841,284],{},[155,4843,4844,4856],{},[142,4845,4846,4851,4854],{},[160,4847,4848],{},[19,4849,4850],{},"BETTER_AUTH_SECRET",[160,4852,4853],{},"Geheimer Schlüssel zum Signieren der BetterAuth-Sitzungen. Erforderlich.",[160,4855,397],{},[142,4857,4858,4863,4866],{},[160,4859,4860],{},[19,4861,4862],{},"SITE_URL",[160,4864,4865],{},"Öffentliche Site-URL für Auth-Weiterleitungen und Callbacks.",[160,4867,4868],{},[19,4869,347],{},[11,4871,2692,4872,4874],{},[19,4873,4850],{}," im Convex-Dashboard. Verwenden Sie eine lange, zufällige Zeichenkette:",[100,4876,4878],{"className":2076,"code":4877,"language":2078,"meta":105,"style":105},"npx convex env set BETTER_AUTH_SECRET $(openssl rand -base64 32)\n",[19,4879,4880],{"__ignoreMap":105},[109,4881,4882,4884,4886,4888,4890,4893,4896,4899,4902,4905,4908],{"class":111,"line":112},[109,4883,2085],{"class":115},[109,4885,2088],{"class":119},[109,4887,2091],{"class":119},[109,4889,2094],{"class":119},[109,4891,4892],{"class":119}," BETTER_AUTH_SECRET",[109,4894,4895],{"class":2128}," $(",[109,4897,4898],{"class":115},"openssl",[109,4900,4901],{"class":119}," rand",[109,4903,4904],{"class":3483}," -base64",[109,4906,4907],{"class":3483}," 32",[109,4909,4910],{"class":2128},")\n",[89,4912,2115],{"id":4913},"nuxt-frontend",[11,4915,4916,4917,2593],{},"Diese gehören in ",[19,4918,2118],{},[136,4920,4921,4929],{},[139,4922,4923],{},[142,4924,4925,4927],{},[145,4926,147],{},[145,4928,150],{},[155,4930,4931,4943,4956],{},[142,4932,4933,4937],{},[160,4934,4935],{},[19,4936,293],{},[160,4938,4939,4940,937],{},"URL Ihres Convex-Deployments (z. B. ",[19,4941,4942],{},"https:\u002F\u002Fyour-deployment.convex.cloud",[142,4944,4945,4949],{},[160,4946,4947],{},[19,4948,308],{},[160,4950,4951,4952,4955],{},"Ihre Convex-Site-URL (z. B. ",[19,4953,4954],{},"https:\u002F\u002Fyour-deployment.convex.site","). Wird für den Auth-Proxy verwendet.",[142,4957,4958,4962],{},[160,4959,4960],{},[19,4961,339],{},[160,4963,4964,4965,4967],{},"Öffentliche Site-URL. Muss der in Convex gesetzten ",[19,4966,4862],{}," entsprechen.",[89,4969,4971],{"id":4970},"vollständige-referenz","Vollständige Referenz",[131,4973,4975,4976,937],{"id":4974},"tenant-app-appsapi","Tenant-App (",[19,4977,4978],{},"apps\u002Fapi",[136,4980,4981,4997],{},[139,4982,4983],{},[142,4984,4985,4987,4990,4992,4994],{},[145,4986,147],{},[145,4988,4989],{},"Wo",[145,4991,2205],{},[145,4993,284],{},[145,4995,4996],{},"Zweck",[155,4998,4999,5025,5047,5064,5079,5096,5111,5143,5159,5174,5189,5204,5223,5239,5254,5270,5287,5306,5321,5336,5352,5371,5387,5406,5421,5436,5452,5467,5485,5500,5517,5544,5562,5580,5595,5610,5625,5643,5663,5683,5701,5719,5738,5763,5782,5799,5815,5831,5846,5862,5879,5896,5913,5939,5954,5969,6000,6017,6032,6047,6062,6077,6092,6112,6129,6147,6164,6180],{},[142,5000,5001,5005,5007,5010,5012],{},[160,5002,5003],{},[19,5004,164],{},[160,5006,2435],{},[160,5008,5009],{},"Ja",[160,5011,397],{},[160,5013,5014,5015,5017,5018,175,5020,175,5022,5024],{},"HKDF-Wurzel für die Verschlüsselung ruhender Zugangsdaten (",[19,5016,170],{},"); gemeinsames Geheimnis, das ",[19,5019,174],{},[19,5021,178],{},[19,5023,181],{}," absichert",[142,5026,5027,5031,5033,5036,5038],{},[160,5028,5029],{},[19,5030,194],{},[160,5032,2435],{},[160,5034,5035],{},"Nein",[160,5037,397],{},[160,5039,5040,5041,5043,5044,5046],{},"Vorheriges ",[19,5042,164],{},", nur während eines Rotationsfensters gesetzt: Unter der alten Wurzel versiegelte ruhende Geheimnisse lassen sich weiterhin entschlüsseln, während ",[19,5045,207],{}," jede Zeile unter dem neuen Geheimnis neu versiegelt. Nach Abschluss der Neuversiegelung entfernen",[142,5048,5049,5053,5055,5057,5061],{},[160,5050,5051],{},[19,5052,4862],{},[160,5054,2435],{},[160,5056,5009],{},[160,5058,5059],{},[19,5060,347],{},[160,5062,5063],{},"Öffentliche Site-URL für Weiterleitungen",[142,5065,5066,5070,5072,5074,5076],{},[160,5067,5068],{},[19,5069,1492],{},[160,5071,2435],{},[160,5073,5035],{},[160,5075,397],{},[160,5077,5078],{},"Alternative Site-URL, der für Auth-Weiterleitungen vertraut wird",[142,5080,5081,5085,5087,5089,5093],{},[160,5082,5083],{},[19,5084,1475],{},[160,5086,2435],{},[160,5088,5035],{},[160,5090,5091],{},[19,5092,347],{},[160,5094,5095],{},"Kommagetrennte CORS-Allowlist für die Convex-HTTP-API",[142,5097,5098,5102,5104,5106,5108],{},[160,5099,5100],{},[19,5101,1440],{},[160,5103,2435],{},[160,5105,5035],{},[160,5107,3187],{},[160,5109,5110],{},"Aktiviert Dev-\u002FSeed-Endpunkte; fail-closed, wenn nicht gesetzt",[142,5112,5113,5117,5119,5121,5123],{},[160,5114,5115],{},[19,5116,2179],{},[160,5118,2435],{},[160,5120,5035],{},[160,5122,397],{},[160,5124,5125,5126,175,5128,175,5130,175,5132,175,5134,631,5136,5138,5139,5142],{},"Instanzweiter E-Mail-Provider (",[19,5127,2220],{},[19,5129,2252],{},[19,5131,2287],{},[19,5133,2312],{},[19,5135,2347],{},[19,5137,2378],{},"); kein Standard — nicht gesetzt bedeutet ",[330,5140,5141],{},"nicht konfiguriert",", und Sendungen werden verweigert. Eine Provider-Route je Organisation überschreibt ihn",[142,5144,5145,5149,5151,5154,5156],{},[160,5146,5147],{},[19,5148,2260],{},[160,5150,2435],{},[160,5152,5153],{},"Bei SES",[160,5155,397],{},[160,5157,5158],{},"AWS-Region für SES",[142,5160,5161,5165,5167,5169,5171],{},[160,5162,5163],{},[19,5164,2263],{},[160,5166,2435],{},[160,5168,5153],{},[160,5170,397],{},[160,5172,5173],{},"AWS-IAM-Access-Key",[142,5175,5176,5180,5182,5184,5186],{},[160,5177,5178],{},[19,5179,2266],{},[160,5181,2435],{},[160,5183,5153],{},[160,5185,397],{},[160,5187,5188],{},"Geheimer AWS-IAM-Schlüssel",[142,5190,5191,5195,5197,5199,5201],{},[160,5192,5193],{},[19,5194,2271],{},[160,5196,2435],{},[160,5198,5035],{},[160,5200,397],{},[160,5202,5203],{},"SES Configuration Set, das für die Feedback-Zuordnung auf jede Sendung angewendet wird",[142,5205,5206,5210,5212,5215,5217],{},[160,5207,5208],{},[19,5209,2274],{},[160,5211,2435],{},[160,5213,5214],{},"Bei SES-Feedback",[160,5216,397],{},[160,5218,5219,5220,5222],{},"ARN des SNS-Topics, das SES-Feedback an ",[19,5221,2549],{}," zustellen darf",[142,5224,5225,5229,5231,5234,5236],{},[160,5226,5227],{},[19,5228,2295],{},[160,5230,2435],{},[160,5232,5233],{},"Bei Resend",[160,5235,397],{},[160,5237,5238],{},"Resend-API-Schlüssel",[142,5240,5241,5245,5247,5249,5251],{},[160,5242,5243],{},[19,5244,2300],{},[160,5246,2435],{},[160,5248,5035],{},[160,5250,397],{},[160,5252,5253],{},"Signiergeheimnis für Resend-Webhooks",[142,5255,5256,5260,5262,5265,5267],{},[160,5257,5258],{},[19,5259,2320],{},[160,5261,2435],{},[160,5263,5264],{},"Bei SMTP",[160,5266,397],{},[160,5268,5269],{},"Hostname des generischen SMTP-Relays",[142,5271,5272,5276,5278,5280,5284],{},[160,5273,5274],{},[19,5275,2331],{},[160,5277,2435],{},[160,5279,5035],{},[160,5281,5282],{},[19,5283,3075],{},[160,5285,5286],{},"SMTP-Submission-Port (465 für implizites TLS)",[142,5288,5289,5293,5295,5297,5301],{},[160,5290,5291],{},[19,5292,2334],{},[160,5294,2435],{},[160,5296,5035],{},[160,5298,5299],{},[19,5300,424],{},[160,5302,5303,5305],{},[19,5304,3091],{}," für implizites TLS (465); sonst STARTTLS",[142,5307,5308,5312,5314,5316,5318],{},[160,5309,5310],{},[19,5311,2323],{},[160,5313,2435],{},[160,5315,5264],{},[160,5317,397],{},[160,5319,5320],{},"Benutzername für die Authentifizierung am SMTP-Relay",[142,5322,5323,5327,5329,5331,5333],{},[160,5324,5325],{},[19,5326,2326],{},[160,5328,2435],{},[160,5330,5264],{},[160,5332,397],{},[160,5334,5335],{},"Passwort für die Authentifizierung am SMTP-Relay",[142,5337,5338,5342,5344,5347,5349],{},[160,5339,5340],{},[19,5341,2355],{},[160,5343,2435],{},[160,5345,5346],{},"Bei Mandrill",[160,5348,397],{},[160,5350,5351],{},"API-Schlüssel für Mailchimp Transactional (Mandrill)",[142,5353,5354,5358,5360,5363,5365],{},[160,5355,5356],{},[19,5357,2360],{},[160,5359,2435],{},[160,5361,5362],{},"Bei Mandrill-Feedback",[160,5364,397],{},[160,5366,5367,5368],{},"Signierschlüssel je Webhook für ",[19,5369,5370],{},"\u002Fwebhooks\u002Fmandrill",[142,5372,5373,5377,5379,5382,5384],{},[160,5374,5375],{},[19,5376,2386],{},[160,5378,2435],{},[160,5380,5381],{},"Bei Emailit-Sendungen",[160,5383,397],{},[160,5385,5386],{},"Bearer-Token für Emailit v2",[142,5388,5389,5393,5395,5398,5400],{},[160,5390,5391],{},[19,5392,2391],{},[160,5394,2435],{},[160,5396,5397],{},"Bei Emailit-Feedback",[160,5399,397],{},[160,5401,5402,5403],{},"HMAC-Geheimnis für ",[19,5404,5405],{},"\u002Fwebhooks\u002Femailit",[142,5407,5408,5412,5414,5416,5418],{},[160,5409,5410],{},[19,5411,2363],{},[160,5413,2435],{},[160,5415,5035],{},[160,5417,397],{},[160,5419,5420],{},"Mandrill-Subaccount, der Owlats Traffic und dessen Reputation isoliert",[142,5422,5423,5427,5429,5431,5433],{},[160,5424,5425],{},[19,5426,2366],{},[160,5428,2435],{},[160,5430,5035],{},[160,5432,397],{},[160,5434,5435],{},"Standardmäßiger dedizierter IP-Pool bei Mandrill; der eigene Pool einer Provider-Route überschreibt ihn",[142,5437,5438,5442,5444,5447,5449],{},[160,5439,5440],{},[19,5441,2231],{},[160,5443,2435],{},[160,5445,5446],{},"Bei MTA",[160,5448,397],{},[160,5450,5451],{},"URL des MTA-Dienstes",[142,5453,5454,5458,5460,5462,5464],{},[160,5455,5456],{},[19,5457,245],{},[160,5459,2435],{},[160,5461,5446],{},[160,5463,397],{},[160,5465,5466],{},"Authentifizierungsschlüssel für die MTA-API",[142,5468,5469,5473,5475,5477,5479],{},[160,5470,5471],{},[19,5472,260],{},[160,5474,2435],{},[160,5476,5446],{},[160,5478,397],{},[160,5480,5481,5482,5484],{},"HMAC-Geheimnis für MTA-Zustell-Callbacks und (bei Postbox) die Prüfung der SMTP-Submission-Zugangsdaten der MTA. Liegt außerhalb des Convex-seitigen Sende-Vorhandensein-Gates, doch der ",[19,5483,2220],{},"-Container selbst startet ohne den Wert nicht",[142,5486,5487,5491,5493,5495,5497],{},[160,5488,5489],{},[19,5490,3866],{},[160,5492,2435],{},[160,5494,5035],{},[160,5496,397],{},[160,5498,5499],{},"MTA-URL für die Prüfung von Anhängen",[142,5501,5502,5506,5508,5510,5512],{},[160,5503,5504],{},[19,5505,1507],{},[160,5507,2435],{},[160,5509,5035],{},[160,5511,397],{},[160,5513,1510,5514,5516],{},[19,5515,1513],{},"-Host in den generierten DNS-Einträgen (entfällt, wenn nicht gesetzt)",[142,5518,5519,5523,5525,5527,5531],{},[160,5520,5521],{},[19,5522,1526],{},[160,5524,2435],{},[160,5526,5035],{},[160,5528,5529],{},[19,5530,1536],{},[160,5532,1529,5533,5535,5536,593,5538,593,5540,593,5542,937],{},[19,5534,1532],{}," in generierten SPF-Einträgen (",[19,5537,1536],{},[19,5539,1540],{},[19,5541,1544],{},[19,5543,1547],{},[142,5545,5546,5550,5552,5554,5556],{},[160,5547,5548],{},[19,5549,1565],{},[160,5551,2435],{},[160,5553,5035],{},[160,5555,397],{},[160,5557,5558,5559,5561],{},"VERP-Return-Path-Domain; erzeugt zusammen mit ",[19,5560,1577],{}," einen Return-Path-SPF-Eintrag",[142,5563,5564,5568,5570,5572,5574],{},[160,5565,5566],{},[19,5567,1589],{},[160,5569,2435],{},[160,5571,5035],{},[160,5573,397],{},[160,5575,5576,5577,5579],{},"VERP-Signierschlüssel (identisch mit ",[19,5578,467],{}," der MTA); lässt Relay-Sendungen unseren eigenen VERP-Return-Path tragen, sodass relayed Bounces zuordenbar sind",[142,5581,5582,5586,5588,5590,5592],{},[160,5583,5584],{},[19,5585,1610],{},[160,5587,2435],{},[160,5589,5035],{},[160,5591,397],{},[160,5593,5594],{},"SPF-Terme, die das Relay am Return-Path-Host autorisieren; erforderlich, bevor eine Relay-Sendung unseren VERP-Envelope-Absender trägt",[142,5596,5597,5601,5603,5605,5607],{},[160,5598,5599],{},[19,5600,1577],{},[160,5602,2435],{},[160,5604,5035],{},[160,5606,397],{},[160,5608,5609],{},"Kommagetrennte sendende IPs, aus denen der Return-Path-SPF-Eintrag gebaut wird",[142,5611,5612,5616,5618,5620,5622],{},[160,5613,5614],{},[19,5615,1666],{},[160,5617,2435],{},[160,5619,5035],{},[160,5621,397],{},[160,5623,5624],{},"Feed-URLs des Microsoft-SNDS-Automated-Data-Access; rein additives externes Reputationssignal für die Microsoft-Zelle",[142,5626,5627,5631,5633,5635,5637],{},[160,5628,5629],{},[19,5630,1701],{},[160,5632,2435],{},[160,5634,5035],{},[160,5636,397],{},[160,5638,5639,5640,5642],{},"DKIM-",[19,5641,1707],{},"-Domain des aktiven Transports, wenn es nicht die From-Domain ist; treibt den Guard für die ausgehende DMARC-Ausrichtung an (Warnung bei Relay-Fehlausrichtung)",[142,5644,5645,5649,5651,5653,5655],{},[160,5646,5647],{},[19,5648,1724],{},[160,5650,2435],{},[160,5652,5035],{},[160,5654,397],{},[160,5656,5657,5659,5660,5662],{},[19,5658,1742],{},"-URI für DMARC-Aggregatberichte im generierten ",[19,5661,1734],{},"-Eintrag (entfällt, wenn nicht gesetzt)",[142,5664,5665,5669,5671,5673,5675],{},[160,5666,5667],{},[19,5668,1759],{},[160,5670,2435],{},[160,5672,5035],{},[160,5674,397],{},[160,5676,5677,5678,5680,5681,5662],{},"TLS-RPT-",[19,5679,1742],{},"-Ziel im generierten ",[19,5682,1768],{},[142,5684,5685,5689,5691,5693,5695],{},[160,5686,5687],{},[19,5688,1798],{},[160,5690,2435],{},[160,5692,5035],{},[160,5694,397],{},[160,5696,5697,5698,5700],{},"HTTPS-URL des SVG-Logos im angebotenen BIMI-Eintrag (",[19,5699,1804],{},"); nicht gesetzt ⇒ kein Eintrag, nie ein Blocker",[142,5702,5703,5707,5709,5711,5713],{},[160,5704,5705],{},[19,5706,1829],{},[160,5708,2435],{},[160,5710,5035],{},[160,5712,397],{},[160,5714,5715,5716,5718],{},"HTTPS-URL des VMC-PEM im angebotenen BIMI-Eintrag (",[19,5717,1835],{},"); nur von Gmail\u002FApple verlangt",[142,5720,5721,5725,5727,5729,5733],{},[160,5722,5723],{},[19,5724,1847],{},[160,5726,2435],{},[160,5728,5035],{},[160,5730,5731],{},[19,5732,1859],{},[160,5734,5735,5736],{},"Selektor-Label für ",[19,5737,1853],{},[142,5739,5740,5744,5747,5749,5753],{},[160,5741,5742],{},[19,5743,1866],{},[160,5745,5746],{},"MTA + Convex",[160,5748,5035],{},[160,5750,5751],{},[19,5752,1872],{},[160,5754,5755,5756,593,5758,593,5760,5762],{},"Ausgehende TLS-Untergrenze der eingebauten MTA (",[19,5757,1872],{},[19,5759,1876],{},[19,5761,1880],{},"); dem Transport-Editor schreibgeschützt angezeigt",[142,5764,5765,5769,5771,5777,5779],{},[160,5766,5767],{},[19,5768,1281],{},[160,5770,2435],{},[160,5772,5773,5774,5776],{},"Wenn ",[19,5775,1245],{}," aktiv",[160,5778,397],{},[160,5780,5781],{},"Basis-URL der internen Send-\u002FTest-API des Mail-Sync-Workers",[142,5783,5784,5788,5790,5794,5796],{},[160,5785,5786],{},[19,5787,1310],{},[160,5789,2435],{},[160,5791,5773,5792,5776],{},[19,5793,1245],{},[160,5795,397],{},[160,5797,5798],{},"Gemeinsamer Schlüssel, mit dem sich Convex gegenüber dem Mail-Sync-Worker authentifiziert",[142,5800,5801,5805,5807,5810,5812],{},[160,5802,5803],{},[19,5804,1348],{},[160,5806,2435],{},[160,5808,5809],{},"Bei SMS-Kanal",[160,5811,397],{},[160,5813,5814],{},"Validiert Signaturen eingehender Twilio-Webhooks",[142,5816,5817,5821,5823,5826,5828],{},[160,5818,5819],{},[19,5820,1366],{},[160,5822,2435],{},[160,5824,5825],{},"Bei WhatsApp-\u002FMessenger-Kanal",[160,5827,397],{},[160,5829,5830],{},"Validiert den HMAC eingehender Meta-Webhooks",[142,5832,5833,5837,5839,5841,5843],{},[160,5834,5835],{},[19,5836,1383],{},[160,5838,2435],{},[160,5840,5825],{},[160,5842,397],{},[160,5844,5845],{},"Challenge-Token für das Meta-Webhook-Abonnement",[142,5847,5848,5852,5854,5857,5859],{},[160,5849,5850],{},[19,5851,1399],{},[160,5853,2435],{},[160,5855,5856],{},"Bei generischem Kanal",[160,5858,397],{},[160,5860,5861],{},"Gemeinsames Geheimnis für den generischen Adapter eingehender Kanäle",[142,5863,5864,5868,5870,5872,5876],{},[160,5865,5866],{},[19,5867,3751],{},[160,5869,2435],{},[160,5871,5035],{},[160,5873,5874],{},[19,5875,3759],{},[160,5877,5878],{},"Standard-Absenderadresse",[142,5880,5881,5885,5887,5889,5893],{},[160,5882,5883],{},[19,5884,3766],{},[160,5886,2435],{},[160,5888,5035],{},[160,5890,5891],{},[19,5892,3774],{},[160,5894,5895],{},"Standard-Absendername",[142,5897,5898,5902,5904,5906,5910],{},[160,5899,5900],{},[19,5901,3781],{},[160,5903,2435],{},[160,5905,5035],{},[160,5907,5908],{},[19,5909,3793],{},[160,5911,5912],{},"Domain für System-E-Mails",[142,5914,5915,5919,5921,5923,5925],{},[160,5916,5917],{},[19,5918,3800],{},[160,5920,2435],{},[160,5922,5009],{},[160,5924,397],{},[160,5926,5927,5928,5930,5931,5934,5935,5938],{},"Eingebaute Convex-Site-URL (Tracking\u002FAbmeldung) — automatisch aus ",[19,5929,308],{}," abgeleitet; nicht per ",[19,5932,5933],{},"convex env set"," setzen (wird als ",[19,5936,5937],{},"EnvVarNameForbidden"," abgelehnt)",[142,5940,5941,5945,5947,5949,5951],{},[160,5942,5943],{},[19,5944,3812],{},[160,5946,2435],{},[160,5948,5009],{},[160,5950,397],{},[160,5952,5953],{},"HMAC-Geheimnis für Abmelde-Token",[142,5955,5956,5960,5962,5964,5966],{},[160,5957,5958],{},[19,5959,4850],{},[160,5961,2435],{},[160,5963,5009],{},[160,5965,397],{},[160,5967,5968],{},"Geheimnis zum Signieren von Sitzungen",[142,5970,5971,5975,5977,5981,5985],{},[160,5972,5973],{},[19,5974,4316],{},[160,5976,2435],{},[160,5978,5773,5979,5776],{},[19,5980,936],{},[160,5982,5983],{},[19,5984,4321],{},[160,5986,5987,5988,175,5990,175,5992,5994,5995,5997,5998,937],{},"LLM-Provider (",[19,5989,4321],{},[19,5991,4324],{},[19,5993,4327],{},"; Claude über ",[19,5996,4321],{}," + OpenAI-kompatible ",[19,5999,4334],{},[142,6001,6002,6006,6008,6012,6014],{},[160,6003,6004],{},[19,6005,1962],{},[160,6007,2435],{},[160,6009,5773,6010,5776],{},[19,6011,936],{},[160,6013,397],{},[160,6015,6016],{},"API-Schlüssel für den gewählten LLM-Provider",[142,6018,6019,6023,6025,6027,6029],{},[160,6020,6021],{},[19,6022,4367],{},[160,6024,2435],{},[160,6026,5035],{},[160,6028,4373],{},[160,6030,6031],{},"Modell-Id der schnellen Stufe",[142,6033,6034,6038,6040,6042,6044],{},[160,6035,6036],{},[19,6037,4380],{},[160,6039,2435],{},[160,6041,5035],{},[160,6043,4373],{},[160,6045,6046],{},"Modell-Id der leistungsfähigen Stufe",[142,6048,6049,6053,6055,6057,6059],{},[160,6050,6051],{},[19,6052,4392],{},[160,6054,2435],{},[160,6056,5035],{},[160,6058,397],{},[160,6060,6061],{},"Einzelmodell-Fallback für beide Stufen",[142,6063,6064,6068,6070,6072,6074],{},[160,6065,6066],{},[19,6067,4409],{},[160,6069,2435],{},[160,6071,5035],{},[160,6073,4373],{},[160,6075,6076],{},"Modell-Id für Embeddings (Env-Fallback)",[142,6078,6079,6083,6085,6087,6089],{},[160,6080,6081],{},[19,6082,4334],{},[160,6084,2435],{},[160,6086,5035],{},[160,6088,397],{},[160,6090,6091],{},"Override für OpenAI-kompatible Endpunkte",[142,6093,6094,6098,6100,6102,6106],{},[160,6095,6096],{},[19,6097,4432],{},[160,6099,2435],{},[160,6101,5035],{},[160,6103,6104],{},[19,6105,4445],{},[160,6107,6108,6109,6111],{},"Lokales, OpenAI-kompatibles ",[19,6110,4438],{},"-Sidecar für die standardmäßig lokale Embedding-Ebene",[142,6113,6114,6118,6120,6122,6126],{},[160,6115,6116],{},[19,6117,4452],{},[160,6119,2435],{},[160,6121,5035],{},[160,6123,6124],{},[19,6125,4458],{},[160,6127,6128],{},"Id des lokalen Embedding-Modells; seine Breite muss zum Vektorindex passen",[142,6130,6131,6135,6137,6142,6144],{},[160,6132,6133],{},[19,6134,4041],{},[160,6136,2435],{},[160,6138,5773,6139,5776],{},[19,6140,6141],{},"analytics.posthog",[160,6143,397],{},[160,6145,6146],{},"PostHog-Projekt-API-Schlüssel (serverseitig)",[142,6148,6149,6153,6155,6157,6161],{},[160,6150,6151],{},[19,6152,4055],{},[160,6154,2435],{},[160,6156,5035],{},[160,6158,6159],{},[19,6160,4061],{},[160,6162,6163],{},"URL der PostHog-Instanz (serverseitig)",[142,6165,6166,6170,6172,6175,6177],{},[160,6167,6168],{},[19,6169,2054],{},[160,6171,2435],{},[160,6173,6174],{},"Nein (nur Hosted)",[160,6176,397],{},[160,6178,6179],{},"Ziel des Analytics-Reporters für die verwaltete Control Plane",[142,6181,6182,6186,6188,6193,6195],{},[160,6183,6184],{},[19,6185,3856],{},[160,6187,2435],{},[160,6189,5773,6190,5776],{},[19,6191,6192],{},"scan.urls",[160,6194,397],{},[160,6196,6197],{},"Prüfung der URL-Reputation (Safe-Browsing-API)",[131,6199,6201,6202,937],{"id":6200},"frontend-appsweb","Frontend (",[19,6203,6204],{},"apps\u002Fweb",[136,6206,6207,6221],{},[139,6208,6209],{},[142,6210,6211,6213,6215,6217,6219],{},[145,6212,147],{},[145,6214,4989],{},[145,6216,2205],{},[145,6218,284],{},[145,6220,4996],{},[155,6222,6223,6241,6258,6275,6292],{},[142,6224,6225,6229,6234,6236,6238],{},[160,6226,6227],{},[19,6228,293],{},[160,6230,6231,6232],{},"Nuxt-",[19,6233,25],{},[160,6235,5009],{},[160,6237,397],{},[160,6239,6240],{},"URL des Convex-Deployments",[142,6242,6243,6247,6251,6253,6255],{},[160,6244,6245],{},[19,6246,308],{},[160,6248,6231,6249],{},[19,6250,25],{},[160,6252,5009],{},[160,6254,397],{},[160,6256,6257],{},"Convex-Site-URL für die Authentifizierung",[142,6259,6260,6264,6268,6270,6272],{},[160,6261,6262],{},[19,6263,339],{},[160,6265,6231,6266],{},[19,6267,25],{},[160,6269,5009],{},[160,6271,397],{},[160,6273,6274],{},"Öffentliche Site-URL",[142,6276,6277,6281,6285,6287,6289],{},[160,6278,6279],{},[19,6280,4087],{},[160,6282,6231,6283],{},[19,6284,25],{},[160,6286,5035],{},[160,6288,397],{},[160,6290,6291],{},"PostHog-Projekt-API-Schlüssel (clientseitig)",[142,6293,6294,6298,6302,6304,6308],{},[160,6295,6296],{},[19,6297,4097],{},[160,6299,6231,6300],{},[19,6301,25],{},[160,6303,5035],{},[160,6305,6306],{},[19,6307,4061],{},[160,6309,6310],{},"URL der PostHog-Instanz (clientseitig)",[131,6312,6314,6315,937],{"id":6313},"mta-appsmta","MTA (",[19,6316,2442],{},[136,6318,6319,6333],{},[139,6320,6321],{},[142,6322,6323,6325,6327,6329,6331],{},[145,6324,147],{},[145,6326,4989],{},[145,6328,2205],{},[145,6330,284],{},[145,6332,4996],{},[155,6334,6335,6356,6372],{},[142,6336,6337,6341,6344,6346,6350],{},[160,6338,6339],{},[19,6340,3899],{},[160,6342,6343],{},"MTA-Env",[160,6345,5035],{},[160,6347,6348],{},[19,6349,3904],{},[160,6351,6352,6353,6355],{},"Hostname des ClamAV-Daemons (",[19,6354,29],{}," verdrahtet den Sidecar-Namen fest)",[142,6357,6358,6362,6364,6366,6370],{},[160,6359,6360],{},[19,6361,3920],{},[160,6363,6343],{},[160,6365,5035],{},[160,6367,6368],{},[19,6369,3925],{},[160,6371,3928],{},[142,6373,6374,6378,6380,6382,6386],{},[160,6375,6376],{},[19,6377,608],{},[160,6379,6343],{},[160,6381,5035],{},[160,6383,6384],{},[19,6385,34],{},[160,6387,6388,6389,6391,6392,4781],{},"Ausführlichkeit des Logs. ",[19,6390,29],{}," bildet die Host-Variable ",[19,6393,586],{},[131,6395,6397,6398,937],{"id":6396},"imap-server-appsimap","IMAP-Server (",[19,6399,1131],{},[11,6401,6402,6403,6405,6406,182],{},"Wird nur gestartet, wenn das Flag ",[19,6404,1125],{}," aktiv ist (über das Docker-Compose-Profil ",[19,6407,6408],{},"personal-mail",[136,6410,6411,6425],{},[139,6412,6413],{},[142,6414,6415,6417,6419,6421,6423],{},[145,6416,147],{},[145,6418,4989],{},[145,6420,2205],{},[145,6422,284],{},[145,6424,4996],{},[155,6426,6427,6444,6460,6476,6494,6511,6532,6546,6564,6582],{},[142,6428,6429,6433,6436,6438,6442],{},[160,6430,6431],{},[19,6432,4656],{},[160,6434,6435],{},"IMAP-Env",[160,6437,5035],{},[160,6439,6440],{},[19,6441,4664],{},[160,6443,4659],{},[142,6445,6446,6450,6452,6454,6458],{},[160,6447,6448],{},[19,6449,4671],{},[160,6451,6435],{},[160,6453,5035],{},[160,6455,6456],{},[19,6457,4679],{},[160,6459,4674],{},[142,6461,6462,6466,6468,6470,6472],{},[160,6463,6464],{},[19,6465,4686],{},[160,6467,6435],{},[160,6469,5035],{},[160,6471,4695],{},[160,6473,4689,6474],{},[19,6475,4692],{},[142,6477,6478,6484,6486,6489,6491],{},[160,6479,6480,749,6482],{},[19,6481,4702],{},[19,6483,4705],{},[160,6485,6435],{},[160,6487,6488],{},"Nein (TLS aus)",[160,6490,397],{},[160,6492,6493],{},"TLS-Zertifikat (PEM oder Pfad)",[142,6495,6496,6502,6504,6506,6508],{},[160,6497,6498,749,6500],{},[19,6499,4717],{},[19,6501,4720],{},[160,6503,6435],{},[160,6505,6488],{},[160,6507,397],{},[160,6509,6510],{},"Privater TLS-Schlüssel (PEM oder Pfad)",[142,6512,6513,6517,6519,6521,6525],{},[160,6514,6515],{},[19,6516,4732],{},[160,6518,6435],{},[160,6520,5035],{},[160,6522,6523],{},[19,6524,4746],{},[160,6526,6527,6528,593,6530],{},"Fallback-Verzeichnis für ",[19,6529,4738],{},[19,6531,4741],{},[142,6533,6534,6538,6540,6542,6544],{},[160,6535,6536],{},[19,6537,4753],{},[160,6539,6435],{},[160,6541,5009],{},[160,6543,397],{},[160,6545,6240],{},[142,6547,6548,6552,6554,6556,6558],{},[160,6549,6550],{},[19,6551,224],{},[160,6553,6435],{},[160,6555,5009],{},[160,6557,397],{},[160,6559,6560,6561,6563],{},"Convex-Admin-Schlüssel — die einzige Authentifizierung des IMAP-Servers gegenüber Convex (ruft ",[19,6562,1191],{}," direkt auf)",[142,6565,6566,6570,6572,6574,6578],{},[160,6567,6568],{},[19,6569,608],{},[160,6571,6435],{},[160,6573,5035],{},[160,6575,6576],{},[19,6577,34],{},[160,6579,4778,6580,4781],{},[19,6581,1207],{},[142,6583,6584,6588,6590,6592,6594],{},[160,6585,6586],{},[19,6587,1217],{},[160,6589,6435],{},[160,6591,5035],{},[160,6593,397],{},[160,6595,6596],{},"Redis-URL für die Speicherung der Rate Limits. Am ausgelieferten Compose-Dienst nicht gesetzt → Rate Limiting schaltet fail-open.",[11,6598,6599,6600,201,6602,6604,6605,87],{},"Der IMAP-Server liest ",[19,6601,260],{},[40,6603,680],{},". Seine einzige erforderliche Convex-Zugangsberechtigung ist ",[19,6606,224],{},[6608,6609,6610],"style",{},"html pre.shiki code .sOLd2, html code.shiki .sOLd2{--shiki-default:#6F42C1;--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 .sDN9O, html code.shiki .sDN9O{--shiki-default:#6A737D;--shiki-dark:#768390}html pre.shiki code .sYgZi, html code.shiki .sYgZi{--shiki-default:#24292E;--shiki-dark:#ADBAC7}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}",{"title":105,"searchDepth":877,"depth":877,"links":6612},[6613,6629,6630,6640,6644,6649,6653,6654,6656,6657,6658],{"id":91,"depth":877,"text":92,"children":6614},[6615,6616,6617,6618,6619,6620,6621,6623,6625,6627,6628],{"id":133,"depth":883,"text":134},{"id":270,"depth":883,"text":271},{"id":350,"depth":883,"text":351},{"id":755,"depth":883,"text":756},{"id":859,"depth":883,"text":860},{"id":913,"depth":883,"text":914},{"id":932,"depth":883,"text":6622},"Optional: LLM-Provider (Flag ai)",{"id":1121,"depth":883,"text":6624},"Optional: Private E-Mail \u002F IMAP (Flag postbox)",{"id":1241,"depth":883,"text":6626},"Optional: Mail-Sync — externe Postfächer (Flag mail.external)",{"id":1316,"depth":883,"text":1317},{"id":1412,"depth":883,"text":1413},{"id":2058,"depth":877,"text":2059},{"id":2156,"depth":877,"text":2157,"children":6631},[6632,6633,6634,6635,6636,6637,6638,6639],{"id":2160,"depth":883,"text":2161},{"id":2482,"depth":883,"text":2280},{"id":2287,"depth":883,"text":2290},{"id":2378,"depth":883,"text":2381},{"id":3030,"depth":883,"text":3031},{"id":3119,"depth":883,"text":2350},{"id":3518,"depth":883,"text":3519},{"id":3726,"depth":883,"text":3727},{"id":3820,"depth":877,"text":3821,"children":6641},[6642,6643],{"id":3830,"depth":883,"text":3831},{"id":3931,"depth":883,"text":2554},{"id":4004,"depth":877,"text":4005,"children":6645},[6646,6647,6648],{"id":4017,"depth":883,"text":3831},{"id":4104,"depth":883,"text":2554},{"id":4206,"depth":883,"text":4207},{"id":4283,"depth":877,"text":4284,"children":6650},[6651,6652],{"id":4295,"depth":883,"text":3831},{"id":4470,"depth":883,"text":2211},{"id":4616,"depth":877,"text":4617},{"id":4627,"depth":877,"text":6655},"Private E-Mail \u002F IMAP (apps\u002Fimap)",{"id":4828,"depth":877,"text":4829},{"id":4913,"depth":877,"text":2115},{"id":4970,"depth":877,"text":4971,"children":6659},[6660,6662,6664,6666],{"id":4974,"depth":883,"text":6661},"Tenant-App (apps\u002Fapi)",{"id":6200,"depth":883,"text":6663},"Frontend (apps\u002Fweb)",{"id":6313,"depth":883,"text":6665},"MTA (apps\u002Fmta)",{"id":6396,"depth":883,"text":6667},"IMAP-Server (apps\u002Fimap)","Referenz zu jeder Umgebungsvariablen, die Owlat im Convex-Backend, in der Web-App, in der MTA, im IMAP-Server und im Mail-Sync-Worker liest.","md",{},"\u002Fdeveloper\u002Fenvironment-variables",{"title":6,"description":6668},"3.developer\u002F8.environment-variables","e-jTSUhbeqLHdmKDhEM4NvvfDbp6LuemdWahsXa9bSk",[6676,6680],{"title":6677,"path":6678,"stem":6679,"children":-1},"Email Renderer","\u002Fdeveloper\u002Femail-renderer","3.developer\u002F7.email-renderer",{"title":6681,"path":6682,"stem":6683,"children":-1},"Komponentenbibliothek","\u002Fdeveloper\u002Fcomponents","3.developer\u002F9.components",1786915107824]