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