[{"data":1,"prerenderedAt":970},["ShallowReactive",2],{"search-de":3,"content-de-developer\u002Ffeature-flags":4,"surround-de-\u002Fdeveloper\u002Ffeature-flags":961},[],{"id":5,"title":6,"body":7,"description":953,"extension":954,"meta":955,"navigation":956,"path":957,"seo":958,"stem":959,"__hash__":960},"content_de\u002F3.developer\u002F11.feature-flags.md","Feature-Flags — Entwicklerreferenz",{"type":8,"value":9,"toc":943},"minimark",[10,14,24,29,40,188,191,284,288,365,459,477,481,489,600,604,619,744,748,836,843,847,874,878,917,921,939],[11,12,6],"h1",{"id":13},"feature-flags-entwicklerreferenz",[15,16,17,18,23],"p",{},"Die betreiberseitige Übersicht finden Sie unter ",[19,20,22],"a",{"href":21},"\u002Fguide\u002Ffeature-flags","Feature-Flags in der Produktanleitung",". Diese Seite richtet sich an Entwickler, die Flags hinzufügen, entfernen oder erweitern.",[25,26,28],"h2",{"id":27},"single-source-of-truth","Single Source of Truth",[15,30,31,32,39],{},"Jede umschaltbare Oberfläche ist in ",[33,34,35],"strong",{},[36,37,38],"code",{},"packages\u002Fshared\u002Fsrc\u002FfeatureFlags.ts"," deklariert. Das Setup-CLI, die Admin-Oberfläche, das Convex-Backend und die Nuxt-Middleware importieren alle aus dieser einen Datei — es gibt keine zweite Registry, die synchron gehalten werden müsste.",[41,42,47],"pre",{"className":43,"code":44,"language":45,"meta":46,"style":46},"language-ts shiki shiki-themes github-light github-dark-dimmed","export const FEATURE_FLAGS: Record\u003CFeatureFlagKey, FeatureFlagDefinition> = {\n  postbox: {\n    key: 'postbox',\n    category: 'receiving',\n    label: 'Personal mail (Postbox)',\n    description: 'Per-user mailboxes with webmail UI, IMAP\u002FSMTP for native clients, and MX-based delivery (Gmail-equivalent).',\n    default: false,\n    dockerProfiles: ['personal-mail'],\n  },\n  \u002F\u002F … 30 more flags (31 total in FEATURE_FLAGS)\n};\n","ts","",[36,48,49,94,100,113,124,135,146,157,169,175,182],{"__ignoreMap":46},[50,51,54,58,61,65,68,72,76,79,82,85,88,91],"span",{"class":52,"line":53},"line",1,[50,55,57],{"class":56},"s7YZ4","export",[50,59,60],{"class":56}," const",[50,62,64],{"class":63},"sviXB"," FEATURE_FLAGS",[50,66,67],{"class":56},":",[50,69,71],{"class":70},"sOLd2"," Record",[50,73,75],{"class":74},"sYgZi","\u003C",[50,77,78],{"class":70},"FeatureFlagKey",[50,80,81],{"class":74},", ",[50,83,84],{"class":70},"FeatureFlagDefinition",[50,86,87],{"class":74},"> ",[50,89,90],{"class":56},"=",[50,92,93],{"class":74}," {\n",[50,95,97],{"class":52,"line":96},2,[50,98,99],{"class":74},"  postbox: {\n",[50,101,103,106,110],{"class":52,"line":102},3,[50,104,105],{"class":74},"    key: ",[50,107,109],{"class":108},"s-HuK","'postbox'",[50,111,112],{"class":74},",\n",[50,114,116,119,122],{"class":52,"line":115},4,[50,117,118],{"class":74},"    category: ",[50,120,121],{"class":108},"'receiving'",[50,123,112],{"class":74},[50,125,127,130,133],{"class":52,"line":126},5,[50,128,129],{"class":74},"    label: ",[50,131,132],{"class":108},"'Personal mail (Postbox)'",[50,134,112],{"class":74},[50,136,138,141,144],{"class":52,"line":137},6,[50,139,140],{"class":74},"    description: ",[50,142,143],{"class":108},"'Per-user mailboxes with webmail UI, IMAP\u002FSMTP for native clients, and MX-based delivery (Gmail-equivalent).'",[50,145,112],{"class":74},[50,147,149,152,155],{"class":52,"line":148},7,[50,150,151],{"class":74},"    default: ",[50,153,154],{"class":63},"false",[50,156,112],{"class":74},[50,158,160,163,166],{"class":52,"line":159},8,[50,161,162],{"class":74},"    dockerProfiles: [",[50,164,165],{"class":108},"'personal-mail'",[50,167,168],{"class":74},"],\n",[50,170,172],{"class":52,"line":171},9,[50,173,174],{"class":74},"  },\n",[50,176,178],{"class":52,"line":177},10,[50,179,181],{"class":180},"sDN9O","  \u002F\u002F … 30 more flags (31 total in FEATURE_FLAGS)\n",[50,183,185],{"class":52,"line":184},11,[50,186,187],{"class":74},"};\n",[15,189,190],{},"Jede Definition kann Folgendes deklarieren:",[192,193,194,207],"table",{},[195,196,197],"thead",{},[198,199,200,204],"tr",{},[201,202,203],"th",{},"Feld",[201,205,206],{},"Zweck",[208,209,210,221,231,241,254,264,274],"tbody",{},[198,211,212,218],{},[213,214,215],"td",{},[36,216,217],{},"category",[213,219,220],{},"Gruppiert das Flag in der Admin-Oberfläche (sending \u002F receiving \u002F ai \u002F integrations \u002F security \u002F deliverability \u002F hosted)",[198,222,223,228],{},[213,224,225],{},[36,226,227],{},"default",[213,229,230],{},"Anfangswert für frische Installationen",[198,232,233,238],{},[213,234,235],{},[36,236,237],{},"requires",[213,239,240],{},"Andere Flag-Schlüssel, die aktiviert sein müssen, damit dieses Flag aktiv sein kann",[198,242,243,248],{},[213,244,245],{},[36,246,247],{},"cascadesOff",[213,249,250,251,253],{},"Flags, die zwangsweise deaktiviert werden, wenn dieses deaktiviert wird (wird außerdem automatisch aus ",[36,252,237],{}," abgeleitet)",[198,255,256,261],{},[213,257,258],{},[36,259,260],{},"requiredEnvVars",[213,262,263],{},"Umgebungsvariablen, die Assistent\u002FOberfläche vor der Aktivierung erfassen müssen",[198,265,266,271],{},[213,267,268],{},[36,269,270],{},"dockerProfiles",[213,272,273],{},"Compose-Profile, die aktiviert werden, wenn dieses Flag aktiv ist",[198,275,276,281],{},[213,277,278],{},[36,279,280],{},"hostedOnly",[213,282,283],{},"Im Self-Host-Assistenten ausgeblendet (Control-Plane-Flags)",[25,285,287],{"id":286},"laufzeit-helfer","Laufzeit-Helfer",[41,289,291],{"className":43,"code":290,"language":45,"meta":46,"style":46},"import {\n  FEATURE_FLAGS,\n  resolveFlags,\n  isFlagEnabled,\n  applyToggle,\n  getActiveProfiles,\n  getRequiredEnvVars,\n  getFlagsByCategory,\n  FEATURE_PACKS,\n  applyPackToggle,\n  isPackEnabled,\n} from '@owlat\u002Fshared\u002FfeatureFlags';\n",[36,292,293,300,305,310,315,320,325,330,335,340,345,350],{"__ignoreMap":46},[50,294,295,298],{"class":52,"line":53},[50,296,297],{"class":56},"import",[50,299,93],{"class":74},[50,301,302],{"class":52,"line":96},[50,303,304],{"class":74},"  FEATURE_FLAGS,\n",[50,306,307],{"class":52,"line":102},[50,308,309],{"class":74},"  resolveFlags,\n",[50,311,312],{"class":52,"line":115},[50,313,314],{"class":74},"  isFlagEnabled,\n",[50,316,317],{"class":52,"line":126},[50,318,319],{"class":74},"  applyToggle,\n",[50,321,322],{"class":52,"line":137},[50,323,324],{"class":74},"  getActiveProfiles,\n",[50,326,327],{"class":52,"line":148},[50,328,329],{"class":74},"  getRequiredEnvVars,\n",[50,331,332],{"class":52,"line":159},[50,333,334],{"class":74},"  getFlagsByCategory,\n",[50,336,337],{"class":52,"line":171},[50,338,339],{"class":74},"  FEATURE_PACKS,\n",[50,341,342],{"class":52,"line":177},[50,343,344],{"class":74},"  applyPackToggle,\n",[50,346,347],{"class":52,"line":184},[50,348,349],{"class":74},"  isPackEnabled,\n",[50,351,353,356,359,362],{"class":52,"line":352},12,[50,354,355],{"class":74},"} ",[50,357,358],{"class":56},"from",[50,360,361],{"class":108}," '@owlat\u002Fshared\u002FfeatureFlags'",[50,363,364],{"class":74},";\n",[192,366,367,377],{},[195,368,369],{},[198,370,371,374],{},[201,372,373],{},"Helfer",[201,375,376],{},"Einsatz",[208,378,379,392,405,419,429,439,449],{},[198,380,381,386],{},[213,382,383],{},[36,384,385],{},"resolveFlags(stored)",[213,387,388,389,391],{},"Aktuellen Zustand lesen — wendet ",[36,390,237],{},"-Kaskaden an und liefert den effektiven Zustand",[198,393,394,399],{},[213,395,396],{},[36,397,398],{},"isFlagEnabled(stored, key)",[213,400,401,402],{},"Bequemer Zugriff auf ",[36,403,404],{},"resolveFlags(...)[key]",[198,406,407,412],{},[213,408,409],{},[36,410,411],{},"applyToggle(stored, key, value)",[213,413,414,415,418],{},"Benutzer hat einen Schalter betätigt — liefert ",[36,416,417],{},"{ next, cascaded }",", damit die Oberfläche zeigen kann, was sich sonst noch geändert hat",[198,420,421,426],{},[213,422,423],{},[36,424,425],{},"getActiveProfiles(stored)",[213,427,428],{},"Die zu aktivierenden Docker-Compose-Profile berechnen",[198,430,431,436],{},[213,432,433],{},[36,434,435],{},"getRequiredEnvVars(stored)",[213,437,438],{},"Welche Umgebungsvariablen bei der aktiven Flag-Menge abgefragt werden müssen",[198,440,441,446],{},[213,442,443],{},[36,444,445],{},"getFlagsByCategory()",[213,447,448],{},"Die Admin-Oberfläche nach Kategorien gruppiert rendern",[198,450,451,456],{},[213,452,453],{},[36,454,455],{},"applyPackToggle(stored, packKey, value)",[213,457,458],{},"Alle Flags eines Packs auf einmal umschalten (Kaskaden greifen weiterhin)",[15,460,461,462,465,466,465,469,472,473,476],{},"Die Auflösung erfolgt iterativ bis zum Fixpunkt mit einer Sicherheitsgrenze von 10 Iterationen — lange Abhängigkeitsketten (",[36,463,464],{},"inbox.codeTasks"," → ",[36,467,468],{},"ai.agent",[36,470,471],{},"ai"," + ",[36,474,475],{},"inbox",") werden in einem einzigen Aufruf aufgelöst.",[25,478,480],{"id":479},"speicherung-durchsetzung","Speicherung & Durchsetzung",[41,482,487],{"className":483,"code":485,"language":486},[484],"language-text","                     ┌─────────────────────────────────────────────────────┐\n                     │  packages\u002Fshared\u002Fsrc\u002FfeatureFlags.ts (registry)     │\n                     │  resolveFlags, applyToggle, getActiveProfiles, …    │\n                     └────┬───────────────┬───────────────┬────────────────┘\n                          │               │               │\n              ┌───────────▼────────┐  ┌──▼─────────────────┐ ┌─▼─────────────────────┐\n              │ apps\u002Fsetup-cli     │  │ apps\u002Fapi           │ │ apps\u002Fweb              │\n              │  commands\u002Ffeature  │  │ organizations\u002F     │ │ middleware\u002F           │\n              │  commands\u002Fpack     │  │   featureFlags.ts  │ │   feature.global.ts   │\n              │  lib\u002Foverride      │  │ lib\u002FfeatureFlags.ts│ │ pages w\u002F requires-    │\n              │  lib\u002FflagState     │  │ + queries          │ │ Feature: '\u003Cflag>'     │\n              └───────┬────────────┘  └────────┬───────────┘ └───┬───────────────────┘\n                      │                        │                 │\n            writes docker-compose              │           route gate →\n            .override.yml + .owlat-            │           \u002Fdashboard?disabled=\u003Cflag>\n            flags.json                         │\n                                  source of truth:\n                                  Convex table\n                                  instanceSettings.featureFlags\n","text",[36,488,485],{"__ignoreMap":46},[490,491,492,503,513,535,575],"ul",{},[493,494,495,498,499,502],"li",{},[33,496,497],{},"Convex"," ist zur Laufzeit die Source of Truth. ",[36,500,501],{},"instanceSettings.featureFlags"," ist ein einzelnes Dokument.",[493,504,505,508,509,512],{},[33,506,507],{},"Das Setup-CLI"," spiegelt den Zustand in ",[36,510,511],{},".owlat-flags.json"," neben der Compose-Datei, damit der Betreiber Flags ändern kann, bevor der Stack läuft. Beim Start gleicht Convex die Datei mit der Datenbank ab.",[493,514,515,518,519,522,523,526,527,530,531,534],{},[33,516,517],{},"Docker-Compose-Profile"," werden indirekt aktiviert: ",[36,520,521],{},"owlat-setup"," generiert ",[36,524,525],{},"docker-compose.override.yml"," aus ",[36,528,529],{},"getActiveProfiles(...)"," neu. Die Basis-Compose-Datei deklariert ",[36,532,533],{},"profiles: [\u003Cname>]"," an jedem gegateten Service.",[493,536,537,540,541,544,545,548,549,552,553,556,557,560,561,563,564,567,568,567,571,574],{},[33,538,539],{},"Page Guards",": Seiten deklarieren in ",[36,542,543],{},"definePageMeta"," ein ",[36,546,547],{},"requiresFeature"," (ein einzelner Schlüssel oder ein Array — alle müssen aktiv sein) und optional ein ",[36,550,551],{},"requiresAnyFeature"," (eine ODER-Gruppe, mindestens eines aktiv). Die dedizierte globale Middleware ",[36,554,555],{},"apps\u002Fweb\u002Fapp\u002Fmiddleware\u002Ffeature.global.ts"," liest beides und leitet auf ",[36,558,559],{},"\u002Fdashboard?disabled=\u003Cflag>"," um, wenn ein erforderliches Flag aus ist. ",[36,562,551],{}," existiert für Oberflächen, die über mehr als eine Funktion erreichbar sind — z. B. die Postbox-Oberfläche unter dem gehosteten ",[36,565,566],{},"postbox"," ",[33,569,570],{},"oder",[36,572,573],{},"mail.external",".",[493,576,577,580,581,584,585,588,589,591,592,595,596,599],{},[33,578,579],{},"Serverseitige Guards",": Öffentliche Convex-Funktionen in gegateten Modulen rufen früh ",[36,582,583],{},"await assertFeatureEnabled(ctx, '\u003Cflag>')"," auf (",[36,586,587],{},"apps\u002Fapi\u002Fconvex\u002Flib\u002FfeatureFlags.ts","), damit ein veralteter Client die Gates der Oberfläche nicht umgehen kann. Der Helfer liest ",[36,590,501],{},", löst Abhängigkeiten über das gemeinsame ",[36,593,594],{},"resolveFlags"," auf und wirft im deaktivierten Fall einen ",[36,597,598],{},"forbidden","-Fehler.",[25,601,603],{"id":602},"feature-packs","Feature-Packs",[15,605,606,607,610,611,614,615,618],{},"Packs sind reiner Oberflächen-Zucker — sie führen keinen neuen Zustand ein, sondern lesen und schreiben denselben ",[36,608,609],{},"FeatureFlagState"," über ",[36,612,613],{},"applyPackToggle",", das pro Flag ",[36,616,617],{},"applyToggle"," aufruft, damit sich Kaskaden korrekt verhalten.",[41,620,622],{"className":43,"code":621,"language":45,"meta":46,"style":46},"export const FEATURE_PACKS: Record\u003CFeaturePackKey, FeaturePack> = {\n  marketing:   { flags: ['campaigns', 'automations', 'transactional'], \u002F* … *\u002F },\n  emailClient: { flags: ['inbox', 'chat', 'postbox'],                  \u002F* … *\u002F },\n  ai:          { flags: ['ai', 'ai.agent', 'ai.autonomy', 'ai.knowledge', 'ai.assistant', 'ai.visualizations'] },\n};\n",[36,623,624,653,680,704,740],{"__ignoreMap":46},[50,625,626,628,630,633,635,637,639,642,644,647,649,651],{"class":52,"line":53},[50,627,57],{"class":56},[50,629,60],{"class":56},[50,631,632],{"class":63}," FEATURE_PACKS",[50,634,67],{"class":56},[50,636,71],{"class":70},[50,638,75],{"class":74},[50,640,641],{"class":70},"FeaturePackKey",[50,643,81],{"class":74},[50,645,646],{"class":70},"FeaturePack",[50,648,87],{"class":74},[50,650,90],{"class":56},[50,652,93],{"class":74},[50,654,655,658,661,663,666,668,671,674,677],{"class":52,"line":96},[50,656,657],{"class":74},"  marketing:   { flags: [",[50,659,660],{"class":108},"'campaigns'",[50,662,81],{"class":74},[50,664,665],{"class":108},"'automations'",[50,667,81],{"class":74},[50,669,670],{"class":108},"'transactional'",[50,672,673],{"class":74},"], ",[50,675,676],{"class":180},"\u002F* … *\u002F",[50,678,679],{"class":74}," },\n",[50,681,682,685,688,690,693,695,697,700,702],{"class":52,"line":102},[50,683,684],{"class":74},"  emailClient: { flags: [",[50,686,687],{"class":108},"'inbox'",[50,689,81],{"class":74},[50,691,692],{"class":108},"'chat'",[50,694,81],{"class":74},[50,696,109],{"class":108},[50,698,699],{"class":74},"],                  ",[50,701,676],{"class":180},[50,703,679],{"class":74},[50,705,706,709,712,714,717,719,722,724,727,729,732,734,737],{"class":52,"line":115},[50,707,708],{"class":74},"  ai:          { flags: [",[50,710,711],{"class":108},"'ai'",[50,713,81],{"class":74},[50,715,716],{"class":108},"'ai.agent'",[50,718,81],{"class":74},[50,720,721],{"class":108},"'ai.autonomy'",[50,723,81],{"class":74},[50,725,726],{"class":108},"'ai.knowledge'",[50,728,81],{"class":74},[50,730,731],{"class":108},"'ai.assistant'",[50,733,81],{"class":74},[50,735,736],{"class":108},"'ai.visualizations'",[50,738,739],{"class":74},"] },\n",[50,741,742],{"class":52,"line":126},[50,743,187],{"class":74},[25,745,747],{"id":746},"ein-neues-flag-hinzufügen","Ein neues Flag hinzufügen",[749,750,751,766,775,792,800,813,827],"ol",{},[493,752,753,756,757,759,760,762,763,574],{},[33,754,755],{},"Deklarieren Sie es"," in ",[36,758,38],{}," — ergänzen Sie die Union ",[36,761,78],{}," und die Map ",[36,764,765],{},"FEATURE_FLAGS",[493,767,768,771,772,774],{},[33,769,770],{},"Entscheiden Sie über Abhängigkeiten."," Verwenden Sie ",[36,773,237],{}," für harte Voraussetzungen; der Resolver und der Cascade-Off-Helfer erledigen den Rest automatisch.",[493,776,777,780,781,783,784,787,788,791],{},[33,778,779],{},"(Optional) Deklarieren Sie ein Docker-Profil",", falls das Flag einen zusätzlichen Service benötigt. Fügen Sie ",[36,782,533],{}," beim entsprechenden Service in ",[36,785,786],{},"infra\u002Ftemplates\u002Fdocker-compose.vps.yml"," und in der ",[36,789,790],{},"docker-compose.yml"," im Wurzelverzeichnis hinzu.",[493,793,794,756,797,799],{},[33,795,796],{},"(Optional) Deklarieren Sie Umgebungsvariablen",[36,798,260],{},". Der Assistent fragt sie ab; die Admin-Oberfläche verhindert das Einschalten, bis sie gesetzt sind.",[493,801,802,805,806,809,810,812],{},[33,803,804],{},"Gaten Sie die Oberfläche."," Fügen Sie ",[36,807,808],{},"requiresFeature: '\u003Ckey>'"," zum ",[36,811,543],{}," jeder Seite hinzu, die zur Funktion gehört, und rendern Sie Sidebar-Einträge bedingt.",[493,814,815,818,819,526,822,824,825,599],{},[33,816,817],{},"Gaten Sie den Server."," Rufen Sie am Anfang jeder öffentlichen Convex-Funktion hinter dem Flag (nach der Auth-Prüfung) ",[36,820,821],{},"await assertFeatureEnabled(ctx, '\u003Ckey>')",[36,823,587],{}," auf — die Funktion liest die gespeicherten Flags, löst Abhängigkeiten auf und wirft selbstständig einen ",[36,826,598],{},[493,828,829,832,833,835],{},[33,830,831],{},"Aktualisieren Sie die Dokumentation",": Nehmen Sie das Flag in die Tabelle unter ",[19,834,22],{"href":21}," auf und referenzieren Sie es (falls für Benutzer sichtbar) aus der Feature-Tabelle in der README.",[15,837,838,839,842],{},"Wenn Sie eine neue Kategorie einführen, ergänzen Sie sie außerdem in der Union ",[36,840,841],{},"FeatureCategory"," sowie mit einem Label im Kategorie-Sortierer der Admin-Oberfläche.",[25,844,846],{"id":845},"ein-flag-entfernen","Ein Flag entfernen",[749,848,849,856,859,871],{},[493,850,851,852,855],{},"Setzen Sie es für ein Release auf ",[36,853,854],{},"default: false",", um Betreibern Zeit für die Migration zu geben.",[493,857,858],{},"Entfernen Sie die Page-Meta-Gates und bedingten Renderings und lassen Sie den zugrunde liegenden Codepfad entweder dauerhaft aktiv (wenn Sie ihn behalten) oder löschen Sie ihn vollständig (wenn Sie die Funktion ausmustern).",[493,860,861,862,864,865,867,868,870],{},"Entfernen Sie den Eintrag aus ",[36,863,765],{}," und der Union ",[36,866,78],{},". Der Resolver ignoriert unbekannte gespeicherte Schlüssel anstandslos, das Entfernen ist also gefahrlos — alte ",[36,869,511],{},"-Dateien gehen dabei nicht kaputt.",[493,872,873],{},"Entfernen Sie das Docker-Profil aus den Compose-Dateien.",[25,875,877],{"id":876},"nur-gehostete-flags","Nur gehostete Flags",[15,879,880,81,883,886,887,890,891,894,895,886,898,900,901,904,905,908,909,912,913,916],{},[36,881,882],{},"billing.stripe",[36,884,885],{},"multiTenancy"," und ",[36,888,889],{},"tier.autoProvision"," sind mit ",[36,892,893],{},"hostedOnly: true"," markiert. ",[36,896,897],{},"getDefaultFlags()",[36,899,445],{}," überspringen sie direkt, sofern nicht ",[36,902,903],{},"{ hosted: true }"," übergeben wird, sodass das Self-Host-Setup-CLI und die Admin-Oberfläche sie nie zu Gesicht bekommen. ",[36,906,907],{},"resolveFlags()"," filtert sie nicht selbst — es merged lediglich über die (gefilterte) Standard-Baseline, sodass ein hostedOnly-Schlüssel, der explizit in ",[36,910,911],{},"stored"," vorhanden ist, dennoch durchaufgelöst würde. Sie werden extern von der gehosteten Control Plane (in einem separaten privaten Repository) gesetzt und von ",[36,914,915],{},"apps\u002Fapi"," für die Sichtbarkeit der Abrechnungsoberfläche gelesen.",[25,918,920],{"id":919},"tests","Tests",[15,922,923,924,927,928,931,932,81,935,938],{},"Unit-Tests für den Resolver liegen in ",[36,925,926],{},"packages\u002Fshared\u002Fsrc\u002F__tests__\u002FfeatureFlags.test.ts",". Wenn Sie ein Flag mit nicht trivialen Abhängigkeiten hinzufügen, ergänzen Sie dort einen Fall, der die Kaskade abdeckt. Die eigenen Tests des Setup-CLI liegen in ",[36,929,930],{},"apps\u002Fsetup-cli\u002Fsrc\u002Flib\u002F__tests__\u002F"," (",[36,933,934],{},"passwordHash.test.ts",[36,936,937],{},"convexDeploy.test.ts",").",[940,941,942],"style",{},"html pre.shiki code .s7YZ4, html code.shiki .s7YZ4{--shiki-default:#D73A49;--shiki-dark:#F47067}html pre.shiki code .sviXB, html code.shiki .sviXB{--shiki-default:#005CC5;--shiki-dark:#6CB6FF}html pre.shiki code .sOLd2, html code.shiki .sOLd2{--shiki-default:#6F42C1;--shiki-dark:#F69D50}html pre.shiki code .sYgZi, html code.shiki .sYgZi{--shiki-default:#24292E;--shiki-dark:#ADBAC7}html pre.shiki code .s-HuK, html code.shiki .s-HuK{--shiki-default:#032F62;--shiki-dark:#96D0FF}html pre.shiki code .sDN9O, html code.shiki .sDN9O{--shiki-default:#6A737D;--shiki-dark:#768390}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);}",{"title":46,"searchDepth":96,"depth":96,"links":944},[945,946,947,948,949,950,951,952],{"id":27,"depth":96,"text":28},{"id":286,"depth":96,"text":287},{"id":479,"depth":96,"text":480},{"id":602,"depth":96,"text":603},{"id":746,"depth":96,"text":747},{"id":845,"depth":96,"text":846},{"id":876,"depth":96,"text":877},{"id":919,"depth":96,"text":920},"Wie das Feature-Flag-System von Owlat funktioniert: Single Source of Truth, Auflösung von Abhängigkeiten, Zuordnung zu Docker-Profilen und wie Sie ein neues Flag hinzufügen.","md",{},true,"\u002Fdeveloper\u002Ffeature-flags",{"title":6,"description":953},"3.developer\u002F11.feature-flags","gN8GbfJyLNSgZoKg8YshPGF8kTlowaZy5DcDoTeRQ6I",[962,966],{"title":963,"path":964,"stem":965,"children":-1},"MTA-System","\u002Fdeveloper\u002Fmta-system","3.developer\u002F10.mta-system",{"title":967,"path":968,"stem":969,"children":-1},"Wie E-Mail funktioniert","\u002Fdeveloper\u002Fhow-email-works","3.developer\u002F12.how-email-works",1786915107965]