<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mehdi Hassan Jony</title>
    <description>The latest articles on DEV Community by Mehdi Hassan Jony (@mehdijony).</description>
    <link>https://dev.to/mehdijony</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3880134%2Fb6115daf-a5d3-4c56-8925-f341eae029d5.png</url>
      <title>DEV Community: Mehdi Hassan Jony</title>
      <link>https://dev.to/mehdijony</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mehdijony"/>
    <language>en</language>
    <item>
      <title>Stop Wasting Days on Dev Setup: How We Automated Our Microservices Environment for Every Developer</title>
      <dc:creator>Mehdi Hassan Jony</dc:creator>
      <pubDate>Tue, 22 Sep 2026 08:38:16 +0000</pubDate>
      <link>https://dev.to/mehdijony/stop-wasting-days-on-dev-setup-how-we-automated-our-microservices-environment-for-every-developer-44jn</link>
      <guid>https://dev.to/mehdijony/stop-wasting-days-on-dev-setup-how-we-automated-our-microservices-environment-for-every-developer-44jn</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F746lcshhe26h80su38av.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F746lcshhe26h80su38av.png" alt="Stop Wasting Days on Dev Setup: How We Automated Our Microservices Environment for Every Developer" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;How we reduced new developer onboarding from 3 days to 15 minutes and eliminated configuration drift across 12 microservices.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Problem That Made Us Snap&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Picture this:&lt;/strong&gt; A new senior developer joins your team. They’re excited, ready to ship code on day one. Then reality hits.&lt;br&gt;
Day 1: They spend 6 hours installing Node, Docker, configuring ESLint to match the team’s style, figuring out which environment variables go where, and asking Slack questions like, “Which version of NestJS are we on again?”&lt;br&gt;
Day 2: They finally get &lt;code&gt;user-service&lt;/code&gt; running, but &lt;code&gt;auth-service&lt;/code&gt; throws a CORS error because their local config is slightly different from everyone else’s. They spend the afternoon comparing &lt;code&gt;.env&lt;/code&gt; files with a teammate.&lt;br&gt;
Day 3: They submit their first PR. The CI pipeline fails because their local Prettier config formats code differently from the shared config that was updated last month — but nobody told them.&lt;br&gt;
Sound familiar?&lt;br&gt;
We had 12 microservices, a team that was growing fast, and a configuration mess that was eating our productivity alive. Every service had slightly different ESLint rules, Docker setups, folder structures, and VS Code settings. Senior developers were spending hours every week answering setup questions instead of building features.&lt;br&gt;
So we built a system that fixed all of it. Here’s exactly how.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution: One Repo to Rule Them All&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We created a central configuration repository called &lt;code&gt;dev-environment-config&lt;/code&gt; that acts as the single source of truth for every development environment across our entire microservices ecosystem.&lt;br&gt;
The idea is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;One repository controls the setup, structure, linting, Docker config, VS Code settings, and shared code for every service. When a senior developer updates it, every developer’s machine automatically syncs the next morning.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The Architecture at a Glance&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dev-environment-config (Central Repo)
├── templates/          → Project scaffolding (NestJS, React)
├── shared/             → ESLint, Prettier, Git configs
├── vscode/             → Extensions &amp;amp; settings
├── docker/             → Base Docker configs
├── scripts/            → Automation (setup, sync, update)
├── common-lib/         → Shared NPM package
└── manifest.json       → Version tracking

         │  syncs to
         ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ user-svc │ │ auth-svc │ │ pay-svc  │  ... 12 services
│ .eslint  │ │ .eslint  │ │ .eslint  │
│ .vscode  │ │ .vscode  │ │ .vscode  │
│ Docker   │ │ Docker   │ │ Docker   │
└──────────┘ └──────────┘ └──────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Implementation: Step by Step&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: The Central Config Repository&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We created a new repository with this structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dev-environment-config/
├── templates/
│   ├── nestjs-service/    # Complete NestJS starter
│   └── reactjs-service/   # Complete React starter
├── shared/
│   ├── .eslintrc.js
│   ├── .prettierrc
│   ├── .editorconfig
│   ├── .gitignore
│   └── commitlint.config.js
├── vscode/
│   ├── extensions.json
│   ├── settings.json
│   └── launch.json
├── scripts/
│   ├── setup-new-developer.sh
│   ├── sync-config.sh
│   ├── auto-update.sh
│   └── create-new-service.sh
├── common-lib/            # Shared NPM package
└── manifest.json          # Version tracker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;manifest.json&lt;/code&gt; is the heartbeat of the system:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"lastUpdated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-01-15T10:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"updatedBy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"senior-dev"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"configs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"eslint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3.2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"prettier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"docker"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.5.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"services"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"user-service"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"auth-service"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"payment-service"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every time a config changes, we bump the version. This is how the auto-update system knows something changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: The One-Command Onboarding Script&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This was the game-changer. We wrote a bash script that a new developer runs once, and their entire environment is ready.&lt;/p&gt;

&lt;p&gt;The new developer’s experience:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install VS Code ✅&lt;/li&gt;
&lt;li&gt;Run one command:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sSL&lt;/span&gt; https://raw.githubusercontent.com/company/dev-environment-config/main/scripts/setup-new-developer.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Wait ~10 minutes. Done.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What the script does under the hood:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt;

&lt;span class="nv"&gt;WORKSPACE_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/company-workspace"&lt;/span&gt;
&lt;span class="nv"&gt;CONFIG_REPO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/company/dev-environment-config.git"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"🚀 Setting up your development environment..."&lt;/span&gt;

&lt;span class="c"&gt;# 1. Check &amp;amp; install prerequisites&lt;/span&gt;
check_and_install &lt;span class="s2"&gt;"git"&lt;/span&gt; &lt;span class="s2"&gt;"Git"&lt;/span&gt;
check_and_install &lt;span class="s2"&gt;"node"&lt;/span&gt; &lt;span class="s2"&gt;"Node.js"&lt;/span&gt; &lt;span class="s2"&gt;"nvm install 20"&lt;/span&gt;
check_and_install &lt;span class="s2"&gt;"docker"&lt;/span&gt; &lt;span class="s2"&gt;"Docker"&lt;/span&gt;

&lt;span class="c"&gt;# 2. Create workspace &amp;amp; clone everything&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$WORKSPACE_DIR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$WORKSPACE_DIR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
git clone &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CONFIG_REPO&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# 3. Clone all service repos from manifest&lt;/span&gt;
&lt;span class="nv"&gt;SERVICES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;dev-environment-config/manifest.json | &lt;span class="se"&gt;\&lt;/span&gt;
  python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import sys,json; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
  [print(s) for s in json.load(sys.stdin)['services']]"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;service &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;$SERVICES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;git clone &lt;span class="s2"&gt;"https://github.com/company/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;service&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.git"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# 4. Install VS Code extensions&lt;/span&gt;
&lt;span class="nv"&gt;EXTENSIONS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;dev-environment-config/vscode/extensions.json | &lt;span class="se"&gt;\&lt;/span&gt;
  python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import sys,json; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
  [print(e) for e in json.load(sys.stdin)['recommendations']]"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;ext &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;$EXTENSIONS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;code &lt;span class="nt"&gt;--install-extension&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ext&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--force&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# 5. Sync shared configs to all services&lt;/span&gt;
bash dev-environment-config/scripts/sync-config.sh

&lt;span class="c"&gt;# 6. Install dependencies everywhere&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;service &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;$SERVICES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$service&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ..
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# 7. Set up daily auto-update cron (8 AM weekdays)&lt;/span&gt;
&lt;span class="nv"&gt;CRON&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"0 8 * * 1-5 cd &lt;/span&gt;&lt;span class="nv"&gt;$WORKSPACE_DIR&lt;/span&gt;&lt;span class="s2"&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
  bash dev-environment-config/scripts/auto-update.sh"&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;crontab &lt;span class="nt"&gt;-l&lt;/span&gt; 2&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CRON&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; | crontab -

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"✅ Setup complete! Open VS Code: code &lt;/span&gt;&lt;span class="nv"&gt;$WORKSPACE_DIR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it. The developer opens VS Code, and everything is configured — extensions, linting, formatting, Docker, environment variables, the works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: The Config Sync Script&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This script copies the shared configs from the central repo into every service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# sync-config.sh&lt;/span&gt;

&lt;span class="nv"&gt;CONFIG_ROOT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;dirname&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SCRIPT_DIR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;WORKSPACE_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;dirname&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CONFIG_ROOT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;service &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;$SERVICES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nv"&gt;SERVICE_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$WORKSPACE_DIR&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$service&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

  &lt;span class="c"&gt;# Copy shared configs&lt;/span&gt;
  &lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CONFIG_ROOT&lt;/span&gt;&lt;span class="s2"&gt;/shared/.eslintrc.js"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SERVICE_DIR&lt;/span&gt;&lt;span class="s2"&gt;/"&lt;/span&gt;
  &lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CONFIG_ROOT&lt;/span&gt;&lt;span class="s2"&gt;/shared/.prettierrc"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SERVICE_DIR&lt;/span&gt;&lt;span class="s2"&gt;/"&lt;/span&gt;
  &lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CONFIG_ROOT&lt;/span&gt;&lt;span class="s2"&gt;/shared/.editorconfig"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SERVICE_DIR&lt;/span&gt;&lt;span class="s2"&gt;/"&lt;/span&gt;
  &lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CONFIG_ROOT&lt;/span&gt;&lt;span class="s2"&gt;/shared/.gitignore"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SERVICE_DIR&lt;/span&gt;&lt;span class="s2"&gt;/"&lt;/span&gt;

  &lt;span class="c"&gt;# Copy VS Code settings&lt;/span&gt;
  &lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SERVICE_DIR&lt;/span&gt;&lt;span class="s2"&gt;/.vscode"&lt;/span&gt;
  &lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CONFIG_ROOT&lt;/span&gt;&lt;span class="s2"&gt;/vscode/settings.json"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SERVICE_DIR&lt;/span&gt;&lt;span class="s2"&gt;/.vscode/"&lt;/span&gt;
  &lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CONFIG_ROOT&lt;/span&gt;&lt;span class="s2"&gt;/vscode/extensions.json"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SERVICE_DIR&lt;/span&gt;&lt;span class="s2"&gt;/.vscode/"&lt;/span&gt;

  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"✅ &lt;/span&gt;&lt;span class="nv"&gt;$service&lt;/span&gt;&lt;span class="s2"&gt; synced"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4: The Daily Auto-Update (The Magic)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the part that keeps everything in sync without anyone thinking about it.&lt;br&gt;
Every morning at 8 AM (weekdays), a cron job runs &lt;code&gt;auto-update.sh&lt;/code&gt; on every developer’s machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# auto-update.sh — Runs daily at 8 AM&lt;/span&gt;

&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CONFIG_ROOT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# 1. Check for config updates&lt;/span&gt;
&lt;span class="nv"&gt;OLD_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;manifest.json | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.version'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
git pull origin main
&lt;span class="nv"&gt;NEW_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;manifest.json | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.version'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OLD_VERSION&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$NEW_VERSION&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"🆕 Config updated: &lt;/span&gt;&lt;span class="nv"&gt;$OLD_VERSION&lt;/span&gt;&lt;span class="s2"&gt; → &lt;/span&gt;&lt;span class="nv"&gt;$NEW_VERSION&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  bash &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SCRIPT_DIR&lt;/span&gt;&lt;span class="s2"&gt;/sync-config.sh"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# 2. Pull latest code for all services&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;service &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;$SERVICES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$WORKSPACE_DIR&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$service&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

  &lt;span class="c"&gt;# Stash local changes safely&lt;/span&gt;
  git stash push &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"auto-update-&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%Y%m%d&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;/dev/null

  &lt;span class="c"&gt;# Pull latest&lt;/span&gt;
  git pull origin &lt;span class="si"&gt;$(&lt;/span&gt;git branch &lt;span class="nt"&gt;--show-current&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;--rebase&lt;/span&gt;

  &lt;span class="c"&gt;# Update dependencies if package.json changed&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;git diff HEAD~1 &lt;span class="nt"&gt;--name-only&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s2"&gt;"package.json"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;npm &lt;span class="nb"&gt;install
  &lt;/span&gt;&lt;span class="k"&gt;fi&lt;/span&gt;

  &lt;span class="c"&gt;# Update shared library&lt;/span&gt;
  npm update @company/common-lib
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# 3. Notify the developer&lt;/span&gt;
notify-send &lt;span class="s2"&gt;"Dev Environment"&lt;/span&gt; &lt;span class="s2"&gt;"✅ Updated to config v&lt;/span&gt;&lt;span class="nv"&gt;$NEW_VERSION&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Senior Dev pushes config change
         │
         ▼
   GitHub Actions
         │
    ┌────┴────┐
    │ Slack   │ Notify team
    │ Publish │ common-lib to NPM
    └────┬────┘
         │
    Next 8 AM
         │
         ▼
  Every developer's cron runs
         │
    ┌────┴────────────────┐
    │ Pull config repo    │
    │ Sync shared configs │
    │ Pull service repos  │
    │ Update dependencies │
    │ Desktop notification│
    └─────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 5: The Shared Common Library&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of copying and pasting guards, interceptors, and DTOs across 12 services, we created &lt;code&gt;@company/common-lib&lt;/code&gt; — a private NPM package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// In any service, just import and use:&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;AuthGuard&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;RolesGuard&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;ResponseInterceptor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;LoggingInterceptor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;HttpExceptionFilter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;PaginationDto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;McpService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;// Qwen MCP integration&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@company/common-lib&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Controller&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;UseGuards&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AuthGuard&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;RolesGuard&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;UseInterceptors&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ResponseInterceptor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;UseFilters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;HttpExceptionFilter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserController&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;mcpService&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;McpService&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nf"&gt;findAll&lt;/span&gt;&lt;span class="p"&gt;(@&lt;/span&gt;&lt;span class="nd"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;pagination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PaginationDto&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pagination&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;analyze&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;analyze&lt;/span&gt;&lt;span class="p"&gt;(@&lt;/span&gt;&lt;span class="nd"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;dto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AnalyzeDto&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mcpService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;callTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text-analysis&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;dto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When we update the common library (add a new guard, fix a bug in the exception filter), the auto-update system bumps the version in every service automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Service Scaffolding&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Creating a new microservice used to take a day of copy-pasting and tweaking. Now it takes 30 seconds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bash scripts/create-new-service.sh

&lt;span class="c"&gt;# Prompts:&lt;/span&gt;
&lt;span class="c"&gt;# Service name: order-service&lt;/span&gt;
&lt;span class="c"&gt;# Description: Handles order processing&lt;/span&gt;
&lt;span class="c"&gt;# Port: 3002&lt;/span&gt;
&lt;span class="c"&gt;# Type: nestjs&lt;/span&gt;

&lt;span class="c"&gt;# ✅ Done! Complete service with:&lt;/span&gt;
&lt;span class="c"&gt;# - src/common/ (filters, guards, interceptors, DTOs)&lt;/span&gt;
&lt;span class="c"&gt;# - Docker setup (Dockerfile + docker-compose)&lt;/span&gt;
&lt;span class="c"&gt;# - VS Code settings&lt;/span&gt;
&lt;span class="c"&gt;# - ESLint + Prettier&lt;/span&gt;
&lt;span class="c"&gt;# - Health check endpoint&lt;/span&gt;
&lt;span class="c"&gt;# - Swagger docs&lt;/span&gt;
&lt;span class="c"&gt;# - MCP integration&lt;/span&gt;
&lt;span class="c"&gt;# - Auto-update scripts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Benefits (With Real Numbers)&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;1. Onboarding: 3 Days → 15 Minutes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Before: Manual setup following a 40-step Confluence page.&lt;/li&gt;
&lt;li&gt;After: One &lt;code&gt;curl&lt;/code&gt;command.&lt;/li&gt;
&lt;li&gt;Before: 3 days to first productive commit.&lt;/li&gt;
&lt;li&gt;After: 15 minutes to running all services.&lt;/li&gt;
&lt;li&gt;Before: "Hey, can you help me with my env vars?" (daily Slack noise).&lt;/li&gt;
&lt;li&gt;After: Zero setup questions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Configuration Drift: Eliminated&lt;/strong&gt;&lt;br&gt;
Before, every service slowly diverged. user-service had ESLint v8, auth-service had v7. Prettier configs had subtle differences. Docker setups were copy-pasted and never updated. Now, every service has identical configs, and they stay identical because the sync script overwrites them daily.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Senior Developer Time: Saved ~5 Hours/Week&lt;/strong&gt;&lt;br&gt;
Senior devs were spending roughly an hour a day helping juniors with setup issues, reviewing PRs that failed CI due to formatting, and manually updating configs across services. That time is now spent building features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Consistent Code Quality&lt;/strong&gt;&lt;br&gt;
Every developer has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The same ESLint rules (auto-fixed on save)&lt;/li&gt;
&lt;li&gt;The same Prettier config (format on save)&lt;/li&gt;
&lt;li&gt;The same commit message format (enforced by Husky)&lt;/li&gt;
&lt;li&gt;The same VS Code extensions (auto-installed)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PR reviews went from "please fix your formatting" to "let’s discuss the architecture."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Zero-Effort Config Updates&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When a senior developer wants to:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1. Add a new ESLint rule → Push to config repo → Everyone gets it tomorrow&lt;/li&gt;
&lt;li&gt;2. Update Docker base image → Push → Auto-synced&lt;/li&gt;
&lt;li&gt;3. Add a VS Code extension → Push → Auto-installed&lt;/li&gt;
&lt;li&gt;4. Fix a bug in the exception filter → Publish common-lib → Auto-updated
No Slack announcements needed. No "please run npm install" messages. It just happens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;6. Standardized Project Structure&lt;/strong&gt;&lt;br&gt;
Every service looks the same. A developer can jump from &lt;code&gt;user-service&lt;/code&gt; to &lt;code&gt;payment-service&lt;/code&gt; and immediately know where everything is. The &lt;code&gt;src/common/ folder&lt;/code&gt; has the same patterns. The Docker setup is identical. The health check endpoint is at the same path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What We Learned&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start Small&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We didn’t build this all at once. We started with just syncing ESLint and Prettier configs. Once the team saw the value, we added Docker, VS Code settings, the common library, and the auto-update system incrementally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don’t Force Everything&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We allow service-specific overrides. If &lt;code&gt;payment-service&lt;/code&gt; needs a special ESLint rule, they can add a &lt;code&gt;.eslintrc.local.js&lt;/code&gt; that extends the shared one. The shared config is the baseline, not a straitjacket.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Notifications Matter&lt;/strong&gt;&lt;br&gt;
The desktop notification ("✅ Updated to config v1.2.0") was a small touch, but it made developers aware of the system. Before that, updates happened silently and people were confused when things changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Version Everything&lt;/strong&gt;&lt;br&gt;
The &lt;code&gt;manifest.json&lt;/code&gt; version tracking was critical. Without it, the auto-update script had no way to know if anything changed, and it would waste time syncing configs that were already up to date.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Complete Stack&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backend: NestJS (TypeScript)&lt;/li&gt;
&lt;li&gt;Frontend: ReactJS (TypeScript)&lt;/li&gt;
&lt;li&gt;AI: Qwen MCP&lt;/li&gt;
&lt;li&gt;Containers: Docker, Docker Compose&lt;/li&gt;
&lt;li&gt;Runtime: Node.js 20 LTS&lt;/li&gt;
&lt;li&gt;Database: PostgreSQL 16&lt;/li&gt;
&lt;li&gt;Cache: Redis 7&lt;/li&gt;
&lt;li&gt;CI/CD: GitHub Actions&lt;/li&gt;
&lt;li&gt;Editor: VS Code&lt;/li&gt;
&lt;li&gt;Config Sync: Bash scripts + Cron&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;
If your team has more than 3 microservices and more than 5 developers, you need a centralized dev environment config. Here’s the recipe:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a config repo with templates, shared configs, and scripts.&lt;/li&gt;
&lt;li&gt;Write a setup script that onboards new devs in one command.&lt;/li&gt;
&lt;li&gt;Write a sync script that copies shared configs to all services.&lt;/li&gt;
&lt;li&gt;Set up a cron job that auto-updates every morning.&lt;/li&gt;
&lt;li&gt;Create a shared NPM library for reusable code.&lt;/li&gt;
&lt;li&gt;Build a service generator for scaffolding new microservices.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result: developers spend their time writing code, not configuring environments.&lt;/p&gt;

&lt;p&gt;Have you solved this problem differently at your company? I’d love to hear about it in the comments.&lt;br&gt;
If you found this useful, give it a clap 👏 and follow for more microservices architecture deep-dives.&lt;/p&gt;

</description>
      <category>microservices</category>
      <category>nestjs</category>
      <category>developer</category>
      <category>ai</category>
    </item>
    <item>
      <title>I Couldn't Afford AWS Cognito Experience — So I Built It Myself</title>
      <dc:creator>Mehdi Hassan Jony</dc:creator>
      <pubDate>Tue, 28 Apr 2026 06:33:45 +0000</pubDate>
      <link>https://dev.to/mehdijony/i-couldnt-afford-aws-cognito-experience-so-i-built-it-myself-515n</link>
      <guid>https://dev.to/mehdijony/i-couldnt-afford-aws-cognito-experience-so-i-built-it-myself-515n</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnr43gg91wyupaqz5ddd4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnr43gg91wyupaqz5ddd4.png" alt="How open-source alternatives can land you the cloud job you're not " width="799" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How open-source alternatives can land you the cloud job you're not "qualified" for
&lt;/h2&gt;




&lt;p&gt;The job posting said "AWS Cognito experience required." I had never touched Cognito. I had never paid an AWS bill above the free tier. I almost closed the tab and moved on.&lt;/p&gt;

&lt;p&gt;Two weeks later, I got called into the interview anyway. And I was ready.&lt;/p&gt;

&lt;p&gt;Here's the uncomfortable truth about tech hiring: companies post aspirational requirement lists. They know the talent pool is wider than their wishlist. They shortlist you anyway. The question isn't whether you'll face that room — it's whether you'll be prepared when you do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The concepts are what matter. The brand name is just packaging.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm going to show you the exact open-source alternatives I used to build enterprise-level knowledge without an enterprise budget. By the end of this, you'll have a map, a 30-day plan, and the exact words to use in your next interview.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Interviewers Are Actually Asking
&lt;/h2&gt;

&lt;p&gt;When someone asks "Have you used AWS Cognito?", they're really asking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do you understand OAuth2, SAML, SSO, MFA, and RBAC?&lt;/li&gt;
&lt;li&gt;Can you reason about authentication flows in a distributed system?&lt;/li&gt;
&lt;li&gt;Have you actually &lt;em&gt;built&lt;/em&gt; something that handles identity?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I've been on both sides of this table. When a candidate says &lt;em&gt;"I haven't used Cognito, but I self-hosted Keycloak, configured OAuth2/OIDC flows, set up LDAP federation, and implemented MFA"&lt;/em&gt; — that answer impresses me more than "Yes, I clicked through the Cognito wizard once."&lt;/p&gt;

&lt;p&gt;Open source teaches you what managed services hide. You're not just consuming abstractions — you're wrestling with the actual systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Stack: Enterprise Cloud → Open Source Alternative
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔐 Identity &amp;amp; Auth
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;You need to know&lt;/th&gt;
&lt;th&gt;You can build with&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AWS Cognito&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Keycloak&lt;/strong&gt;, Authentik, ZITADEL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth0, Okta&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;SuperTokens&lt;/strong&gt;, Ory&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz1bt7d072ku9lyv89ams.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz1bt7d072ku9lyv89ams.png" alt="Keycloak" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I started with &lt;a href="https://www.keycloak.org/" rel="noopener noreferrer"&gt;Keycloak&lt;/a&gt;. One Docker command. Within an hour I had OAuth2 SSO running against a test app with MFA enabled. The concepts map 1:1 to Cognito.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fun fact:&lt;/strong&gt; Cognito isn't natively multi-tenant — you need a dedicated user pool per tenant. Keycloak handles this through realms. Understanding that architectural difference alone puts you ahead of candidates who just clicked "Create User Pool."&lt;/p&gt;

&lt;h3&gt;
  
  
  🗄️ NoSQL Databases
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Enterprise&lt;/th&gt;
&lt;th&gt;Open Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DynamoDB&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Apache Cassandra&lt;/strong&gt;, ScyllaDB Alternator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firestore&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Supabase&lt;/strong&gt;, PocketBase&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Here's the thing about DynamoDB: it's built on the same research paper as Cassandra. The partition key model, the consistency levels, the distributed architecture — it's the same DNA.&lt;/p&gt;

&lt;p&gt;ScyllaDB's Alternator goes a step further. It offers an actual DynamoDB-compatible API. I ran my AWS SDK code against it locally. Zero changes. That's legitimate DynamoDB development experience without touching an AWS account.&lt;/p&gt;

&lt;h3&gt;
  
  
  📨 Message Queues
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Enterprise&lt;/th&gt;
&lt;th&gt;Open Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AWS SQS / SNS&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;RabbitMQ&lt;/strong&gt;, NATS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS Kinesis&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Apache Kafka&lt;/strong&gt;, Redpanda&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I configured RabbitMQ with dead-letter queues, topic exchanges, and consumer acknowledgments. When the interviewer asked about SQS, I could talk about every pattern they cared about — because they're the same patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔥 Backend-as-a-Service
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Enterprise&lt;/th&gt;
&lt;th&gt;Open Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Firebase, AWS Amplify&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Supabase&lt;/strong&gt;, Appwrite, PocketBase&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Supabase is the open-source Firebase. Postgres database, authentication, real-time subscriptions, file storage, edge functions — all runnable with a single &lt;code&gt;docker compose up&lt;/code&gt;. I built a full-stack app on my laptop. When they asked if I understood the BaaS model, I could walk them through every layer.&lt;/p&gt;

&lt;h3&gt;
  
  
  🪣 Object Storage
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Enterprise&lt;/th&gt;
&lt;th&gt;Open Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AWS S3, Azure Blob&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;MinIO&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;MinIO is S3-API compatible. Not metaphorically — literally. My SDK calls, presigned URL generation, bucket policies — identical surface. MinIO to S3 is a config change, not a rewrite.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚡ The Nuclear Option: LocalStack
&lt;/h3&gt;

&lt;p&gt;LocalStack simulates 45+ AWS services on your machine. DynamoDB, S3, SQS, Lambda, API Gateway, Cognito — same SDK calls, same Terraform configs, same everything. Point your endpoint to &lt;code&gt;localhost&lt;/code&gt; instead of &lt;code&gt;amazonaws.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This was how I built "AWS experience" without an AWS bill.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Interview Framework That Works
&lt;/h2&gt;

&lt;p&gt;When they ask about a tool you haven't used commercially:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Acknowledge.&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;"I haven't used Cognito in production."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Bridge.&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;"But I've built authentication systems with Keycloak — OAuth2/OIDC, multi-tenant realms, LDAP federation."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Go deeper.&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;"I configured MFA with TOTP and WebAuthn, and set up fine-grained authorization policies. These map directly to Cognito's user pool features."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I've watched interviewers visibly recalibrate their assessment after this kind of answer. You're no longer "the candidate without Cognito." You're "the candidate who understands identity systems at a depth most Cognito users don't."&lt;/p&gt;




&lt;h2&gt;
  
  
  My 30-Day Zero-Cost Roadmap
&lt;/h2&gt;

&lt;p&gt;Here's exactly what I did. You can start today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 1 — Identity&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker run keycloak&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Configure a realm, users, OAuth2 client&lt;/li&gt;
&lt;li&gt;Add MFA&lt;/li&gt;
&lt;li&gt;Build a simple login flow in your preferred language&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Week 2 — Messaging&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker run rabbitmq&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Producer/consumer app with dead-letter queue&lt;/li&gt;
&lt;li&gt;Then try Kafka, understand the difference&lt;/li&gt;
&lt;li&gt;Be able to explain when you'd choose each&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Week 3 — Data&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MongoDB and Cassandra, both on Docker&lt;/li&gt;
&lt;li&gt;CRUD API against each&lt;/li&gt;
&lt;li&gt;Design partition keys for different access patterns&lt;/li&gt;
&lt;li&gt;Try DynamoDB-compatible queries against ScyllaDB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Week 4 — Full Stack&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;docker compose&lt;/code&gt; with Supabase&lt;/li&gt;
&lt;li&gt;Build a small app using auth, database, storage&lt;/li&gt;
&lt;li&gt;Then simulate S3, SQS, DynamoDB with LocalStack&lt;/li&gt;
&lt;li&gt;Push everything to GitHub with good READMEs&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;The developer who says "I built this with Keycloak, RabbitMQ, Cassandra, and MinIO — here's my repo" is demonstrating something better than managed service familiarity.&lt;/p&gt;

&lt;p&gt;They're demonstrating that they seek understanding over convenience. That they build rather than configure wizards. That they'll know &lt;em&gt;why&lt;/em&gt; something works, not just &lt;em&gt;that&lt;/em&gt; a button exists.&lt;/p&gt;

&lt;p&gt;The cloud services you're being asked about were built on open-source concepts. Cognito implements the standards Keycloak speaks. DynamoDB evolved from the same paper as Cassandra. S3's API is so dominant MinIO cloned it.&lt;/p&gt;

&lt;p&gt;The knowledge transfers. It always does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start building. Document everything. Walk into that interview with something real.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What open-source alternative has been most useful in your career? I'm genuinely curious — drop it in the comments and I'll check it out.&lt;/em&gt;&lt;/p&gt;




</description>
      <category>opensource</category>
      <category>aws</category>
      <category>microsoft</category>
      <category>paidalternative</category>
    </item>
    <item>
      <title>I built a CLI that installs a production-ready Auth system into any NestJS project in &lt; 5 mins</title>
      <dc:creator>Mehdi Hassan Jony</dc:creator>
      <pubDate>Mon, 27 Apr 2026 03:41:26 +0000</pubDate>
      <link>https://dev.to/mehdijony/i-built-a-cli-that-installs-a-production-ready-auth-system-into-any-nestjs-project-in-5-mins-3jn</link>
      <guid>https://dev.to/mehdijony/i-built-a-cli-that-installs-a-production-ready-auth-system-into-any-nestjs-project-in-5-mins-3jn</guid>
      <description>&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5kboaym4ryztn9mwn8ky.png" alt="Image showing the contrast between 'manual auth configuration' and 'instant one-command setup'" width="799" height="436"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  The "Day One" NestJS Fatigue
&lt;/h2&gt;

&lt;p&gt;Every time I start a new NestJS project, I get a brief moment of excitement... followed by the realization that I have to build &lt;strong&gt;Auth&lt;/strong&gt; again.&lt;/p&gt;

&lt;p&gt;We’ve all been there. You spend 3 days setting up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JWT strategies and refresh token rotation.&lt;/li&gt;
&lt;li&gt;Password hashing with Bcrypt or Argon2.&lt;/li&gt;
&lt;li&gt;Passport strategies for Google/GitHub.&lt;/li&gt;
&lt;li&gt;Database schemas for Users and Roles.&lt;/li&gt;
&lt;li&gt;Docker Compose for Redis and Postgres.&lt;/li&gt;
&lt;li&gt;Swagger docs so the frontend team stops asking for endpoints.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s the same 80% of code every time. So, I decided to automate it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing &lt;code&gt;@mehdijony/nestjs-user-service&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;I built a CLI tool that doesn't just scaffold a &lt;em&gt;new&lt;/em&gt; project—it installs a complete, high-performance user management engine into your &lt;strong&gt;existing&lt;/strong&gt; project.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚡️ The 5-Minute Setup
&lt;/h3&gt;

&lt;p&gt;In your terminal, just run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @mehdijony/nestjs-user-service init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI kicks off an interactive session. It’s smart enough to detect your stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Package Manager:&lt;/strong&gt; npm, yarn, pnpm, or bun.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ORM:&lt;/strong&gt; Prisma, TypeORM, Mongoose, or Drizzle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment:&lt;/strong&gt; It reads your &lt;code&gt;.env&lt;/code&gt; and &lt;code&gt;docker-compose.yml&lt;/code&gt; to ensure zero conflicts.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠 What's under the hood?
&lt;/h2&gt;

&lt;p&gt;I didn't want this to be "just another boilerplate." It’s built for senior-level requirements:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Modular Architecture
&lt;/h3&gt;

&lt;p&gt;It generates a &lt;code&gt;src/user-service/&lt;/code&gt; directory with a clean separation of concerns. It even injects the &lt;code&gt;UserServiceModule&lt;/code&gt; into your &lt;code&gt;AppModule&lt;/code&gt; automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Multi-Driver Support
&lt;/h3&gt;

&lt;p&gt;Whether you are a &lt;strong&gt;Prisma&lt;/strong&gt; fan or a &lt;strong&gt;TypeORM&lt;/strong&gt; veteran, the CLI generates the correct entities and repositories for your chosen database (Postgres, MySQL, MongoDB, etc.).&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Safety First (The Rollback Engine)
&lt;/h3&gt;

&lt;p&gt;This is my favorite feature. Modifying source code is scary. &lt;br&gt;
Before the CLI touches a single line, it creates a &lt;strong&gt;Restore Point&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;If you don't like the result, or something goes wrong:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @mehdijony/nestjs-user-service rollback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It uninstalls the packages, deletes the generated files, and restores your &lt;code&gt;app.module.ts&lt;/code&gt; and &lt;code&gt;.env&lt;/code&gt; to their exact original state. &lt;strong&gt;Zero footprint.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Feature Checklist
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Features&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JWT, Refresh Tokens, Magic Links, OTP, Social OAuth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2FA (TOTP), RBAC, Rate Limiting, Account Lockout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Infra&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Redis Caching, BullMQ/Kafka, S3 File Uploads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DevOps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Auto-Swagger, Health Checks, Docker Compose Merge&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🚀 Why I built this
&lt;/h2&gt;

&lt;p&gt;As a Backend Engineer, I want to spend my time on &lt;strong&gt;unique business logic&lt;/strong&gt;, not re-writing the same &lt;code&gt;AuthService&lt;/code&gt; for the 10th time. This tool is for the solo dev who needs to ship fast and the agency team that wants a standardized auth foundation across all projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Give it a spin
&lt;/h3&gt;

&lt;p&gt;I'd love to get the community's feedback on this. If it saves you a few days of work, drop a star on GitHub!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NPM:&lt;/strong&gt; [&lt;a href="https://www.npmjs.com/package/@mehdijony/nestjs-user-service" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@mehdijony/nestjs-user-service&lt;/a&gt;]&lt;br&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; [&lt;a href="https://www.github.com/mehdijony/nestjs-user-service" rel="noopener noreferrer"&gt;https://www.github.com/mehdijony/nestjs-user-service&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What feature should I add next? LDAP support? SAML? Let me know in the comments!&lt;/strong&gt; 👇&lt;/p&gt;




</description>
      <category>nestjs</category>
      <category>typescript</category>
      <category>node</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How Claude Code Built My Dashboard with Almost No Effort</title>
      <dc:creator>Mehdi Hassan Jony</dc:creator>
      <pubDate>Mon, 20 Apr 2026 03:31:58 +0000</pubDate>
      <link>https://dev.to/mehdijony/how-claude-code-built-my-dashboard-with-almost-no-effort-li4</link>
      <guid>https://dev.to/mehdijony/how-claude-code-built-my-dashboard-with-almost-no-effort-li4</guid>
      <description>&lt;p&gt;I’ve built dashboards before. Usually, it means hours of structuring components, managing state, wiring APIs, and refining UI behavior.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz6kk2qoanqfg4zhu7afa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz6kk2qoanqfg4zhu7afa.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;br&gt;
This time was different.&lt;/p&gt;

&lt;p&gt;I used Claude Code and reduced the entire process to a few precise prompts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I did&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I described the system at a high level:&lt;/p&gt;

&lt;p&gt;Backend: NestJS&lt;br&gt;
Data source: APIs / database&lt;br&gt;
Frontend: dashboard with analytics, charts, and tables&lt;/p&gt;

&lt;p&gt;Then I iterated with small corrections instead of writing everything manually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What changed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;p&gt;Writing boilerplate&lt;br&gt;
Structuring folders manually&lt;br&gt;
Debugging repetitive code&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I focused on:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;System design&lt;br&gt;
Data flow&lt;br&gt;
Edge cases&lt;/p&gt;

&lt;p&gt;The AI handled:&lt;/p&gt;

&lt;p&gt;Component scaffolding&lt;br&gt;
API integration patterns&lt;br&gt;
Basic UI logic&lt;br&gt;
Where it actually helps&lt;/p&gt;

&lt;p&gt;This approach is not magic. It works well when:&lt;/p&gt;

&lt;p&gt;You already understand architecture&lt;br&gt;
You can detect wrong outputs instantly&lt;br&gt;
You guide the system with constraints&lt;/p&gt;

&lt;p&gt;Without that, it breaks quickly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What still matters&lt;/strong&gt;&lt;br&gt;
Code review is still mandatory&lt;br&gt;
Security and validation are not guaranteed&lt;br&gt;
Performance tuning still requires manual work&lt;br&gt;
Final thought&lt;/p&gt;

&lt;p&gt;The shift is real:&lt;br&gt;
Development is moving from writing code → directing code generation.&lt;/p&gt;

&lt;p&gt;Tools like Claude Code don’t replace engineers.&lt;br&gt;
They compress execution time.&lt;/p&gt;

&lt;p&gt;The bottleneck is no longer typing speed.&lt;br&gt;
It’s clarity of thought.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Most developers rely on cloud AI tools. I switched to running AI locally using Ollama.</title>
      <dc:creator>Mehdi Hassan Jony</dc:creator>
      <pubDate>Thu, 16 Apr 2026 05:07:17 +0000</pubDate>
      <link>https://dev.to/mehdijony/most-developers-rely-on-cloud-ai-tools-i-switched-to-running-ai-locally-using-ollama-3l6k</link>
      <guid>https://dev.to/mehdijony/most-developers-rely-on-cloud-ai-tools-i-switched-to-running-ai-locally-using-ollama-3l6k</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff76838fhni3ro6mnzntf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff76838fhni3ro6mnzntf.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;br&gt;
No API cost. No latency. No data exposure.&lt;/p&gt;

&lt;p&gt;I use it daily for:&lt;/p&gt;

&lt;p&gt;code generation&lt;br&gt;
debugging&lt;br&gt;
SQL queries&lt;br&gt;
documentation&lt;/p&gt;

&lt;p&gt;Full breakdown:&lt;br&gt;
&lt;a href="https://medium.com/@shoyshab/using-ollama-locally-how-it-changed-my-daily-development-workflow-9a07045dcd6c" rel="noopener noreferrer"&gt;https://medium.com/@shoyshab/using-ollama-locally-how-it-changed-my-daily-development-workflow-9a07045dcd6c&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ollama</category>
      <category>llms</category>
      <category>node</category>
    </item>
    <item>
      <title>Building a Scalable Backend Architecture with NestJS, Kafka, and PostgreSQL</title>
      <dc:creator>Mehdi Hassan Jony</dc:creator>
      <pubDate>Wed, 15 Apr 2026 09:37:03 +0000</pubDate>
      <link>https://dev.to/mehdijony/building-a-scalable-backend-architecture-with-nestjs-kafka-and-postgresql-4c20</link>
      <guid>https://dev.to/mehdijony/building-a-scalable-backend-architecture-with-nestjs-kafka-and-postgresql-4c20</guid>
      <description>&lt;p&gt;Most backend systems collapse under scale not because of traffic, but because of poor architectural decisions made early. Tight coupling, synchronous dependencies, and weak data strategies create bottlenecks that are expensive to fix later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;Typical backend issues at scale:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API latency increases under load&lt;/li&gt;
&lt;li&gt;Services become tightly coupled&lt;/li&gt;
&lt;li&gt;Failures cascade across the system&lt;/li&gt;
&lt;li&gt;Database becomes a bottleneck&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1whkhkxkkwaw4hpjy2mp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1whkhkxkkwaw4hpjy2mp.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;

&lt;p&gt;An event-driven microservices architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API Gateway (NestJS)&lt;/li&gt;
&lt;li&gt;Microservices (NestJS)&lt;/li&gt;
&lt;li&gt;Kafka (message broker)&lt;/li&gt;
&lt;li&gt;PostgreSQL (database)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Client hits API Gateway&lt;/li&gt;
&lt;li&gt;Event is produced&lt;/li&gt;
&lt;li&gt;Kafka distributes it&lt;/li&gt;
&lt;li&gt;Consumers process independently&lt;/li&gt;
&lt;li&gt;Data persists&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why This Stack
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;NestJS&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modular architecture&lt;/li&gt;
&lt;li&gt;Dependency injection&lt;/li&gt;
&lt;li&gt;Scalable structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Kafka&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High-throughput messaging&lt;/li&gt;
&lt;li&gt;Decouples services&lt;/li&gt;
&lt;li&gt;Enables async workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Strong consistency&lt;/li&gt;
&lt;li&gt;Reliable transactions&lt;/li&gt;
&lt;li&gt;Powerful querying&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Event-Driven Communication
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Producer:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;kafkaClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;order_created&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Consumer:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;MessagePattern&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;order_created&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// process event&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Key Strategies
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Failure Handling&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Retry with backoff&lt;/li&gt;
&lt;li&gt;Dead Letter Queues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Idempotency&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Track processed events&lt;/li&gt;
&lt;li&gt;Prevent duplication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Scaling&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Horizontal scaling for consumers&lt;/li&gt;
&lt;li&gt;Read replicas for DB&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real-World Use Case
&lt;/h2&gt;

&lt;p&gt;In systems like logistics or trading platforms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Orders trigger multiple services&lt;/li&gt;
&lt;li&gt;Payments, inventory, notifications run independently&lt;/li&gt;
&lt;li&gt;Failures don’t block the system&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Design async-first&lt;/li&gt;
&lt;li&gt;Avoid tight coupling&lt;/li&gt;
&lt;li&gt;Plan for failure&lt;/li&gt;
&lt;li&gt;Scale consumers, not just APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Full Article
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://medium.com/@shoyshab/building-a-scalable-backend-architecture-with-nestjs-kafka-and-postgresql-ae938465b39b" rel="noopener noreferrer"&gt;https://medium.com/@shoyshab/building-a-scalable-backend-architecture-with-nestjs-kafka-and-postgresql-ae938465b39b&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nestjs</category>
      <category>microservices</category>
      <category>backenddevelopment</category>
      <category>postgres</category>
    </item>
  </channel>
</rss>
