[{"data":1,"prerenderedAt":1087},["ShallowReactive",2],{"search-de":3,"content-de-developer":4,"surround-de-\u002Fdeveloper":1080},[],{"id":5,"title":6,"body":7,"description":1073,"extension":1074,"meta":1075,"navigation":938,"path":1076,"seo":1077,"stem":1078,"__hash__":1079},"content_de\u002F3.developer\u002F1.index.md","Entwicklerhandbuch",{"type":8,"value":9,"toc":1049},"minimark",[10,14,19,24,71,75,112,116,125,129,165,169,201,205,209,220,224,288,291,298,304,310,479,483,527,531,539,543,647,651,655,684,688,695,721,724,743,746,749,812,816,835,984,988,994,1042,1045],[11,12,13],"p",{},"Dieses Handbuch behandelt die technische Architektur und die Entwicklungsmuster, die in Owlat verwendet werden. Owlat ist als eine Menge von Funktionsbereichen aufgebaut (Versand, Empfang, KI, Integrationen, Sicherheit, Zustellbarkeit), die sich eine gemeinsame Plattform teilen — das Convex-Backend, die E-Mail-Rendering-Engine und die Feature-Flag-Registry, die jeden Bereich ein- oder ausschaltet.",[15,16,18],"h2",{"id":17},"schnellzugriff","Schnellzugriff",[20,21,23],"h3",{"id":22},"architektur-kernsysteme","Architektur & Kernsysteme",[25,26,27,36,43,50,57,64],"ul",{},[28,29,30,35],"li",{},[31,32,34],"a",{"href":33},"\u002Fdeveloper\u002Farchitecture","Architekturüberblick"," — Systemdesign, Monorepo-Aufbau, Datenfluss",[28,37,38,42],{},[31,39,41],{"href":40},"\u002Fdeveloper\u002Ffeature-flags","Feature-Flags"," — Registry, Abhängigkeitsauflösung, Zuordnung zu Docker-Profilen",[28,44,45,49],{},[31,46,48],{"href":47},"\u002Fdeveloper\u002Fproviders","Provider"," — austauschbare LLM- und E-Mail-\u002FVersand-Provider",[28,51,52,56],{},[31,53,55],{"href":54},"\u002Fdeveloper\u002Fconvex","Convex-Backend"," — Datenbankschema und API-Funktionen",[28,58,59,63],{},[31,60,62],{"href":61},"\u002Fdeveloper\u002Fauthentication","Authentifizierung"," — BetterAuth-Integration",[28,65,66,70],{},[31,67,69],{"href":68},"\u002Fdeveloper\u002Fenvironment-variables","Umgebungsvariablen"," — vollständige Referenz",[20,72,74],{"id":73},"ausgehende-e-mail","Ausgehende E-Mail",[25,76,77,84,91,98,105],{},[28,78,79,83],{},[31,80,82],{"href":81},"\u002Fdeveloper\u002Femail-system","E-Mail-System"," — Editor, Vorlagen und Versand",[28,85,86,90],{},[31,87,89],{"href":88},"\u002Fdeveloper\u002Femail-renderer","E-Mail-Renderer"," — Rendering-Engine von Blöcken zu HTML",[28,92,93,97],{},[31,94,96],{"href":95},"\u002Fdeveloper\u002Femail-security","E-Mail-Sicherheit"," — Inhaltsprüfung, Dateivalidierung, URL-Reputation, ClamAV",[28,99,100,104],{},[31,101,103],{"href":102},"\u002Fdeveloper\u002Fmta-system","MTA-System"," — ausgehender Mail Transfer Agent",[28,106,107,111],{},[31,108,110],{"href":109},"\u002Fdeveloper\u002Fhow-email-works","Wie E-Mail funktioniert"," — Einführung in SMTP, SPF, DKIM, DMARC",[20,113,115],{"id":114},"eingehende-e-mail","Eingehende E-Mail",[25,117,118],{},[28,119,120,124],{},[31,121,123],{"href":122},"\u002Fdeveloper\u002Fpostbox-architecture","Postbox-Architektur"," — Schema persönlicher Postfächer, IMAP-Server, App-Passwort-Authentifizierung, ausgehendes Relay",[20,126,128],{"id":127},"self-hosting","Self-Hosting",[25,130,131,137,144,151,158],{},[28,132,133,136],{},[31,134,128],{"href":135},"\u002Fdeveloper\u002Fself-hosting"," — Installation auf einem VPS in 10 Minuten",[28,138,139,143],{},[31,140,142],{"href":141},"\u002Fdeveloper\u002Fself-hosting-config","Self-Hosting-Konfiguration"," — Umgebungsvariablen und Overrides",[28,145,146,150],{},[31,147,149],{"href":148},"\u002Fdeveloper\u002Fself-hosting-dns-email","DNS & E-Mail"," — DNS-Einträge, rDNS, DKIM",[28,152,153,157],{},[31,154,156],{"href":155},"\u002Fdeveloper\u002Fself-hosting-production","Produktion"," — Härtung und Tuning",[28,159,160,164],{},[31,161,163],{"href":162},"\u002Fdeveloper\u002Fself-hosting-maintenance","Wartung"," — Backups, Upgrades, Observability",[20,166,168],{"id":167},"referenz","Referenz",[25,170,171,178,185,192],{},[28,172,173,177],{},[31,174,176],{"href":175},"\u002Fdeveloper\u002Fcomponents","Komponentenbibliothek"," — wiederverwendbare UI-Komponenten",[28,179,180,184],{},[31,181,183],{"href":182},"\u002Fdeveloper\u002Fscopes","Scopes"," — Berechtigungsmodell",[28,186,187,191],{},[31,188,190],{"href":189},"\u002Fdeveloper\u002Fdecisions","Architekturentscheidungen"," — ADRs",[28,193,194,200],{},[31,195,199],{"href":196,"rel":197},"https:\u002F\u002Fgithub.com\u002Fwolvesdotink\u002Fowlat\u002Fblob\u002Fmain\u002FCONTRIBUTING.md",[198],"nofollow","Mitwirken"," — wie Sie zu Owlat beitragen",[15,202,204],{"id":203},"entwicklungsumgebung-einrichten","Entwicklungsumgebung einrichten",[20,206,208],{"id":207},"voraussetzungen","Voraussetzungen",[25,210,211,214,217],{},[28,212,213],{},"Node.js 22+",[28,215,216],{},"Bun als Paketmanager",[28,218,219],{},"Docker + Docker Compose v2 (für den vollständigen Self-Host-Stack)",[20,221,223],{"id":222},"lokale-entwicklung","Lokale Entwicklung",[225,226,227,253,271],"ol",{},[28,228,229,230],{},"Abhängigkeiten installieren:",[231,232,237],"pre",{"className":233,"code":234,"language":235,"meta":236,"style":236},"language-bash shiki shiki-themes github-light github-dark-dimmed","bun install\n","bash","",[238,239,240],"code",{"__ignoreMap":236},[241,242,245,249],"span",{"class":243,"line":244},"line",1,[241,246,248],{"class":247},"sOLd2","bun",[241,250,252],{"class":251},"s-HuK"," install\n",[28,254,255,256],{},"Das Convex-Backend starten (läuft dauerhaft weiter):",[231,257,259],{"className":233,"code":258,"language":235,"meta":236,"style":236},"bun run dev:api\n",[238,260,261],{"__ignoreMap":236},[241,262,263,265,268],{"class":243,"line":244},[241,264,248],{"class":247},[241,266,267],{"class":251}," run",[241,269,270],{"class":251}," dev:api\n",[28,272,273,274],{},"Das Nuxt-Frontend starten:",[231,275,277],{"className":233,"code":276,"language":235,"meta":236,"style":236},"bun run dev\n",[238,278,279],{"__ignoreMap":236},[241,280,281,283,285],{"class":243,"line":244},[241,282,248],{"class":247},[241,284,267],{"class":251},[241,286,287],{"class":251}," dev\n",[20,289,69],{"id":290},"umgebungsvariablen",[11,292,293,294,297],{},"Sowohl das Nuxt-Frontend als auch das Convex-Backend verwenden Umgebungsvariablen zur Konfiguration. Feature-Flags folgen einem Muster aus zwei Variablen: eine Convex-Umgebungsvariable für das Backend und eine ",[238,295,296],{},"NUXT_PUBLIC_*","-Variable für das Frontend.",[11,299,300,301,303],{},"Auf der Seite ",[31,302,69],{"href":68}," finden Sie eine vollständige Referenz samt Einrichtungsanleitungen für Provider, Sicherheit und Analytics.",[11,305,306],{},[307,308,309],"strong",{},"Kurzreferenz — wesentliche Variablen:",[311,312,313,329],"table",{},[314,315,316],"thead",{},[317,318,319,323,326],"tr",{},[320,321,322],"th",{},"Variable",[320,324,325],{},"Wo",[320,327,328],{},"Zweck",[330,331,332,346,358,390,423,435,451,465],"tbody",{},[317,333,334,340,343],{},[335,336,337],"td",{},[238,338,339],{},"BETTER_AUTH_SECRET",[335,341,342],{},"Convex",[335,344,345],{},"Secret zum Signieren von Sessions",[317,347,348,353,355],{},[335,349,350],{},[238,351,352],{},"SITE_URL",[335,354,342],{},[335,356,357],{},"Öffentliche Site-URL für Weiterleitungen",[317,359,360,365,367],{},[335,361,362],{},[238,363,364],{},"EMAIL_PROVIDER",[335,366,342],{},[335,368,369,372,373,372,376,372,379,372,382,385,386,389],{},[238,370,371],{},"mta",", ",[238,374,375],{},"ses",[238,377,378],{},"resend",[238,380,381],{},"smtp",[238,383,384],{},"mandrill"," oder ",[238,387,388],{},"emailit"," — kein impliziter Standardwert; nicht gesetzt bedeutet unkonfiguriert und Sendungen werden abgelehnt",[317,391,392,397,399],{},[335,393,394],{},[238,395,396],{},"LLM_PROVIDER",[335,398,342],{},[335,400,401,404,405,372,408,411,412,415,416,419,420],{},[238,402,403],{},"openai"," (Standard), ",[238,406,407],{},"openrouter",[238,409,410],{},"ollama"," (alle OpenAI-kompatibel) — nur erforderlich, wenn das Flag ",[238,413,414],{},"ai"," aktiv ist. Ein Claude-Endpunkt ist nur erreichbar, indem Sie ",[238,417,418],{},"LLM_BASE_URL"," auf einen OpenAI-kompatiblen Proxy richten, nicht durch Setzen von ",[238,421,422],{},"LLM_PROVIDER=anthropic",[317,424,425,430,432],{},[335,426,427],{},[238,428,429],{},"UNSUBSCRIBE_SECRET",[335,431,342],{},[335,433,434],{},"HMAC-Secret für Abmelde-Token",[317,436,437,442,448],{},[335,438,439],{},[238,440,441],{},"NUXT_PUBLIC_CONVEX_URL",[335,443,444,445],{},"Nuxt ",[238,446,447],{},".env",[335,449,450],{},"URL des Convex-Deployments",[317,452,453,458,462],{},[335,454,455],{},[238,456,457],{},"NUXT_PUBLIC_CONVEX_SITE_URL",[335,459,444,460],{},[238,461,447],{},[335,463,464],{},"Convex-Site-URL (für die Authentifizierung)",[317,466,467,472,476],{},[335,468,469],{},[238,470,471],{},"NUXT_PUBLIC_SITE_URL",[335,473,444,474],{},[238,475,447],{},[335,477,478],{},"Öffentliche Site-URL",[20,480,482],{"id":481},"codequalität","Codequalität",[231,484,486],{"className":233,"code":485,"language":235,"meta":236,"style":236},"bun run typecheck  # TypeScript checking\nbun run lint       # Oxlint\nbun run ox:fmt     # Format with Oxfmt\n",[238,487,488,501,514],{"__ignoreMap":236},[241,489,490,492,494,497],{"class":243,"line":244},[241,491,248],{"class":247},[241,493,267],{"class":251},[241,495,496],{"class":251}," typecheck",[241,498,500],{"class":499},"sDN9O","  # TypeScript checking\n",[241,502,504,506,508,511],{"class":243,"line":503},2,[241,505,248],{"class":247},[241,507,267],{"class":251},[241,509,510],{"class":251}," lint",[241,512,513],{"class":499},"       # Oxlint\n",[241,515,517,519,521,524],{"class":243,"line":516},3,[241,518,248],{"class":247},[241,520,267],{"class":251},[241,522,523],{"class":251}," ox:fmt",[241,525,526],{"class":499},"     # Format with Oxfmt\n",[15,528,530],{"id":529},"projektstruktur","Projektstruktur",[231,532,537],{"className":533,"code":535,"language":536},[534],"language-text","owlat\u002F\n├── apps\u002F\n│   ├── web\u002F                # Nuxt 4 dashboard\n│   │   └── app\u002F\n│   │       ├── components\u002F     # Vue components\n│   │       │   └── ui\u002F         # App-specific UI components\n│   │       ├── composables\u002F    # Vue composables\n│   │       ├── layouts\u002F        # Page layouts\n│   │       ├── pages\u002F          # File-based routing\n│   │       └── plugins\u002F        # Nuxt plugins\n│   ├── api\u002F                # Convex backend\n│   │   └── convex\u002F\n│   │       ├── _generated\u002F         # Auto-generated (don't edit)\n│   │       ├── lib\u002F                # Shared utilities + provider factories\n│   │       │   ├── llm\u002F             # LLM helpers\n│   │       │   ├── llmProvider.ts   # OpenAI-compatible LLM dispatch\n│   │       │   ├── sendProviders\u002F      # MTA, Resend, SES senders + routing\u002Fdispatch\n│   │       │   ├── emailProviders\u002F     # Identity + domain verification (mtaIdentity, sesIdentity, domainVerification)\n│   │       │   └── posthog.ts       # PostHog analytics\n│   │       ├── schema.ts           # Database schema\n│   │       ├── mail\u002F               # Postbox \u002F mailbox modules\n│   │       └── *.ts                # API functions\n│   ├── mta\u002F                # Outbound Mail Transfer Agent (SMTP sender + scan endpoint)\n│   ├── imap\u002F               # IMAP4rev1 server (Postbox personal mail)\n│   ├── mail-sync\u002F          # Syncs users' external IMAP\u002FSMTP accounts (IMAP IDLE inbound + outbound relay)\n│   ├── setup-cli\u002F          # `owlat-setup` — wizard, feature\u002Fpack\u002Fenv management\n│   ├── updater\u002F            # In-place update sidecar\n│   ├── docs\u002F               # Nuxt Content documentation\n│   ├── marketing\u002F          # Marketing \u002F landing page (Nuxt)\n│   ├── desktop\u002F            # Desktop client shell (Tauri)\n│   └── code-worker\u002F        # Code-task worker (for `codeWorkTasks`)\n├── infra\u002F\n│   └── templates\u002F          # Per-instance VPS compose, ACME (lego) sidecar, env template\n├── docker-compose.yml      # Root self-host stack (web\u002Fconvex\u002Fmta + optional Caddy --profile tls)\n├── Caddyfile.example       # Reference reverse-proxy config for --profile tls\n└── packages\u002F\n    ├── email-builder\u002F      # Vue email editor component\n    ├── email-renderer\u002F     # JSON blocks → HTML renderer\n    ├── email-scanner\u002F      # Email security scanning\n    ├── email-previewer\u002F    # Email preview \u002F compatibility analysis\n    ├── channels\u002F           # Notification channel abstractions\n    ├── shared\u002F             # Shared types, validation, feature flag registry\n    ├── ui\u002F                 # Nuxt layer: shared UI components and composables\n    ├── sdk-js\u002F             # Official TypeScript SDK\n    └── sdk-java\u002F           # Official Java SDK\n","text",[238,538,535],{"__ignoreMap":236},[15,540,542],{"id":541},"zentrale-technologien","Zentrale Technologien",[311,544,545,554],{},[314,546,547],{},[317,548,549,552],{},[320,550,551],{},"Technologie",[320,553,328],{},[330,555,556,564,571,579,587,595,603,611,623,631,639],{},[317,557,558,561],{},[335,559,560],{},"Nuxt 4",[335,562,563],{},"Vue-3-Full-Stack-Framework",[317,565,566,568],{},[335,567,342],{},[335,569,570],{},"Serverloses Echtzeit-Backend",[317,572,573,576],{},[335,574,575],{},"BetterAuth",[335,577,578],{},"Authentifizierung mit Organisationsunterstützung",[317,580,581,584],{},[335,582,583],{},"Tailwind CSS 4",[335,585,586],{},"Utility-First-Styling",[317,588,589,592],{},[335,590,591],{},"@owlat\u002Femail-renderer",[335,593,594],{},"Eigenes Rendering für HTML-E-Mails",[317,596,597,600],{},[335,598,599],{},"Hono",[335,601,602],{},"HTTP-Framework (MTA-Scan-\u002FRelay-Endpunkte)",[317,604,605,608],{},[335,606,607],{},"GroupMQ + Redis",[335,609,610],{},"MTA-Job-Queue",[317,612,613,616],{},[335,614,615],{},"Caddy",[335,617,618,619,622],{},"Mitgelieferter HTTPS-Reverse-Proxy für Web\u002FConvex\u002FMTA (",[238,620,621],{},"--profile tls",")",[317,624,625,628],{},[335,626,627],{},"lego \u002F ACME",[335,629,630],{},"TLS im Self-Hosting über DNS-01 für IMAP-\u002FSMTP-Mail-Zertifikate",[317,632,633,636],{},[335,634,635],{},"Docker-Compose-Profile",[335,637,638],{},"Optionale Dienste je Feature-Flag",[317,640,641,644],{},[335,642,643],{},"Lucide",[335,645,646],{},"Icon-Bibliothek",[15,648,650],{"id":649},"muster-und-konventionen","Muster und Konventionen",[20,652,654],{"id":653},"dateibenennung","Dateibenennung",[25,656,657,663,669,675],{},[28,658,659,660],{},"Vue-Komponenten: ",[238,661,662],{},"PascalCase.vue",[28,664,665,666],{},"Composables: ",[238,667,668],{},"useCamelCase.ts",[28,670,671,672],{},"Convex-Funktionen: ",[238,673,674],{},"camelCase.ts",[28,676,677,678,385,681],{},"Seiten: ",[238,679,680],{},"kebab-case.vue",[238,682,683],{},"[param].vue",[20,685,687],{"id":686},"imports","Imports",[11,689,690,691,694],{},"Verwenden Sie den Alias ",[238,692,693],{},"~\u002F"," für Imports innerhalb der Nuxt-App:",[231,696,700],{"className":697,"code":698,"language":699,"meta":236,"style":236},"language-typescript shiki shiki-themes github-light github-dark-dimmed","import { useAuth } from '~\u002Fcomposables\u002FuseAuth';\n","typescript",[238,701,702],{"__ignoreMap":236},[241,703,704,708,712,715,718],{"class":243,"line":244},[241,705,707],{"class":706},"s7YZ4","import",[241,709,711],{"class":710},"sYgZi"," { useAuth } ",[241,713,714],{"class":706},"from",[241,716,717],{"class":251}," '~\u002Fcomposables\u002FuseAuth'",[241,719,720],{"class":710},";\n",[11,722,723],{},"Die Feature-Flag-Registry wird in jeder Schicht aus dem Shared-Package importiert:",[231,725,727],{"className":697,"code":726,"language":699,"meta":236,"style":236},"import { FEATURE_FLAGS, resolveFlags, applyToggle } from '@owlat\u002Fshared\u002FfeatureFlags';\n",[238,728,729],{"__ignoreMap":236},[241,730,731,733,736,738,741],{"class":243,"line":244},[241,732,707],{"class":706},[241,734,735],{"class":710}," { FEATURE_FLAGS, resolveFlags, applyToggle } ",[241,737,714],{"class":706},[241,739,740],{"class":251}," '@owlat\u002Fshared\u002FfeatureFlags'",[241,742,720],{"class":710},[20,744,745],{"id":699},"TypeScript",[11,747,748],{},"Der gesamte Code ist TypeScript. Verwenden Sie explizite Typen für Funktionsparameter und Rückgabewerte:",[231,750,752],{"className":697,"code":751,"language":699,"meta":236,"style":236},"function formatDate(timestamp: number): string {\n    return new Date(timestamp).toLocaleDateString();\n}\n",[238,753,754,787,807],{"__ignoreMap":236},[241,755,756,759,763,766,770,773,777,779,781,784],{"class":243,"line":244},[241,757,758],{"class":706},"function",[241,760,762],{"class":761},"sPO5f"," formatDate",[241,764,765],{"class":710},"(",[241,767,769],{"class":768},"stnAF","timestamp",[241,771,772],{"class":706},":",[241,774,776],{"class":775},"sviXB"," number",[241,778,622],{"class":710},[241,780,772],{"class":706},[241,782,783],{"class":775}," string",[241,785,786],{"class":710}," {\n",[241,788,789,792,795,798,801,804],{"class":243,"line":503},[241,790,791],{"class":706},"    return",[241,793,794],{"class":706}," new",[241,796,797],{"class":761}," Date",[241,799,800],{"class":710},"(timestamp).",[241,802,803],{"class":761},"toLocaleDateString",[241,805,806],{"class":710},"();\n",[241,808,809],{"class":243,"line":516},[241,810,811],{"class":710},"}\n",[20,813,815],{"id":814},"fehlerbehandlung","Fehlerbehandlung",[25,817,818,825,832],{},[28,819,820,821,824],{},"Frontend: ",[238,822,823],{},"useToast()"," für Rückmeldungen an die Nutzerin oder den Nutzer verwenden",[28,826,827,828,831],{},"Backend: ",[238,829,830],{},"Error"," mit aussagekräftigen Meldungen werfen",[28,833,834],{},"API: strukturierte Fehlerantworten zurückgeben",[231,836,838],{"className":697,"code":837,"language":699,"meta":236,"style":236},"\u002F\u002F Frontend\nconst { showToast } = useToast();\ntry {\n    await mutation();\n    showToast('Saved successfully');\n} catch (e) {\n    showToast('Failed to save', 'error');\n}\n\n\u002F\u002F Backend (Convex)\nif (!organizationId) {\n    throw new Error('Organization not found');\n}\n",[238,839,840,845,867,874,885,899,911,928,933,940,946,961,979],{"__ignoreMap":236},[241,841,842],{"class":243,"line":244},[241,843,844],{"class":499},"\u002F\u002F Frontend\n",[241,846,847,850,853,856,859,862,865],{"class":243,"line":503},[241,848,849],{"class":706},"const",[241,851,852],{"class":710}," { ",[241,854,855],{"class":775},"showToast",[241,857,858],{"class":710}," } ",[241,860,861],{"class":706},"=",[241,863,864],{"class":761}," useToast",[241,866,806],{"class":710},[241,868,869,872],{"class":243,"line":516},[241,870,871],{"class":706},"try",[241,873,786],{"class":710},[241,875,877,880,883],{"class":243,"line":876},4,[241,878,879],{"class":706},"    await",[241,881,882],{"class":761}," mutation",[241,884,806],{"class":710},[241,886,888,891,893,896],{"class":243,"line":887},5,[241,889,890],{"class":761},"    showToast",[241,892,765],{"class":710},[241,894,895],{"class":251},"'Saved successfully'",[241,897,898],{"class":710},");\n",[241,900,902,905,908],{"class":243,"line":901},6,[241,903,904],{"class":710},"} ",[241,906,907],{"class":706},"catch",[241,909,910],{"class":710}," (e) {\n",[241,912,914,916,918,921,923,926],{"class":243,"line":913},7,[241,915,890],{"class":761},[241,917,765],{"class":710},[241,919,920],{"class":251},"'Failed to save'",[241,922,372],{"class":710},[241,924,925],{"class":251},"'error'",[241,927,898],{"class":710},[241,929,931],{"class":243,"line":930},8,[241,932,811],{"class":710},[241,934,936],{"class":243,"line":935},9,[241,937,939],{"emptyLinePlaceholder":938},true,"\n",[241,941,943],{"class":243,"line":942},10,[241,944,945],{"class":499},"\u002F\u002F Backend (Convex)\n",[241,947,949,952,955,958],{"class":243,"line":948},11,[241,950,951],{"class":706},"if",[241,953,954],{"class":710}," (",[241,956,957],{"class":706},"!",[241,959,960],{"class":710},"organizationId) {\n",[241,962,964,967,969,972,974,977],{"class":243,"line":963},12,[241,965,966],{"class":706},"    throw",[241,968,794],{"class":706},[241,970,971],{"class":761}," Error",[241,973,765],{"class":710},[241,975,976],{"class":251},"'Organization not found'",[241,978,898],{"class":710},[241,980,982],{"class":243,"line":981},13,[241,983,811],{"class":710},[20,985,987],{"id":986},"feature-gesteuerte-routen","Feature-gesteuerte Routen",[11,989,990,991,772],{},"Seiten, die zu einer schaltbaren Funktion gehören, deklarieren dies über ",[238,992,993],{},"definePageMeta",[231,995,997],{"className":697,"code":996,"language":699,"meta":236,"style":236},"definePageMeta({\n    layout: 'dashboard',\n    middleware: 'auth',\n    requiresFeature: 'postbox',\n});\n",[238,998,999,1006,1017,1027,1037],{"__ignoreMap":236},[241,1000,1001,1003],{"class":243,"line":244},[241,1002,993],{"class":761},[241,1004,1005],{"class":710},"({\n",[241,1007,1008,1011,1014],{"class":243,"line":503},[241,1009,1010],{"class":710},"    layout: ",[241,1012,1013],{"class":251},"'dashboard'",[241,1015,1016],{"class":710},",\n",[241,1018,1019,1022,1025],{"class":243,"line":516},[241,1020,1021],{"class":710},"    middleware: ",[241,1023,1024],{"class":251},"'auth'",[241,1026,1016],{"class":710},[241,1028,1029,1032,1035],{"class":243,"line":876},[241,1030,1031],{"class":710},"    requiresFeature: ",[241,1033,1034],{"class":251},"'postbox'",[241,1036,1016],{"class":710},[241,1038,1039],{"class":243,"line":887},[241,1040,1041],{"class":710},"});\n",[11,1043,1044],{},"Eine globale Middleware leitet auf eine „Funktion deaktiviert“-Seite um, wenn das Flag ausgeschaltet ist. Convex-Queries prüfen das Flag zusätzlich serverseitig, damit ein veralteter Client es nicht umgehen kann.",[1046,1047,1048],"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 .s7YZ4, html code.shiki .s7YZ4{--shiki-default:#D73A49;--shiki-dark:#F47067}html pre.shiki code .sYgZi, html code.shiki .sYgZi{--shiki-default:#24292E;--shiki-dark:#ADBAC7}html pre.shiki code .sPO5f, html code.shiki .sPO5f{--shiki-default:#6F42C1;--shiki-dark:#DCBDFB}html pre.shiki code .stnAF, html code.shiki .stnAF{--shiki-default:#E36209;--shiki-dark:#F69D50}html pre.shiki code .sviXB, html code.shiki .sviXB{--shiki-default:#005CC5;--shiki-dark:#6CB6FF}",{"title":236,"searchDepth":503,"depth":503,"links":1050},[1051,1058,1064,1065,1066],{"id":17,"depth":503,"text":18,"children":1052},[1053,1054,1055,1056,1057],{"id":22,"depth":516,"text":23},{"id":73,"depth":516,"text":74},{"id":114,"depth":516,"text":115},{"id":127,"depth":516,"text":128},{"id":167,"depth":516,"text":168},{"id":203,"depth":503,"text":204,"children":1059},[1060,1061,1062,1063],{"id":207,"depth":516,"text":208},{"id":222,"depth":516,"text":223},{"id":290,"depth":516,"text":69},{"id":481,"depth":516,"text":482},{"id":529,"depth":503,"text":530},{"id":541,"depth":503,"text":542},{"id":649,"depth":503,"text":650,"children":1067},[1068,1069,1070,1071,1072],{"id":653,"depth":516,"text":654},{"id":686,"depth":516,"text":687},{"id":699,"depth":516,"text":745},{"id":814,"depth":516,"text":815},{"id":986,"depth":516,"text":987},"Technische Architektur, Feature-Flag-Modell und Provider-Abstraktionen, die Owlat verwendet.","md",{},"\u002Fdeveloper",{"title":6,"description":1073},"3.developer\u002F1.index","VHF6PzwSGzTV1xjvOYtNZ32QyUOVUVAhb1dVyppeaEI",[1081,1085],{"title":1082,"path":1083,"stem":1084,"children":-1},"Formular-API","\u002Fapi\u002Fforms","2.api\u002F9.forms",{"title":103,"path":102,"stem":1086,"children":-1},"3.developer\u002F10.mta-system",1786915099325]