[{"data":1,"prerenderedAt":1145},["ShallowReactive",2],{"navigation":3,"\u002Fbuild\u002Fconfiguration":189,"\u002Fbuild\u002Fconfiguration-surround":1140},[4,34,60,116,137,153],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":33},"Getting Started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,18,23,28],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-house",{"title":5,"path":16,"stem":17,"icon":6},"\u002Fgetting-started\u002Fgetting-started","1.getting-started\u002F2.getting-started",{"title":19,"path":20,"stem":21,"icon":22},"Choosing a Preset","\u002Fgetting-started\u002Fchoosing-a-preset","1.getting-started\u002F3.choosing-a-preset","i-lucide-git-branch",{"title":24,"path":25,"stem":26,"icon":27},"Deployment","\u002Fgetting-started\u002Fdeployment","1.getting-started\u002F4.deployment","i-lucide-cloud",{"title":29,"path":30,"stem":31,"icon":32},"Background Maintenance","\u002Fgetting-started\u002Fbackground-maintenance","1.getting-started\u002F5.background-maintenance","i-lucide-timer-reset",false,{"title":35,"icon":36,"path":37,"stem":38,"children":39,"page":33},"Build","i-lucide-wrench","\u002Fbuild","2.build",[40,45,50,55],{"title":41,"path":42,"stem":43,"icon":44},"Routers & Prefixes","\u002Fbuild\u002Frouters-and-prefixes","2.build\u002F1.routers-and-prefixes","i-lucide-route",{"title":46,"path":47,"stem":48,"icon":49},"Configuration","\u002Fbuild\u002Fconfiguration","2.build\u002F2.configuration","i-lucide-settings",{"title":51,"path":52,"stem":53,"icon":54},"Authorization Dependencies","\u002Fbuild\u002Fauthorization-dependencies","2.build\u002F3.authorization-dependencies","i-lucide-shield-check",{"title":56,"path":57,"stem":58,"icon":59},"Command Line","\u002Fbuild\u002Fcli","2.build\u002F4.cli","i-lucide-terminal",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":33},"Auth","i-lucide-lock","\u002Fauth","3.auth",[66,71,76,81,86,91,96,101,106,111],{"title":67,"path":68,"stem":69,"icon":70},"OAuth & Social Login","\u002Fauth\u002Foauth-and-social-login","3.auth\u002F1.oauth-and-social-login","i-lucide-log-in",{"title":72,"path":73,"stem":74,"icon":75},"Multi-Frontend Support","\u002Fauth\u002Fmulti-frontend","3.auth\u002F10.multi-frontend","i-lucide-layout-grid",{"title":77,"path":78,"stem":79,"icon":80},"Sessions & Audit","\u002Fauth\u002Fsessions-and-audit","3.auth\u002F2.sessions-and-audit","i-lucide-monitor-smartphone",{"title":82,"path":83,"stem":84,"icon":85},"Passwordless & Messaging","\u002Fauth\u002Fpasswordless-and-messaging","3.auth\u002F3.passwordless-and-messaging","i-lucide-mail",{"title":87,"path":88,"stem":89,"icon":90},"JWT Tokens","\u002Fauth\u002Fjwt-tokens","3.auth\u002F4.jwt-tokens","i-lucide-key-round",{"title":92,"path":93,"stem":94,"icon":95},"User Management API","\u002Fauth\u002Fuser-management-api","3.auth\u002F5.user-management-api","i-lucide-users",{"title":97,"path":98,"stem":99,"icon":100},"User Invitations","\u002Fauth\u002Fuser-invitations","3.auth\u002F6.user-invitations","i-lucide-send",{"title":102,"path":103,"stem":104,"icon":105},"Roles & Permissions","\u002Fauth\u002Froles-and-permissions","3.auth\u002F7.roles-and-permissions","i-lucide-shield",{"title":107,"path":108,"stem":109,"icon":110},"ABAC","\u002Fauth\u002Fabac","3.auth\u002F8.abac","i-lucide-filter",{"title":112,"path":113,"stem":114,"icon":115},"User Status","\u002Fauth\u002Fuser-status","3.auth\u002F9.user-status","i-lucide-user-cog",{"title":117,"icon":118,"path":119,"stem":120,"children":121,"page":33},"Enterprise","i-lucide-building-2","\u002Fenterprise","4.enterprise",[122,127,132],{"title":123,"path":124,"stem":125,"icon":126},"Core Authorization Concepts","\u002Fenterprise\u002Fcore-authorization-concepts","4.enterprise\u002F1.core-authorization-concepts","i-lucide-network",{"title":128,"path":129,"stem":130,"icon":131},"Entities","\u002Fenterprise\u002Fentities","4.enterprise\u002F2.entities","i-lucide-folder-tree",{"title":133,"path":134,"stem":135,"icon":136},"Entity Memberships","\u002Fenterprise\u002Fentity-memberships","4.enterprise\u002F3.entity-memberships","i-lucide-user-plus",{"title":138,"icon":139,"path":140,"stem":141,"children":142,"page":33},"Integrations","i-lucide-plug","\u002Fintegrations","5.integrations",[143,148],{"title":144,"path":145,"stem":146,"icon":147},"API Keys","\u002Fintegrations\u002Fapi-keys","5.integrations\u002F1.api-keys","i-lucide-key",{"title":149,"path":150,"stem":151,"icon":152},"OutlabsAuth UI","\u002Fintegrations\u002Foutlabsauth-ui","5.integrations\u002F2.outlabsauth-ui","i-lucide-layout-dashboard",{"title":154,"icon":155,"path":156,"stem":157,"children":158,"page":33},"Reference","i-lucide-book-marked","\u002Freference","6.reference",[159,164,169,174,179,184],{"title":160,"path":161,"stem":162,"icon":163},"Data Models","\u002Freference\u002Fdata-models","6.reference\u002F1.data-models","i-lucide-database",{"title":165,"path":166,"stem":167,"icon":168},"Activity Tracking","\u002Freference\u002Factivity-tracking","6.reference\u002F2.activity-tracking","i-lucide-activity",{"title":170,"path":171,"stem":172,"icon":173},"Testing","\u002Freference\u002Ftesting","6.reference\u002F3.testing","i-lucide-flask-conical",{"title":175,"path":176,"stem":177,"icon":178},"Observability","\u002Freference\u002Fobservability","6.reference\u002F4.observability","i-lucide-eye",{"title":180,"path":181,"stem":182,"icon":183},"Metrics Reference","\u002Freference\u002Fmetrics-reference","6.reference\u002F5.metrics-reference","i-lucide-chart-bar",{"title":185,"path":186,"stem":187,"icon":188},"Log Events Reference","\u002Freference\u002Flog-events-reference","6.reference\u002F6.log-events-reference","i-lucide-scroll-text",{"id":190,"title":46,"body":191,"description":1133,"extension":1134,"links":1135,"meta":1136,"navigation":1137,"path":47,"seo":1138,"stem":48,"__hash__":1139},"docs\u002F2.build\u002F2.configuration.md",{"type":192,"value":193,"toc":1123},"minimark",[194,207,217,222,282,286,353,443,447,488,522,539,543,559,565,569,622,709,727,731,734,918,994,1003,1007,1068,1082,1087,1091,1119],[195,196,197,198,202,203,206],"p",{},"Knobs you set when embedding OutlabsAuth. The full field list lives in\n",[199,200,201],"code",{},"outlabs_auth\u002Fcore\u002Fconfig.py"," (",[199,204,205],{},"AuthConfig",").",[208,209,210],"tip",{"to":16},[195,211,212,213,216],{},"New install? Start with ",[214,215,5],"a",{"href":16},", then\ncome back here for production defaults.",[218,219,221],"h2",{"id":220},"required","Required",[223,224,225,241],"table",{},[226,227,228],"thead",{},[229,230,231,235,238],"tr",{},[232,233,234],"th",{},"Setting",[232,236,237],{},"How",[232,239,240],{},"Notes",[242,243,244,266],"tbody",{},[229,245,246,250,260],{},[247,248,249],"td",{},"Database URL",[247,251,252,255,256,259],{},[199,253,254],{},"database_url="," or ",[199,257,258],{},"DATABASE_URL"," for CLI",[247,261,262,263],{},"Must be ",[199,264,265],{},"postgresql+asyncpg:\u002F\u002F...",[229,267,268,271,279],{},[247,269,270],{},"JWT secret",[247,272,273,255,276],{},[199,274,275],{},"secret_key=",[199,277,278],{},"SECRET_KEY",[247,280,281],{},"≥ 32 characters for HS256",[218,283,285],{"id":284},"recommended-production-baseline","Recommended production baseline",[287,288,294],"pre",{"className":289,"code":290,"filename":291,"language":292,"meta":293,"style":293},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from outlabs_auth import EnterpriseRBAC  # or SimpleRBAC\n\nauth = EnterpriseRBAC(\n    database_url=\"postgresql+asyncpg:\u002F\u002Fuser:password@db-host\u002Fapp?ssl=require\",\n    database_schema=\"outlabs_auth\",\n    secret_key=\"...\",  # long random secret\n    auto_migrate=False,\n    redis_url=\"redis:\u002F\u002Fcache-host:6379\u002F0\",\n)\n","main.py","python","",[199,295,296,304,311,317,323,329,335,341,347],{"__ignoreMap":293},[297,298,301],"span",{"class":299,"line":300},"line",1,[297,302,303],{},"from outlabs_auth import EnterpriseRBAC  # or SimpleRBAC\n",[297,305,307],{"class":299,"line":306},2,[297,308,310],{"emptyLinePlaceholder":309},true,"\n",[297,312,314],{"class":299,"line":313},3,[297,315,316],{},"auth = EnterpriseRBAC(\n",[297,318,320],{"class":299,"line":319},4,[297,321,322],{},"    database_url=\"postgresql+asyncpg:\u002F\u002Fuser:password@db-host\u002Fapp?ssl=require\",\n",[297,324,326],{"class":299,"line":325},5,[297,327,328],{},"    database_schema=\"outlabs_auth\",\n",[297,330,332],{"class":299,"line":331},6,[297,333,334],{},"    secret_key=\"...\",  # long random secret\n",[297,336,338],{"class":299,"line":337},7,[297,339,340],{},"    auto_migrate=False,\n",[297,342,344],{"class":299,"line":343},8,[297,345,346],{},"    redis_url=\"redis:\u002F\u002Fcache-host:6379\u002F0\",\n",[297,348,350],{"class":299,"line":349},9,[297,351,352],{},")\n",[223,354,355,364],{},[226,356,357],{},[229,358,359,361],{},[232,360,234],{},[232,362,363],{},"Guidance",[242,365,366,376,389,399,419,432],{},[229,367,368,373],{},[247,369,370],{},[199,371,372],{},"database_schema",[247,374,375],{},"Keep auth tables in a dedicated schema",[229,377,378,383],{},[247,379,380],{},[199,381,382],{},"auto_migrate",[247,384,385,388],{},[199,386,387],{},"False"," in multi-worker runtime; migrate via CLI in prestart",[229,390,391,396],{},[247,392,393],{},[199,394,395],{},"redis_url",[247,397,398],{},"Counters, rate limits, shared permission caching",[229,400,401,406],{},[247,402,403],{},[199,404,405],{},"cache_backend",[247,407,408,411,412,415,416],{},[199,409,410],{},"redis"," (multi-instance), ",[199,413,414],{},"memory"," (single-process), or ",[199,417,418],{},"none",[229,420,421,426],{},[247,422,423],{},[199,424,425],{},"background_job_mode",[247,427,428,431],{},[199,429,430],{},"\"disabled\""," in production APIs; use one external maintenance owner",[229,433,434,437],{},[247,435,436],{},"Mount prefix",[247,438,439,440],{},"App-owned — keep consistent with UI ",[199,441,442],{},"authApiPrefix",[218,444,446],{"id":445},"permission-cache-backends","Permission cache backends",[223,448,449,459],{},[226,450,451],{},[229,452,453,456],{},[232,454,455],{},"Backend",[232,457,458],{},"When to use",[242,460,461,470,479],{},[229,462,463,467],{},[247,464,465],{},[199,466,410],{},[247,468,469],{},"Multi-instance \u002F multi-worker production",[229,471,472,476],{},[247,473,474],{},[199,475,414],{},[247,477,478],{},"Single-process hosts without Redis",[229,480,481,485],{},[247,482,483],{},[199,484,418],{},[247,486,487],{},"No cross-request permission cache",[287,489,491],{"className":289,"code":490,"filename":291,"language":292,"meta":293,"style":293},"# Single-instance, no Redis\nauth = SimpleRBAC(\n    database_url=...,\n    secret_key=...,\n    cache_backend=\"memory\",\n)\n",[199,492,493,498,503,508,513,518],{"__ignoreMap":293},[297,494,495],{"class":299,"line":300},[297,496,497],{},"# Single-instance, no Redis\n",[297,499,500],{"class":299,"line":306},[297,501,502],{},"auth = SimpleRBAC(\n",[297,504,505],{"class":299,"line":313},[297,506,507],{},"    database_url=...,\n",[297,509,510],{"class":299,"line":319},[297,511,512],{},"    secret_key=...,\n",[297,514,515],{"class":299,"line":325},[297,516,517],{},"    cache_backend=\"memory\",\n",[297,519,520],{"class":299,"line":331},[297,521,352],{},[523,524,525],"caution",{},[195,526,527,528,532,533,535,536,538],{},"Do ",[529,530,531],"strong",{},"not"," use ",[199,534,414],{}," when multiple workers must see each other's permission\ninvalidations immediately — use ",[199,537,410],{}," instead.",[218,540,542],{"id":541},"background-maintenance","Background maintenance",[195,544,545,547,548,550,551,554,555,558],{},[199,546,425],{}," accepts ",[199,549,430],{}," (the default) or ",[199,552,553],{},"\"embedded\"",".\nProduction API processes should remain disabled while one explicit scheduler or\nworker calls ",[199,556,557],{},"run_maintenance_once()",". Embedded mode is a single-process\ndevelopment convenience.",[195,560,561,562,564],{},"TaskQ, Celery, and Cron are host integrations—not library modes. See\n",[214,563,29],{"href":30}," for the CLI\nand programmatic entry points, retries, activation, and rollback.",[218,566,568],{"id":567},"feature-flags","Feature flags",[223,570,571,584],{},[226,572,573],{},[229,574,575,578,581],{},[232,576,577],{},"Flag",[232,579,580],{},"SimpleRBAC",[232,582,583],{},"EnterpriseRBAC",[242,585,586,599,611],{},[229,587,588,593,596],{},[247,589,590],{},[199,591,592],{},"enable_entity_hierarchy",[247,594,595],{},"forced off",[247,597,598],{},"forced on",[229,600,601,606,608],{},[247,602,603],{},[199,604,605],{},"enable_context_aware_roles",[247,607,595],{},[247,609,610],{},"optional (default off)",[229,612,613,618,620],{},[247,614,615],{},[199,616,617],{},"enable_abac",[247,619,595],{},[247,621,610],{},[223,623,624,636],{},[226,625,626],{},[229,627,628,630,633],{},[232,629,577],{},[232,631,632],{},"Default",[232,634,635],{},"Purpose",[242,637,638,653,667,681,695],{},[229,639,640,645,650],{},[247,641,642],{},[199,643,644],{},"enable_invitations",[247,646,647],{},[199,648,649],{},"True",[247,651,652],{},"Invite-by-email flow",[229,654,655,660,664],{},[247,656,657],{},[199,658,659],{},"enable_magic_links",[247,661,662],{},[199,663,387],{},[247,665,666],{},"Passwordless magic links",[229,668,669,674,678],{},[247,670,671],{},[199,672,673],{},"enable_access_codes",[247,675,676],{},[199,677,387],{},[247,679,680],{},"Passwordless access codes",[229,682,683,688,692],{},[247,684,685],{},[199,686,687],{},"store_refresh_tokens",[247,689,690],{},[199,691,649],{},[247,693,694],{},"DB-backed refresh revocation (session inventory)",[229,696,697,702,706],{},[247,698,699],{},[199,700,701],{},"enable_token_blacklist",[247,703,704],{},[199,705,387],{},[247,707,708],{},"Immediate access-token blacklist (Redis)",[710,711,712],"note",{},[195,713,714,717,718,720,721,723,724,726],{},[199,715,716],{},"enable_audit_log"," is a legacy feature-status flag — it does ",[529,719,531],{}," gate\nsession\u002Faudit HTTP routes. Passwordless walkthrough:\n",[214,722,82],{"href":83},". ABAC:\n",[214,725,107],{"href":108},".",[218,728,730],{"id":729},"cli-target-and-credentials","CLI target and credentials",[195,732,733],{},"Contexts store non-secret target metadata. Human bearer sessions live in a\nseparate owner-only store, while API keys and one-off bearer credentials should\ncome from environment variables or a secret manager.",[223,735,736,745],{},[226,737,738],{},[229,739,740,743],{},[232,741,742],{},"Variable",[232,744,635],{},[242,746,747,756,766,776,786,796,806,816,826,842,852,862,872,888,898,908],{},[229,748,749,753],{},[247,750,751],{},[199,752,258],{},[247,754,755],{},"Direct Postgres URL for local database commands",[229,757,758,763],{},[247,759,760],{},[199,761,762],{},"OUTLABS_AUTH_SCHEMA",[247,764,765],{},"Database schema for migrations and maintenance",[229,767,768,773],{},[247,769,770],{},[199,771,772],{},"OUTLABS_AUTH_BOOTSTRAP_*",[247,774,775],{},"Optional first-admin inputs for non-interactive bootstrap",[229,777,778,783],{},[247,779,780],{},[199,781,782],{},"OUTLABS_AUTH_CONFIG",[247,784,785],{},"Alternate non-secret context file",[229,787,788,793],{},[247,789,790],{},[199,791,792],{},"OUTLABS_AUTH_CREDENTIALS",[247,794,795],{},"Alternate owner-only human session file",[229,797,798,803],{},[247,799,800],{},[199,801,802],{},"OUTLABS_AUTH_PROFILE",[247,804,805],{},"Context selected for an invocation",[229,807,808,813],{},[247,809,810],{},[199,811,812],{},"OUTLABS_AUTH_BASE_URL",[247,814,815],{},"One-off remote base URL override",[229,817,818,823],{},[247,819,820],{},[199,821,822],{},"OUTLABS_AUTH_API_PREFIX",[247,824,825],{},"One-off mounted API-prefix override",[229,827,828,833],{},[247,829,830],{},[199,831,832],{},"OUTLABS_AUTH_CREDENTIAL_TYPE",[247,834,835,836,255,839],{},"One-off transport override: ",[199,837,838],{},"bearer",[199,840,841],{},"api-key",[229,843,844,849],{},[247,845,846],{},[199,847,848],{},"OUTLABS_AUTH_CREDENTIAL_ENV",[247,850,851],{},"One-off name of the environment variable containing the credential",[229,853,854,859],{},[247,855,856],{},[199,857,858],{},"OUTLABS_AUTH_TOKEN",[247,860,861],{},"Default remote bearer credential",[229,863,864,869],{},[247,865,866],{},[199,867,868],{},"OUTLABS_AUTH_API_KEY",[247,870,871],{},"Default remote API-key credential",[229,873,874,879],{},[247,875,876],{},[199,877,878],{},"OUTLABS_AUTH_OUTPUT",[247,880,881,882,255,885],{},"Default output contract: ",[199,883,884],{},"text",[199,886,887],{},"json",[229,889,890,895],{},[247,891,892],{},[199,893,894],{},"OUTLABS_AUTH_NON_INTERACTIVE",[247,896,897],{},"Disable prompts for automation",[229,899,900,905],{},[247,901,902],{},[199,903,904],{},"OUTLABS_AUTH_TIMEOUT",[247,906,907],{},"Remote HTTP timeout in seconds",[229,909,910,915],{},[247,911,912],{},[199,913,914],{},"OUTLABS_AUTH_DEBUG",[247,916,917],{},"Include tracebacks for unexpected CLI failures",[287,919,924],{"className":920,"code":921,"filename":922,"language":923,"meta":293,"style":293},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","outlabs-auth context add production \\\n  --base-url https:\u002F\u002Fapi.example.com \\\n  --api-prefix \u002Fiam\noutlabs-auth auth login --email admin@example.com\noutlabs-auth capabilities\noutlabs-auth whoami\n","Terminal","bash",[199,925,926,946,956,964,980,987],{"__ignoreMap":293},[297,927,928,932,936,939,942],{"class":299,"line":300},[297,929,931],{"class":930},"sBMFI","outlabs-auth",[297,933,935],{"class":934},"sfazB"," context",[297,937,938],{"class":934}," add",[297,940,941],{"class":934}," production",[297,943,945],{"class":944},"sTEyZ"," \\\n",[297,947,948,951,954],{"class":299,"line":306},[297,949,950],{"class":934},"  --base-url",[297,952,953],{"class":934}," https:\u002F\u002Fapi.example.com",[297,955,945],{"class":944},[297,957,958,961],{"class":299,"line":313},[297,959,960],{"class":934},"  --api-prefix",[297,962,963],{"class":934}," \u002Fiam\n",[297,965,966,968,971,974,977],{"class":299,"line":319},[297,967,931],{"class":930},[297,969,970],{"class":934}," auth",[297,972,973],{"class":934}," login",[297,975,976],{"class":934}," --email",[297,978,979],{"class":934}," admin@example.com\n",[297,981,982,984],{"class":299,"line":325},[297,983,931],{"class":930},[297,985,986],{"class":934}," capabilities\n",[297,988,989,991],{"class":299,"line":331},[297,990,931],{"class":930},[297,992,993],{"class":934}," whoami\n",[208,995,996],{"to":57},[195,997,998,999,1002],{},"The ",[214,1000,1001],{"href":57},"Command Line guide"," covers complete UI-optional\nadministration, secret-safe key creation, coding-agent discovery, stable JSON\nand exit contracts, and declarative plan\u002Fapply.",[218,1004,1006],{"id":1005},"local-operator-commands","Local operator commands",[287,1008,1010],{"className":920,"code":1009,"filename":922,"language":923,"meta":293,"style":293},"outlabs-auth migrate\noutlabs-auth seed-system\noutlabs-auth bootstrap-admin\noutlabs-auth doctor\noutlabs-auth bootstrap\noutlabs-auth run-maintenance\noutlabs-auth tables\noutlabs-auth current\n",[199,1011,1012,1019,1026,1033,1040,1047,1054,1061],{"__ignoreMap":293},[297,1013,1014,1016],{"class":299,"line":300},[297,1015,931],{"class":930},[297,1017,1018],{"class":934}," migrate\n",[297,1020,1021,1023],{"class":299,"line":306},[297,1022,931],{"class":930},[297,1024,1025],{"class":934}," seed-system\n",[297,1027,1028,1030],{"class":299,"line":313},[297,1029,931],{"class":930},[297,1031,1032],{"class":934}," bootstrap-admin\n",[297,1034,1035,1037],{"class":299,"line":319},[297,1036,931],{"class":930},[297,1038,1039],{"class":934}," doctor\n",[297,1041,1042,1044],{"class":299,"line":325},[297,1043,931],{"class":930},[297,1045,1046],{"class":934}," bootstrap\n",[297,1048,1049,1051],{"class":299,"line":331},[297,1050,931],{"class":930},[297,1052,1053],{"class":934}," run-maintenance\n",[297,1055,1056,1058],{"class":299,"line":337},[297,1057,931],{"class":930},[297,1059,1060],{"class":934}," tables\n",[297,1062,1063,1065],{"class":299,"line":343},[297,1064,931],{"class":930},[297,1066,1067],{"class":934}," current\n",[195,1069,1070,1073,1074,1077,1078,1081],{},[199,1071,1072],{},"run-maintenance"," prints a typed maintenance report. Exit ",[199,1075,1076],{},"0"," means every\nconfigured step completed without reported errors; exit ",[199,1079,1080],{},"1"," means the report is\nincomplete or error-bearing.",[195,1083,1084,1085,726],{},"See also ",[214,1086,24],{"href":25},[218,1088,1090],{"id":1089},"related","Related",[1092,1093,1094,1099,1103,1107,1111,1115],"ul",{},[1095,1096,1097],"li",{},[214,1098,5],{"href":16},[1095,1100,1101],{},[214,1102,24],{"href":25},[1095,1104,1105],{},[214,1106,29],{"href":30},[1095,1108,1109],{},[214,1110,41],{"href":42},[1095,1112,1113],{},[214,1114,56],{"href":57},[1095,1116,1117],{},[214,1118,175],{"href":176},[1120,1121,1122],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":293,"searchDepth":300,"depth":306,"links":1124},[1125,1126,1127,1128,1129,1130,1131,1132],{"id":220,"depth":306,"text":221},{"id":284,"depth":306,"text":285},{"id":445,"depth":306,"text":446},{"id":541,"depth":306,"text":542},{"id":567,"depth":306,"text":568},{"id":729,"depth":306,"text":730},{"id":1005,"depth":306,"text":1006},{"id":1089,"depth":306,"text":1090},"Secrets, schema, Redis, cache backends, and CLI.","md",null,{},{"icon":49},{"title":46,"description":1133},"lqhOBjJUDgpMi8-8ui8RyqeTjERAmQgvqbg5Y1MAL1E",[1141,1143],{"title":41,"path":42,"stem":43,"description":1142,"icon":44,"children":-1},"Which get_*_router factories to mount and how prefixes work.",{"title":51,"path":52,"stem":53,"description":1144,"icon":54,"children":-1},"Protect host routes with authentication, permission, entity, tree, source, and two-phase checks.",1787472745731]