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