<?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: Abdalla Emad</title>
    <description>The latest articles on DEV Community by Abdalla Emad (@abdalla_emad_335fff40f342).</description>
    <link>https://dev.to/abdalla_emad_335fff40f342</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%2F3828300%2F1579b53c-5b0b-4f53-bc47-fb8c24f3b2b3.jpg</url>
      <title>DEV Community: Abdalla Emad</title>
      <link>https://dev.to/abdalla_emad_335fff40f342</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abdalla_emad_335fff40f342"/>
    <language>en</language>
    <item>
      <title>Your API Docs Look Good — But AI Still Can’t Use Them</title>
      <dc:creator>Abdalla Emad</dc:creator>
      <pubDate>Sun, 26 Apr 2026 04:58:36 +0000</pubDate>
      <link>https://dev.to/abdalla_emad_335fff40f342/your-api-docs-look-good-but-ai-still-cant-use-them-2go2</link>
      <guid>https://dev.to/abdalla_emad_335fff40f342/your-api-docs-look-good-but-ai-still-cant-use-them-2go2</guid>
      <description>&lt;p&gt;Most API docs today are beautifully designed.&lt;/p&gt;

&lt;p&gt;Clean UI.&lt;br&gt;
Search works.&lt;br&gt;
Examples are there.&lt;/p&gt;

&lt;p&gt;And yet…&lt;/p&gt;

&lt;p&gt;Ask an AI assistant to integrate your API, and everything breaks down.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hidden Problem With Modern Docs
&lt;/h2&gt;

&lt;p&gt;Tools like Swagger UI and other documentation platforms solved one problem really well:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Making APIs readable for humans.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But they completely ignored a new one:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Making APIs usable for AI.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That gap is starting to hurt.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Real Scenario
&lt;/h2&gt;

&lt;p&gt;You have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A solid OpenAPI spec&lt;/li&gt;
&lt;li&gt;Hosted docs&lt;/li&gt;
&lt;li&gt;Authentication explained&lt;/li&gt;
&lt;li&gt;Endpoints documented&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now you try this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Use this API to create a user, handle errors, and retry if needed.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What happens?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The AI guesses missing details&lt;/li&gt;
&lt;li&gt;It misinterprets fields&lt;/li&gt;
&lt;li&gt;It skips edge cases&lt;/li&gt;
&lt;li&gt;Or just asks you to clarify everything&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not because your API is bad.&lt;/p&gt;

&lt;p&gt;Because your docs are &lt;strong&gt;not structured for understanding&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Docs Today Are Passive
&lt;/h2&gt;

&lt;p&gt;Most documentation is still:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Static pages&lt;/li&gt;
&lt;li&gt;Built for browsing&lt;/li&gt;
&lt;li&gt;Designed for humans only&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even when generated from OpenAPI, the output is just a visual layer.&lt;/p&gt;

&lt;p&gt;There’s no:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Context awareness&lt;/li&gt;
&lt;li&gt;Queryable interface&lt;/li&gt;
&lt;li&gt;Machine-level interaction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So AI tools treat your API like an incomplete dataset.&lt;/p&gt;




&lt;h2&gt;
  
  
  What AI Actually Needs From Docs
&lt;/h2&gt;

&lt;p&gt;For AI to reliably work with your API, docs need to be:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Structured Beyond Rendering
&lt;/h3&gt;

&lt;p&gt;Not just:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Titles&lt;/li&gt;
&lt;li&gt;Tables&lt;/li&gt;
&lt;li&gt;Examples&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But something that can be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parsed deeply&lt;/li&gt;
&lt;li&gt;Queried dynamically&lt;/li&gt;
&lt;li&gt;Understood in context&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. Interactive
&lt;/h3&gt;

&lt;p&gt;Instead of scrolling and guessing, developers (and AI) should be able to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask questions&lt;/li&gt;
&lt;li&gt;Get precise answers&lt;/li&gt;
&lt;li&gt;Explore flows, not just endpoints&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. Always Up to Date
&lt;/h3&gt;

&lt;p&gt;Outdated docs = broken integrations.&lt;/p&gt;

&lt;p&gt;The system needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Source-of-truth syncing&lt;/li&gt;
&lt;li&gt;Version control&lt;/li&gt;
&lt;li&gt;Zero manual edits&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. Programmatically Accessible
&lt;/h3&gt;

&lt;p&gt;If your docs can’t be accessed by tools, they’re a dead end.&lt;/p&gt;

&lt;p&gt;AI systems need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Direct interfaces&lt;/li&gt;
&lt;li&gt;Structured access&lt;/li&gt;
&lt;li&gt;Real-time context&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What We Built: Outworx Docs
&lt;/h2&gt;

&lt;p&gt;Outworx Docs is built around a simple idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your API docs should work for AI as well as they work for humans.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of just rendering your spec, it turns it into an &lt;strong&gt;interactive system&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Here’s how it works:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Upload your OpenAPI, Swagger, or GraphQL spec&lt;/li&gt;
&lt;li&gt;Instantly get a hosted documentation site&lt;/li&gt;
&lt;li&gt;Add your branding and custom domain&lt;/li&gt;
&lt;li&gt;Keep everything in sync with GitHub&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the real difference is what happens &lt;em&gt;after&lt;/em&gt; that:&lt;/p&gt;




&lt;h3&gt;
  
  
  AI Chat That Understands Your API
&lt;/h3&gt;

&lt;p&gt;Not a generic chatbot.&lt;/p&gt;

&lt;p&gt;It’s trained directly on your spec.&lt;/p&gt;

&lt;p&gt;You can ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“How do I handle pagination?”&lt;/li&gt;
&lt;li&gt;“What errors can this endpoint return?”&lt;/li&gt;
&lt;li&gt;“Show me a full integration flow”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And get answers based on your actual API.&lt;/p&gt;




&lt;h3&gt;
  
  
  Per-Project MCP Server
&lt;/h3&gt;

&lt;p&gt;Each project exposes a structured interface that tools can interact with.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI assistants can query your API definition directly&lt;/li&gt;
&lt;li&gt;Internal tools can integrate without scraping docs&lt;/li&gt;
&lt;li&gt;Your API becomes machine-readable in a real way&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Multi-Version Without Chaos
&lt;/h3&gt;

&lt;p&gt;Versioning is built in.&lt;/p&gt;

&lt;p&gt;So:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Old integrations don’t break&lt;/li&gt;
&lt;li&gt;Teams can navigate changes clearly&lt;/li&gt;
&lt;li&gt;AI tools can reference the correct version&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  GitHub Auto Sync
&lt;/h3&gt;

&lt;p&gt;Your docs stay aligned with your code.&lt;/p&gt;

&lt;p&gt;No manual updates.&lt;br&gt;
No outdated endpoints.&lt;br&gt;
No confusion.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Shift Is Already Happening
&lt;/h2&gt;

&lt;p&gt;Developers are no longer the only consumers of API docs.&lt;/p&gt;

&lt;p&gt;AI tools are now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reading them&lt;/li&gt;
&lt;li&gt;Generating code from them&lt;/li&gt;
&lt;li&gt;Making decisions based on them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your docs don’t support that, you’re introducing friction without realizing it.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Quick Test
&lt;/h2&gt;

&lt;p&gt;Try this with your current docs:&lt;/p&gt;

&lt;p&gt;Ask an AI tool:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Integrate this API fully, including error handling and edge cases.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the result isn’t reliable, the issue isn’t the AI.&lt;/p&gt;

&lt;p&gt;It’s the docs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;We’re moving from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Docs as a reference&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Docs as infrastructure&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And most tools haven’t caught up yet.&lt;/p&gt;

&lt;p&gt;Outworx Docs is built for that shift.&lt;/p&gt;




&lt;p&gt;If you're curious, you can check it out here:&lt;br&gt;
👉 &lt;a href="https://docs.outworx.io" rel="noopener noreferrer"&gt;https://docs.outworx.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Would love to hear how you're handling API docs today—and whether AI is part of your workflow yet.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>backend</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Sharing State Across Packages and Apps in a React Monorepo (Web + Mobile)</title>
      <dc:creator>Abdalla Emad</dc:creator>
      <pubDate>Tue, 17 Mar 2026 01:20:33 +0000</pubDate>
      <link>https://dev.to/abdalla_emad_335fff40f342/sharing-state-across-packages-and-apps-in-a-react-monorepo-web-mobile-4gak</link>
      <guid>https://dev.to/abdalla_emad_335fff40f342/sharing-state-across-packages-and-apps-in-a-react-monorepo-web-mobile-4gak</guid>
      <description>&lt;h1&gt;
  
  
  Article
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;If you're building a modern app, chances are you’re not just building one thing.&lt;/p&gt;

&lt;p&gt;You might have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a web app (Next.js)&lt;/li&gt;
&lt;li&gt;a mobile app (React Native)&lt;/li&gt;
&lt;li&gt;shared UI packages&lt;/li&gt;
&lt;li&gt;multiple internal modules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And if you're using a monorepo (with tools like Turborepo, Nx, or Lerna), you’ll quickly run into this problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do you share state across packages… and across apps?&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Real Problem
&lt;/h2&gt;

&lt;p&gt;Sharing state inside a single React app is easy.&lt;/p&gt;

&lt;p&gt;Sharing it across:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;packages&lt;/li&gt;
&lt;li&gt;apps&lt;/li&gt;
&lt;li&gt;platforms (web + mobile)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;is where things break down.&lt;/p&gt;

&lt;p&gt;You start dealing with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;duplicated stores&lt;/li&gt;
&lt;li&gt;inconsistent state&lt;/li&gt;
&lt;li&gt;complex syncing logic&lt;/li&gt;
&lt;li&gt;unnecessary API calls&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Approaches (and Their Limits)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prop drilling / Context
&lt;/h3&gt;

&lt;p&gt;Only works inside one React tree.&lt;/p&gt;




&lt;h3&gt;
  
  
  Shared packages
&lt;/h3&gt;

&lt;p&gt;You can move state into a shared package…&lt;br&gt;
but now everything is tightly coupled.&lt;/p&gt;


&lt;h3&gt;
  
  
  Redux / Zustand across apps
&lt;/h3&gt;

&lt;p&gt;Tools like Redux Toolkit or Zustand work great inside a single app.&lt;/p&gt;

&lt;p&gt;But across packages and apps?&lt;/p&gt;

&lt;p&gt;You end up writing a lot of glue code.&lt;/p&gt;


&lt;h3&gt;
  
  
  APIs for syncing state
&lt;/h3&gt;

&lt;p&gt;Works… but:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;adds latency&lt;/li&gt;
&lt;li&gt;increases complexity&lt;/li&gt;
&lt;li&gt;feels like overkill for local state&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  What We Actually Want
&lt;/h2&gt;

&lt;p&gt;Something like this:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getBridge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;auth&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;any package&lt;/li&gt;
&lt;li&gt;any app&lt;/li&gt;
&lt;li&gt;web or mobile&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same state. Same source of truth.&lt;/p&gt;




&lt;h2&gt;
  
  
  Introducing &lt;code&gt;shared-state-bridge&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;shared-state-bridge&lt;/strong&gt; to solve this exact problem.&lt;/p&gt;

&lt;p&gt;It’s a &lt;strong&gt;cross-package + cross-app state store&lt;/strong&gt; for React monorepos.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Makes It Different
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Share state across packages
&lt;/h3&gt;

&lt;p&gt;Create a named store once:&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="nf"&gt;createBridge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;auth&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;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Access it anywhere:&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="nf"&gt;getBridge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;auth&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No prop drilling. No wiring.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Share state across apps (Web + Mobile)
&lt;/h3&gt;

&lt;p&gt;This is where it gets powerful.&lt;/p&gt;

&lt;p&gt;You can sync state between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js apps&lt;/li&gt;
&lt;li&gt;React Native apps&lt;/li&gt;
&lt;li&gt;multiple clients&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using built-in &lt;strong&gt;WebSocket sync&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;login state shared between web and mobile&lt;/li&gt;
&lt;li&gt;real-time updates across apps&lt;/li&gt;
&lt;li&gt;consistent user experience everywhere&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. React 18 optimized
&lt;/h3&gt;

&lt;p&gt;Uses &lt;code&gt;useSyncExternalStore&lt;/code&gt; for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fine-grained updates&lt;/li&gt;
&lt;li&gt;minimal re-renders&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. Persistence built-in
&lt;/h3&gt;

&lt;p&gt;Works out of the box with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;localStorage (web)&lt;/li&gt;
&lt;li&gt;AsyncStorage (React Native)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. Tiny and dependency-free
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;~1.2 KB core&lt;/li&gt;
&lt;li&gt;zero dependencies&lt;/li&gt;
&lt;li&gt;fully tree-shakeable&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  6. Full TypeScript support
&lt;/h3&gt;

&lt;p&gt;Everything is typed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;state&lt;/li&gt;
&lt;li&gt;setters&lt;/li&gt;
&lt;li&gt;selectors&lt;/li&gt;
&lt;li&gt;plugins&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Modern apps are no longer single-platform.&lt;/p&gt;

&lt;p&gt;You’re building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;web + mobile&lt;/li&gt;
&lt;li&gt;multiple frontends&lt;/li&gt;
&lt;li&gt;shared ecosystems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And state becomes fragmented across:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;apps&lt;/li&gt;
&lt;li&gt;packages&lt;/li&gt;
&lt;li&gt;environments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;shared-state-bridge&lt;/code&gt; gives you:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;One shared state layer across everything.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  How It Works (Conceptually)
&lt;/h2&gt;

&lt;p&gt;Each state is registered globally by name:&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="nf"&gt;createBridge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;auth&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;initialState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then resolved anywhere:&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="nf"&gt;getBridge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;auth&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Internally, it uses &lt;code&gt;Symbol.for&lt;/code&gt; so it works even when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;multiple builds exist&lt;/li&gt;
&lt;li&gt;packages are duplicated in node_modules&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;shared-state-bridge&lt;/th&gt;
&lt;th&gt;Zustand&lt;/th&gt;
&lt;th&gt;Redux Toolkit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cross-package state&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-app (web + mobile)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real-time sync&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Boilerplate&lt;/td&gt;
&lt;td&gt;Minimal&lt;/td&gt;
&lt;td&gt;Minimal&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  When You Should Use It
&lt;/h2&gt;

&lt;p&gt;This is perfect if you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a React monorepo&lt;/li&gt;
&lt;li&gt;multiple apps (web + mobile)&lt;/li&gt;
&lt;li&gt;shared runtime state&lt;/li&gt;
&lt;li&gt;real-time requirements&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It Out
&lt;/h2&gt;

&lt;p&gt;Check it here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/shared-state-bridge" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/shared-state-bridge&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;State management is hard.&lt;/p&gt;

&lt;p&gt;Cross-package state is harder.&lt;/p&gt;

&lt;p&gt;Cross-app state (web + mobile) is where things usually fall apart.&lt;/p&gt;

&lt;p&gt;Instead of adding more complexity, a better approach is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;make state globally accessible — across packages and apps.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Feedback
&lt;/h2&gt;

&lt;p&gt;I’d love to hear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how you're handling cross-app state&lt;/li&gt;
&lt;li&gt;whether you've faced this issue&lt;/li&gt;
&lt;li&gt;what you think about this approach&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>sideprojects</category>
      <category>webdev</category>
      <category>react</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Debugging Webhooks During Development: A Simple Workflow</title>
      <dc:creator>Abdalla Emad</dc:creator>
      <pubDate>Tue, 17 Mar 2026 01:01:09 +0000</pubDate>
      <link>https://dev.to/abdalla_emad_335fff40f342/debugging-webhooks-during-development-a-simple-workflow-24nn</link>
      <guid>https://dev.to/abdalla_emad_335fff40f342/debugging-webhooks-during-development-a-simple-workflow-24nn</guid>
      <description>&lt;h2&gt;
  
  
  Article
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;Webhooks are everywhere.&lt;/p&gt;

&lt;p&gt;Modern platforms rely on webhooks to send real-time events between services.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;payment events&lt;/li&gt;
&lt;li&gt;repository updates&lt;/li&gt;
&lt;li&gt;messaging events&lt;/li&gt;
&lt;li&gt;automation triggers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've ever worked with platforms like GitHub, Stripe, or Slack, you've probably used webhooks.&lt;/p&gt;

&lt;p&gt;But debugging them during development can be frustrating.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Problem with Webhooks
&lt;/h1&gt;

&lt;p&gt;When building webhook integrations, developers often face these issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;events are sent to local servers&lt;/li&gt;
&lt;li&gt;requests are hard to inspect&lt;/li&gt;
&lt;li&gt;payloads can be large JSON objects&lt;/li&gt;
&lt;li&gt;debugging requires logging everything&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When something breaks, it's difficult to see exactly &lt;strong&gt;what payload was sent&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  What Developers Usually Do
&lt;/h1&gt;

&lt;p&gt;Most developers end up doing things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;exposing a local server&lt;/li&gt;
&lt;li&gt;printing request logs&lt;/li&gt;
&lt;li&gt;manually inspecting JSON payloads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But this isn't always convenient.&lt;/p&gt;

&lt;p&gt;A much easier solution is using a &lt;strong&gt;webhook inspection endpoint&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Webhook Inspection Endpoints
&lt;/h1&gt;

&lt;p&gt;Webhook inspection tools give you a temporary URL that receives requests and shows you the payload.&lt;/p&gt;

&lt;p&gt;When an event is sent, you can immediately see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;request headers&lt;/li&gt;
&lt;li&gt;request body&lt;/li&gt;
&lt;li&gt;JSON payload&lt;/li&gt;
&lt;li&gt;timestamps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes debugging webhook integrations much easier.&lt;/p&gt;




&lt;h1&gt;
  
  
  Example Webhook Payload
&lt;/h1&gt;

&lt;p&gt;A webhook request might look like this:&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;"event"&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.succeeded"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&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;Without inspection tools, you would need to log this manually.&lt;/p&gt;

&lt;p&gt;With a webhook debugger, you can see the full payload instantly.&lt;/p&gt;




&lt;h1&gt;
  
  
  A Simple Webhook Debugging Tool
&lt;/h1&gt;

&lt;p&gt;To simplify webhook debugging, I built a small tool called &lt;strong&gt;Outworx Hooks&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It gives you an instant webhook URL where incoming requests are captured and displayed in real time.&lt;/p&gt;

&lt;p&gt;You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inspect webhook payloads&lt;/li&gt;
&lt;li&gt;view headers and bodies&lt;/li&gt;
&lt;li&gt;debug API integrations&lt;/li&gt;
&lt;li&gt;test webhook triggers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal was to create a &lt;strong&gt;simple and lightweight webhook testing workflow&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can try it here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hooks.outworx.io" rel="noopener noreferrer"&gt;https://hooks.outworx.io&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  When This Is Useful
&lt;/h1&gt;

&lt;p&gt;Webhook inspection tools are useful when working with services like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;payment systems&lt;/li&gt;
&lt;li&gt;CI/CD events&lt;/li&gt;
&lt;li&gt;automation platforms&lt;/li&gt;
&lt;li&gt;Git repository events&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of guessing what was sent, you can see the exact request instantly.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Webhooks are powerful, but debugging them shouldn't be difficult.&lt;/p&gt;

&lt;p&gt;Using a webhook inspection endpoint can save a lot of time during development.&lt;/p&gt;

&lt;p&gt;If you're building webhook integrations, feel free to try:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hooks.outworx.io" rel="noopener noreferrer"&gt;https://hooks.outworx.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd love feedback from developers working with APIs and integrations.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>development</category>
      <category>webhook</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>How to Generate Interactive API Documentation from OpenAPI in Under 60 Seconds</title>
      <dc:creator>Abdalla Emad</dc:creator>
      <pubDate>Tue, 17 Mar 2026 00:54:08 +0000</pubDate>
      <link>https://dev.to/abdalla_emad_335fff40f342/how-to-generate-interactive-api-documentation-from-openapi-in-under-60-seconds-32b4</link>
      <guid>https://dev.to/abdalla_emad_335fff40f342/how-to-generate-interactive-api-documentation-from-openapi-in-under-60-seconds-32b4</guid>
      <description>&lt;h2&gt;
  
  
  Article
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;If you build APIs, you already know how important good documentation is.&lt;/p&gt;

&lt;p&gt;The problem is that &lt;strong&gt;maintaining API documentation manually is painful&lt;/strong&gt;.&lt;br&gt;
It quickly gets outdated, requires extra work, and often ends up being ignored by developers.&lt;/p&gt;

&lt;p&gt;Luckily, tools like OpenAPI and Swagger allow you to describe your API in a structured way so documentation can be generated automatically.&lt;/p&gt;

&lt;p&gt;In this article, I'll show you how you can turn an API specification into &lt;strong&gt;interactive documentation with a live API playground&lt;/strong&gt; in less than a minute.&lt;/p&gt;


&lt;h1&gt;
  
  
  Why API Documentation Is Hard
&lt;/h1&gt;

&lt;p&gt;Most teams struggle with API docs because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docs are written manually&lt;/li&gt;
&lt;li&gt;They become outdated quickly&lt;/li&gt;
&lt;li&gt;Developers forget to update them&lt;/li&gt;
&lt;li&gt;Setting up documentation platforms can be complicated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When documentation drifts away from the actual API, developers stop trusting it.&lt;/p&gt;

&lt;p&gt;That's why &lt;strong&gt;spec-driven documentation&lt;/strong&gt; became popular.&lt;/p&gt;


&lt;h1&gt;
  
  
  Using an API Specification
&lt;/h1&gt;

&lt;p&gt;Instead of writing docs manually, many teams define their APIs using specifications like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenAPI&lt;/li&gt;
&lt;li&gt;Swagger&lt;/li&gt;
&lt;li&gt;GraphQL schemas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These specs describe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;endpoints&lt;/li&gt;
&lt;li&gt;parameters&lt;/li&gt;
&lt;li&gt;responses&lt;/li&gt;
&lt;li&gt;authentication&lt;/li&gt;
&lt;li&gt;request formats&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you have a spec, documentation can be generated automatically.&lt;/p&gt;


&lt;h1&gt;
  
  
  Turning a Spec into Interactive Documentation
&lt;/h1&gt;

&lt;p&gt;With a documentation generator, you can convert a spec into a full developer portal that includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;interactive endpoint documentation&lt;/li&gt;
&lt;li&gt;request/response examples&lt;/li&gt;
&lt;li&gt;live API playground&lt;/li&gt;
&lt;li&gt;code snippets&lt;/li&gt;
&lt;li&gt;hosted documentation pages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows developers to &lt;strong&gt;test APIs directly from the docs&lt;/strong&gt;, which improves the developer experience dramatically.&lt;/p&gt;


&lt;h1&gt;
  
  
  Example Workflow
&lt;/h1&gt;

&lt;p&gt;The workflow is surprisingly simple.&lt;/p&gt;

&lt;p&gt;1️⃣ Generate or export your API spec&lt;br&gt;
2️⃣ Upload the spec&lt;br&gt;
3️⃣ The documentation is generated automatically&lt;/p&gt;

&lt;p&gt;For example, this OpenAPI snippet:&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;"paths"&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;"/users"&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;"get"&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;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Get all users"&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;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;can instantly become a full interactive documentation page.&lt;/p&gt;




&lt;h1&gt;
  
  
  Instant API Docs
&lt;/h1&gt;

&lt;p&gt;To simplify this workflow, I built a small tool called &lt;strong&gt;Outworx Docs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It allows you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload an OpenAPI / Swagger / GraphQL spec&lt;/li&gt;
&lt;li&gt;Generate interactive documentation instantly&lt;/li&gt;
&lt;li&gt;Get a hosted documentation page&lt;/li&gt;
&lt;li&gt;Enable a live API playground&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal was simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;spec → live documentation in under 60 seconds&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can try it here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.outworx.io" rel="noopener noreferrer"&gt;https://docs.outworx.io&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Why Interactive Docs Matter
&lt;/h1&gt;

&lt;p&gt;Interactive documentation dramatically improves developer experience because developers can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;test endpoints directly&lt;/li&gt;
&lt;li&gt;explore request formats&lt;/li&gt;
&lt;li&gt;copy ready-to-use code snippets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This reduces integration time and helps teams adopt APIs faster.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Spec-driven documentation is quickly becoming the standard for API development.&lt;/p&gt;

&lt;p&gt;If you already use OpenAPI or Swagger, generating interactive documentation is one of the easiest ways to improve your API experience.&lt;/p&gt;

&lt;p&gt;If you're interested in trying it out, feel free to check out:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://docs.outworx.io" rel="noopener noreferrer"&gt;https://docs.outworx.io&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And I'd love to hear feedback from developers building APIs.&lt;/p&gt;




</description>
      <category>webdev</category>
      <category>api</category>
      <category>development</category>
    </item>
  </channel>
</rss>
