[{"data":1,"prerenderedAt":201},["ShallowReactive",2],{"navigation_docs":3,"-docs-reference-decisions":60,"-docs-reference-decisions-surround":198},[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":56,"body":62,"description":191,"extension":192,"links":193,"meta":194,"navigation":195,"path":57,"seo":196,"stem":58,"__hash__":197},"docs\u002Fdocs\u002F3.reference\u002F2.decisions.md",{"type":63,"value":64,"toc":186},"minimark",[65,69,151,156,159,166,172,182],[66,67,68],"p",{},"Reversible-but-significant choices are recorded as ADRs in the repository. They\nlive next to the code rather than being copied here, so there is one version of\neach decision rather than two that drift.",[70,71,72,85],"table",{},[73,74,75],"thead",{},[76,77,78,82],"tr",{},[79,80,81],"th",{},"ADR",[79,83,84],{},"Decision",[86,87,88,103,115,127,139],"tbody",{},[76,89,90,100],{},[91,92,93],"td",{},[94,95,99],"a",{"href":96,"rel":97},"https:\u002F\u002Fgithub.com\u002FTerrorSquad\u002Fgstack\u002Fblob\u002Fmain\u002Fdocs\u002Fadr\u002F0001-payments-provider.md",[98],"nofollow","0001",[91,101,102],{},"Payments provider — Polar as Merchant of Record",[76,104,105,112],{},[91,106,107],{},[94,108,111],{"href":109,"rel":110},"https:\u002F\u002Fgithub.com\u002FTerrorSquad\u002Fgstack\u002Fblob\u002Fmain\u002Fdocs\u002Fadr\u002F0002-data-layer.md",[98],"0002",[91,113,114],{},"Data layer — generated types, no ORM yet",[76,116,117,124],{},[91,118,119],{},[94,120,123],{"href":121,"rel":122},"https:\u002F\u002Fgithub.com\u002FTerrorSquad\u002Fgstack\u002Fblob\u002Fmain\u002Fdocs\u002Fadr\u002F0003-upstash-redis.md",[98],"0003",[91,125,126],{},"Upstash Redis for distributed rate limiting",[76,128,129,136],{},[91,130,131],{},[94,132,135],{"href":133,"rel":134},"https:\u002F\u002Fgithub.com\u002FTerrorSquad\u002Fgstack\u002Fblob\u002Fmain\u002Fdocs\u002Fadr\u002F0004-distribution-github-template.md",[98],"0004",[91,137,138],{},"Distribution as a GitHub template repository",[76,140,141,148],{},[91,142,143],{},[94,144,147],{"href":145,"rel":146},"https:\u002F\u002Fgithub.com\u002FTerrorSquad\u002Fgstack\u002Fblob\u002Fmain\u002Fdocs\u002Fadr\u002F0005-nuxt-layers.md",[98],"0005",[91,149,150],{},"Nuxt Layers for feature organisation",[152,153,155],"h2",{"id":154},"deliberately-deferred","Deliberately deferred",[66,157,158],{},"The absent things are choices too:",[66,160,161,165],{},[162,163,164],"strong",{},"Drizzle ORM."," Generated types already give end-to-end safety. Adopt an ORM when\nserver-side query complexity actually demands it, not before.",[66,167,168,171],{},[162,169,170],{},"Direct Stripe."," Not available to sellers in every country the stack targets;\nPolar is a Merchant of Record, which also removes the tax-handling problem.",[66,173,174,177,178,181],{},[162,175,176],{},"A monorepo."," There is one deployable. A monorepo waits until a second app\nexists. In-repo ",[162,179,180],{},"Nuxt Layers"," are used for feature organisation — that is not\nthe same thing.",[183,184,185],"note",{},"Each of these is cheap to add later and expensive to carry now. That asymmetry is\nthe whole argument.",{"title":187,"searchDepth":188,"depth":188,"links":189},"",2,[190],{"id":154,"depth":188,"text":155},"The architecture decision records, and the things deliberately not built.","md",null,{},{"icon":59},{"title":56,"description":191},"aWhM_4MKxd9iTY_vNHXtgjMHKqv-Qn87qurtSCdT8dQ",[199,193],{"title":51,"path":52,"stem":53,"description":200,"icon":54,"children":-1},"Every script worth knowing, grouped by what you're doing.",1785842751195]