[{"data":1,"prerenderedAt":1129},["ShallowReactive",2],{"navigation:en":3,"\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Ftech-stack:en":311},[4],{"title":5,"path":6,"stem":7,"children":8,"icon":10},"Nuxfire Docs","\u002Fdocs","docs\u002F0.index",[9,11,152],{"title":5,"path":6,"stem":7,"icon":10},"i-lucide-layout-grid",{"title":12,"path":13,"stem":14,"children":15,"icon":151},"SaaS Starter Kit","\u002Fdocs\u002Fsaas-starter-kit","docs\u002F1.saas-starter-kit\u002F0.index",[16,19,63,129],{"title":17,"path":13,"stem":14,"icon":18},"What is the SaaS Starter Kit?","i-lucide-info",{"title":20,"icon":21,"hide":22,"path":23,"stem":24,"children":25,"page":62},"Getting Started","i-lucide-play",true,"\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started","docs\u002F1.saas-starter-kit\u002F1.getting-started",[26,30,34,38,42,46,50,54,58],{"title":27,"path":28,"stem":29},"Quick Start","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fquick-start","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F0.quick-start",{"title":31,"path":32,"stem":33},"Installation","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Finstallation","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F1.installation",{"title":35,"path":36,"stem":37},"Cloudflare Access","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fcloudflare-access","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F2.cloudflare-access",{"title":39,"path":40,"stem":41},"Configuration","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fconfiguration","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F3.configuration",{"title":43,"path":44,"stem":45},"Secrets","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fsecrets","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F4.secrets",{"title":47,"path":48,"stem":49},"Environment Variables","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fenvironment-variables","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F5.environment-variables",{"title":51,"path":52,"stem":53},"Deploy","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fdeploy","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F6.deploy",{"title":55,"path":56,"stem":57},"Local Development","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Flocal-development","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F7.local-development",{"title":59,"path":60,"stem":61},"Project Structure","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fproject-structure","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F8.project-structure",false,{"title":64,"icon":65,"hide":22,"path":66,"stem":67,"children":68,"page":62},"Features","i-lucide-box","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures","docs\u002F1.saas-starter-kit\u002F2.features",[69,73,77,81,85,89,93,97,101,105,109,113,117,121,125],{"title":70,"path":71,"stem":72},"Authentication","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fauth","docs\u002F1.saas-starter-kit\u002F2.features\u002F1.auth",{"title":74,"path":75,"stem":76},"Rate Limiting","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Frate-limiting","docs\u002F1.saas-starter-kit\u002F2.features\u002F10.rate-limiting",{"title":78,"path":79,"stem":80},"WebSockets","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fwebsockets","docs\u002F1.saas-starter-kit\u002F2.features\u002F11.websockets",{"title":82,"path":83,"stem":84},"Blog","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fblog","docs\u002F1.saas-starter-kit\u002F2.features\u002F14.blog",{"title":86,"path":87,"stem":88},"Documentation","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fdocumentation","docs\u002F1.saas-starter-kit\u002F2.features\u002F15.documentation",{"title":90,"path":91,"stem":92},"Analytics","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fanalytics","docs\u002F1.saas-starter-kit\u002F2.features\u002F16.analytics",{"title":94,"path":95,"stem":96},"Platform Admin Console","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fplatform-admin","docs\u002F1.saas-starter-kit\u002F2.features\u002F17.platform-admin",{"title":98,"path":99,"stem":100},"Database","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fdatabase","docs\u002F1.saas-starter-kit\u002F2.features\u002F2.database",{"title":102,"path":103,"stem":104},"Payments & Billing","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fpayments","docs\u002F1.saas-starter-kit\u002F2.features\u002F3.payments",{"title":106,"path":107,"stem":108},"Emails","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Femails","docs\u002F1.saas-starter-kit\u002F2.features\u002F4.emails",{"title":110,"path":111,"stem":112},"Notifications","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fnotifications","docs\u002F1.saas-starter-kit\u002F2.features\u002F5.notifications",{"title":114,"path":115,"stem":116},"Role-Based Access Control","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Frbac","docs\u002F1.saas-starter-kit\u002F2.features\u002F6.rbac",{"title":118,"path":119,"stem":120},"Async Jobs","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fasync-jobs","docs\u002F1.saas-starter-kit\u002F2.features\u002F7.async-jobs",{"title":122,"path":123,"stem":124},"Storage","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fstorage","docs\u002F1.saas-starter-kit\u002F2.features\u002F8.storage",{"title":126,"path":127,"stem":128},"Internationalization","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Finternationalization","docs\u002F1.saas-starter-kit\u002F2.features\u002F9.internationalization",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":62},"Concepts","i-lucide-graduation-cap","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts","docs\u002F1.saas-starter-kit\u002F3.concepts",[135,139,143,147],{"title":136,"path":137,"stem":138},"Technology Stack","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Ftech-stack","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F0.tech-stack",{"title":140,"path":141,"stem":142},"SST.dev","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Fsst","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F1.sst",{"title":144,"path":145,"stem":146},"NuxtHub","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Fnuxt-hub","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F2.nuxt-hub",{"title":148,"path":149,"stem":150},"Design System & Branding","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Fdesign-system","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F3.design-system","i-lucide-zap",{"title":153,"path":154,"stem":155,"children":156,"icon":159},"Fireskills","\u002Fdocs\u002Ffireskills","docs\u002F2.fireskills\u002F0.index",[157,160,219,249,275,293],{"title":158,"path":154,"stem":155,"icon":159},"What is Fireskills?","i-lucide-flame",{"title":20,"icon":21,"hide":22,"path":161,"stem":162,"children":163,"page":62},"\u002Fdocs\u002Ffireskills\u002Fgetting-started","docs\u002F2.fireskills\u002F1.getting-started",[164,167,171,175,179,183,187,191,195,199,203,207,211,215],{"title":27,"path":165,"stem":166},"\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fquick-start","docs\u002F2.fireskills\u002F1.getting-started\u002F00.quick-start",{"title":168,"path":169,"stem":170},"Workflow & Governance","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fworkflow","docs\u002F2.fireskills\u002F1.getting-started\u002F01.workflow",{"title":172,"path":173,"stem":174},"Project Context","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fproject-context","docs\u002F2.fireskills\u002F1.getting-started\u002F02.project-context",{"title":176,"path":177,"stem":178},"Step 0: Setup","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-setup","docs\u002F2.fireskills\u002F1.getting-started\u002F03.step-setup",{"title":180,"path":181,"stem":182},"Step 1: Inbox","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-inbox","docs\u002F2.fireskills\u002F1.getting-started\u002F04.step-inbox",{"title":184,"path":185,"stem":186},"Step 2: Backlog","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-backlog","docs\u002F2.fireskills\u002F1.getting-started\u002F05.step-backlog",{"title":188,"path":189,"stem":190},"Step 3: Specify","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-specify","docs\u002F2.fireskills\u002F1.getting-started\u002F06.step-specify",{"title":192,"path":193,"stem":194},"Step 4: Validate","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-validate","docs\u002F2.fireskills\u002F1.getting-started\u002F07.step-validate",{"title":196,"path":197,"stem":198},"Step 5: Tasks","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-tasks","docs\u002F2.fireskills\u002F1.getting-started\u002F08.step-tasks",{"title":200,"path":201,"stem":202},"Step 6: TDD\u002FBDD","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-tdd-bdd","docs\u002F2.fireskills\u002F1.getting-started\u002F09.step-tdd-bdd",{"title":204,"path":205,"stem":206},"Step 7: Implement","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-implement","docs\u002F2.fireskills\u002F1.getting-started\u002F10.step-implement",{"title":208,"path":209,"stem":210},"Step 8: Documentator","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-documentator","docs\u002F2.fireskills\u002F1.getting-started\u002F11.step-documentator",{"title":212,"path":213,"stem":214},"Late Changes","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Flate-changes","docs\u002F2.fireskills\u002F1.getting-started\u002F12.late-changes",{"title":216,"path":217,"stem":218},"Other Entry Points","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fother-entry-points","docs\u002F2.fireskills\u002F1.getting-started\u002F13.other-entry-points",{"title":220,"icon":221,"hide":22,"path":222,"stem":223,"children":224,"page":62},"Methodology","i-lucide-git-branch","\u002Fdocs\u002Ffireskills\u002Fmethodology","docs\u002F2.fireskills\u002F2.methodology",[225,229,233,237,241,245],{"title":226,"path":227,"stem":228},"The Three Acts","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fthree-acts","docs\u002F2.fireskills\u002F2.methodology\u002F0.three-acts",{"title":230,"path":231,"stem":232},"The Three Gates","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fthree-gates","docs\u002F2.fireskills\u002F2.methodology\u002F1.three-gates",{"title":234,"path":235,"stem":236},"The Canonical Spec","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fcanonical-spec","docs\u002F2.fireskills\u002F2.methodology\u002F2.canonical-spec",{"title":238,"path":239,"stem":240},"Lifecycle States","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Flifecycle-states","docs\u002F2.fireskills\u002F2.methodology\u002F3.lifecycle-states",{"title":242,"path":243,"stem":244},"Effort Scale","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Feffort-scale","docs\u002F2.fireskills\u002F2.methodology\u002F4.effort-scale",{"title":246,"path":247,"stem":248},"Milestones & Governance","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fgovernance-and-milestones","docs\u002F2.fireskills\u002F2.methodology\u002F5.governance-and-milestones",{"title":250,"icon":251,"hide":22,"path":252,"stem":253,"children":254,"page":62},"Skills","i-lucide-layers","\u002Fdocs\u002Ffireskills\u002Fskills","docs\u002F2.fireskills\u002F3.skills",[255,259,263,267,271],{"title":256,"path":257,"stem":258},"Catalog","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fcatalog","docs\u002F2.fireskills\u002F3.skills\u002F0.catalog",{"title":260,"path":261,"stem":262},"Act I: Define","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fact-1-define","docs\u002F2.fireskills\u002F3.skills\u002F1.act-1-define",{"title":264,"path":265,"stem":266},"Act II: Design & Prove","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fact-2-design-prove","docs\u002F2.fireskills\u002F3.skills\u002F2.act-2-design-prove",{"title":268,"path":269,"stem":270},"Act III: Deliver","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fact-3-deliver","docs\u002F2.fireskills\u002F3.skills\u002F3.act-3-deliver",{"title":272,"path":273,"stem":274},"Governance & Decisions","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fgovernance-and-decisions","docs\u002F2.fireskills\u002F3.skills\u002F4.governance-and-decisions",{"title":276,"icon":277,"hide":22,"path":278,"stem":279,"children":280,"page":62},"Specialists","i-lucide-sparkles","\u002Fdocs\u002Ffireskills\u002Fspecialists","docs\u002F2.fireskills\u002F4.specialists",[281,285,289],{"title":282,"path":283,"stem":284},"Overview","\u002Fdocs\u002Ffireskills\u002Fspecialists\u002Foverview","docs\u002F2.fireskills\u002F4.specialists\u002F0.overview",{"title":286,"path":287,"stem":288},"Nuxfire Stack","\u002Fdocs\u002Ffireskills\u002Fspecialists\u002Fnuxfire-stack","docs\u002F2.fireskills\u002F4.specialists\u002F1.nuxfire-stack",{"title":290,"path":291,"stem":292},"Engineering Specialists","\u002Fdocs\u002Ffireskills\u002Fspecialists\u002Fengineering-specialists","docs\u002F2.fireskills\u002F4.specialists\u002F2.engineering-specialists",{"title":294,"icon":295,"hide":22,"path":296,"stem":297,"children":298,"page":62},"CLI & Tooling","i-lucide-terminal","\u002Fdocs\u002Ffireskills\u002Fcli","docs\u002F2.fireskills\u002F5.cli",[299,303,307],{"title":300,"path":301,"stem":302},"CLI Overview","\u002Fdocs\u002Ffireskills\u002Fcli\u002Foverview","docs\u002F2.fireskills\u002F5.cli\u002F0.overview",{"title":304,"path":305,"stem":306},"Commands","\u002Fdocs\u002Ffireskills\u002Fcli\u002Fcommands","docs\u002F2.fireskills\u002F5.cli\u002F1.commands",{"title":308,"path":309,"stem":310},"Safety Scripts","\u002Fdocs\u002Ffireskills\u002Fcli\u002Fgovernance-scripts","docs\u002F2.fireskills\u002F5.cli\u002F2.governance-scripts",{"id":312,"title":136,"body":313,"description":1123,"extension":1124,"meta":1125,"navigation":1126,"path":137,"seo":1127,"stem":138,"__hash__":1128},"docs\u002Fdocs\u002F1.saas-starter-kit\u002F3.concepts\u002F0.tech-stack.md",{"type":314,"value":315,"toc":1108},"minimark",[316,329,334,375,379,556,560,609,612,656,660,720,724,751,851,855,901,905,960,964,1001,1005,1056,1060],[317,318,319,320,324,325,328],"p",{},"Pulled directly from the real ",[321,322,323],"code",{},"package.json"," files and ",[321,326,327],{},"infra\u002F*.ts"," — nothing here is aspirational.",[330,331,333],"h2",{"id":332},"runtime-language","Runtime & language",[335,336,337,349],"table",{},[338,339,340],"thead",{},[341,342,343,346],"tr",{},[344,345],"th",{},[344,347,348],{},"Purpose",[350,351,352,367],"tbody",{},[341,353,354,364],{},[355,356,357],"td",{},[358,359,363],"a",{"href":360,"rel":361},"https:\u002F\u002Fbun.sh",[362],"nofollow","Bun",[355,365,366],{},"Package manager and JS runtime for every package and script",[341,368,369,372],{},[355,370,371],{},"TypeScript",[355,373,374],{},"Every package, strict mode",[330,376,378],{"id":377},"frontend","Frontend",[335,380,381,389],{},[338,382,383],{},[341,384,385,387],{},[344,386],{},[344,388,348],{},[350,390,391,413,421,434,455,467,478,488,498,508,518,527,540],{},[341,392,393,400],{},[355,394,395],{},[358,396,399],{"href":397,"rel":398},"https:\u002F\u002Fnuxt.com",[362],"Nuxt 4",[355,401,402,403,406,407,406,410],{},"App framework — ",[321,404,405],{},"apps\u002Fapp",", ",[321,408,409],{},"apps\u002Fweb",[321,411,412],{},"apps\u002Flogin",[341,414,415,418],{},[355,416,417],{},"Vue 3",[355,419,420],{},"Component layer under Nuxt",[341,422,423,431],{},[355,424,425,430],{},[358,426,429],{"href":427,"rel":428},"https:\u002F\u002Fui.nuxt.com",[362],"Nuxt UI"," v4",[355,432,433],{},"Component library (built on Reka UI + Tailwind)",[341,435,436,439],{},[355,437,438],{},"Tailwind CSS",[355,440,441,442,406,445,406,448,406,451,454],{},"Styling, plus the ",[321,443,444],{},"forms",[321,446,447],{},"typography",[321,449,450],{},"aspect-ratio",[321,452,453],{},"container-queries"," plugins",[341,456,457,464],{},[355,458,459,460,463],{},"Pinia (",[321,461,462],{},"@pinia\u002Fnuxt",")",[355,465,466],{},"Client state — notifications store, teams store",[341,468,469,475],{},[355,470,471,472,463],{},"VueUse (",[321,473,474],{},"@vueuse\u002Fnuxt",[355,476,477],{},"Composable utilities",[341,479,480,485],{},[355,481,482],{},[321,483,484],{},"@nuxt\u002Fimage",[355,486,487],{},"Image optimization",[341,489,490,495],{},[355,491,492],{},[321,493,494],{},"@nuxt\u002Ffonts",[355,496,497],{},"Web font loading",[341,499,500,505],{},[355,501,502],{},[321,503,504],{},"@nuxt\u002Fscripts",[355,506,507],{},"Third-party script loading",[341,509,510,515],{},[355,511,512],{},[321,513,514],{},"nuxt-svgo",[355,516,517],{},"SVG-to-component icons",[341,519,520,525],{},[355,521,522],{},[321,523,524],{},"@nuxtjs\u002Fi18n",[355,526,126],{},[341,528,529,534],{},[355,530,531],{},[321,532,533],{},"@nuxtjs\u002Fseo",[355,535,536,537,539],{},"SEO\u002Fmeta tags, sitemap, OG images (",[321,538,409],{}," only)",[341,541,542,551],{},[355,543,544,547,548],{},[321,545,546],{},"@unovis\u002Fts"," \u002F ",[321,549,550],{},"@unovis\u002Fvue",[355,552,553,554,539],{},"The team dashboard's chart (",[321,555,405],{},[330,557,559],{"id":558},"api-layer","API layer",[335,561,562,570],{},[338,563,564],{},[341,565,566,568],{},[344,567],{},[344,569,348],{},[350,571,572,597],{},[341,573,574,591],{},[355,575,576,581,582,406,585,406,588,463],{},[358,577,580],{"href":578,"rel":579},"https:\u002F\u002Ftrpc.io",[362],"tRPC"," (",[321,583,584],{},"@trpc\u002Fserver",[321,586,587],{},"@trpc\u002Fclient",[321,589,590],{},"trpc-nuxt",[355,592,593,594,596],{},"Type-safe API between ",[321,595,405],{},"'s client and server",[341,598,599,606],{},[355,600,601],{},[358,602,605],{"href":603,"rel":604},"https:\u002F\u002Fzod.dev",[362],"Zod",[355,607,608],{},"Input validation for every tRPC procedure",[330,610,98],{"id":611},"database",[335,613,614,622],{},[338,615,616],{},[341,617,618,620],{},[344,619],{},[344,621,348],{},[350,623,624,632,645],{},[341,625,626,629],{},[355,627,628],{},"PostgreSQL",[355,630,631],{},"Primary database — any standard instance (Supabase, RDS, Neon, self-hosted)",[341,633,634,642],{},[355,635,636,641],{},[358,637,640],{"href":638,"rel":639},"https:\u002F\u002Form.drizzle.team",[362],"Drizzle ORM"," + Drizzle Kit",[355,643,644],{},"Schema, queries, migrations",[341,646,647,653],{},[355,648,649,652],{},[321,650,651],{},"postgres"," (postgres.js)",[355,654,655],{},"The actual wire-protocol driver, via Hyperdrive",[330,657,659],{"id":658},"auth-authorization","Auth & authorization",[335,661,662,670],{},[338,663,664],{},[341,665,666,668],{},[344,667],{},[344,669,348],{},[350,671,672,688,700,710],{},[341,673,674,681],{},[355,675,676],{},[358,677,680],{"href":678,"rel":679},"https:\u002F\u002Fgithub.com\u002Fopenauthjs\u002Fopenauth",[362],"OpenAuth.js",[355,682,683,684,687],{},"The independent auth server (",[321,685,686],{},"apps\u002Ffunctions\u002Fsrc\u002Fauth.ts",") — password, code, GitHub, Google providers",[341,689,690,697],{},[355,691,692],{},[358,693,696],{"href":694,"rel":695},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fnuxt-authorization",[362],"nuxt-authorization",[355,698,699],{},"Team-scoped RBAC (Bouncer-style abilities)",[341,701,702,707],{},[355,703,704],{},[321,705,706],{},"otpauth",[355,708,709],{},"TOTP generation\u002Fverification for platform-admin MFA",[341,711,712,717],{},[355,713,714],{},[321,715,716],{},"uqr",[355,718,719],{},"Client-side QR code rendering for MFA enrollment (zero runtime deps)",[330,721,723],{"id":722},"infrastructure-cloudflare-via-sst","Infrastructure — Cloudflare, via SST",[317,725,726,727,581,732,735,736,739,740,743,744,747,748,750],{},"Deployed entirely as code with ",[358,728,731],{"href":729,"rel":730},"https:\u002F\u002Fsst.dev",[362],"SST",[321,733,734],{},"sst"," 4.14.0) and its Pulumi providers (",[321,737,738],{},"cloudflare"," 6.20.0, ",[321,741,742],{},"command"," 1.0.1, ",[321,745,746],{},"random"," 4.17.0) — see ",[358,749,140],{"href":141},".",[335,752,753,763],{},[338,754,755],{},[341,756,757,760],{},[344,758,759],{},"Cloudflare service",[344,761,762],{},"Used for",[350,764,765,773,781,793,804,819,827,835,843],{},[341,766,767,770],{},[355,768,769],{},"Workers",[355,771,772],{},"Every deployed app (App, Auth, Web, Emails, Websockets, job\u002FDLQ consumers, Cron)",[341,774,775,778],{},[355,776,777],{},"Hyperdrive",[355,779,780],{},"Postgres connection pooling from Workers",[341,782,783,786],{},[355,784,785],{},"KV",[355,787,788,789,792],{},"Auth credentials (",[321,790,791],{},"AuthKV","), rate-limit counters, small cached values",[341,794,795,801],{},[355,796,797,798,463],{},"R2 (via ",[321,799,800],{},"@nuxt-hub\u002Fcore",[355,802,803],{},"Blob storage — profile pictures, team logos",[341,805,806,809],{},[355,807,808],{},"D1",[355,810,811,812,814,815,818],{},"The docs site's content database (",[321,813,409],{},"'s search box) — ",[321,816,817],{},"@nuxt\u002Fcontent"," requires it on Cloudflare",[341,820,821,824],{},[355,822,823],{},"Queues",[355,825,826],{},"Async job processing, plus a dead-letter queue",[341,828,829,832],{},[355,830,831],{},"Durable Objects",[355,833,834],{},"The WebSockets server",[341,836,837,840],{},[355,838,839],{},"Cron Triggers",[355,841,842],{},"Scheduled tasks",[341,844,845,848],{},[355,846,847],{},"Custom Domains",[355,849,850],{},"Every Worker's public domain, DNS handled automatically",[330,852,854],{"id":853},"payments","Payments",[335,856,857,865],{},[338,858,859],{},[341,860,861,863],{},[344,862],{},[344,864,348],{},[350,866,867,883],{},[341,868,869,880],{},[355,870,871,581,876,879],{},[358,872,875],{"href":873,"rel":874},"https:\u002F\u002Fstripe.com",[362],"Stripe",[321,877,878],{},"stripe"," SDK)",[355,881,882],{},"Checkout, billing portal, webhooks",[341,884,885,898],{},[355,886,887,581,892,406,895,463],{},[358,888,891],{"href":889,"rel":890},"https:\u002F\u002Fpaddle.com",[362],"Paddle",[321,893,894],{},"@paddle\u002Fpaddle-js",[321,896,897],{},"@paddle\u002Fpaddle-node-sdk",[355,899,900],{},"Same, alternate provider — both can run in parallel",[330,902,904],{"id":903},"email","Email",[335,906,907,915],{},[338,908,909],{},[341,910,911,913],{},[344,912],{},[344,914,348],{},[350,916,917,935,948],{},[341,918,919,929],{},[355,920,921,581,926,463],{},[358,922,925],{"href":923,"rel":924},"https:\u002F\u002Freact.email",[362],"React Email",[321,927,928],{},"@react-email\u002Fcomponents",[355,930,931,932,463],{},"Templates (",[321,933,934],{},"packages\u002Femails\u002Ftemplates",[341,936,937,942],{},[355,938,939],{},[321,940,941],{},"@nuxfire\u002Femails\u002Fmailer",[355,943,944,945,463],{},"Provider-agnostic sender — a vendored fork of AdonisJS Mail, adapted to run without the AdonisJS framework (",[321,946,947],{},"packages\u002Femails\u002Fmailer",[341,949,950,953],{},[355,951,952],{},"Resend, Mailgun, AWS SES, SparkPost, SMTP",[355,954,955,956,959],{},"Supported providers, one active at a time per ",[321,957,958],{},"config.ts"," flags",[330,961,963],{"id":962},"documentation-content-site","Documentation & content site",[335,965,966,974],{},[338,967,968],{},[341,969,970,972],{},[344,971],{},[344,973,348],{},[350,975,976,989],{},[341,977,978,986],{},[355,979,980,985],{},[358,981,984],{"href":982,"rel":983},"https:\u002F\u002Fcontent.nuxt.com",[362],"Nuxt Content"," v3",[355,987,988],{},"This documentation, the blog, FAQs, and legal pages — all Markdown",[341,990,991,998],{},[355,992,993],{},[358,994,997],{"href":995,"rel":996},"https:\u002F\u002Fshiki.style",[362],"Shiki",[355,999,1000],{},"Syntax highlighting for code blocks",[330,1002,1004],{"id":1003},"backend-workers-runtime","Backend Workers runtime",[335,1006,1007,1015],{},[338,1008,1009],{},[341,1010,1011,1013],{},[344,1012],{},[344,1014,348],{},[350,1016,1017,1033,1043],{},[341,1018,1019,1026],{},[355,1020,1021],{},[358,1022,1025],{"href":1023,"rel":1024},"https:\u002F\u002Fhono.dev",[362],"Hono",[355,1027,1028,1029,1032],{},"HTTP routing inside ",[321,1030,1031],{},"apps\u002Ffunctions"," (the auth issuer)",[341,1034,1035,1040],{},[355,1036,1037],{},[321,1038,1039],{},"ofetch",[355,1041,1042],{},"HTTP client used server-side",[341,1044,1045,1050],{},[355,1046,1047],{},[321,1048,1049],{},"valibot",[355,1051,1052,1053,1055],{},"Validation inside ",[321,1054,1031],{}," (lighter than Zod for Worker bundle size)",[330,1057,1059],{"id":1058},"dev-tooling","Dev tooling",[335,1061,1062,1070],{},[338,1063,1064],{},[341,1065,1066,1068],{},[344,1067],{},[344,1069,348],{},[350,1071,1072,1080,1090,1100],{},[341,1073,1074,1077],{},[355,1075,1076],{},"ESLint + Prettier",[355,1078,1079],{},"Linting and formatting, every package",[341,1081,1082,1087],{},[355,1083,1084],{},[321,1085,1086],{},"vue-tsc",[355,1088,1089],{},"Type-checking Vue SFCs",[341,1091,1092,1097],{},[355,1093,1094],{},[321,1095,1096],{},"@cloudflare\u002Fworkers-types",[355,1098,1099],{},"TypeScript types for Workers runtime APIs",[341,1101,1102,1105],{},[355,1103,1104],{},"Drizzle Kit",[355,1106,1107],{},"Migration generation",{"title":1109,"searchDepth":1110,"depth":1110,"links":1111},"",2,[1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122],{"id":332,"depth":1110,"text":333},{"id":377,"depth":1110,"text":378},{"id":558,"depth":1110,"text":559},{"id":611,"depth":1110,"text":98},{"id":658,"depth":1110,"text":659},{"id":722,"depth":1110,"text":723},{"id":853,"depth":1110,"text":854},{"id":903,"depth":1110,"text":904},{"id":962,"depth":1110,"text":963},{"id":1003,"depth":1110,"text":1004},{"id":1058,"depth":1110,"text":1059},"Every language, framework, library, and Cloudflare service the SaaS Starter Kit actually depends on.","md",{},{"title":136},{"title":136,"description":1123},"vwyBwldiDTpxJKXYBmwMSlkwrYXe_ramwSXiLp0rfBw",1790707485288]