<?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: Wael Rabadi</title>
    <description>The latest articles on DEV Community by Wael Rabadi (@wrabadinf).</description>
    <link>https://dev.to/wrabadinf</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3731683%2Fd16d33a4-4388-493f-a180-5e25e8b4257c.png</url>
      <title>DEV Community: Wael Rabadi</title>
      <link>https://dev.to/wrabadinf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wrabadinf"/>
    <language>en</language>
    <item>
      <title>Simplifying Local Development for Distributed Systems. Consider the value a tool like NDL can provide

https://nuewframe.dev/blog/introducing-ndl-simplifying-distributed-systems-local-development</title>
      <dc:creator>Wael Rabadi</dc:creator>
      <pubDate>Wed, 28 Jan 2026 00:10:50 +0000</pubDate>
      <link>https://dev.to/wrabadinf/simplifying-local-development-for-distributed-systems-consider-the-value-a-tool-like-ndl-can-3fp0</link>
      <guid>https://dev.to/wrabadinf/simplifying-local-development-for-distributed-systems-consider-the-value-a-tool-like-ndl-can-3fp0</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://nuewframe.dev/blog/introducing-ndl-simplifying-distributed-systems-local-development/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnuewframe.dev%2F_astro%2Fblog-placeholder-1.Bx0Zcyzv.jpg" height="400" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://nuewframe.dev/blog/introducing-ndl-simplifying-distributed-systems-local-development/" rel="noopener noreferrer" class="c-link"&gt;
            Introducing NDL: Simplifying Local Development for Distributed Systems
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            NDL brings production primitives into local development—starting with DNS-based service names, gateway routing, discovery, and centralized config—and it's designed to be extensible as new primitives are added.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnuewframe.dev%2Ffavicon.svg" width="128" height="128"&gt;
          nuewframe.dev
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Your Local Environment Tests a Different System Than Production</title>
      <dc:creator>Wael Rabadi</dc:creator>
      <pubDate>Sun, 25 Jan 2026 18:13:22 +0000</pubDate>
      <link>https://dev.to/nuewframe/your-local-environment-tests-a-different-system-than-production-4ib1</link>
      <guid>https://dev.to/nuewframe/your-local-environment-tests-a-different-system-than-production-4ib1</guid>
      <description>&lt;p&gt;&lt;em&gt;Why "works on my machine" keeps happening—and what we're building to fix it.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;You've seen this before:&lt;/p&gt;

&lt;p&gt;Your multi-service app works perfectly locally. All services talk to each other, tests pass, everything's green. You push to CI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CI fails.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Or staging breaks. Or production returns 404s on routes that worked fine on your laptop.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: localhost Isn't Production
&lt;/h2&gt;

&lt;p&gt;Here's what you're actually testing locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Your local code&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;API_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:3001&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;API_URL&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/users`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Direct call, root path&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's what runs in production:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Same code, different environment&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;API_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;API_URL&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/users`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Through gateway, with /api prefix, auth headers&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Different calling patterns. Different routing. Different configuration.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You didn't test the wrong code. You tested code running in the wrong environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Missing: Production Primitives
&lt;/h2&gt;

&lt;p&gt;Production has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DNS-based service names&lt;/strong&gt; - Services call &lt;code&gt;api.internal&lt;/code&gt;, not &lt;code&gt;localhost:3001&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gateway routing&lt;/strong&gt; - Single entrypoint, path-based routing, header injection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service discovery&lt;/strong&gt; - Services find each other by name, not hardcoded ports&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Centralized config&lt;/strong&gt; - One source of truth, not scattered &lt;code&gt;.env&lt;/code&gt; files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Local development has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Port hunting (&lt;code&gt;localhost:3000&lt;/code&gt;, &lt;code&gt;3001&lt;/code&gt;, &lt;code&gt;3002&lt;/code&gt;...)&lt;/li&gt;
&lt;li&gt;Direct service calls (no gateway)&lt;/li&gt;
&lt;li&gt;Hardcoded URLs everywhere&lt;/li&gt;
&lt;li&gt;Configuration drift across machines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;This gap is why integration bugs show up late.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing NDL
&lt;/h2&gt;

&lt;p&gt;We're building &lt;strong&gt;NDL&lt;/strong&gt; (Nuewframe Development Library) to bring production primitives to local development:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Declare your service&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1alpha1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;workingDirectory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./api"&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;npm&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;start"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;PORT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{.Service.Port}}"&lt;/span&gt;
  &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3001&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then interact by service name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ndl apply &lt;span class="nt"&gt;-f&lt;/span&gt; manifest.yaml

&lt;span class="c"&gt;# Call by DNS name (not localhost)&lt;/span&gt;
curl http://api.default.ndl.test:18400/users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your frontend code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Same pattern locally AND in production&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;API_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;API_URL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// http://api.default.ndl.test:18400&lt;/span&gt;
&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;API_URL&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/users`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Key Ideas
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. DNS-based service names&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Stop calling &lt;code&gt;localhost:3001&lt;/code&gt;. Start using &lt;code&gt;api.myapp.ndl.test&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Gateway routing&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Test path prefixes, header injection, and routing rules locally—before they break in staging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Service discovery&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Services find each other by name. No more hardcoded ports.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Polyglot support&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Same workflow for Node.js, .NET, Python, Go, Java. Just change the &lt;code&gt;command&lt;/code&gt; line.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. No Kubernetes required&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Uses Kubernetes architectural patterns (declarative manifests, reconciliation, operators) without needing a cluster. 50MB vs 4GB, 2s startup vs 90s.&lt;/p&gt;

&lt;h2&gt;
  
  
  See It in Action
&lt;/h2&gt;

&lt;p&gt;We've published two demos showing NDL with real apps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demo 1: Simple Service (2 min)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Basic "hello world" showing DNS routing and gateway access.&lt;/p&gt;

&lt;p&gt;🎥 &lt;a href="https://www.youtube.com/watch?v=IR_h8C5rCBo" rel="noopener noreferrer"&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demo 2: .NET Multi-Service App (5 min)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Real distributed system: API + frontend + database + centralized config.&lt;/p&gt;

&lt;p&gt;🎥 &lt;a href="https://www.youtube.com/watch?v=ZbRKeSjjE-A" rel="noopener noreferrer"&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the Full Story
&lt;/h2&gt;

&lt;p&gt;I've written a comprehensive introduction covering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why local dev loses validation&lt;/li&gt;
&lt;li&gt;The primitives production has (that local dev doesn't)&lt;/li&gt;
&lt;li&gt;How NDL works (without becoming "Kubernetes on your laptop")&lt;/li&gt;
&lt;li&gt;Who it's for (and when it's not the right fit)&lt;/li&gt;
&lt;li&gt;The architectural approach (declarative, event-driven, extensible)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📖 &lt;strong&gt;&lt;a href="https://nuewframe.dev/blog/introducing-ndl-simplifying-distributed-systems-local-development" rel="noopener noreferrer"&gt;Read: Introducing NDL - Simplifying Local Development for Distributed Systems&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Early Access
&lt;/h2&gt;

&lt;p&gt;NDL is in early access (public GitHub release coming March 2026). We're gathering feedback from developers and teams building distributed systems locally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we're looking for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Teams feeling the pain of config drift and late integration failures&lt;/li&gt;
&lt;li&gt;Polyglot environments (Node + .NET + Python + Go)&lt;/li&gt;
&lt;li&gt;Platform engineers standardizing local dev across teams&lt;/li&gt;
&lt;li&gt;Anyone tired of "works on my machine" onboarding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What you'll get:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Early access to NDL before public release&lt;/li&gt;
&lt;li&gt;Direct input on roadmap and features&lt;/li&gt;
&lt;li&gt;Support for getting set up with your specific stack&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://docs.google.com/forms/d/e/1FAIpQLSdVdALnzdsN_XKbPfMkFaaeIbj8ITDraBPvuc82ZBwjxlWsSg/viewform?usp=sharing&amp;amp;ouid=110150521967619277950" rel="noopener noreferrer"&gt;Join the early access waitlist →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you sign up, let us know what problem you're hoping NDL will help you solve. That feedback directly shapes what we build.&lt;/p&gt;




&lt;h2&gt;
  
  
  Questions I'm Expecting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"How is this different from Docker Compose?"&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Docker Compose orchestrates containers. NDL brings production primitives (DNS, gateway, discovery) to local dev—whether you use containers or not. Many teams use both: Compose for databases/infra, NDL for app services. I'll be posting a detailed comparison next week.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Do I need Kubernetes knowledge?"&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No. NDL uses Kubernetes &lt;em&gt;architectural patterns&lt;/em&gt; (declarative manifests, reconciliation) but doesn't require a cluster. If you can write YAML, you can use NDL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"What languages/runtimes are supported?"&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Node.js, Deno, .NET, Python, Go, Java—anything that runs on your laptop. The manifest just changes the &lt;code&gt;command&lt;/code&gt; line. I'll be posting a polyglot guide showing Node + .NET + Python + Go in one system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Can I use this with existing projects?"&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes. NDL works with new and existing projects. Start by adding a manifest to your main service, then expand to dependencies incrementally.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Coming next on Dev.to:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NDL vs Docker Compose (detailed comparison)&lt;/li&gt;
&lt;li&gt;.NET Microservices Tutorial&lt;/li&gt;
&lt;li&gt;Polyglot Guide (Node, .NET, Python, Go—one manifest)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Follow me here or on &lt;a href="https://twitter.com/nuewframe" rel="noopener noreferrer"&gt;Twitter/X&lt;/a&gt; for updates.&lt;/p&gt;

</description>
      <category>developers</category>
      <category>distributedsystems</category>
      <category>microservices</category>
      <category>kubernetes</category>
    </item>
  </channel>
</rss>
