[{"data":1,"prerenderedAt":202},["ShallowReactive",2],{"navigation_docs":3,"-docs-getting-started-configuration":64,"-docs-getting-started-configuration-surround":197},[4,29,49],{"title":5,"path":6,"stem":7,"children":8,"page":28},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fdocs\u002Fgetting-started\u002Fintroduction","docs\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation","i-lucide-rocket",{"title":20,"path":21,"stem":22,"icon":23},"Configuration","\u002Fdocs\u002Fgetting-started\u002Fconfiguration","docs\u002F1.getting-started\u002F3.configuration","i-lucide-sliders-horizontal",{"title":25,"path":26,"stem":27,"icon":18},"Deployment","\u002Fdocs\u002Fgetting-started\u002Fdeployment","docs\u002F1.getting-started\u002F4.deployment",false,{"title":30,"path":31,"stem":32,"children":33,"page":28},"Architecture","\u002Fdocs\u002Farchitecture","docs\u002F2.architecture",[34,39,44],{"title":35,"path":36,"stem":37,"icon":38},"Layers","\u002Fdocs\u002Farchitecture\u002Flayers","docs\u002F2.architecture\u002F1.layers","i-lucide-layers",{"title":40,"path":41,"stem":42,"icon":43},"Multi-tenancy","\u002Fdocs\u002Farchitecture\u002Fmulti-tenancy","docs\u002F2.architecture\u002F2.multi-tenancy","i-lucide-building-2",{"title":45,"path":46,"stem":47,"icon":48},"Testing","\u002Fdocs\u002Farchitecture\u002Ftesting","docs\u002F2.architecture\u002F3.testing","i-lucide-flask-conical",{"title":50,"path":51,"stem":52,"children":53,"page":28},"Reference","\u002Fdocs\u002Freference","docs\u002F3.reference",[54,59],{"title":55,"path":56,"stem":57,"icon":58},"Commands","\u002Fdocs\u002Freference\u002Fcommands","docs\u002F3.reference\u002F1.commands","i-lucide-terminal",{"title":60,"path":61,"stem":62,"icon":63},"Decisions","\u002Fdocs\u002Freference\u002Fdecisions","docs\u002F3.reference\u002F2.decisions","i-lucide-git-branch",{"id":65,"title":20,"body":66,"description":190,"extension":191,"links":192,"meta":193,"navigation":194,"path":21,"seo":195,"stem":22,"__hash__":196},"docs\u002Fdocs\u002F1.getting-started\u002F3.configuration.md",{"type":67,"value":68,"toc":181},"minimark",[69,73,78,81,101,105,111,121,125,140,144,164,167,171],[70,71,72],"p",{},"Every optional subsystem is off until you set its flag. The app runs fully without\nany of them.",[74,75,77],"h2",{"id":76},"subsystems","Subsystems",[79,80],"integrations-table",{},[70,82,83,84,88,89,92,93,96,97,100],{},"This table is generated from ",[85,86,87],"code",{},"scripts\u002Fintegrations.ts"," — the same manifest\n",[85,90,91],{},"pnpm setup"," and ",[85,94,95],{},"pnpm doctor"," read — so it cannot drift from what the code\nactually does. Subsystems with no flag are switched on by the presence of their\nkeys. ",[85,98,99],{},"NUXT_PUBLIC_POSTHOG_SESSION_REPLAY"," is not a subsystem of its own; it is\nan extra opt-in on top of PostHog.",[74,102,104],{"id":103},"notifications","Notifications",[70,106,107,108,110],{},"A database trigger fans a new note out to the tenant's admins as ",[85,109,103],{},"\nrows. The in-app feed and bell render them; a Supabase database webhook mirrors\neach row to email through Resend.",[70,112,113,114,116,117,120],{},"To wire the email half, add a Supabase webhook on ",[85,115,103],{}," INSERT that\nPOSTs to ",[85,118,119],{},"\u002Fapi\u002Fhooks\u002Fnotification-email"," with your secret header.",[74,122,124],{"id":123},"social-login","Social login",[70,126,127,128,131,132,135,136,139],{},"Enable ",[85,129,130],{},"[auth.external.github]"," or ",[85,133,134],{},"[auth.external.google]"," in\n",[85,137,138],{},"supabase\u002Fconfig.toml",", set the client id\u002Fsecret, and restart local Supabase. The\nlogin page buttons are already wired.",[74,141,143],{"id":142},"email-templates","Email templates",[145,146,147,150,151,155,156,159,160,163],"caution",{},[85,148,149],{},"supabase\u002Ftemplates\u002F*.html"," are ",[152,153,154],"strong",{},"generated",", not source. Edit\n",[85,157,158],{},"scripts\u002Fgen-auth-templates.ts"," and run ",[85,161,162],{},"pnpm gen:auth-templates",".",[70,165,166],{},"Auth mail is rendered by GoTrue rather than by the app, so it has to exist as\nstandalone files — but they come from the same shell the app's own transactional\nmail uses. A unit test compares the committed HTML against the generator, so\nhand-edits and forgotten regenerations fail on pre-commit instead of shipping a\nmismatched password-reset email.",[74,168,170],{"id":169},"feature-flags-without-posthog","Feature flags without PostHog",[70,172,173,176,177,180],{},[85,174,175],{},"useFeatureFlag(key, fallback)"," returns a reactive flag that degrades to\n",[85,178,179],{},"fallback"," when PostHog is disabled. Gated UI therefore works on a bare clone —\nyou never have to stand up an analytics account to develop against a flag.",{"title":182,"searchDepth":183,"depth":183,"links":184},"",2,[185,186,187,188,189],{"id":76,"depth":183,"text":77},{"id":103,"depth":183,"text":104},{"id":123,"depth":183,"text":124},{"id":142,"depth":183,"text":143},{"id":169,"depth":183,"text":170},"Every subsystem, its flag, and what it costs to turn on.","md",null,{},{"icon":23},{"title":20,"description":190},"1x3mKI4PWBT8NAZ_TDRKWlfwua0-EHJ94VbmKxH73BQ",[198,200],{"title":15,"path":16,"stem":17,"description":199,"icon":18,"children":-1},"From clone to a running app with a seeded demo tenant.",{"title":25,"path":26,"stem":27,"description":201,"icon":18,"children":-1},"Getting it onto a real domain, with a hosted database and the migrations applied.",1785950578066]