<?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>Navigating Xianyu: A Developer’s Guide to Buying Used Hardware in China without Getting Scammed</title>
      <dc:creator>Mehdi Hassan Jony</dc:creator>
      <pubDate>Mon, 26 Oct 2026 06:03:01 +0000</pubDate>
      <link>https://dev.to/mehdijony/navigating-xianyu-a-developers-guide-to-buying-used-hardware-in-china-without-getting-scammed-1183</link>
      <guid>https://dev.to/mehdijony/navigating-xianyu-a-developers-guide-to-buying-used-hardware-in-china-without-getting-scammed-1183</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%2Fvp26z6k1rn0nb6wnf20e.jpg" 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%2Fvp26z6k1rn0nb6wnf20e.jpg" alt=" " width="799" height="436"&gt;&lt;/a&gt;&lt;br&gt;
If you live in China or shop through consolidation proxies, &lt;strong&gt;Xianyu (咸鱼 - "Idle Fish")&lt;/strong&gt;—Taobao’s C2C second-hand marketplace—is a goldmine for tech bargains. From dirt-cheap RTX 3060 12GB cards to budget desktop platforms, the deals can look irresistible.&lt;/p&gt;

&lt;p&gt;However, Xianyu is also a wild frontier of e-waste recycling, modified vBIOS cards, and predatory commercial resellers disguised as personal sellers.&lt;/p&gt;

&lt;p&gt;Whether you are building a budget local AI workstation for &lt;strong&gt;ComfyUI / LLMs&lt;/strong&gt; or assembling a &lt;strong&gt;1440p gaming rig&lt;/strong&gt;, here is how to navigate China’s second-hand PC ecosystem, spot common fraud scripts, and extract real value.&lt;/p&gt;


&lt;h2&gt;
  
  
  Part 1: Anatomy of a Xianyu Scam
&lt;/h2&gt;

&lt;p&gt;Commercial second-hand dealers (&lt;em&gt;“工作室”&lt;/em&gt; or &lt;em&gt;“二手贩子”&lt;/em&gt;) flood Xianyu with copy-pasted listings designed to deceive non-technical buyers. Understanding their tactics is essential to avoiding them.&lt;/p&gt;
&lt;h3&gt;
  
  
  Scam Trap #1: The "12-Core Flagship" E-Waste Machine
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Copy:&lt;/strong&gt; &lt;em&gt;"Intel 12-Core 24-Thread, turbo locked to 3.5GHz, crushes 10th-gen i5s."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Reality:&lt;/strong&gt; This is almost always a decade-old server CPU (such as an &lt;strong&gt;Intel Xeon E5-2678 v3 / E5-2673 v3&lt;/strong&gt;) paired with a cheap, recycled Chinese motherboard (Huananzhi/Jingyue X99) and slow DDR3 server RAM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it fails:&lt;/strong&gt; While 24 threads sound impressive for multi-tasking, the single-core IPC (instructions per cycle) is abysmal. Modern AI frameworks (like PyTorch and ComfyUI) and modern game engines rely heavily on single-core throughput for tokenization and model loading.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+-----------------------------------------------------------------------+
| SCAM LISTING CHECKLIST (AVOID AT ALL COSTS)                           |
+-----------------------------------------------------------------------+
| [x] "英特尔12核24线程" (Intel 12-core 24-thread)                     |
| [x] "性能碾压i7" (Performance crushes i7)                             |
| [x] "华硕雪豹 8G" or "对标3060Ti" (Claiming ancient cards match 3060Ti) |
| [x] "工作室挂机 / 准备直播带货亏本转让" (Bought for livestreaming loss)  |
| [x] "跑分190万" (Manipulated LuDaShi benchmark scores)                 |
+-----------------------------------------------------------------------+

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Scam Trap #2: The "Asus Snow Leopard / RX 580 8GB" GPU Illusion
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Copy:&lt;/strong&gt; &lt;em&gt;"ASUS Snow Leopard 8GB! Outperforms RX 580, matches RTX 3060 Ti!"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Reality:&lt;/strong&gt; In China's second-hand market, "Snow Leopard 8G" (&lt;em&gt;雪豹 8G&lt;/em&gt;) usually refers to heavily mined RX 470/480/570 cards re-flashed with modified vBIOS files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it fails for AI:&lt;/strong&gt; Older AMD Polaris architecture (GCN 4) has no native ROCm support on modern software and lacks CUDA completely. Trying to run AI video generation tools (like AnimateDiff, LTX-Video, or Wan) on an RX 580 results in direct fallback crashes or hours-long render times.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Scam Trap #3: "Bait-and-Switch" Barebones Pricing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Copy:&lt;/strong&gt; &lt;em&gt;"i5 14400F + B760 motherboard, ocean view case — Only 1,199 RMB!"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Reality:&lt;/strong&gt; Physical computer shops (&lt;em&gt;实体店&lt;/em&gt;) list incomplete systems or Engineering Sample (ES/QS) CPUs at impossibly low prices to generate leads. Once you message them, they reveal the price excludes RAM, SSD, and GPU, or requires buying overpriced bundled parts.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Part 2: Buying for AI vs. Gaming on Xianyu
&lt;/h2&gt;

&lt;p&gt;Hardware requirements differ significantly depending on your primary target workload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                  +-----------------------------------+
                  |      YOUR MAIN WORKLOAD           |
                  +-----------------+-----------------+
                                    |
            +-----------------------+-----------------------+
            |                                               |
            v                                               v
  [ LOCAL AI WORKLOADS ]                          [ GAMING WORKLOADS ]
  (ComfyUI, LLMs, Diffusion)                     (1080p / 1440p Raster)
  * Priority: CUDA &amp;amp; VRAM Capacity                * Priority: Raster &amp;amp; Bandwidth
  * Minimum: 6GB VRAM (8GB+ ideal)                * Flexible: NVIDIA or AMD
  * Architecture: RTX 20/30/40 Series             * Architecture: GTX 1660S, RX 6600
  * Hardware Requirement: NVIDIA CUDA             * Platform: Intel / AMD Consumer

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1. Requirements for AI (LLMs, ComfyUI, Image &amp;amp; Video Generation)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NVIDIA is mandatory:&lt;/strong&gt; AMD cards can technically run PyTorch via ROCm on Linux, but the developer ecosystem, custom nodes, FlashAttention kernels, and xFormers rely natively on &lt;strong&gt;NVIDIA CUDA&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VRAM Is King:&lt;/strong&gt; Model parameters must fit directly into GPU memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Absolute Minimum:&lt;/strong&gt; 6GB VRAM (GTX 1660 Super / RTX 2060 6GB) for basic 512x512 SD1.5 generation.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sweet Spot Budget:&lt;/strong&gt; 12GB VRAM (&lt;strong&gt;RTX 3060 12GB&lt;/strong&gt;) or 16GB VRAM (&lt;strong&gt;RTX 4060 Ti 16GB / RTX 3090 24GB&lt;/strong&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;System RAM:&lt;/strong&gt; Aim for &lt;strong&gt;32GB DDR4/DDR5&lt;/strong&gt;. When VRAM spills over during large model initialization, low system RAM causes immediate out-of-memory crashes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Requirements for Pure Gaming
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AMD is Viable:&lt;/strong&gt; Cards like the &lt;strong&gt;RX 6600 8GB&lt;/strong&gt; (~800–900 RMB on Xianyu) or &lt;strong&gt;RX 6700 XT 12GB&lt;/strong&gt; offer higher raw rasterization frame rates per RMB than equivalent NVIDIA cards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CPU Focus:&lt;/strong&gt; Prioritize higher single-core boost clock CPUs (e.g., &lt;strong&gt;Intel Core i3-12100F / i5-10400F&lt;/strong&gt; or &lt;strong&gt;AMD Ryzen 5 5600&lt;/strong&gt;) over high core-count server chips.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Part 3: Golden Rules &amp;amp; Inspection Strategy
&lt;/h2&gt;

&lt;p&gt;When purchasing hardware on Xianyu, follow this strict checklist to guarantee a smooth transaction:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;              +-----------------------------------------------+
              |            XIANYU BUYING PIPELINE             |
              +-----------------------------------------------+
                                      |
            +-------------------------+-------------------------+
            | Step 1: Seller Audit    | Zhima Credit (优秀/极好) |
            |                         | No bulk merchant scripts|
            +-------------------------+-------------------------+
                                      |
            +-------------------------+-------------------------+
            | Step 2: Request Proof   | FurMark + GPU-Z Video   |
            |                         | Match Serial Numbers    |
            +-------------------------+-------------------------+
                                      |
            +-------------------------+-------------------------+
            | Step 3: Unboxing Test   | Continuous video recording|
            |                         | Benchmarks before sign  |
            +-------------------------+-------------------------+

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1. Check Zhima Credit &amp;amp; Seller Profile (&lt;em&gt;芝麻信用&lt;/em&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Filter for High Credit:&lt;/strong&gt; Only transact with sellers marked as &lt;strong&gt;"Zhima Credit Excellent" (芝麻信用优秀)&lt;/strong&gt; or &lt;strong&gt;"Outstanding" (芝麻信用极好)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid Bulk Sellers:&lt;/strong&gt; Click on the seller’s avatar. If they have 20 identical listings for "office liquidation PCs" (&lt;em&gt;工作室退役&lt;/em&gt;), pass immediately. Look for individual personal sellers (&lt;em&gt;个人自用&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Request Live Stress-Test Videos Before Shipping
&lt;/h3&gt;

&lt;p&gt;Never accept static photos of hardware. Message the seller and ask for a unified video showing:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;GPU-Z Validation:&lt;/strong&gt; Verifying official lookup parameters, memory type, and stock vBIOS version.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FurMark / 3DMark Run:&lt;/strong&gt; At least 10–15 minutes of continuous load displaying stable core temperatures (&amp;lt;80°C) and hot-spot/VRAM temperatures (&amp;lt;95°C).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serial Number Verification:&lt;/strong&gt; Showing the SN on the GPU PCB matching the outer box (if available).&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3. Record the Unboxing &amp;amp; Benchmarking
&lt;/h3&gt;

&lt;p&gt;When your courier package arrives (usually via &lt;strong&gt;SF Express / 顺丰速运&lt;/strong&gt; or &lt;strong&gt;JD Express / 京东快递&lt;/strong&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Record a continuous, unedited video opening the package, checking for physical PCB damage or missing components.&lt;/li&gt;
&lt;li&gt;Install the hardware, run &lt;strong&gt;GPU-Z&lt;/strong&gt; and &lt;strong&gt;FurMark&lt;/strong&gt; on your own rig, and verify stability &lt;em&gt;before&lt;/em&gt; clicking &lt;strong&gt;"Confirm Receipt" (确认收货)&lt;/strong&gt; on Xianyu. Once confirmed, escrow funds are released to the seller, making disputes significantly harder.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Summary Reference Table: Realistic Second-Hand Pricing
&lt;/h2&gt;

&lt;p&gt;Use this baseline table to evaluate whether a Xianyu listing is priced fairly or inflated by shop margins:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target GPU / System Spec&lt;/th&gt;
&lt;th&gt;Typical Xianyu Price Range (RMB)&lt;/th&gt;
&lt;th&gt;Recommended Workload&lt;/th&gt;
&lt;th&gt;AI Viability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GTX 1660 Super 6GB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;450 – 580 RMB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Budget 1080p Gaming / Entry AI&lt;/td&gt;
&lt;td&gt;Basic SD1.5 / Small Models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RTX 2060 6GB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;650 – 750 RMB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1080p Gaming / Budget CUDA&lt;/td&gt;
&lt;td&gt;Tensor Accelerated SD / ComfyUI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RTX 3060 12GB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1,300 – 1,550 RMB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Mid-Range AI Workstation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Excellent (12GB VRAM Sweetspot)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Complete System:&lt;/strong&gt; i3-12100F + GTX 1660S&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1,400 – 1,700 RMB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Complete Budget Entry PC&lt;/td&gt;
&lt;td&gt;Stable Starter AI Workstation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Complete System:&lt;/strong&gt; i5-12400F + RTX 3060 12G&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2,500 – 2,900 RMB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Complete Mid-Tier PC&lt;/td&gt;
&lt;td&gt;High-Performance Local AI Setup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Key Takeaway
&lt;/h3&gt;

&lt;p&gt;Cheap second-hand hardware is one of the best ways to get started with local machine learning and gaming. However, &lt;strong&gt;never trade architectural compatibility for raw core counts&lt;/strong&gt;. Stick to verified consumer platforms (Intel 10th Gen+, AMD Ryzen, and NVIDIA RTX cards), enforce technical verification via video proof, and buy strictly through escrow-protected platforms.&lt;/p&gt;

</description>
      <category>secondhandpc</category>
      <category>ai</category>
      <category>gamingpc</category>
      <category>xianyu</category>
    </item>
    <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>
