[{"data":1,"prerenderedAt":636},["ShallowReactive",2],{"navigation_docs":3,"-docs-getting-started-installation":64,"-docs-getting-started-installation-surround":631},[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":15,"body":66,"description":624,"extension":625,"links":626,"meta":627,"navigation":628,"path":16,"seo":629,"stem":17,"__hash__":630},"docs\u002Fdocs\u002F1.getting-started\u002F2.installation.md",{"type":67,"value":68,"toc":617},"minimark",[69,74,107,123,127,135,347,363,367,445,455,462,466,473,525,536,540,543,575,582,613],[70,71,73],"h2",{"id":72},"prerequisites","Prerequisites",[75,76,77,94,100],"ul",{},[78,79,80,84,85,88,89,93],"li",{},[81,82,83],"strong",{},"Node 26"," and ",[81,86,87],{},"pnpm 11"," (a ",[90,91,92],"code",{},"mise.toml"," pins both)",[78,95,96,99],{},[81,97,98],{},"Docker"," — the Supabase CLI runs Postgres and Auth locally",[78,101,102,103,106],{},"The Supabase CLI is a project dependency, so use ",[90,104,105],{},"pnpm supabase \u003Ccmd>","; there is\nnothing to install globally.",[108,109,110,111,114,115,118,119,122],"warning",{},"This project uses ",[81,112,113],{},"pnpm",". ",[90,116,117],{},"npm install"," or ",[90,120,121],{},"yarn"," will produce a lockfile the CI\ndoesn't expect.",[70,124,126],{"id":125},"get-the-code","Get the code",[128,129,130,131,134],"p",{},"GStack is a GitHub ",[81,132,133],{},"template repository",", so the cleanest route is to make your\nown repo from it rather than forking. Pick whichever fits:",[136,137,138,196,274],"code-group",{},[139,140,146],"pre",{"className":141,"code":142,"filename":143,"language":144,"meta":145,"style":145},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Creates your own repo from the template and clones it.\ngh repo create my-app --template TerrorSquad\u002Fgstack --private --clone\ncd my-app\n","GitHub CLI","bash","",[90,147,148,157,186],{"__ignoreMap":145},[149,150,153],"span",{"class":151,"line":152},"line",1,[149,154,156],{"class":155},"sHwdD","# Creates your own repo from the template and clones it.\n",[149,158,160,164,168,171,174,177,180,183],{"class":151,"line":159},2,[149,161,163],{"class":162},"sBMFI","gh",[149,165,167],{"class":166},"sfazB"," repo",[149,169,170],{"class":166}," create",[149,172,173],{"class":166}," my-app",[149,175,176],{"class":166}," --template",[149,178,179],{"class":166}," TerrorSquad\u002Fgstack",[149,181,182],{"class":166}," --private",[149,184,185],{"class":166}," --clone\n",[149,187,189,193],{"class":151,"line":188},3,[149,190,192],{"class":191},"s2Zo4","cd",[149,194,195],{"class":166}," my-app\n",[139,197,200],{"className":141,"code":198,"filename":199,"language":144,"meta":145,"style":145},"# No GitHub account needed. Downloads the files with no git history,\n# so your first commit is your own.\npnpm dlx degit TerrorSquad\u002Fgstack my-app\ncd my-app\ngit init && git add -A && git commit -m \"chore: initial commit from GStack\"\n","degit",[90,201,202,207,212,226,233],{"__ignoreMap":145},[149,203,204],{"class":151,"line":152},[149,205,206],{"class":155},"# No GitHub account needed. Downloads the files with no git history,\n",[149,208,209],{"class":151,"line":159},[149,210,211],{"class":155},"# so your first commit is your own.\n",[149,213,214,216,219,222,224],{"class":151,"line":188},[149,215,113],{"class":162},[149,217,218],{"class":166}," dlx",[149,220,221],{"class":166}," degit",[149,223,179],{"class":166},[149,225,195],{"class":166},[149,227,229,231],{"class":151,"line":228},4,[149,230,192],{"class":191},[149,232,195],{"class":166},[149,234,236,239,242,246,249,252,255,257,259,262,265,268,271],{"class":151,"line":235},5,[149,237,238],{"class":162},"git",[149,240,241],{"class":166}," init",[149,243,245],{"class":244},"sMK4o"," &&",[149,247,248],{"class":162}," git",[149,250,251],{"class":166}," add",[149,253,254],{"class":166}," -A",[149,256,245],{"class":244},[149,258,248],{"class":162},[149,260,261],{"class":166}," commit",[149,263,264],{"class":166}," -m",[149,266,267],{"class":244}," \"",[149,269,270],{"class":166},"chore: initial commit from GStack",[149,272,273],{"class":244},"\"\n",[139,275,278],{"className":141,"code":276,"filename":277,"language":144,"meta":145,"style":145},"git clone --depth 1 https:\u002F\u002Fgithub.com\u002FTerrorSquad\u002Fgstack.git my-app\ncd my-app\nrm -rf .git          # drop GStack's history\ngit init && git add -A && git commit -m \"chore: initial commit from GStack\"\n","git clone",[90,279,280,299,305,319],{"__ignoreMap":145},[149,281,282,284,287,290,294,297],{"class":151,"line":152},[149,283,238],{"class":162},[149,285,286],{"class":166}," clone",[149,288,289],{"class":166}," --depth",[149,291,293],{"class":292},"sbssI"," 1",[149,295,296],{"class":166}," https:\u002F\u002Fgithub.com\u002FTerrorSquad\u002Fgstack.git",[149,298,195],{"class":166},[149,300,301,303],{"class":151,"line":159},[149,302,192],{"class":191},[149,304,195],{"class":166},[149,306,307,310,313,316],{"class":151,"line":188},[149,308,309],{"class":162},"rm",[149,311,312],{"class":166}," -rf",[149,314,315],{"class":166}," .git",[149,317,318],{"class":155},"          # drop GStack's history\n",[149,320,321,323,325,327,329,331,333,335,337,339,341,343,345],{"class":151,"line":228},[149,322,238],{"class":162},[149,324,241],{"class":166},[149,326,245],{"class":244},[149,328,248],{"class":162},[149,330,251],{"class":166},[149,332,254],{"class":166},[149,334,245],{"class":244},[149,336,248],{"class":162},[149,338,261],{"class":166},[149,340,264],{"class":166},[149,342,267],{"class":244},[149,344,270],{"class":166},[149,346,273],{"class":244},[348,349,350,351,354,355,362],"tip",{},"Prefer clicking? Hit ",[81,352,353],{},"Use this template"," on the\n",[356,357,361],"a",{"href":358,"rel":359},"https:\u002F\u002Fgithub.com\u002FTerrorSquad\u002Fgstack",[360],"nofollow","repository page",", then clone the repo it\ncreates for you.",[70,364,366],{"id":365},"setup","Setup",[139,368,370],{"className":141,"code":369,"language":144,"meta":145,"style":145},"pnpm install\ncp .env.example .env\npnpm setup          # pick which integrations to enable; writes .env\npnpm supabase start # local Postgres + Auth\npnpm db:reset       # apply migrations + seed a demo tenant\npnpm db:types       # regenerate typed client from the live schema\npnpm dev            # http:\u002F\u002Flocalhost:3000\n",[90,371,372,379,390,400,413,423,434],{"__ignoreMap":145},[149,373,374,376],{"class":151,"line":152},[149,375,113],{"class":162},[149,377,378],{"class":166}," install\n",[149,380,381,384,387],{"class":151,"line":159},[149,382,383],{"class":162},"cp",[149,385,386],{"class":166}," .env.example",[149,388,389],{"class":166}," .env\n",[149,391,392,394,397],{"class":151,"line":188},[149,393,113],{"class":162},[149,395,396],{"class":166}," setup",[149,398,399],{"class":155},"          # pick which integrations to enable; writes .env\n",[149,401,402,404,407,410],{"class":151,"line":228},[149,403,113],{"class":162},[149,405,406],{"class":166}," supabase",[149,408,409],{"class":166}," start",[149,411,412],{"class":155}," # local Postgres + Auth\n",[149,414,415,417,420],{"class":151,"line":235},[149,416,113],{"class":162},[149,418,419],{"class":166}," db:reset",[149,421,422],{"class":155},"       # apply migrations + seed a demo tenant\n",[149,424,426,428,431],{"class":151,"line":425},6,[149,427,113],{"class":162},[149,429,430],{"class":166}," db:types",[149,432,433],{"class":155},"       # regenerate typed client from the live schema\n",[149,435,437,439,442],{"class":151,"line":436},7,[149,438,113],{"class":162},[149,440,441],{"class":166}," dev",[149,443,444],{"class":155},"            # http:\u002F\u002Flocalhost:3000\n",[128,446,447,450,451,454],{},[90,448,449],{},"pnpm setup"," reads a single subsystem manifest and flips the flag for each\nintegration you pick, stubbing any missing keys. Unpicked subsystems are set to\n",[90,452,453],{},"false",", never deleted, and existing values are never overwritten.",[128,456,457,458,461],{},"Run ",[90,459,460],{},"pnpm doctor"," afterwards to verify — it reads the same manifest, so adding a\nsubsystem wires up both scripts at once.",[70,463,465],{"id":464},"demo-logins","Demo logins",[128,467,468,469,472],{},"After ",[90,470,471],{},"pnpm db:reset",":",[474,475,476,492],"table",{},[477,478,479],"thead",{},[480,481,482,486,489],"tr",{},[483,484,485],"th",{},"Account",[483,487,488],{},"Email",[483,490,491],{},"Password",[493,494,495,511],"tbody",{},[480,496,497,501,506],{},[498,499,500],"td",{},"Admin",[498,502,503],{},[90,504,505],{},"admin@example.com",[498,507,508],{},[90,509,510],{},"Demo123!Demo123",[480,512,513,516,521],{},[498,514,515],{},"Member",[498,517,518],{},[90,519,520],{},"member@example.com",[498,522,523],{},[90,524,510],{},[128,526,527,528,531,532,535],{},"Seeding is idempotent — it wipes the ",[90,529,530],{},"@example.com"," domain first, so re-running is\nsafe. ",[90,533,534],{},"SEED_FAST=1 pnpm seed"," builds the minimal set.",[70,537,539],{"id":538},"make-it-yours","Make it yours",[128,541,542],{},"Do this early, so the placeholder name never reaches your own first commit:",[139,544,546],{"className":141,"code":545,"language":144,"meta":145,"style":145},"node scripts\u002Frename.mjs \"My App\" --package my-app --site https:\u002F\u002Fmyapp.com\n",[90,547,548],{"__ignoreMap":145},[149,549,550,553,556,558,561,564,567,569,572],{"class":151,"line":152},[149,551,552],{"class":162},"node",[149,554,555],{"class":166}," scripts\u002Frename.mjs",[149,557,267],{"class":244},[149,559,560],{"class":166},"My App",[149,562,563],{"class":244},"\"",[149,565,566],{"class":166}," --package",[149,568,173],{"class":166},[149,570,571],{"class":166}," --site",[149,573,574],{"class":166}," https:\u002F\u002Fmyapp.com\n",[128,576,577,578,581],{},"That replaces the ",[90,579,580],{},"GStack"," display name across the app, the email templates and\nthe Supabase config, and sets the package name. Left for you by hand:",[75,583,584,595,601,607],{},[78,585,586,587,590,591,594],{},"brand palette — ",[90,588,589],{},"layers\u002Fui\u002Fapp\u002Fassets\u002Fcss\u002Fmain.css"," (",[90,592,593],{},"--color-brand-*",")",[78,596,597,598],{},"favicon — ",[90,599,600],{},"public\u002Ffavicon.svg",[78,602,603,606],{},[90,604,605],{},"LICENSE"," copyright holder",[78,608,609,612],{},[90,610,611],{},"README.md"," product description",[614,615,616],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":145,"searchDepth":159,"depth":159,"links":618},[619,620,621,622,623],{"id":72,"depth":159,"text":73},{"id":125,"depth":159,"text":126},{"id":365,"depth":159,"text":366},{"id":464,"depth":159,"text":465},{"id":538,"depth":159,"text":539},"From clone to a running app with a seeded demo tenant.","md",null,{},{"icon":18},{"title":15,"description":624},"_4zPGQnZfj76enNhI1W8bBvWRTatwKcy9T6KTeYfQzs",[632,634],{"title":10,"path":11,"stem":12,"description":633,"icon":13,"children":-1},"What GStack is, what it refuses to be, and who should use it.",{"title":20,"path":21,"stem":22,"description":635,"icon":23,"children":-1},"Every subsystem, its flag, and what it costs to turn on.",1785950578066]