[{"data":1,"prerenderedAt":886},["ShallowReactive",2],{"navigation:en":3,"\u002Fblog\u002Fmodular-architecture-nuxt-layers-b2b":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":865,"date":866,"description":867,"extension":868,"image":869,"lang":870,"meta":871,"navigation":22,"ogImage":872,"path":873,"readTime":874,"seo":875,"stem":876,"tags":877,"translations":881,"updated":315,"__hash__":885},"blog\u002Fblog\u002Fmodular-architecture-nuxt-layers-b2b.md","Modular Architecture with Nuxt Layers: Organizing B2B Features Without a Spaghetti Monolith","Nuxfire Team",null,{"type":317,"value":318,"toc":857},"minimark",[319,323,339,342,347,350,384,395,405,407,414,421,656,658,665,671,804,811,813,817,841,844,853],[320,321,322],"p",{},"As a SaaS product grows, the complexity of its code tends to explode. Checkout components get mixed with authentication rules, admin screens share directories with regular user screens, and a change to the database model breaks three different screens without warning.",[320,324,325,326,330,331,334,335,338],{},"The ",[327,328,329],"strong",{},"Nuxt 4"," answer to this dilemma is called ",[327,332,333],{},"Nuxt Layers",". In ",[327,336,337],{},"Nuxfire",", we use Layers to build isolated modules that can be turned on or off with a single line of configuration.",[340,341],"hr",{},[343,344,346],"h2",{"id":345},"what-is-a-nuxt-layer","What Is a Nuxt Layer?",[320,348,349],{},"A Layer in Nuxt is a complete, self-contained package that can hold:",[351,352,353,366,372,378],"ul",{},[354,355,356,357,361,362,365],"li",{},"Pages (",[358,359,360],"code",{},"pages\u002F",") and layouts (",[358,363,364],{},"layouts\u002F",").",[354,367,368,369,365],{},"Accessible Vue components (",[358,370,371],{},"components\u002F",[354,373,374,375,365],{},"Server routes and tRPC procedures (",[358,376,377],{},"server\u002F",[354,379,380,381,365],{},"Drizzle ORM schema slices (",[358,382,383],{},"schema.ts",[320,385,386,387,390,391,394],{},"This means the ",[327,388,389],{},"Billing"," feature, for example, lives entirely inside ",[358,392,393],{},"layers\u002Fbilling\u002F",".",[396,397,402],"pre",{"className":398,"code":400,"language":401},[399],"language-text","layers\u002F\n├── admin\u002F          # Platform admin panel, MFA and audit logs\n├── billing\u002F        # Stripe plans, checkout, webhooks and customer portal\n├── teams\u002F          # B2B multi-tenancy, member invitations and granular RBAC\n├── notifications\u002F  # WebSocket hub with Durable Objects and SQLite history\n└── kanban\u002F         # Optional module for interactive boards and cards\n","text",[358,403,400],{"__ignoreMap":404},"",[340,406],{},[343,408,410,411],{"id":409},"the-layer-contract-nuxfiremanifest","The Layer Contract: ",[358,412,413],{},"@nuxfire\u002Fmanifest",[320,415,416,417,420],{},"For each layer to be truly modular without tight coupling, every layer exports a manifest using the shared ",[358,418,419],{},"defineLayerManifest()"," helper:",[396,422,426],{"className":423,"code":424,"language":425,"meta":404,"style":404},"language-typescript shiki shiki-themes material-theme-lighter github-light github-dark monokai","import { defineLayerManifest } from \"@nuxfire\u002Fmanifest\";\n\nexport default defineLayerManifest({\n  name: \"billing\",\n  description: \"Stripe subscription management, webhooks and customer portal\",\n  dependencies: [\"teams\"],\n  routes: [\"\u002Fbilling\", \"\u002Fbilling\u002Fplans\"],\n  navigation: {\n    title: \"Subscription & Billing\",\n    icon: \"i-lucide-credit-card\",\n    path: \"\u002Fbilling\"\n  }\n});\n","typescript",[358,427,428,464,470,488,508,525,548,579,590,607,624,639,645],{"__ignoreMap":404},[429,430,433,437,441,445,448,451,455,458,461],"span",{"class":431,"line":432},"line",1,[429,434,436],{"class":435},"sRxSC","import",[429,438,440],{"class":439},"swvn1"," {",[429,442,444],{"class":443},"ss--_"," defineLayerManifest",[429,446,447],{"class":439}," }",[429,449,450],{"class":435}," from",[429,452,454],{"class":453},"siCPE"," \"",[429,456,413],{"class":457},"sLACW",[429,459,460],{"class":453},"\"",[429,462,463],{"class":439},";\n",[429,465,467],{"class":431,"line":466},2,[429,468,469],{"emptyLinePlaceholder":22},"\n",[429,471,473,476,479,482,485],{"class":431,"line":472},3,[429,474,475],{"class":435},"export",[429,477,478],{"class":435}," default",[429,480,444],{"class":481},"sD0ED",[429,483,484],{"class":443},"(",[429,486,487],{"class":439},"{\n",[429,489,491,495,498,500,503,505],{"class":431,"line":490},4,[429,492,494],{"class":493},"squCx","  name",[429,496,497],{"class":439},":",[429,499,454],{"class":453},[429,501,502],{"class":457},"billing",[429,504,460],{"class":453},[429,506,507],{"class":439},",\n",[429,509,511,514,516,518,521,523],{"class":431,"line":510},5,[429,512,513],{"class":493},"  description",[429,515,497],{"class":439},[429,517,454],{"class":453},[429,519,520],{"class":457},"Stripe subscription management, webhooks and customer portal",[429,522,460],{"class":453},[429,524,507],{"class":439},[429,526,528,531,533,536,538,541,543,546],{"class":431,"line":527},6,[429,529,530],{"class":493},"  dependencies",[429,532,497],{"class":439},[429,534,535],{"class":443}," [",[429,537,460],{"class":453},[429,539,540],{"class":457},"teams",[429,542,460],{"class":453},[429,544,545],{"class":443},"]",[429,547,507],{"class":439},[429,549,551,554,556,558,560,563,565,568,570,573,575,577],{"class":431,"line":550},7,[429,552,553],{"class":493},"  routes",[429,555,497],{"class":439},[429,557,535],{"class":443},[429,559,460],{"class":453},[429,561,562],{"class":457},"\u002Fbilling",[429,564,460],{"class":453},[429,566,567],{"class":439},",",[429,569,454],{"class":453},[429,571,572],{"class":457},"\u002Fbilling\u002Fplans",[429,574,460],{"class":453},[429,576,545],{"class":443},[429,578,507],{"class":439},[429,580,582,585,587],{"class":431,"line":581},8,[429,583,584],{"class":493},"  navigation",[429,586,497],{"class":439},[429,588,589],{"class":439}," {\n",[429,591,593,596,598,600,603,605],{"class":431,"line":592},9,[429,594,595],{"class":493},"    title",[429,597,497],{"class":439},[429,599,454],{"class":453},[429,601,602],{"class":457},"Subscription & Billing",[429,604,460],{"class":453},[429,606,507],{"class":439},[429,608,610,613,615,617,620,622],{"class":431,"line":609},10,[429,611,612],{"class":493},"    icon",[429,614,497],{"class":439},[429,616,454],{"class":453},[429,618,619],{"class":457},"i-lucide-credit-card",[429,621,460],{"class":453},[429,623,507],{"class":439},[429,625,627,630,632,634,636],{"class":431,"line":626},11,[429,628,629],{"class":493},"    path",[429,631,497],{"class":439},[429,633,454],{"class":453},[429,635,562],{"class":457},[429,637,638],{"class":453},"\"\n",[429,640,642],{"class":431,"line":641},12,[429,643,644],{"class":439},"  }\n",[429,646,648,651,654],{"class":431,"line":647},13,[429,649,650],{"class":439},"}",[429,652,653],{"class":443},")",[429,655,463],{"class":439},[340,657],{},[343,659,661,662],{"id":660},"turning-modules-on-and-off-in-configts","Turning Modules On and Off in ",[358,663,664],{},"config.ts",[320,666,667,668,670],{},"Imagine you are building a lean product and you do not need the Kanban module or the complex notification system. In Nuxfire, you control the modules in the root ",[358,669,664],{}," file:",[396,672,674],{"className":423,"code":673,"language":425,"meta":404,"style":404},"export const config = {\n  domain: \"yoursaas.com\",\n  layers: {\n    core: [\"teams\", \"billing\", \"notifications\", \"admin\"],\n    features: {\n      kanban: false, \u002F\u002F Turn it off easily without breaking the build\n    }\n  }\n};\n",[358,675,676,694,710,719,764,773,790,795,799],{"__ignoreMap":404},[429,677,678,680,684,688,692],{"class":431,"line":432},[429,679,475],{"class":435},[429,681,683],{"class":682},"srJo8"," const",[429,685,687],{"class":686},"s91G_"," config",[429,689,691],{"class":690},"sGXK2"," =",[429,693,589],{"class":439},[429,695,696,699,701,703,706,708],{"class":431,"line":466},[429,697,698],{"class":493},"  domain",[429,700,497],{"class":439},[429,702,454],{"class":453},[429,704,705],{"class":457},"yoursaas.com",[429,707,460],{"class":453},[429,709,507],{"class":439},[429,711,712,715,717],{"class":431,"line":472},[429,713,714],{"class":493},"  layers",[429,716,497],{"class":439},[429,718,589],{"class":439},[429,720,721,724,726,728,730,732,734,736,738,740,742,744,746,749,751,753,755,758,760,762],{"class":431,"line":490},[429,722,723],{"class":493},"    core",[429,725,497],{"class":439},[429,727,535],{"class":443},[429,729,460],{"class":453},[429,731,540],{"class":457},[429,733,460],{"class":453},[429,735,567],{"class":439},[429,737,454],{"class":453},[429,739,502],{"class":457},[429,741,460],{"class":453},[429,743,567],{"class":439},[429,745,454],{"class":453},[429,747,748],{"class":457},"notifications",[429,750,460],{"class":453},[429,752,567],{"class":439},[429,754,454],{"class":453},[429,756,757],{"class":457},"admin",[429,759,460],{"class":453},[429,761,545],{"class":443},[429,763,507],{"class":439},[429,765,766,769,771],{"class":431,"line":510},[429,767,768],{"class":493},"    features",[429,770,497],{"class":439},[429,772,589],{"class":439},[429,774,775,778,780,784,786],{"class":431,"line":527},[429,776,777],{"class":493},"      kanban",[429,779,497],{"class":439},[429,781,783],{"class":782},"s8HiA"," false",[429,785,567],{"class":439},[429,787,789],{"class":788},"ss7Ak"," \u002F\u002F Turn it off easily without breaking the build\n",[429,791,792],{"class":431,"line":550},[429,793,794],{"class":439},"    }\n",[429,796,797],{"class":431,"line":581},[429,798,644],{"class":439},[429,800,801],{"class":431,"line":592},[429,802,803],{"class":439},"};\n",[320,805,806,807,810],{},"The build script inspects this file and assembles the final composition in ",[358,808,809],{},"apps\u002Fapp\u002Fnuxt.config.ts"," 100% automatically.",[340,812],{},[343,814,816],{"id":815},"practical-benefits-for-teams-and-developers","Practical Benefits for Teams and Developers",[818,819,820,826,832],"ol",{},[354,821,822,825],{},[327,823,824],{},"Isolated Testability",": Each layer has its own unit and integration tests.",[354,827,828,831],{},[327,829,830],{},"Immediate Reuse",": Create a new product by copying only the layers you need.",[354,833,834,837,838,840],{},[327,835,836],{},"Ideal Context for AI",": When you ask an AI (Cursor, Claude Code) to edit the checkout, it only needs to read the files inside ",[358,839,393],{},", without loading thousands of irrelevant lines into memory.",[320,842,843],{},"Ready to transform your productivity and build on the right architecture from the start?",[320,845,846],{},[847,848,850],"a",{"href":849},"\u002F#pricing",[327,851,852],{},"Get immediate access to the Nuxfire source code and the VIP Group →",[854,855,856],"style",{},"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 .swvn1, html code.shiki .swvn1{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}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 .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 pre.shiki code .sD0ED, html code.shiki .sD0ED{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .squCx, html code.shiki .squCx{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}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 .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 .s8HiA, html code.shiki .s8HiA{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}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}",{"title":404,"searchDepth":466,"depth":466,"links":858},[859,860,862,864],{"id":345,"depth":466,"text":346},{"id":409,"depth":466,"text":861},"The Layer Contract: @nuxfire\u002Fmanifest",{"id":660,"depth":466,"text":863},"Turning Modules On and Off in config.ts",{"id":815,"depth":466,"text":816},"Software Engineering","2026-09-15","How to decouple Stripe billing, multi-tenant workspaces and the admin panel with Nuxt Layers and Bun monorepos to build clean, sustainable SaaS products.","md","\u002Fimages\u002Fblog\u002Fnuxt-layers-modular-b2b-en.svg","en",{},"\u002Fimages\u002Fblog\u002Fnuxt-layers-modular-b2b-en.png","\u002Fblog\u002Fmodular-architecture-nuxt-layers-b2b","8 min",{"title":313,"description":867},"blog\u002Fmodular-architecture-nuxt-layers-b2b",[333,878,879,880],"Modular Architecture","B2B SaaS","Clean Code",{"en":882,"pt-br":883,"es":884},"modular-architecture-nuxt-layers-b2b","arquitetura-modular-nuxt-layers-b2b","arquitectura-modular-nuxt-layers-b2b","NVy81nuVGAXk0v7tLDgsPb7eapJSi782FAMcC0ZZr2w",1790707502398]