[{"data":1,"prerenderedAt":1011},["ShallowReactive",2],{"navigation:en":3,"\u002Fblog\u002Fbuild-scalable-saas-nuxt-4-cloudflare":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":313,"author":314,"authorType":315,"body":316,"category":991,"date":992,"description":993,"extension":994,"image":995,"lang":996,"meta":997,"navigation":22,"ogImage":998,"path":999,"readTime":1000,"seo":1001,"stem":1002,"tags":1003,"translations":1006,"updated":315,"__hash__":1010},"blog\u002Fblog\u002Fbuild-scalable-saas-nuxt-4-cloudflare.md","How to Build a Scalable SaaS with Nuxt 4 and Cloudflare Workers: The Definitive Guide","Nuxfire Team",null,{"type":317,"value":318,"toc":983},"minimark",[319,323,343,346,351,354,357,384,389,395,415,672,674,678,687,739,770,772,776,783,797,938,940,944,950,970,979],[320,321,322],"p",{},"Launching a SaaS product in 2026 takes much more than a good-looking interface. Users expect instant responses anywhere in the world, investors demand predictable operating costs, and developers do not want to lose weekends managing Kubernetes pods or paying astronomical bills for idle dedicated servers.",[320,324,325,326,330,331,334,335,338,339,342],{},"In this complete guide, we explore the architecture of ",[327,328,329],"strong",{},"Nuxfire",": a production-ready codebase built on ",[327,332,333],{},"Nuxt 4",", ",[327,336,337],{},"SST v4"," and ",[327,340,341],{},"Cloudflare Workers",".",[344,345],"hr",{},[347,348,350],"h2",{"id":349},"why-has-traditional-saas-architecture-become-obsolete","Why Has Traditional SaaS Architecture Become Obsolete?",[320,352,353],{},"For years, the industry standard for new startups was to rent virtual instances (AWS EC2, DigitalOcean) or use PaaS providers with aggressive per-seat and usage-based pricing.",[320,355,356],{},"The problems of this traditional model show up quickly:",[358,359,360,367,378],"ol",{},[361,362,363,366],"li",{},[327,364,365],{},"Critical Cold Starts",": Traditional Lambdas take 800ms to 2s to warm up connections to databases and heavy modules.",[361,368,369,372,373,377],{},[327,370,371],{},"Regional Latency",": Users in Latin America or Europe suffer from routes that have to hit servers in the United States (",[374,375,376],"code",{},"us-east-1",").",[361,379,380,383],{},[327,381,382],{},"Complex Scaling",": Configuring container autoscaling requires monitoring metrics, memory limits and costs that grow long before your revenue does.",[385,386,388],"h3",{"id":387},"the-alternative-global-edge-computing","The Alternative: Global Edge Computing",[320,390,391,392,394],{},"With ",[327,393,341],{},", your JavaScript\u002FTypeScript code runs directly on the V8 network distributed across more than 300 cities around the globe:",[396,397,398,404,409],"ul",{},[361,399,400,403],{},[327,401,402],{},"0ms startup time"," (zero cold starts).",[361,405,406,342],{},[327,407,408],{},"Execution milliseconds away from the end user",[361,410,411,414],{},[327,412,413],{},"Up to 80% lower operating cost"," than dedicated servers.",[416,417,422],"pre",{"className":418,"code":419,"language":420,"meta":421,"style":421},"language-typescript shiki shiki-themes material-theme-lighter github-light github-dark monokai","\u002F\u002F Example of a high-performance serverless endpoint in Nuxt 4\nexport default defineEventHandler(async (event) => {\n  const { user } = await requireUserSession(event);\n  \n  \u002F\u002F Runs at the edge closest to the user, with a pooled connection through Hyperdrive\n  const team = await useDatabase().query.teams.findFirst({\n    where: eq(teams.ownerId, user.id)\n  });\n\n  return { team, edgeRegion: event.context.cloudflare?.region ?? \"edge\" };\n});\n","typescript","",[374,423,424,433,473,509,515,521,559,593,603,609,662],{"__ignoreMap":421},[425,426,429],"span",{"class":427,"line":428},"line",1,[425,430,432],{"class":431},"ss7Ak","\u002F\u002F Example of a high-performance serverless endpoint in Nuxt 4\n",[425,434,436,440,443,447,451,455,459,463,466,470],{"class":427,"line":435},2,[425,437,439],{"class":438},"sRxSC","export",[425,441,442],{"class":438}," default",[425,444,446],{"class":445},"sD0ED"," defineEventHandler",[425,448,450],{"class":449},"ss--_","(",[425,452,454],{"class":453},"sTNss","async",[425,456,458],{"class":457},"swvn1"," (",[425,460,462],{"class":461},"sQgqH","event",[425,464,465],{"class":457},")",[425,467,469],{"class":468},"srJo8"," =>",[425,471,472],{"class":457}," {\n",[425,474,476,479,482,486,489,493,496,499,502,504,506],{"class":427,"line":475},3,[425,477,478],{"class":468},"  const",[425,480,481],{"class":457}," {",[425,483,485],{"class":484},"s91G_"," user",[425,487,488],{"class":457}," }",[425,490,492],{"class":491},"sGXK2"," =",[425,494,495],{"class":438}," await",[425,497,498],{"class":445}," requireUserSession",[425,500,450],{"class":501},"squCx",[425,503,462],{"class":449},[425,505,465],{"class":501},[425,507,508],{"class":457},";\n",[425,510,512],{"class":427,"line":511},4,[425,513,514],{"class":501},"  \n",[425,516,518],{"class":427,"line":517},5,[425,519,520],{"class":431},"  \u002F\u002F Runs at the edge closest to the user, with a pooled connection through Hyperdrive\n",[425,522,524,526,529,531,533,536,539,541,544,546,549,551,554,556],{"class":427,"line":523},6,[425,525,478],{"class":468},[425,527,528],{"class":484}," team",[425,530,492],{"class":491},[425,532,495],{"class":438},[425,534,535],{"class":445}," useDatabase",[425,537,538],{"class":501},"()",[425,540,342],{"class":457},[425,542,543],{"class":449},"query",[425,545,342],{"class":457},[425,547,548],{"class":449},"teams",[425,550,342],{"class":457},[425,552,553],{"class":445},"findFirst",[425,555,450],{"class":501},[425,557,558],{"class":457},"{\n",[425,560,562,565,568,571,573,575,577,580,583,585,587,590],{"class":427,"line":561},7,[425,563,564],{"class":501},"    where",[425,566,567],{"class":457},":",[425,569,570],{"class":445}," eq",[425,572,450],{"class":501},[425,574,548],{"class":449},[425,576,342],{"class":457},[425,578,579],{"class":449},"ownerId",[425,581,582],{"class":457},",",[425,584,485],{"class":449},[425,586,342],{"class":457},[425,588,589],{"class":449},"id",[425,591,592],{"class":501},")\n",[425,594,596,599,601],{"class":427,"line":595},8,[425,597,598],{"class":457},"  }",[425,600,465],{"class":501},[425,602,508],{"class":457},[425,604,606],{"class":427,"line":605},9,[425,607,608],{"emptyLinePlaceholder":22},"\n",[425,610,612,615,617,619,621,624,626,629,631,634,636,639,642,645,648,652,656,659],{"class":427,"line":611},10,[425,613,614],{"class":438},"  return",[425,616,481],{"class":457},[425,618,528],{"class":449},[425,620,582],{"class":457},[425,622,623],{"class":501}," edgeRegion",[425,625,567],{"class":457},[425,627,628],{"class":449}," event",[425,630,342],{"class":457},[425,632,633],{"class":449},"context",[425,635,342],{"class":457},[425,637,638],{"class":449},"cloudflare",[425,640,641],{"class":457},"?.",[425,643,644],{"class":449},"region",[425,646,647],{"class":491}," ??",[425,649,651],{"class":650},"siCPE"," \"",[425,653,655],{"class":654},"sLACW","edge",[425,657,658],{"class":650},"\"",[425,660,661],{"class":457}," };\n",[425,663,665,668,670],{"class":427,"line":664},11,[425,666,667],{"class":457},"}",[425,669,465],{"class":449},[425,671,508],{"class":457},[344,673],{},[347,675,677],{"id":676},"the-bun-monorepo-the-professional-structure-of-an-enterprise-saas","The Bun Monorepo: The Professional Structure of an Enterprise SaaS",[320,679,680,681,683,684,567],{},"Many boilerplates package code as one messy monolithic block. In ",[327,682,329],{},", we adopted a monorepo orchestrated with ",[327,685,686],{},"Bun Workspaces",[396,688,689,697,705,713,721,729],{},[361,690,691,696],{},[327,692,693],{},[374,694,695],{},"apps\u002Fapp",": The main SaaS dashboard, with team layouts, end-to-end tRPC and account settings.",[361,698,699,704],{},[327,700,701],{},[374,702,703],{},"apps\u002Fweb",": The public marketing portal with complete documentation, a high-conversion landing page and a blog.",[361,706,707,712],{},[327,708,709],{},[374,710,711],{},"apps\u002Flogin",": A static, ultra-secure interface for OpenAuth.js, supporting magic links and social logins (Google, GitHub).",[361,714,715,720],{},[327,716,717],{},[374,718,719],{},"apps\u002Ffunctions",": Auxiliary Cloudflare Workers for async queues, periodic billing CRON and WebSockets.",[361,722,723,728],{},[327,724,725],{},[374,726,727],{},"layers\u002F*",": Decoupled domain modules (Admin, Billing, Teams, Notifications).",[361,730,731,736,737,342],{},[327,732,733],{},[374,734,735],{},"infra\u002F*.ts",": All infrastructure declared as TypeScript code using ",[327,738,337],{},[416,740,744],{"className":741,"code":742,"language":743,"meta":421,"style":421},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark monokai","# Ultra-fast start in the Bun monorepo\nbun install\nbun run dev\n","bash",[374,745,746,751,760],{"__ignoreMap":421},[425,747,748],{"class":427,"line":428},[425,749,750],{"class":431},"# Ultra-fast start in the Bun monorepo\n",[425,752,753,757],{"class":427,"line":435},[425,754,756],{"class":755},"sR7ES","bun",[425,758,759],{"class":654}," install\n",[425,761,762,764,767],{"class":427,"line":475},[425,763,756],{"class":755},[425,765,766],{"class":654}," run",[425,768,769],{"class":654}," dev\n",[344,771],{},[347,773,775],{"id":774},"connecting-postgresql-to-the-edge-with-cloudflare-hyperdrive","Connecting PostgreSQL to the Edge with Cloudflare Hyperdrive",[320,777,778,779,782],{},"The biggest myth about relational databases and Workers was that direct connections would exhaust the PostgreSQL pool. With ",[327,780,781],{},"Cloudflare Hyperdrive",", your Postgres instances connect to the edge with:",[396,784,785,788,791],{},[361,786,787],{},"Smart pooling of reused TCP connections.",[361,789,790],{},"Read-query caching close to the user.",[361,792,793,794,342],{},"Full compatibility with typed queries using ",[327,795,796],{},"Drizzle ORM",[416,798,800],{"className":418,"code":799,"language":420,"meta":421,"style":421},"import { drizzle } from \"drizzle-orm\u002Fpostgres-js\";\nimport postgres from \"postgres\";\n\nexport function createDatabaseClient(connectionString: string) {\n  const sql = postgres(connectionString, { max: 1 });\n  return drizzle(sql, { schema });\n}\n",[374,801,802,826,845,849,874,909,933],{"__ignoreMap":421},[425,803,804,807,809,812,814,817,819,822,824],{"class":427,"line":428},[425,805,806],{"class":438},"import",[425,808,481],{"class":457},[425,810,811],{"class":449}," drizzle",[425,813,488],{"class":457},[425,815,816],{"class":438}," from",[425,818,651],{"class":650},[425,820,821],{"class":654},"drizzle-orm\u002Fpostgres-js",[425,823,658],{"class":650},[425,825,508],{"class":457},[425,827,828,830,833,836,838,841,843],{"class":427,"line":435},[425,829,806],{"class":438},[425,831,832],{"class":449}," postgres ",[425,834,835],{"class":438},"from",[425,837,651],{"class":650},[425,839,840],{"class":654},"postgres",[425,842,658],{"class":650},[425,844,508],{"class":457},[425,846,847],{"class":427,"line":475},[425,848,608],{"emptyLinePlaceholder":22},[425,850,851,853,856,859,861,864,866,870,872],{"class":427,"line":511},[425,852,439],{"class":438},[425,854,855],{"class":468}," function",[425,857,858],{"class":445}," createDatabaseClient",[425,860,450],{"class":457},[425,862,863],{"class":461},"connectionString",[425,865,567],{"class":491},[425,867,869],{"class":868},"s_MOj"," string",[425,871,465],{"class":457},[425,873,472],{"class":457},[425,875,876,878,881,883,886,888,890,892,894,897,899,903,905,907],{"class":427,"line":517},[425,877,478],{"class":468},[425,879,880],{"class":484}," sql",[425,882,492],{"class":491},[425,884,885],{"class":445}," postgres",[425,887,450],{"class":501},[425,889,863],{"class":449},[425,891,582],{"class":457},[425,893,481],{"class":457},[425,895,896],{"class":501}," max",[425,898,567],{"class":457},[425,900,902],{"class":901},"sYThS"," 1",[425,904,488],{"class":457},[425,906,465],{"class":501},[425,908,508],{"class":457},[425,910,911,913,915,917,920,922,924,927,929,931],{"class":427,"line":523},[425,912,614],{"class":438},[425,914,811],{"class":445},[425,916,450],{"class":501},[425,918,919],{"class":449},"sql",[425,921,582],{"class":457},[425,923,481],{"class":457},[425,925,926],{"class":449}," schema",[425,928,488],{"class":457},[425,930,465],{"class":501},[425,932,508],{"class":457},[425,934,935],{"class":427,"line":561},[425,936,937],{"class":457},"}\n",[344,939],{},[347,941,943],{"id":942},"start-with-nuxfire-save-months-of-development","Start with Nuxfire: Save Months of Development",[320,945,946,947,949],{},"Instead of spending 3 to 6 months setting up authentication, WebSockets, background queues, Stripe billing and multi-tenant permissions from scratch, ",[327,948,329],{}," delivers all of that code ready, tested and strictly typed end to end.",[396,951,952,958,964],{},[361,953,954,957],{},[327,955,956],{},"Full Source Code Access",": No closed private packages or per-developer fees.",[361,959,960,963],{},[327,961,962],{},"Immediate Delivery",": Get immediate access to the repository and the official VIP Group right after confirmation.",[361,965,966,969],{},[327,967,968],{},"Perpetual License",": Create unlimited commercial projects.",[320,971,972],{},[973,974,976],"a",{"href":975},"\u002F#pricing",[327,977,978],{},"Get Immediate Access to the Source Code at the Promotional Price →",[980,981,982],"style",{},"html pre.shiki code .ss7Ak, html code.shiki .ss7Ak{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit;--shiki-sepia:#88846F;--shiki-sepia-font-style:inherit}html pre.shiki code .sRxSC, html code.shiki .sRxSC{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#F92672;--shiki-sepia-font-style:inherit}html pre.shiki code .sD0ED, html code.shiki .sD0ED{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .ss--_, html code.shiki .ss--_{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sTNss, html code.shiki .sTNss{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .swvn1, html code.shiki .swvn1{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sQgqH, html code.shiki .sQgqH{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit;--shiki-sepia:#FD971F;--shiki-sepia-font-style:italic}html pre.shiki code .srJo8, html code.shiki .srJo8{--shiki-light:#9C3EDA;--shiki-light-font-style:inherit;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .s91G_, html code.shiki .s91G_{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#F8F8F2}html pre.shiki code .sGXK2, html code.shiki .sGXK2{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .squCx, html code.shiki .squCx{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .siCPE, html code.shiki .siCPE{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sLACW, html code.shiki .sLACW{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}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 .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .sR7ES, html code.shiki .sR7ES{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .s_MOj, html code.shiki .s_MOj{--shiki-light:#E2931D;--shiki-light-font-style:inherit;--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sYThS, html code.shiki .sYThS{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}",{"title":421,"searchDepth":435,"depth":435,"links":984},[985,988,989,990],{"id":349,"depth":435,"text":350,"children":986},[987],{"id":387,"depth":475,"text":388},{"id":676,"depth":435,"text":677},{"id":774,"depth":435,"text":775},{"id":942,"depth":435,"text":943},"Edge Architecture","2026-09-15","Learn how to structure a modern SaaS in 2026 with Nuxt 4, SST v4 and Cloudflare Workers. Zero cold starts, sub-50ms global latency and massive infrastructure savings.","md","\u002Fimages\u002Fblog\u002Fnuxt4-cloudflare-saas-en.svg","en",{},"\u002Fimages\u002Fblog\u002Fnuxt4-cloudflare-saas-en.png","\u002Fblog\u002Fbuild-scalable-saas-nuxt-4-cloudflare","7 min",{"title":313,"description":993},"blog\u002Fbuild-scalable-saas-nuxt-4-cloudflare",[333,341,1004,1005,337],"SaaS","Serverless",{"en":1007,"pt-br":1008,"es":1009},"build-scalable-saas-nuxt-4-cloudflare","como-construir-saas-escalavel-nuxt-4-cloudflare","como-construir-saas-escalable-nuxt-4-cloudflare","QOfsE8PUUi55i1V4KqElzkBhY0IbQiZFnKpRRpvT7Sc",1790707501852]