I Wired the Boring 80% So You Can Build the Interesting 20% A developer has released an open-source, production-ready TypeScript modular monolith starter kit designed for the AI era, featuring built-in auth, multi-tenancy, file uploads, notifications, and more. The project aims to let developers skip boilerplate and focus on core features, with guardrails for AI agents and human developers alike. Built for the AI era: a production-ready TypeScript modular monolith with guardrails for robot coworkers. Every new project starts the same way. You need auth, multi-tenancy, file uploads, notifications, emails, i18n, a web app, a mobile app, tests, observability… and three weeks later you're still wiring boilerplate instead of building the thing that actually matters. So I built the starter I always wished existed: a production-grade modular monolith in TypeScript β€” one repo, one deployable, zero premature microservices β€” with all the boring-but-critical stuff already done. It's open source and free: fork it, change it, make it yours β†’ https://github.com/ihssmaheel-dev/modular-monolith-starter https://github.com/ihssmaheel-dev/modular-monolith-starter . Here's the tour. 🎒 AI made it possible to build a working app in a weekend. That's amazing β€” but it's also where the trouble starts. Once real users, real data, and real money arrive, so do the questions nobody planned for: Speed without structure becomes pain. Every time. This starter exists so you can have both: move fast on day one, and still sleep well on day one thousand. Big words, simple meaning: auth , notes , files , notifications … is a strict module with walls around it. Modules never touch each other's database tables. They talk through clean commands, queries, and events β€” and CI blocks you if you cheat. Simple to start, safe to scale β€” easy for a new developer or an AI agent to grasp in an afternoon, and solid when the team grows to twenty. Each domain module follows CQRS: thin controllers, single-responsibility commands and queries, pure domain entities, and Drizzle repositories. Application code never throws β€” it returns neverthrow Results. Boring? Yes. The kind of boring that sleeps through the night? Also yes. Already wired behind those modules: /api/docs notes:create , team:invite … , ownership checks, tenant and department predicates, enforced via decorators and services x-request-id flows through logs, error envelopes, and traces, so a user report maps to the exact request in seconds Accept-Language negotiation, the same keys consumed by web and mobile, and CI parity checks so no language ever falls behind The web app SSR on srvx, file-based routes, dark mode, EN/ES/FR out of the box and the Expo mobile app SecureStore auth, push notifications, deep links, offline-tolerant queries consume the same Zod contracts as the API. Change a schema, and TypeScript yells at every layer that disagrees. API drift becomes a compile error instead of a 2 a.m. mystery. Features already living in both clients: auth flows, notes CRUD with attachments, user management, tenant invitations, notification center with preferences and live updates, GDPR export and erasure, avatar + file uploads presigned S3 URLs via local MinIO , toasts, paginated data tables, and empty/loading/error states that don't lie to users. The notes feature doubles as the reference slice: a complete, production-shaped example β€” contracts, module, permissions, translations, tests, web and mobile UI β€” that new developers read first and copy when building their own features. And when it's time to make it yours: change one theme file, run one command, and the whole product β€” web, mobile, even emails β€” wears your brand. Backend | Stack | Why | |---|---| | NestJS 11 + Fastify 5 | Modules and DI that mirror the monolith; Fastify for raw speed | | PostgreSQL 16 | JSON, full-text search, RLS, rock-solid transactions | | Drizzle | SQL you can read, types you can trust, migrations you control | | Redis 7 + BullMQ | Queues, retries, digests, and scheduled work that survives restarts | | Zod 4 + oRPC | One contract language, end to end β€” drift is a compile error | | neverthrow | Errors as values, not hidden GOTO statements | | Argon2 | Modern password hashing, not legacy bcrypt defaults | | Pino + OpenTelemetry + prom-client | Structured logs, traces, and metrics without extra wiring | | Nodemailer / Resend + React Email | Transactional mail with failover and real templates | | Piscina + NestJS Schedule | CPU-heavy work off the event loop; cron without a sidecar | | WebSockets + SSE | Live updates for browsers and phones alike | Frontend | Stack | Why | |---|---| | TanStack Start + React 19 | File-based routes and SSR without framework magic taking over β€” explicit, portable, and easy for AI tools to reason about. No lock-in, no deploy surprises | | TanStack Query + Zustand 5 | Server state with caching; client state without boilerplate | | Tailwind 4 + shadcn + Base UI | Utility styling plus accessible primitives, themed by tokens | | react-hook-form + zodResolver | Forms validated by the same schemas as the API | | react-i18next + date-fns | Every string and date localized, no hardcoding | | Vitest + Playwright | Fast unit tests plus real browser journeys | | srvx + nginx | Lean SSR server in front of a production-grade proxy | Mobile | Stack | Why | |---|---| | Expo 57 + expo-router | Real native apps, file-based routes like the web | | NativeWind + Tailwind 3 | Same design tokens, native rendering | | SecureStore + expo-notifications | Hardware-backed secrets; push that actually arrives | | Same api-client + contracts | One API language across web, mobile, and server | Platform | Stack | Why | |---|---| | Turborepo + pnpm 10 + TypeScript 6 | Fast monorepo builds, one lockfile, strict types everywhere | | Docker + MinIO + Mailpit + pgAdmin | Prod-like local infra: S3, inbox, and DB GUI included | | Prometheus + Loki + Jaeger + Grafana | Metrics, logs, and traces locally before you need them in prod | | Husky + commitlint + Changesets | Clean commits and versioned releases by default | | GitHub Actions CI/CD | Typecheck, lint, tests, architecture rules β€” enforced, not suggested | Nothing trendy-for-trendy's-sake. Everything chosen to make the next five years easier, not just the next five minutes. pnpm bootstrap β†’ deps, env, Docker services, migrations, build. Then pnpm dev . That's it. An optional idempotent seed creates your first admin. pnpm project:init rebrands the whole starter β€” name, slug, app titles, bundle IDs β€” so your fork stops looking like a template in minutes, with a dry-run plan before it touches anything. pnpm generate:feature