[{"data":1,"prerenderedAt":228},["ShallowReactive",2],{"navigation_docs":3,"-docs-getting-started-introduction":60,"-docs-getting-started-introduction-surround":225},[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":10,"body":62,"description":218,"extension":219,"links":220,"meta":221,"navigation":222,"path":11,"seo":223,"stem":12,"__hash__":224},"docs\u002Fdocs\u002F1.getting-started\u002F1.introduction.md",{"type":63,"value":64,"toc":204},"minimark",[65,78,83,136,140,153,157,195],[66,67,68,69,73,74,77],"p",{},"GStack is an opinionated starting point for ",[70,71,72],"strong",{},"multi-tenant, role-aware SaaS"," built\non Nuxt 4 and Supabase. It is distributed as a GitHub template repository: click\n",[70,75,76],{},"Use this template",", run one rename command, and it's yours.",[79,80,82],"h2",{"id":81},"principles","Principles",[84,85,87,92,95,99,107,111,118,122,129,133],"steps",{"level":86},"3",[88,89,91],"h3",{"id":90},"rls-first-security","RLS-first security",[66,93,94],{},"Access control lives in Postgres Row Level Security, not in application code.\nPage-level role gates are UX only. A bug in a component can never leak another\ntenant's data, because the component never had the rows.",[88,96,98],{"id":97},"type-safe-end-to-end","Type-safe end to end",[66,100,101,102,106],{},"Database schema → generated types → composables → UI. A query that under-selects\nfails at ",[103,104,105],"code",{},"pnpm typecheck",", not in production.",[88,108,110],{"id":109},"batteries-included-but-flag-gated","Batteries included, but flag-gated",[66,112,113,114,117],{},"Notifications, observability, email, billing, analytics, feedback and the\nonboarding tour are all wired and all ",[70,115,116],{},"off by default"," behind env flags. Nothing\nhalf-works — you flip one switch per subsystem. A bare clone runs with no\nthird-party account at all.",[88,119,121],{"id":120},"generic-and-rebrandable","Generic and rebrandable",[66,123,124,125,128],{},"No product identity is baked in. ",[103,126,127],{},"node scripts\u002Frename.mjs \"My App\""," swaps the\ndisplay name everywhere it appears; there is one brand palette to change.",[88,130,132],{"id":131},"dx-over-cleverness","DX over cleverness",[66,134,135],{},"Boring, legible code. The laziest solution that actually works. Deletion over\naddition.",[79,137,139],{"id":138},"non-goals","Non-goals",[141,142,143,147,150],"ul",{},[144,145,146],"li",{},"Not a no-code platform.",[144,148,149],{},"Not framework-agnostic — it is Nuxt + Supabase, deliberately.",[144,151,152],{},"Not a kitchen sink. Every dependency earns its place or is cut.",[79,154,156],{"id":155},"how-it-compares","How it compares",[158,159,160,171],"table",{},[161,162,163],"thead",{},[164,165,166,169],"tr",{},[167,168],"th",{},[167,170],{},[172,173,174,185],"tbody",{},[164,175,176,182],{},[177,178,179],"td",{},[70,180,181],{},"vs. create-t3-app",[177,183,184],{},"Same type-safety ethos, but RLS-first Postgres instead of app-layer authz, and Vue\u002FNuxt instead of React\u002FNext.",[164,186,187,192],{},[177,188,189],{},[70,190,191],{},"vs. commercial Nuxt SaaS kits",[177,193,194],{},"Matches them on auth, i18n and testing; ahead on observability, accessibility, release automation and proven multi-tenancy.",[196,197,198,199,203],"note",{},"Reversible-but-significant choices are recorded as ",[200,201,202],"a",{"href":57},"ADRs","\nin the repository — including the ones deliberately deferred.",{"title":205,"searchDepth":206,"depth":206,"links":207},"",2,[208,216,217],{"id":81,"depth":206,"text":82,"children":209},[210,212,213,214,215],{"id":90,"depth":211,"text":91},3,{"id":97,"depth":211,"text":98},{"id":109,"depth":211,"text":110},{"id":120,"depth":211,"text":121},{"id":131,"depth":211,"text":132},{"id":138,"depth":206,"text":139},{"id":155,"depth":206,"text":156},"What GStack is, what it refuses to be, and who should use it.","md",null,{},{"icon":13},{"title":10,"description":218},"r5ZRV5oYCvPYOOLHF5mOcqTFLxHLlUJNXZcGUrzciIA",[220,226],{"title":15,"path":16,"stem":17,"description":227,"icon":18,"children":-1},"From clone to a running app with a seeded demo tenant.",1785842750816]