[{"data":1,"prerenderedAt":1011},["ShallowReactive",2],{"navigation:en":3,"\u002Fblog\u002Fcomo-construir-saas-escalavel-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\u002Fcomo-construir-saas-escalavel-nuxt-4-cloudflare.md","Como Construir um SaaS Escalável com Nuxt 4 e Cloudflare Workers: O Guia Definitivo","Equipe Nuxfire",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",{},"Lançar um produto SaaS em 2026 exige muito mais do que apenas criar uma interface bonita. Usuários esperam respostas instantâneas em qualquer lugar do mundo, investidores exigem custos operacionais previsíveis e desenvolvedores não querem perder fins de semana gerenciando pods do Kubernetes ou pagando contas astronômicas de servidores dedicados ociosos.",[320,324,325,326,330,331,334,335,338,339,342],{},"Neste guia completo, exploramos a arquitetura do ",[327,328,329],"strong",{},"Nuxfire",": uma base de código pronta para produção baseada em ",[327,332,333],{},"Nuxt 4",", ",[327,336,337],{},"SST v4"," e ",[327,340,341],{},"Cloudflare Workers",".",[344,345],"hr",{},[347,348,350],"h2",{"id":349},"por-que-a-arquitetura-tradicional-de-saas-ficou-obsoleta","Por que a Arquitetura Tradicional de SaaS Ficou Obsoleta?",[320,352,353],{},"Durante anos, o padrão da indústria para novas startups foi alugar instâncias virtuais (AWS EC2, DigitalOcean) ou usar provedores PaaS com precificação agressiva por assento e consumo.",[320,355,356],{},"Os problemas desse modelo tradicional aparecem rapidamente:",[358,359,360,367,378],"ol",{},[361,362,363,366],"li",{},[327,364,365],{},"Cold Starts Críticos",": Lambdas tradicionais demoram de 800ms a 2s para aquecer conexões com bancos e módulos pesados.",[361,368,369,372,373,377],{},[327,370,371],{},"Latência Regional",": Usuários na América Latina ou Europa sofrem com rotas que precisam bater em servidores nos Estados Unidos (",[374,375,376],"code",{},"us-east-1",").",[361,379,380,383],{},[327,381,382],{},"Escalonamento Complexo",": Configurar autoscaling de containers requer monitoramento de métricas, limites de memória e custos que escalam muito antes da sua receita.",[385,386,388],"h3",{"id":387},"a-alternativa-edge-computing-global","A Alternativa: Edge Computing Global",[320,390,391,392,394],{},"Com os ",[327,393,341],{},", seu código JavaScript\u002FTypeScript roda diretamente na rede V8 distribuída em mais de 300 cidades ao redor do globo:",[396,397,398,404,409],"ul",{},[361,399,400,403],{},[327,401,402],{},"Tempo de inicialização de 0ms"," (zero cold starts).",[361,405,406,342],{},[327,407,408],{},"Execução a milissegundos do usuário final",[361,410,411,414],{},[327,412,413],{},"Custo operacional até 80% menor"," que servidores dedicados.",[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 Exemplo de endpoint serverless de alta performance no Nuxt 4\nexport default defineEventHandler(async (event) => {\n  const { user } = await requireUserSession(event);\n  \n  \u002F\u002F Executado na borda mais próxima do usuário com conexão em pool via 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 Exemplo de endpoint serverless de alta performance no 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 Executado na borda mais próxima do usuário com conexão em pool via 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},"o-monorepo-bun-estrutura-profissional-de-um-saas-enterprise","O Monorepo Bun: Estrutura Profissional de um SaaS Enterprise",[320,679,680,681,683,684,567],{},"Muitos boilerplates empacotam código como um bloco monolítico e desordenado. No ",[327,682,329],{},", adotamos um monorepo orquestrado com ",[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",": O dashboard principal do SaaS, com layouts de equipe, tRPC ponta a ponta e configurações de conta.",[361,698,699,704],{},[327,700,701],{},[374,702,703],{},"apps\u002Fweb",": O portal público de marketing com documentação completa, landing page de alta conversão e blog.",[361,706,707,712],{},[327,708,709],{},[374,710,711],{},"apps\u002Flogin",": Interface estática e ultra-segura para OpenAuth.js, suportando magic links e logins sociais (Google, GitHub).",[361,714,715,720],{},[327,716,717],{},[374,718,719],{},"apps\u002Ffunctions",": Workers auxiliares da Cloudflare para filas assíncronas, CRON periódico de faturamento e WebSockets.",[361,722,723,728],{},[327,724,725],{},[374,726,727],{},"layers\u002F*",": Módulos desacoplados de domínio (Admin, Billing, Teams, Notifications).",[361,730,731,736,737,342],{},[327,732,733],{},[374,734,735],{},"infra\u002F*.ts",": Toda a infraestrutura declarada como código TypeScript usando ",[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","# Inicialização ultra-rápida no 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},"# Inicialização ultra-rápida no 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},"conectando-postgresql-à-edge-com-cloudflare-hyperdrive","Conectando PostgreSQL à Edge com Cloudflare Hyperdrive",[320,777,778,779,782],{},"O maior mito sobre bancos de dados relacionais e Workers era que conexões diretas esgotavam o pool do PostgreSQL. Com o ",[327,780,781],{},"Cloudflare Hyperdrive",", suas instâncias Postgres conectam-se à borda com:",[396,784,785,788,791],{},[361,786,787],{},"Pooling inteligente de conexões TCP reutilizadas.",[361,789,790],{},"Cache de consultas de leitura próximo ao usuário.",[361,792,793,794,342],{},"Compatibilidade total com queries tipadas usando ",[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},"comece-com-o-nuxfire-economize-meses-de-desenvolvimento","Comece com o Nuxfire: Economize Meses de Desenvolvimento",[320,945,946,947,949],{},"Em vez de gastar de 3 a 6 meses configurando autenticação, WebSockets, filas de background, faturamento Stripe e permissões multi-tenant do zero, o ",[327,948,329],{}," entrega todo esse código pronto, testado e com tipagem estrita de ponta a ponta.",[396,951,952,958,964],{},[361,953,954,957],{},[327,955,956],{},"Acesso Completo ao Código-Fonte",": Sem pacotes privados fechados ou mensalidades por desenvolvedor.",[361,959,960,963],{},[327,961,962],{},"Entrega Imediata",": Tenha acesso imediato ao repositório e ao Grupo VIP oficial logo após a confirmação.",[361,965,966,969],{},[327,967,968],{},"Licença Perpétua",": Crie projetos comerciais ilimitados.",[320,971,972],{},[973,974,976],"a",{"href":975},"\u002Fpt-br#pricing",[327,977,978],{},"Garantir Acesso Imediato ao Código-Fonte no Preço Promocional →",[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},"Arquitetura Edge","2026-09-15","Aprenda a estruturar um SaaS moderno em 2026 com Nuxt 4, SST v4 e Cloudflare Workers. Cold starts zero, latência global sub-50ms e economia massiva de infraestrutura.","md","\u002Fimages\u002Fblog\u002Fnuxt4-cloudflare-saas.svg","pt-br",{},"\u002Fimages\u002Fblog\u002Fnuxt4-cloudflare-saas.png","\u002Fblog\u002Fcomo-construir-saas-escalavel-nuxt-4-cloudflare","7 min",{"title":313,"description":993},"blog\u002Fcomo-construir-saas-escalavel-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","_J1faUFvy4qSb8nP80-QweYUK3Oy0-5U4MYznCU_qrQ",1790707502045]