[{"data":1,"prerenderedAt":277},["ShallowReactive",2],{"navigation_docs":3,"-docs-getting-started-configuration":60,"-docs-getting-started-configuration-surround":272},[4,25,45],{"title":5,"path":6,"stem":7,"children":8,"page":24},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started",[9,14,19],{"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",false,{"title":26,"path":27,"stem":28,"children":29,"page":24},"Architecture","\u002Fdocs\u002Farchitecture","docs\u002F2.architecture",[30,35,40],{"title":31,"path":32,"stem":33,"icon":34},"Layers","\u002Fdocs\u002Farchitecture\u002Flayers","docs\u002F2.architecture\u002F1.layers","i-lucide-layers",{"title":36,"path":37,"stem":38,"icon":39},"Multi-tenancy","\u002Fdocs\u002Farchitecture\u002Fmulti-tenancy","docs\u002F2.architecture\u002F2.multi-tenancy","i-lucide-building-2",{"title":41,"path":42,"stem":43,"icon":44},"Testing","\u002Fdocs\u002Farchitecture\u002Ftesting","docs\u002F2.architecture\u002F3.testing","i-lucide-flask-conical",{"title":46,"path":47,"stem":48,"children":49,"page":24},"Reference","\u002Fdocs\u002Freference","docs\u002F3.reference",[50,55],{"title":51,"path":52,"stem":53,"icon":54},"Commands","\u002Fdocs\u002Freference\u002Fcommands","docs\u002F3.reference\u002F1.commands","i-lucide-terminal",{"title":56,"path":57,"stem":58,"icon":59},"Decisions","\u002Fdocs\u002Freference\u002Fdecisions","docs\u002F3.reference\u002F2.decisions","i-lucide-git-branch",{"id":61,"title":20,"body":62,"description":265,"extension":266,"links":267,"meta":268,"navigation":269,"path":21,"seo":270,"stem":22,"__hash__":271},"docs\u002Fdocs\u002F1.getting-started\u002F3.configuration.md",{"type":63,"value":64,"toc":256},"minimark",[65,69,74,176,180,186,196,200,215,219,239,242,246],[66,67,68],"p",{},"Every optional subsystem is off until you set its flag. The app runs fully without\nany of them.",[70,71,73],"h2",{"id":72},"subsystems","Subsystems",[75,76,77,93],"table",{},[78,79,80],"thead",{},[81,82,83,87,90],"tr",{},[84,85,86],"th",{},"Subsystem",[84,88,89],{},"Flag",[84,91,92],{},"Needs",[94,95,96,111,124,137,150,163],"tbody",{},[81,97,98,102,108],{},[99,100,101],"td",{},"Notifications + email",[99,103,104],{},[105,106,107],"code",{},"NUXT_PUBLIC_NOTIFICATIONS_ENABLED",[99,109,110],{},"Resend key, webhook secret",[81,112,113,116,121],{},[99,114,115],{},"Feedback widget",[99,117,118],{},[105,119,120],{},"NUXT_PUBLIC_FEEDBACK_ENABLED",[99,122,123],{},"nothing (self-hosted)",[81,125,126,129,134],{},[99,127,128],{},"Onboarding tour",[99,130,131],{},[105,132,133],{},"NUXT_PUBLIC_TOUR_ENABLED",[99,135,136],{},"nothing",[81,138,139,142,147],{},[99,140,141],{},"Analytics + flags",[99,143,144],{},[105,145,146],{},"NUXT_PUBLIC_POSTHOG_ENABLED",[99,148,149],{},"PostHog key",[81,151,152,155,160],{},[99,153,154],{},"Session replay",[99,156,157],{},[105,158,159],{},"NUXT_PUBLIC_POSTHOG_SESSION_REPLAY",[99,161,162],{},"PostHog enabled",[81,164,165,168,173],{},[99,166,167],{},"Error tracking",[99,169,170],{},[105,171,172],{},"NUXT_PUBLIC_SENTRY_DSN",[99,174,175],{},"Sentry DSN",[70,177,179],{"id":178},"notifications","Notifications",[66,181,182,183,185],{},"A database trigger fans a new note out to the tenant's admins as ",[105,184,178],{},"\nrows. The in-app feed and bell render them; a Supabase database webhook mirrors\neach row to email through Resend.",[66,187,188,189,191,192,195],{},"To wire the email half, add a Supabase webhook on ",[105,190,178],{}," INSERT that\nPOSTs to ",[105,193,194],{},"\u002Fapi\u002Fhooks\u002Fnotification-email"," with your secret header.",[70,197,199],{"id":198},"social-login","Social login",[66,201,202,203,206,207,210,211,214],{},"Enable ",[105,204,205],{},"[auth.external.github]"," or ",[105,208,209],{},"[auth.external.google]"," in\n",[105,212,213],{},"supabase\u002Fconfig.toml",", set the client id\u002Fsecret, and restart local Supabase. The\nlogin page buttons are already wired.",[70,216,218],{"id":217},"email-templates","Email templates",[220,221,222,225,226,230,231,234,235,238],"caution",{},[105,223,224],{},"supabase\u002Ftemplates\u002F*.html"," are ",[227,228,229],"strong",{},"generated",", not source. Edit\n",[105,232,233],{},"scripts\u002Fgen-auth-templates.ts"," and run ",[105,236,237],{},"pnpm gen:auth-templates",".",[66,240,241],{},"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.",[70,243,245],{"id":244},"feature-flags-without-posthog","Feature flags without PostHog",[66,247,248,251,252,255],{},[105,249,250],{},"useFeatureFlag(key, fallback)"," returns a reactive flag that degrades to\n",[105,253,254],{},"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":257,"searchDepth":258,"depth":258,"links":259},"",2,[260,261,262,263,264],{"id":72,"depth":258,"text":73},{"id":178,"depth":258,"text":179},{"id":198,"depth":258,"text":199},{"id":217,"depth":258,"text":218},{"id":244,"depth":258,"text":245},"Every subsystem, its flag, and what it costs to turn on.","md",null,{},{"icon":23},{"title":20,"description":265},"d44w7SeOYk1sioaDJw15dzYWnKzw8YNxgGyYztP3vJk",[273,275],{"title":15,"path":16,"stem":17,"description":274,"icon":18,"children":-1},"From clone to a running app with a seeded demo tenant.",{"title":31,"path":32,"stem":33,"description":276,"icon":34,"children":-1},"How features are organised, and why ~ never means what you think.",1785842751195]