[{"data":1,"prerenderedAt":499},["ShallowReactive",2],{"navigation":3,"\u002Fgetting-started\u002Fchoosing-a-preset":189,"\u002Fgetting-started\u002Fchoosing-a-preset-surround":494},[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":19,"body":191,"description":487,"extension":488,"links":489,"meta":490,"navigation":491,"path":20,"seo":492,"stem":21,"__hash__":493},"docs\u002F1.getting-started\u002F3.choosing-a-preset.md",{"type":192,"value":193,"toc":480},"minimark",[194,203,208,219,236,314,318,321,368,372,383,438,442,448,452,476],[195,196,197,198,202],"p",{},"OutlabsAuth ships two presets. They share the same core library; the difference\nis whether you need an ",[199,200,201],"strong",{},"organization tree",".",[204,205,207],"h2",{"id":206},"quick-chooser","Quick chooser",[209,210,216],"pre",{"className":211,"code":213,"language":214,"meta":215},[212],"language-text","Do you need departments, teams, offices, client orgs, or similar hierarchy?\n│\n├─ No  → SimpleRBAC\n│        Users have roles for the whole app.\n│\n└─ Yes → EnterpriseRBAC\n         Users get roles *inside* entities (and optionally down a tree).\n","text","",[217,218,213],"code",{"__ignoreMap":215},[220,221,222,230],"card-group",{},[223,224,227],"card",{"icon":225,"title":226},"i-lucide-layers","SimpleRBAC",[195,228,229],{},"Flat roles for the whole app. Best for blogs, tools, and SaaS without org nesting.",[223,231,233],{"icon":131,"title":232},"EnterpriseRBAC",[195,234,235],{},"Hierarchy, memberships, and tree permissions. Best for companies, franchises, multi-office products.",[237,238,239,252],"table",{},[240,241,242],"thead",{},[243,244,245,248,250],"tr",{},[246,247],"th",{},[246,249,226],{},[246,251,232],{},[253,254,255,267,278,289],"tbody",{},[243,256,257,261,264],{},[258,259,260],"td",{},"Best for",[258,262,263],{},"Blogs, tools, SaaS without org nesting",[258,265,266],{},"Companies, franchises, multi-office products",[243,268,269,272,275],{},[258,270,271],{},"Roles",[258,273,274],{},"Flat — assigned to the user",[258,276,277],{},"Scoped — assigned via entity membership",[243,279,280,283,286],{},[258,281,282],{},"Entities \u002F tree permissions",[258,284,285],{},"No",[258,287,288],{},"Yes",[243,290,291,294,305],{},[258,292,293],{},"Typical example",[258,295,296],{},[297,298,302],"a",{"href":299,"rel":300},"https:\u002F\u002Fgithub.com\u002Foutlabsio\u002FoutlabsAuth\u002Ftree\u002Fmain\u002Fexamples\u002Fsimple_rbac",[301],"nofollow",[217,303,304],{},"examples\u002Fsimple_rbac",[258,306,307],{},[297,308,311],{"href":309,"rel":310},"https:\u002F\u002Fgithub.com\u002Foutlabsio\u002FoutlabsAuth\u002Ftree\u002Fmain\u002Fexamples\u002Fenterprise_rbac",[301],[217,312,313],{},"examples\u002Fenterprise_rbac",[204,315,317],{"id":316},"simplerbac-in-one-sentence","SimpleRBAC in one sentence",[195,319,320],{},"“Who can do what?” — roles and permissions for the whole application.",[209,322,327],{"className":323,"code":324,"filename":325,"language":326,"meta":215,"style":215},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from outlabs_auth import SimpleRBAC\n\nauth = SimpleRBAC(\n    database_url=os.environ[\"DATABASE_URL\"],\n    secret_key=os.environ[\"SECRET_KEY\"],\n)\n","main.py","python",[217,328,329,337,344,350,356,362],{"__ignoreMap":215},[330,331,334],"span",{"class":332,"line":333},"line",1,[330,335,336],{},"from outlabs_auth import SimpleRBAC\n",[330,338,340],{"class":332,"line":339},2,[330,341,343],{"emptyLinePlaceholder":342},true,"\n",[330,345,347],{"class":332,"line":346},3,[330,348,349],{},"auth = SimpleRBAC(\n",[330,351,353],{"class":332,"line":352},4,[330,354,355],{},"    database_url=os.environ[\"DATABASE_URL\"],\n",[330,357,359],{"class":332,"line":358},5,[330,360,361],{},"    secret_key=os.environ[\"SECRET_KEY\"],\n",[330,363,365],{"class":332,"line":364},6,[330,366,367],{},")\n",[204,369,371],{"id":370},"enterpriserbac-in-one-sentence","EnterpriseRBAC in one sentence",[195,373,374,375,378,379,382],{},"“Who can do what, ",[199,376,377],{},"where","?” — roles apply in an entity context (and optionally\nto descendants with ",[217,380,381],{},"_tree"," permissions).",[209,384,386],{"className":323,"code":385,"filename":325,"language":326,"meta":215,"style":215},"from outlabs_auth import EnterpriseRBAC\n\nauth = EnterpriseRBAC(\n    database_url=os.environ[\"DATABASE_URL\"],\n    secret_key=os.environ[\"SECRET_KEY\"],\n    # Optional extras:\n    # enable_context_aware_roles=True,\n    # enable_abac=True,\n    redis_url=os.environ.get(\"REDIS_URL\"),  # recommended in production\n)\n",[217,387,388,393,397,402,406,410,415,421,427,433],{"__ignoreMap":215},[330,389,390],{"class":332,"line":333},[330,391,392],{},"from outlabs_auth import EnterpriseRBAC\n",[330,394,395],{"class":332,"line":339},[330,396,343],{"emptyLinePlaceholder":342},[330,398,399],{"class":332,"line":346},[330,400,401],{},"auth = EnterpriseRBAC(\n",[330,403,404],{"class":332,"line":352},[330,405,355],{},[330,407,408],{"class":332,"line":358},[330,409,361],{},[330,411,412],{"class":332,"line":364},[330,413,414],{},"    # Optional extras:\n",[330,416,418],{"class":332,"line":417},7,[330,419,420],{},"    # enable_context_aware_roles=True,\n",[330,422,424],{"class":332,"line":423},8,[330,425,426],{},"    # enable_abac=True,\n",[330,428,430],{"class":332,"line":429},9,[330,431,432],{},"    redis_url=os.environ.get(\"REDIS_URL\"),  # recommended in production\n",[330,434,436],{"class":332,"line":435},10,[330,437,367],{},[204,439,441],{"id":440},"can-i-switch-later","Can I switch later?",[443,444,445],"warning",{},[195,446,447],{},"You can move from Simple to Enterprise when you need hierarchy, but treat it as\na product migration (new entities, memberships, invite rules), not a one-line\nflip. Start with the preset that matches the product you are shipping in the\nnext quarter.",[204,449,451],{"id":450},"go-deeper","Go deeper",[453,454,455,461,470],"ul",{},[456,457,458,459],"li",{},"Concepts: ",[297,460,123],{"href":124},[456,462,463,464,466,467],{},"Entities & memberships: ",[297,465,128],{"href":129}," · ",[297,468,469],{"href":134},"Memberships",[456,471,472,473,475],{},"Next: ",[297,474,5],{"href":16}," if you have not wired an app yet",[477,478,479],"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);}",{"title":215,"searchDepth":333,"depth":339,"links":481},[482,483,484,485,486],{"id":206,"depth":339,"text":207},{"id":316,"depth":339,"text":317},{"id":370,"depth":339,"text":371},{"id":440,"depth":339,"text":441},{"id":450,"depth":339,"text":451},"SimpleRBAC vs EnterpriseRBAC in plain language.","md",null,{},{"icon":22},{"title":19,"description":487},"NyzbRzIidlQkIA6EmhoYmWNNE1zUNpF8CTLigl3LiD0",[495,497],{"title":5,"path":16,"stem":17,"description":496,"icon":6,"children":-1},"Install, migrate, mount routers, and log in.",{"title":24,"path":25,"stem":26,"description":498,"icon":27,"children":-1},"Production migrate, Redis, and multi-worker checklist.",1787472744721]