{"slug": "i-wired-the-boring-80-so-you-can-build-the-interesting-20", "title": "I Wired the Boring 80% So You Can Build the Interesting 20%", "summary": "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.", "body_md": "Built for the AI era: a production-ready TypeScript modular monolith\n\nwith guardrails for robot coworkers.\n\nEvery new project starts the same way. You need auth, multi-tenancy,\n\nfile uploads, notifications, emails, i18n, a web app, a mobile app,\n\ntests, observability… and three weeks later you're still wiring\n\nboilerplate instead of building the thing that actually matters.\n\nSo I built the starter I always wished existed: a production-grade\n\nmodular monolith in TypeScript — one repo, one deployable, zero\n\npremature microservices — with all the boring-but-critical stuff\n\nalready done. It's open source and free: fork it, change it, make it\n\nyours → [https://github.com/ihssmaheel-dev/modular-monolith-starter](https://github.com/ihssmaheel-dev/modular-monolith-starter).\n\nHere's the tour. 🎢\n\nAI made it possible to build a working app in a weekend. That's amazing —\n\nbut it's also where the trouble starts. Once real users, real data, and\n\nreal money arrive, so do the questions nobody planned for:\n\nSpeed without structure becomes pain. Every time.\n\nThis starter exists so you can have both: move fast on day one, and\n\nstill sleep well on day one thousand.\n\nBig words, simple meaning:\n\n`auth`, `notes`,\n`files`, `notifications`…) is a strict module with walls around it.\nModules never touch each other's database tables. They talk through\nclean commands, queries, and events — and CI blocks you if you cheat.\nSimple to start, safe to scale — easy for a new developer (or an AI\n\nagent) to grasp in an afternoon, and solid when the team grows to twenty.\n\nEach domain module follows CQRS: thin controllers,\n\nsingle-responsibility commands and queries, pure domain entities, and\n\nDrizzle repositories. Application code never throws — it returns\n\n`neverthrow` Results. Boring? Yes. The kind of boring that sleeps\n\nthrough the night? Also yes.\n\nAlready wired behind those modules:\n\n`/api/docs`\n`notes:create`,\n`team:invite`…), ownership checks, tenant and department predicates,\nenforced via decorators and services`x-request-id` flows through\nlogs, error envelopes, and traces, so a user report maps to the\nexact request in seconds`Accept-Language` negotiation, the\nsame keys consumed by web and mobile, and CI parity checks so no\nlanguage ever falls behind\nThe web app (SSR on srvx, file-based routes, dark mode, EN/ES/FR out of\n\nthe box) and the Expo mobile app (SecureStore auth, push notifications,\n\ndeep links, offline-tolerant queries) consume the same Zod contracts as\n\nthe API. Change a schema, and TypeScript yells at every layer that\n\ndisagrees. API drift becomes a compile error instead of a 2 a.m. mystery.\n\nFeatures already living in both clients: auth flows, notes CRUD with\n\nattachments, user management, tenant invitations, notification center\n\nwith preferences and live updates, GDPR export and erasure, avatar +\n\nfile uploads (presigned S3 URLs via local MinIO), toasts, paginated\n\ndata tables, and empty/loading/error states that don't lie to users.\n\nThe notes feature doubles as the reference slice: a complete,\n\nproduction-shaped example — contracts, module, permissions,\n\ntranslations, tests, web and mobile UI — that new developers read\n\nfirst and copy when building their own features.\n\nAnd when it's time to make it yours: change one theme file, run one\n\ncommand, and the whole product — web, mobile, even emails — wears\n\nyour brand.\n\n**Backend**\n\n| Stack | Why | \n|---|---|\n| NestJS 11 + Fastify 5 | Modules and DI that mirror the monolith; Fastify for raw speed | \n| PostgreSQL 16 | JSON, full-text search, RLS, rock-solid transactions | \n| Drizzle | SQL you can read, types you can trust, migrations you control | \n| Redis 7 + BullMQ | Queues, retries, digests, and scheduled work that survives restarts | \n| Zod 4 + oRPC | One contract language, end to end — drift is a compile error | \n| neverthrow | Errors as values, not hidden GOTO statements | \n| Argon2 | Modern password hashing, not legacy bcrypt defaults | \n| Pino + OpenTelemetry + prom-client | Structured logs, traces, and metrics without extra wiring | \n| Nodemailer / Resend + React Email | Transactional mail with failover and real templates | \n| Piscina + NestJS Schedule | CPU-heavy work off the event loop; cron without a sidecar | \n| WebSockets + SSE | Live updates for browsers and phones alike | \n\n**Frontend**\n\n| Stack | Why | \n|---|---|\n| 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 | \n| TanStack Query + Zustand 5 | Server state with caching; client state without boilerplate | \n| Tailwind 4 + shadcn + Base UI | Utility styling plus accessible primitives, themed by tokens | \n| react-hook-form + zodResolver | Forms validated by the same schemas as the API | \n| react-i18next + date-fns | Every string and date localized, no hardcoding | \n| Vitest + Playwright | Fast unit tests plus real browser journeys | \n| srvx + nginx | Lean SSR server in front of a production-grade proxy | \n\n**Mobile**\n\n| Stack | Why | \n|---|---|\n| Expo 57 + expo-router | Real native apps, file-based routes like the web | \n| NativeWind + Tailwind 3 | Same design tokens, native rendering | \n| SecureStore + expo-notifications | Hardware-backed secrets; push that actually arrives | \n| Same api-client + contracts | One API language across web, mobile, and server | \n\n**Platform**\n\n| Stack | Why | \n|---|---|\n| Turborepo + pnpm 10 + TypeScript 6 | Fast monorepo builds, one lockfile, strict types everywhere | \n| Docker + MinIO + Mailpit + pgAdmin | Prod-like local infra: S3, inbox, and DB GUI included | \n| Prometheus + Loki + Jaeger + Grafana | Metrics, logs, and traces locally before you need them in prod | \n| Husky + commitlint + Changesets | Clean commits and versioned releases by default | \n| GitHub Actions CI/CD | Typecheck, lint, tests, architecture rules — enforced, not suggested | \n\nNothing trendy-for-trendy's-sake. Everything chosen to make the next\n\nfive years easier, not just the next five minutes.\n\n`pnpm bootstrap` → deps, env, Docker services, migrations, build.\nThen `pnpm dev`. That's it. (An optional idempotent seed creates\nyour first admin.)`pnpm project:init` rebrands the whole starter — name, slug, app\ntitles, bundle IDs — so your fork stops looking like a template in\nminutes, with a dry-run plan before it touches anything.`pnpm generate:feature <module> <feature>` scaffolds a full vertical\nslice: contracts, backend module, API client, web + mobile UI. A new\nfeature stops being a two-day wiring exercise.`pnpm rules:check` enforces architecture as code: file placement, no\nstray `fetch`, locale parity across languages, co-located tests for\nevery data module. The rules bite — I know, they've bitten me.`_FILE` mounts, traces and logs wired from the start.\nHere's the part I'm most excited about. The repo has an\n\n`ai_instructions/` folder — mandatory, machine-readable architecture\n\nlaws: locked stack, where every file belongs, how errors, i18n, and\n\ntests work. Combined with small single-responsibility files and\n\nend-to-end types, AI assistants stop hallucinating random patterns and\n\nstart writing code that fits the codebase on the first try. It turned my\n\nown workflow from \"review every line suspiciously\" into \"review, nod,\n\nmerge.\" The feature generator plus strict contracts plus enforced rules\n\nbasically function as guardrails for robot coworkers.\n\nLast week I needed a full feature with API, web UI, mobile UI,\n\npermissions, translations in three languages, and tests. Old me: two\n\ndays. With this starter: scaffold the slice, fill in the business logic,\n\nrun the gate (`typecheck`, `lint`, `test:unit`, `rules:check`,\n\n`format:check`, `build`), commit. The checklist does the worrying.\n\nAn honest note: this is an active, early-stage project. Mobile component\n\ntests are now in place, coverage keeps ratcheting, docs keep growing —\n\nand next up is a Python-based intelligence layer, so AI features live in\n\na dedicated service beside the NestJS API. There will still be rough\n\nedges and bugs we haven't met. But everything you need to start\n\na serious project today is already here and wired.\n\n```\ngit clone https://github.com/ihssmaheel-dev/modular-monolith-starter.git\ncd modular-monolith-starter\npnpm bootstrap\npnpm dev\n```\n\nThat's the whole install. If it helps you, a star on [GitHub](https://github.com/ihssmaheel-dev/modular-monolith-starter) is the cheapest way to say thanks — and it helps other developers find it too. ⭐\n\nIf you try it and something breaks, confuses you, or just smells wrong —\n\nplease [open an issue on GitHub](https://github.com/ihssmaheel-dev/modular-monolith-starter/issues)\n\nor drop it in the comments. Feature requests doubly welcome. The fastest\n\nway to make a starter great is people actually using it and complaining\n\nloudly. 🙂\n\nHappy building — and may your monolith stay modular.", "url": "https://wpnews.pro/news/i-wired-the-boring-80-so-you-can-build-the-interesting-20", "canonical_source": "https://dev.to/ihssmaheel/i-wired-the-boring-80-so-you-can-build-the-interesting-20-3dfm", "published_at": "2026-09-08 19:24:39+00:00", "updated_at": "2026-09-08 19:47:02.306016+00:00", "lang": "en", "topics": ["developer-tools", "ai-tools"], "entities": ["TypeScript", "NestJS", "Fastify", "PostgreSQL", "Drizzle", "Redis", "BullMQ", "Zod"], "alternates": {"html": "https://wpnews.pro/news/i-wired-the-boring-80-so-you-can-build-the-interesting-20", "markdown": "https://wpnews.pro/news/i-wired-the-boring-80-so-you-can-build-the-interesting-20.md", "text": "https://wpnews.pro/news/i-wired-the-boring-80-so-you-can-build-the-interesting-20.txt", "jsonld": "https://wpnews.pro/news/i-wired-the-boring-80-so-you-can-build-the-interesting-20.jsonld"}}