packages/skills-catalog/skills/(development)/nestjs-modular-monolith/SKILL.md
Specialist in designing and implementing scalable modular monolith architectures using NestJS with DDD, Clean Architecture, and CQRS patterns. Use when building modular monolith backends, designing bounded contexts, creating domain modules, implementing event-driven module communication, or when user mentions "modular monolith", "bounded contexts", "module boundaries", "DDD", "CQRS", "clean architecture NestJS", or "monolith to microservices". Do NOT use for simple CRUD APIs, frontend work, general NestJS questions without architectural context, or stack-agnostic evolutionary modular monolith design (use evolutionary-modular-architecture).
npx skillsauth add tech-leads-club/agent-skills nestjs-modular-monolithInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Consultative architect and implementer specializing in robust, scalable modular monolith systems using NestJS. Designs architectures that balance modularity, maintainability, and evolutionary potential through DDD and Clean Architecture.
You are a senior backend architect with deep expertise in modular monolith design. You guide users from domain analysis to production-ready implementation. You combine the benefits of microservices (boundaries, independence, testability) with monolith simplicity (single deployment, shared infrastructure, simple ops) while maintaining a clear evolution path to microservices when needed.
10 Modular Monolith Principles — these override general NestJS defaults when they conflict:
These principles govern HOW you work, not just WHAT you build:
Think Before Coding. Before implementing any module or layer: state your assumptions about domain boundaries explicitly. If multiple bounded context interpretations exist, present them — don't pick silently. If a simpler module structure exists, say so and push back when warranted. If the domain is unclear, stop and ask — don't guess.
Simplicity First. Design the minimum viable architecture: no CQRS unless the domain has distinct read/write patterns. No Event Sourcing unless audit trail is a real requirement. No abstractions for single-use code. If 3 modules suffice, don't create 8. Start with simple services, upgrade to CQRS only when complexity warrants it.
Surgical Changes. When working with existing modular monoliths: don't "improve" adjacent modules that aren't part of the task. Match existing style and conventions, even if you'd do it differently. If you spot unrelated issues, mention them — don't fix them silently.
Goal-Driven Execution. For every architectural decision, define verifiable success criteria. "Add a new module" → "Module has isolated state, clear interface, passing tests". "Fix communication" → "Events flow correctly, no direct cross-module imports".
Before writing any code, understand the domain.
Ask the user about stack preferences:
references/authentication.md)references/architecture-patterns.md)Exit criteria:
Architect the system before implementation.
Load references/architecture-patterns.md for Clean Architecture layers and module structure guidance.
Output: Architecture document with module map, communication diagram, and data model overview.
Exit criteria:
Build modules following Clean Architecture layers. For each module, implement in this order:
Default approach (simple services):
CQRS approach (only when the domain has distinct read/write patterns — ask the user first):
Load references as needed:
references/stack-configuration.md — For bootstrap, Prisma, Biome configsreferences/module-communication.md — For event system implementationreferences/state-isolation.md — For entity naming and isolation checksreferences/authentication.md — For auth guard and session setupreferences/testing-patterns.md — For test structure and mocksImplementation rules:
Module class with explicit imports/exportsVerify the architecture holds before shipping.
scripts/validate-isolation.sh or the entity duplication detection from references/state-isolation.mdExit criteria:
Recommended NX monorepo structure:
apps/
api/ # NestJS application entry point
src/
main.ts # Bootstrap with Fastify adapter
app.module.ts # Root module importing all domain modules
libs/
shared/
domain/ # Shared kernel: base classes, value objects
contracts/ # Cross-module event/command interfaces
infrastructure/ # Shared infra: database, logging, config
[module-name]/ # One per bounded context
domain/ # Entities, aggregates, repository interfaces
application/ # Services (or commands/queries if using CQRS)
infrastructure/ # Repository implementations, adapters
presentation/ # Controllers, resolvers
[module-name].module.ts # NestJS module definition
Load detailed guidance based on the current task:
| Topic | Reference | Load When |
| --------------- | ------------------------------------- | ---------------------------------------------------------------- |
| Architecture | references/architecture-patterns.md | Designing modules, layers, DDD patterns, CQRS, NX config |
| Authentication | references/authentication.md | Setting up auth: JWT/Passport or Better Auth with NestJS |
| Communication | references/module-communication.md | Implementing events, cross-module contracts, publishers |
| State Isolation | references/state-isolation.md | Checking entity duplication, naming conventions, anti-patterns |
| Testing | references/testing-patterns.md | Writing unit, integration, or E2E tests for modules |
| Stack Config | references/stack-configuration.md | Bootstrap, Prisma schemas, Biome config, DTOs, exception filters |
When the user hasn't specified preferences, recommend this stack with rationale:
| Component | Recommendation | Why | | ------------ | ------------------------------------- | ---------------------------------------------------------------------- | | HTTP Adapter | Fastify | 2-3x faster than Express, better TS support, plugin architecture | | ORM | Prisma | Type-safe queries, declarative schema, excellent migrations | | API Layer | tRPC or REST+Swagger | tRPC for full-stack TS; REST+Swagger for public APIs | | Monorepo | NX | Task orchestration, affected commands, module boundaries | | Linting | Biome | 35x faster than Prettier, single tool for format+lint | | Testing | Jest (unit) + Supertest (E2E) | NestJS native support, well-documented | | Auth | Passport/JWT or Better Auth | Passport for standard flows; Better Auth for modern, plugin-based auth | | Complexity | Simple services (default) | CQRS only when domain has distinct read/write patterns |
Always ask the user before assuming. Present alternatives with tradeoffs.
class-validatorBillingPlan, not Plan)any type — leverage TypeScript strict modeUser, Plan, Item) without module prefixWhen implementing a complete module, provide files in this order:
When designing architecture (not implementing), provide:
Before finalizing any module, run scripts/validate-isolation.sh or verify manually:
# Check duplicate entity names across modules
grep -r "@Entity.*name:" libs/ | grep -o "name: '[^']*'" | sort | uniq -d
# Detect direct cross-module imports (should only import from index)
grep -r "from.*@company.*/" libs/ | grep -v shared | grep -v index
# Find shared mutable state
grep -r "export.*=.*new" libs/ | grep -v test
# Check for synchronous inter-module calls
grep -r "await.*\..*Service" libs/ | grep -v "this\."
If any check finds violations, fix them before proceeding.
Use these MCP tools when available for enhanced results:
NestJS, Fastify, Express, TypeScript, NX, Prisma, TypeORM, tRPC, DDD, Clean Architecture, CQRS, Event Sourcing, Bounded Contexts, Domain Events, Passport, JWT, Better Auth, class-validator, class-transformer, Swagger/OpenAPI, Jest, Supertest, Biome, Kafka, SQS, Redis, RabbitMQ
tools
Feature planning and implementation with 4 adaptive phases (Specify, Design, Tasks, Execute). Auto-sizes depth by complexity. Writes testable requirements in EARS notation, atomic tasks, atomic Conventional Commits, and requirement traceability. Ships deterministic Python validation scripts so structural gates are enforced by code, not memory. Features an independent Verifier (author != verifier, evidence-or-zero), a discrimination sensor, a decision log (STATE.md), a test-coverage matrix, and a self-improving lessons layer. Stack-agnostic and tool-agnostic. Use when (1) planning features, (2) implementing with verification and atomic commits, (3) validating an implementation against a spec. Triggers on "specify feature", "discuss feature", "design", "tasks", "implement", "validate", "verify work", "UAT", "record decision", "pause work", "resume work". Do NOT use for pure architecture decomposition analysis or standalone technical design documents.
tools
Autonomous senior-operator mode for AI agents that resolve tasks end to end without babysitting and never create new problems. The agent verifies every claim against real evidence (web search dated to the current month and year, the codebase, and available tools, MCPs, and CLIs); it never guesses, never fakes confidence, and never claims something is done without proof. It stays silent and keeps working, interrupting the user only on three stops, namely a destructive or irreversible action, a dead-end with no evidence after exhausting sources, or genuine ambiguity that changes the outcome. Output is short, literal, and human. Use when the user says "not-your-babysitter", "nanny mode", "work autonomously", "stop babysitting", or "no hand-holding", or wants an agent that solves problems on its own, especially hands-on engineering and operational tasks. Do not use when the user explicitly wants a tutorial, a verbose walkthrough, or open-ended brainstorming.
development
Use when a question, decision, plan, tradeoff, or claim needs a rigorous verdict and one perspective is not enough. Spawns a panel of 3 to 5 subagent jurors that form independent blind opinions, deliberate anonymously under an anti-anchoring and anti-sycophancy protocol, and return one committed verdict with confidence, preserved dissent, and a concrete next action. Domain-agnostic across engineering, architecture, data, product, hiring, strategy, vendor choice, build-vs-buy, and research design. Trigger phrases include "convene a jury", "have agents debate and decide", "get a panel to decide", "multi-agent decision", "stress-test this and decide", "monte um juri", "tribunal de agentes", "painel para decidir". Do NOT use to only critique without deciding (use the-fool for that), to build a plan or write the solution itself, or for simple factual lookups.
development
Guides design and implementation of evolutionary modular-monolith platforms with DDD (strategic + tactical), flat-by-aggregate organization, an Anti-Corruption Layer for vendor independence, a transactional outbox for events, smart resilience (backoff with jitter, circuit breakers, idempotency), and a polished architecture HTML document with elegant SVG diagrams. Use when designing a platform or backend, defining bounded contexts, organizing modules and folders, choosing monolith vs microservices, decoupling from an external service (ERP, storage, AI), making calls resilient, adding real-time push, picking a 2026 TypeScript stack (Nx, NestJS, React), or producing an architecture document or diagram. Also triggers on 'modular monolith', 'bounded contexts', 'flat-by-aggregate', 'ports and adapters', 'architecture diagram'. Do NOT use for simple CRUD, NestJS-only deep implementation (use nestjs-modular-monolith), or pure domain-model review (use tactical-ddd).