<?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: Bao Ngo</title>
    <description>The latest articles on DEV Community by Bao Ngo (@bao_ngo_48313312086d5b368).</description>
    <link>https://dev.to/bao_ngo_48313312086d5b368</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%2F2864045%2F8df56a51-77e0-483c-ab1f-5fefa6a26148.jpg</url>
      <title>DEV Community: Bao Ngo</title>
      <link>https://dev.to/bao_ngo_48313312086d5b368</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bao_ngo_48313312086d5b368"/>
    <language>en</language>
    <item>
      <title>When the tool breaking is the only thing that makes you take a break</title>
      <dc:creator>Bao Ngo</dc:creator>
      <pubDate>Tue, 14 Apr 2026 15:21:28 +0000</pubDate>
      <link>https://dev.to/bao_ngo_48313312086d5b368/when-the-tool-breaking-is-the-only-thing-that-makes-you-take-a-break-151d</link>
      <guid>https://dev.to/bao_ngo_48313312086d5b368/when-the-tool-breaking-is-the-only-thing-that-makes-you-take-a-break-151d</guid>
      <description>&lt;p&gt;&lt;em&gt;"Don't stop me now, I'm having such a good time, I'm having a ball"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;11pm. Fourth worktree. Everything merging clean. Prompt, approve, ship, prompt, approve, ship. Freddie Mercury starts making sense. You're in the zone. You're a supersonic man. The PRs are green. You're floating around in ecstasy.&lt;/p&gt;

&lt;p&gt;Then you realize — that song is about a guy who cannot stop. "Don't stop me, don't stop me, don't stop me." It's not a celebration. It's a confession. He's asking you not to interrupt because if he stops he'll have to feel something.&lt;/p&gt;




&lt;p&gt;I barely write code anymore. The AI does 95% of it. I type a sentence, adjust a word, approve, ship. Next worktree. Merge. Next. And I'm more tired than when I did everything myself.&lt;/p&gt;

&lt;p&gt;Make that make sense.&lt;/p&gt;

&lt;h2&gt;
  
  
  The dumbest contradiction
&lt;/h2&gt;

&lt;p&gt;By every metric, my life got easier. The AI is genuinely good — I trust it, I built the systems around it, it ships real work. So why am I cooked by 3pm?&lt;/p&gt;

&lt;p&gt;Because it's never one session. The AI is so fast that "done" and "what's next" are the same moment. No gap. No friction. You think "this will only take 5 minutes" — and that thought loops for 9 hours.&lt;/p&gt;

&lt;p&gt;When I coded everything myself, debugging was secretly rest. Waiting for builds was meditation. The friction was load-bearing and I didn't know it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doomscrolling but productive
&lt;/h2&gt;

&lt;p&gt;Each click is nothing. Each approval is nothing. You never hit the wall where your body says stop. AI-assisted shipping is the doomscrolling of engineering — except you actually ship stuff. Which makes it worse. Because at least with doomscrolling you feel guilty enough to stop.&lt;/p&gt;

&lt;p&gt;Your GitHub graph is green. You're shipping. You haven't had an original thought in 3 days but hey — the PR got merged.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what
&lt;/h2&gt;

&lt;p&gt;Mrinank Sharma ran Anthropic's safeguards research. Last project was studying how AI makes us less human. Quit to write poetry. I'm not saying I get it. I'm saying after my 60th approve-merge-next loop, I don't not get it. (Weakkkkkkk)&lt;/p&gt;

&lt;p&gt;We optimized away every reason to stop. Compile times, deploy queues, human bottlenecks — we called them inefficiencies. Turns out they were walls. And walls hold things up.&lt;/p&gt;




&lt;p&gt;Credits just ran out. Going for a walk.&lt;/p&gt;

&lt;p&gt;Best manager I ever had isn't a person. It's a rate limit.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mentalhealth</category>
    </item>
    <item>
      <title>AI gets you — it just can't remember your API field names</title>
      <dc:creator>Bao Ngo</dc:creator>
      <pubDate>Sun, 12 Apr 2026 17:44:39 +0000</pubDate>
      <link>https://dev.to/bao_ngo_48313312086d5b368/ai-gets-you-it-just-cant-remember-your-api-field-names-1n1l</link>
      <guid>https://dev.to/bao_ngo_48313312086d5b368/ai-gets-you-it-just-cant-remember-your-api-field-names-1n1l</guid>
      <description>&lt;p&gt;What can I do anyway...&lt;/p&gt;

&lt;p&gt;AI is scary good, duh. Like, I describe a workflow in plain English — "check this spreadsheet, send a Slack if the number's off, log it to the database" — and it just... gets it? The intent, the order, the edge cases. That part still blows my mind every time. 🤯&lt;/p&gt;

&lt;p&gt;But then. BUT THEN.&lt;/p&gt;

&lt;p&gt;It writes &lt;code&gt;channelId&lt;/code&gt; instead of &lt;code&gt;channel_id&lt;/code&gt;. Or &lt;code&gt;messages.write&lt;/code&gt; instead of &lt;code&gt;chat:write&lt;/code&gt;. Or nests the JSON one level too deep. And your workflow 403s at 3am and you wake up to an angry Slack thread. Fun times. 😅&lt;/p&gt;

&lt;p&gt;It's not like this happens everywhere. AI writes Python, SQL, whole apps — and it's terrifyingly accurate. But some things are just... arbitrary strings. An API field name isn't something you can reason about. It's &lt;code&gt;channel_id&lt;/code&gt; because someone at Slack decided it's &lt;code&gt;channel_id&lt;/code&gt;. No amount of intelligence helps you guess that.&lt;/p&gt;

&lt;h2&gt;
  
  
  When work depends on you, "close enough" isn't
&lt;/h2&gt;

&lt;p&gt;And this is the key part — it's not about AI being bad. AI is incredible. But there's a difference between "AI helps me write code and I review it" versus "AI generates a plan that runs autonomously while I sleep."&lt;/p&gt;

&lt;p&gt;One of those can be 95% right and you're fine. The other one... you need the API contract to be exactly right or nothing works.&lt;/p&gt;

&lt;p&gt;Will future models fix this? Honestly, probably yeah. Claude 4.7, GPT-5.5, whatever's next — I wouldn't be surprised if they nail exact field names way more consistently. Maybe this post ages like someone complaining about dial-up. 🙈&lt;/p&gt;

&lt;p&gt;But I'm shipping today. "Wait for the next model" isn't really a strategy when you have users.&lt;/p&gt;

&lt;h2&gt;
  
  
  So here's what I did
&lt;/h2&gt;

&lt;p&gt;In CFFBRW, when you write a workflow and the AI compiles it — we don't ask it to get every parameter name perfect. That's asking it to be a database. Instead, we let it describe what it &lt;em&gt;wants&lt;/em&gt; to do. Natural language. Its comfort zone.&lt;/p&gt;

&lt;p&gt;Then we have this thing called the Resolver that maps that to reality.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI says:       "Send a message to #alerts in Slack"
Resolver maps:  slack.send_message → { channel: "#alerts" }
                (exact slug, exact param keys, from a real catalog)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The AI describes intent. The Resolver enforces the contract. It matches against a catalog of real actions and real field names — handles typos, handles naming drift, produces exact output. No AI involved in this step. Just code doing what code is good at.&lt;/p&gt;

&lt;h2&gt;
  
  
  The full pipeline (quick version)
&lt;/h2&gt;

&lt;p&gt;This Resolver is stage 4 of 5. Every workflow compilation goes through:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Enrich&lt;/strong&gt; — load context and best practices into the AI prompt&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screen&lt;/strong&gt; — AI sanity-checks the markdown before compiling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compile&lt;/strong&gt; — AI generates the execution plan (retries if validation catches stuff)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resolve&lt;/strong&gt; — deterministic mapping to real API catalogs ← &lt;em&gt;this one&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate&lt;/strong&gt; — structural and semantic checks, contract enforcement and re-try, following Instructor.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AI handles 1-3. Stages 4-5 are pure logic. The plan that actually hits your APIs has been verified by code, not vibes.&lt;/p&gt;

&lt;p&gt;And honestly — even when models get perfect at remembering field names, having a verification layer before you execute against real APIs with real credentials is just... good practice? Like, I don't think you ever want to skip that step. The Resolver isn't a hack for today's AI limitations. It's the design.&lt;/p&gt;

&lt;p&gt;Anyway — if you want to see how this works end-to-end, &lt;a href="https://dev.to/CFFBRW/agent-native-saas-in-practice/"&gt;the whole platform is exposed as an MCP server&lt;/a&gt; so any AI agent can compile and run workflows through this pipeline. The Resolver is invisible to the caller. It just works.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building CFFBRW at &lt;a href="https://cffbrw.com" rel="noopener noreferrer"&gt;cffbrw.com&lt;/a&gt;. Still learning as I go — would love feedback.&lt;/em&gt; ✌️&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Every SaaS Is Already an MCP. Every Chrome Is an Agent.</title>
      <dc:creator>Bao Ngo</dc:creator>
      <pubDate>Sat, 11 Apr 2026 16:42:18 +0000</pubDate>
      <link>https://dev.to/bao_ngo_48313312086d5b368/every-saas-is-already-an-mcp-every-chrome-is-an-agent-2kl5</link>
      <guid>https://dev.to/bao_ngo_48313312086d5b368/every-saas-is-already-an-mcp-every-chrome-is-an-agent-2kl5</guid>
      <description>&lt;p&gt;Warning: Naive.&lt;br&gt;
A couple weeks ago I &lt;a href="https://harrycorn.com/research/saas-is-dead-and-webmcp/" rel="noopener noreferrer"&gt;AI-wrote&lt;/a&gt; to myself about the "SaaS is dead" panic — $285 billion wiped, everyone freaking out. The reality: SaaS isn't dead, but value is getting sucked upward into the agent layer and downward into the data layer. The thin UI middle is getting crushed.&lt;/p&gt;

&lt;p&gt;Then MCP and WebMCP show up as the buoy. MCP standardizes how agents talk to servers. WebMCP lets websites publish "tool contracts" for agents. Together they tell SaaS vendors: "expose a structured interface and agents can still use you."&lt;/p&gt;

&lt;p&gt;APIs, REST, GraphQL, webhooks — those aren't going anywhere. That's backend-to-frontend, system-to-system. No human needed. Fine.&lt;/p&gt;

&lt;p&gt;But there's a layer above all of that. Where you're logged into 12 SaaS tabs copying data between them like an animal. That layer is about to get a new runtime.&lt;/p&gt;
&lt;h2&gt;
  
  
  Chrome as MCP
&lt;/h2&gt;

&lt;p&gt;Here's the thought.&lt;/p&gt;

&lt;p&gt;MCP lets agents talk to servers. WebMCP lets agents talk to websites. But what if Chrome itself becomes an MCP? Not one website. Not one server. The whole browser — every tab, every session, every logged-in SaaS tool — as one unified agent surface.&lt;/p&gt;

&lt;p&gt;Today you tell an agent "send Q1 numbers to finance." It needs an MCP server/connection for your spreadsheet, another for email, OAuth for both, someone to wire it together. CFFBRW somehow support this.&lt;/p&gt;

&lt;p&gt;Tomorrow: the spreadsheet is tab 3, Gmail is tab 7. You're already logged in. The agent reads the DOM, grabs the data, switches tabs, composes the email. Done. No API. No OAuth. No integration. Because the human already did all the integration work — by logging in.&lt;/p&gt;

&lt;p&gt;This isn't Selenium with extra steps. Old automation works outside-in — an external program guessing at buttons. This works inside-out — the agent lives in the page, reads structured DOM text, inherits your session. And the LLM closes the gap — "click submit" works whether the button says "Submit", "Send", or "Confirm."&lt;/p&gt;

&lt;p&gt;Is it as reliable as a typed API? No. But it covers a surface APIs never will — the millions of internal tools, admin panels, government portals that will never get an API.&lt;/p&gt;


&lt;h2&gt;
  
  
  SaaS Gets a New User
&lt;/h2&gt;

&lt;p&gt;SaaS doesn't die. It just gets a non-human user.&lt;/p&gt;

&lt;p&gt;The agent doesn't need the vendor's cooperation. It needs the UI to exist. If a human can do it in a browser, an agent can do it in a browser. Your SaaS stays in the loop — not as a tool the human clicks, but as a tool surface the agent operates.&lt;/p&gt;

&lt;p&gt;Counterpoint to myself: this only works if the UI is agent-friendly. Poorly structured DOMs, no semantic HTML, aggressive bot detection — those break it. So there's a new competitive advantage: agent-friendliness. SaaS tools that make their UI easy for agents win. The rest get routed around. I even tried to build a skill called &lt;code&gt;Retrofit SaaS for Agent&lt;/code&gt;; I make sure CFFBRW support BYOModel.&lt;/p&gt;


&lt;h2&gt;
  
  
  Where CFFBRW Fits
&lt;/h2&gt;

&lt;p&gt;This is where I get hopeful. Because CFFBRW is built for exactly this future, or at least as I see it.&lt;/p&gt;

&lt;p&gt;CFFBRW compiles markdown workflows into execution plans. Today those plans run steps against MCP servers (this is the hard part) and typed connectors — structured, reliable, deterministic. That handles the backend layer. APIs, data, system-to-system.&lt;/p&gt;

&lt;p&gt;But the Chrome-as-agent layer? That's a new connector type waiting to happen. Imagine a CFFBRW workflow step that doesn't call an API — it instructs an agent in the user's browser. "Fill in the expense report." "Approve the PR." "Download the invoice from that vendor portal that hasn't had an API since 2019."&lt;/p&gt;

&lt;p&gt;The workflow orchestrates. Chrome executes. The user's logged-in state is the auth layer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Markdown workflow (CFFBRW)
  ↓ compiles to
Execution plan
  ↓ steps run against
┌─────────────────────────────────────┐
│ MCP servers     → structured APIs   │
│ Connectors      → typed integrations│
│ Chrome agent    → browser UI layer  │ ← new
└─────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three tiers of reach. MCP for structured tools. Connectors for typed APIs. Chrome agent for everything else — the long tail nobody will ever build an integration for. CFFBRW becomes the orchestration layer that ties them all together.&lt;/p&gt;

&lt;p&gt;That's the vision. Markdown in, results out, regardless of whether the step hits an API or clicks a button in tab 4.&lt;/p&gt;

&lt;p&gt;Or maybe CFFBRW is worth no more than a AI-touch-grass.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Happens Next
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Chrome ships an agent API.&lt;/strong&gt; Not "if" but "when." WebMCP is already in Chrome Canary. Someone will build a Chrome-native MCP that exposes all open tabs as tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SaaS vendors adapt or get routed around.&lt;/strong&gt; Smart ones go agent-friendly. Stubborn ones add CAPTCHAs. Market decides.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Orchestration becomes the real product.&lt;/strong&gt; Individual tools matter less. The thing that coordinates across all of them — across APIs AND browser UIs — that's where the value concentrates. That's CFFBRW's bet.&lt;/p&gt;

&lt;p&gt;I could be wrong about the timeline. But MCP gave agents hands for servers. WebMCP gave agents hands for websites. Chrome-as-agent gives agents hands for everything.&lt;/p&gt;

&lt;p&gt;SaaS was drowning. MCP threw it a buoy. Chrome-as-agent rebuilds the boat. And CFFBRW wants to be, just, a... I don't know yet.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Signal: PageAgent (github.com/alibaba/page-agent) — MIT, Alibaba&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
    </item>
    <item>
      <title>CFFBRW went from drag-and-drop to "hey AI, just deploy this for me"</title>
      <dc:creator>Bao Ngo</dc:creator>
      <pubDate>Sat, 28 Mar 2026 17:52:27 +0000</pubDate>
      <link>https://dev.to/bao_ngo_48313312086d5b368/cffbrw-went-from-drag-and-drop-to-hey-ai-just-deploy-this-for-me-1kj6</link>
      <guid>https://dev.to/bao_ngo_48313312086d5b368/cffbrw-went-from-drag-and-drop-to-hey-ai-just-deploy-this-for-me-1kj6</guid>
      <description>&lt;p&gt;Hey! So if you've been following CFFBRW since the &lt;a href="https://dev.to/bao_ngo_48313312086d5b368/now-you-can-build-api-like-lego-5deh"&gt;Blockly days&lt;/a&gt; (DOUBT IT!), things have... changed a lot. Like, "I threw away the entire visual editor" level of change. 😅&lt;/p&gt;

&lt;p&gt;Remember when I was all excited about snapping blocks together like LEGO? Turns out, when AI agents can write code better than I can drag blocks around, maybe the blocks aren't the product anymore.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happened
&lt;/h2&gt;

&lt;p&gt;So I've been reading a lot about the whole "SaaS is dead" thing (I wrote some &lt;a href="https://dev.to/research/saas-is-dead-and-webmcp/"&gt;research notes&lt;/a&gt; about it). The basic idea: value is moving UP to the agent layer and DOWN to the data layer. The middle — dashboards, drag-and-drop UIs, per-seat pricing — is getting crushed.&lt;/p&gt;

&lt;p&gt;And I looked at CFFBRW and thought... wait. My visual builder IS the middle layer. 🙈&lt;/p&gt;

&lt;p&gt;So I rebuilt the whole thing around one idea: &lt;strong&gt;what if you just write what you want in plain English, and AI compiles it into a workflow?&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;Before:  Drag blocks → Configure each one → Deploy
Now:     Write markdown → AI compiles → Deploy

The markdown is the source of truth. Not a config file, not YAML, not blocks.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The AI compiler runs once per workflow version, caches the result, and then execution is fully deterministic. No AI involved at runtime = fast and cheap.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I'm most excited about: BYOM MCP Server
&lt;/h2&gt;

&lt;p&gt;BYOM = Bring Your Own Model. I exposed the entire platform as an MCP server at &lt;code&gt;/mcp&lt;/code&gt;. Any AI — Claude, Gemini, whatever — can compile, validate, deploy, and run workflows. Not through the dashboard. Through MCP tools.&lt;/p&gt;

&lt;p&gt;This is... kind of the whole point? If agents are the future users, the MCP server IS the product. The dashboard is just nice-to-have.&lt;/p&gt;

&lt;p&gt;Here's what the MCP server gives you:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt; (so the AI understands the system before acting):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cffbrw://schema/execution-plan&lt;/code&gt; — the JSON format it needs to generate&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cffbrw://schema/step-types&lt;/code&gt; — all 9 step types (http_request, ai_call, transform, conditional, loop, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cffbrw://tools/available&lt;/code&gt; — what external MCP tools you've registered&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cffbrw://examples/plans&lt;/code&gt; — examples from simple to complex&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tools&lt;/strong&gt; (what the AI can actually do):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;validate_plan&lt;/code&gt; — submit JSON, get errors or a validated plan&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;deploy_workflow&lt;/code&gt; / &lt;code&gt;update_workflow&lt;/code&gt; — create or update workflows&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;run_workflow&lt;/code&gt; — execute, get back a run ID and WebSocket URL&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_run_status&lt;/code&gt; — poll until it's done&lt;/li&gt;
&lt;li&gt;Plus &lt;code&gt;get_workflow&lt;/code&gt;, &lt;code&gt;list_runs&lt;/code&gt;, &lt;code&gt;list_workflows&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's also a &lt;code&gt;compile&lt;/code&gt; prompt that tells the AI "read the resources, take this markdown, give me valid JSON." But honestly the resources contain everything — the prompt is optional.&lt;/p&gt;

&lt;h2&gt;
  
  
  The auth model (learned this the hard way)
&lt;/h2&gt;

&lt;p&gt;Remember the &lt;a href="https://dev.to/bao_ngo_48313312086d5b368/today-i-learned-race-conditions-literally--14d1"&gt;voucher race condition&lt;/a&gt;? Yeah, I've gotten more careful about security since then.&lt;/p&gt;

&lt;p&gt;Two access levels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;wfk_&lt;/code&gt; API keys&lt;/strong&gt; — scoped to ONE specific workflow. Can read, update, and run it (only if published). Cannot see other workflows or create new ones. If this key leaks, damage is contained.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clerk JWT&lt;/strong&gt; — full workspace access. Everything works. For the dashboard and admin stuff.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So a CI/CD key can trigger your workflow but can't create arbitrary new ones. That felt important after the voucher incident taught me that "it'll probably be fine" is not a security strategy 😄&lt;/p&gt;

&lt;h2&gt;
  
  
  Expression eval: because &lt;code&gt;eval()&lt;/code&gt; doesn't work on Cloudflare (not any more)
&lt;/h2&gt;

&lt;p&gt;This was a fun rabbit hole. Workflows need to evaluate expressions — like referencing a previous step's output or doing a conditional check. But Cloudflare Workers blocks &lt;code&gt;eval()&lt;/code&gt; and &lt;code&gt;new Function()&lt;/code&gt;. Just... doesn't work. I learned this the hard way (as I learn most things).&lt;/p&gt;

&lt;p&gt;So I built a three-tier system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tier A&lt;/strong&gt; — Simple string templates like &lt;code&gt;"Hello ${steps.step_0.name}"&lt;/code&gt;. Parsed by an AST walker (jsep). Under 1ms. Handles most cases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tier B&lt;/strong&gt; — More complex expressions. Tries the AST walker first, falls back to a Dynamic Worker sandbox if it's too gnarly. ~10-30ms for the fallback. And I cannot stress this enough &lt;strong&gt;Dynamic Worker&lt;/strong&gt; is a game-changer. So try it. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tier C&lt;/strong&gt; — Full JavaScript code blocks in a Dynamic Worker. Network blocked by default. The escape hatch.
And I cannot stress this enough &lt;strong&gt;Dynamic Worker&lt;/strong&gt; is a game-changer. So try it. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI compiler is told to prefer Tier A/B. Only use complex JS when you actually need multi-statement logic. Because honestly, most workflow expressions are just "get this value from the previous step."&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack (for the curious)
&lt;/h2&gt;

&lt;p&gt;Everything runs on Cloudflare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API:&lt;/strong&gt; Hono&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation:&lt;/strong&gt; Zod everywhere — schemas are the single source of truth, TypeScript types derived from them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI:&lt;/strong&gt; Claude (primary) + Gemini (fallback). Strategy pattern, so they're swappable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage:&lt;/strong&gt; D1 for workflows/runs, KV for compilation cache, R2 for artifacts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time:&lt;/strong&gt; Cloudflare Agents SDK — &lt;code&gt;NotebookAgent&lt;/code&gt; for WebSocket streaming, &lt;code&gt;WorkflowRunner&lt;/code&gt; for durable execution. They talk via RPC.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard:&lt;/strong&gt; TanStack Start + React Flow for DAG visualization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auth:&lt;/strong&gt; Clerk with organizations for multi-tenant&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Agents SDK was... an experience. The TypeScript types are incomplete, &lt;code&gt;routeAgentRequest()&lt;/code&gt; doesn't work with custom URL patterns, and you need a magic &lt;code&gt;x-partykit-room&lt;/code&gt; header that isn't documented anywhere. I ended up reading &lt;code&gt;node_modules/agents/dist/index.js&lt;/code&gt; more than the actual docs. Classic Cloudflare beta experience 😅&lt;/p&gt;

&lt;h2&gt;
  
  
  So where's the value now?
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🤖 Agent Layer    → BYOM MCP server (any AI can use it)
🔌 Protocol Layer → 8 tools + 4 resources + compile prompt
🖥️ UI Layer       → Dashboard (nice but not the moat)
🗄️ Data Layer     → Run history, step logs, compilation cache (the actual moat)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The dashboard looks cool. But an AI agent talking to the MCP server can do literally everything the dashboard does. The data — workflow definitions, historical runs, step-level logs — is what compounds over time. That's what no agent can replicate from the outside.&lt;/p&gt;

&lt;p&gt;Still building. Still learning. If you want to try the MCP server or have thoughts on how agent-native products should work, I'd love to hear it.&lt;/p&gt;

&lt;p&gt;And I believe any builder should use Gstack from &lt;a href="https://github.com/garrytan/gstack" rel="noopener noreferrer"&gt;Garry Tan&lt;/a&gt;. Old news I know, but for people who live under a rock like I do.&lt;/p&gt;

&lt;p&gt;So cheers! ☕&lt;/p&gt;

</description>
      <category>markdown</category>
      <category>nocode</category>
    </item>
    <item>
      <title>Just another simple file sharing</title>
      <dc:creator>Bao Ngo</dc:creator>
      <pubDate>Thu, 17 Jul 2025 08:06:01 +0000</pubDate>
      <link>https://dev.to/bao_ngo_48313312086d5b368/simple-file-sharing-1i6k</link>
      <guid>https://dev.to/bao_ngo_48313312086d5b368/simple-file-sharing-1i6k</guid>
      <description>&lt;p&gt;Sometimes, all I want when sharing files is "Just" sharing files. Don't ask me to sign-in or provide emails.&lt;/p&gt;

&lt;p&gt;And sometimes your company policy just blocks file-sharing websites so...&lt;/p&gt;

&lt;p&gt;Of course everyone needs to eat but... come on. Maybe this will help a few folks out there, at least until I either run out of money or figure out a sane way to sustain it reasonably.&lt;/p&gt;

&lt;p&gt;Inspired by publicnote.com (check it out), I whipped up plcfile.com.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;You type in a folder title.&lt;/li&gt;
&lt;li&gt;Upload your files.&lt;/li&gt;
&lt;li&gt;The files are encrypted using the title and stored at a hashed version of it.
The only thing you need to access your files later is that unique title. Don’t lose it — I can't even find it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Please upvote if you can, it would help:&lt;br&gt;
&lt;a href="https://www.producthunt.com/products/public-file" rel="noopener noreferrer"&gt;https://www.producthunt.com/products/public-file&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>filesharing</category>
      <category>beginners</category>
    </item>
    <item>
      <title>On driving</title>
      <dc:creator>Bao Ngo</dc:creator>
      <pubDate>Thu, 19 Jun 2025 16:25:17 +0000</pubDate>
      <link>https://dev.to/bao_ngo_48313312086d5b368/on-driving-47j3</link>
      <guid>https://dev.to/bao_ngo_48313312086d5b368/on-driving-47j3</guid>
      <description>&lt;p&gt;If you come to Malaysa you know the speed limits are like for show  right?&lt;br&gt;
People drive how fast they think is still Okay.&lt;/p&gt;

&lt;p&gt;And if it is any builder is doing right now. AI helps us to move fast but how fast you are willing to go.&lt;/p&gt;

&lt;p&gt;MCP, A2A, PaaIP what any of those really mean?&lt;/p&gt;

&lt;p&gt;I am looking for people to build CFFBRW with me, or someone to say that I am wrong and wasting my time.&lt;/p&gt;

&lt;p&gt;What dev is it this post anyway?&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>javascript</category>
    </item>
    <item>
      <title>TODAY I LEARNED: Race Conditions (Literally 💸)</title>
      <dc:creator>Bao Ngo</dc:creator>
      <pubDate>Thu, 12 Jun 2025 17:28:17 +0000</pubDate>
      <link>https://dev.to/bao_ngo_48313312086d5b368/today-i-learned-race-conditions-literally--14d1</link>
      <guid>https://dev.to/bao_ngo_48313312086d5b368/today-i-learned-race-conditions-literally--14d1</guid>
      <description>&lt;p&gt;Hey devs! Remember when I said I'd keep my project CFFBRW simple? Well, turns out distributed systems don't care about your feelings.&lt;/p&gt;

&lt;p&gt;So I built this global variable feature - basically Redis but worse (I'm kidding... mostly). Users wanted to share state between API workflows, and I thought "how hard could it be?" Famous last words.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fun Before The WHAT-THE-HELL
&lt;/h2&gt;

&lt;p&gt;So a friend wanted a gamification banner - "Wheel of fortune, only 10 '20% off' vouchers available daily!" Simple enough. I whipped up an API workflow in 15 minutes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check inventory&lt;/li&gt;
&lt;li&gt;If voucher stock is available, return wheel config&lt;/li&gt;
&lt;li&gt;Deploy for ⚡ SPEED ⚡&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It was beautiful. It was fast. It was also giving vouchers to 47 users because race conditions don't care about your business logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Burned Through Vouchers Faster Than My Free-Tier Credits
&lt;/h2&gt;

&lt;p&gt;Picture this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10:00:01 - User 1st: "Vouchers available: 10?" Yes! (Chance to win = 50%)
10:01:15 - User 10th: "Vouchers available: 7?" Yes! (Chance to win = 50%)
10:02:38 - User 20th: "Vouchers available: 5?" Yes! (Chance to win = 50%)
... 
10:05:0... - User 47th: "I deserve a voucher! Because I won."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then the banner was paused.&lt;/p&gt;

&lt;p&gt;By the time the writes reconciled, we'd given away 37 extra vouchers. My friend was... not thrilled. 😅&lt;/p&gt;

&lt;p&gt;So demo failed. Too early, yes, but he is my friend, so... Teehee!&lt;/p&gt;

&lt;p&gt;I know that there are technologies/products to address this. But I hold back myself from adding things so that CFFBRW can be as cheap and light and fast to run as possible.&lt;/p&gt;

&lt;p&gt;And when you limit your options, you rack your brains. After some frantic Googling and some "vibe-asking", I discovered some reconciliation strategies for the component.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 4 Reconciliation Strategies That Could've Saved My Sanity
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;last-write-wins&lt;/code&gt; (The YOLO Strategy)
&lt;/h3&gt;

&lt;p&gt;The default. Whatever wrote last is the truth. Great for settings, but BEWARE: Not for anything critical.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use case:&lt;/strong&gt; User preferences, feature flags&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;code&gt;sum-increments&lt;/code&gt; (The "Actually Count Everything" Strategy)
&lt;/h3&gt;

&lt;p&gt;Instead of setting values, you track increments. All increments get summed during reconciliation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use case:&lt;/strong&gt; Page views, API calls, VOUCHER COUNTERS (😭)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My case:&lt;/strong&gt; Would've correctly counted all 47 winners. Demo saved.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;code&gt;merge-objects&lt;/code&gt; (The "Keep Everything" Strategy)
&lt;/h3&gt;

&lt;p&gt;For JSON objects, merge all updates together. Conflicts on same field? Usually last-write-wins per field.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use case:&lt;/strong&gt; User profiles, shopping carts, collaborative data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My case:&lt;/strong&gt; Not applicable, but imagine if there were multiple vouchers with different winning chances...&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. &lt;code&gt;max-value&lt;/code&gt; (The "Only Up" Strategy)
&lt;/h3&gt;

&lt;p&gt;Always keep the highest value seen. Like a high score that never goes down.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use case:&lt;/strong&gt; Versioning, sequence numbers, "highest bid" scenarios&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My case:&lt;/strong&gt; Would've jumped straight to 47, at least I'd know the damage immediately&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Actually Actually Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Default settings are defaults, not solutions&lt;/strong&gt; - Last-write-wins is fine until it's not. And a big Beware/Caution is needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test with concurrency&lt;/strong&gt; - My demo with one request at a time? Adorable. Be more test-driven, especially with vibe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Math &amp;gt; Vibes&lt;/strong&gt; - "It'll probably be fine" is not a reconciliation strategy. As anyone knows, I've been learning to code for the last two years in my free time. And more than ever, you need to spend time to actually &lt;strong&gt;learn&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge computing is fast&lt;/strong&gt; - Fast enough to create race conditions you didn't know existed, and cheap enough to get you hooked and locked in. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The fix was simple - switched to &lt;code&gt;sum-increments&lt;/code&gt; for anything involving counting. But I don't think it actually addresses all the issues. It only gives me a good enough solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current Status
&lt;/h2&gt;

&lt;p&gt;Still shipping, still learning. The gamification banner now works perfectly.&lt;/p&gt;

&lt;p&gt;Building in public means learning in public, admitting your limitations in public, regretting a bit in private, and learning more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; - If you're like me and don't know these things, I hope we can learn something new. Set up your reconciliation strategy BEFORE deploying to production. Your wallet will thank you. And if you already know this, guide me some.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P.P.S.&lt;/strong&gt; - Now my motto is "Move fast but scale correctly." &lt;/p&gt;

</description>
      <category>api</category>
      <category>tooling</category>
      <category>beginners</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Now you can build API like LEGO</title>
      <dc:creator>Bao Ngo</dc:creator>
      <pubDate>Sat, 31 May 2025 17:52:14 +0000</pubDate>
      <link>https://dev.to/bao_ngo_48313312086d5b368/now-you-can-build-api-like-lego-5deh</link>
      <guid>https://dev.to/bao_ngo_48313312086d5b368/now-you-can-build-api-like-lego-5deh</guid>
      <description>&lt;p&gt;Hey again devs! Quick update on CFFBRW (my visual API builder I posted about earlier).&lt;/p&gt;

&lt;p&gt;So I got some feedback that the workflow builder felt... well, kinda basic while being overwhelming (I am confused!). One dev literally said "this looks like my nephew's Scratch project" 😅 Fair point. The drag-and-drop Sortable was functional but not exactly inspiring confidence for production use.&lt;/p&gt;

&lt;p&gt;Two big updates that I have implemented over the week:&lt;br&gt;
&lt;strong&gt;1.&lt;/strong&gt; Rebuilt the whole visual editor with Google Blockly&lt;br&gt;
I know, I know - Blockly is what they use to teach kids programming. But hear me out. After wrestling with custom drag-and-drop for weeks, I realized Blockly is actually perfect for this use case. It handles all the connection logic, validation, and visual feedback I was struggling to build, by actually making it look more like a Scratch project 🤣&lt;/p&gt;

&lt;p&gt;Now workflows snap together like LEGO blocks. You can see the data flow, nest components properly, and it actually feels solid. Plus, Blockly is battle-tested by millions of students worldwide - if it can survive middle schoolers, it can handle my API workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; Added a Python runtime component (!)&lt;br&gt;
This was the #1 request - "can I just write some Python for complex logic?"&lt;br&gt;
So I spun up a shared Python runtime (sandboxed, don't worry) that you can drop into any workflow. It's literally a component called "Code" where you write Python, and it executes inline with your other components.&lt;br&gt;
Example - I needed to calculate some custom metrics from API data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import pandas as pd
import numpy as np

df = pd.DataFrame(responsedData)

df['Price'] = pd.to_numeric(df['Price'], errors='coerce')

if df['Price'].isna().any():
    print(f"Warning: {df['Price'].isna().sum()} price values could not be converted")
    df = df.dropna(subset=['Price'])  # Remove rows with invalid prices

summary_stats = {
    'total_records': len(df),
    'average_price': round(df['Price'].mean(), 2),
    'price_range': {
        'min': float(df['Price'].min()),
        'max': float(df['Price'].max())
    }
}

output_data = {
    'transformed_data': df.to_dict('records'),
    'summary': summary_stats,
    'columns': list(df.columns),
    'data_types': df.dtypes.astype(str).to_dict(),
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Just dropped this between my Fetch and Response components. No server setup, no Docker, no Lambda configs. Just... Python that runs.&lt;/p&gt;

&lt;p&gt;Currently it's a shared instance (so be nice, don't mine Bitcoin 😄), but working on multiple runtimes. The tricky part is keeping it fast - nobody wants to wait 5 seconds for a cold start on their API.&lt;br&gt;
Real use case from this week:&lt;br&gt;
Client needed an API that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fetches data from their Shopify store&lt;/li&gt;
&lt;li&gt;Runs some pandas transformations (inventory calculations)&lt;/li&gt;
&lt;li&gt;Formats it for their warehouse system&lt;/li&gt;
&lt;li&gt;Forward it to one or fan-out to multiple API endpoints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of my usual "let me set up a FastAPI server" dance, I just:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drag Request block → Code block (30 lines of Python) → Transform block&lt;/li&gt;
&lt;li&gt;Deploy
It was done in 15 minutes. &lt;em&gt;I am not saying building your own API is a waste of time, but you need to do something more important for now.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Python code handles all the weird business logic that would be painful to express in visual components. Best of both worlds - visual for the flow, code for the complexity.&lt;/p&gt;

&lt;p&gt;What's next:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New Python environments (soon™)&lt;/li&gt;
&lt;li&gt;Packages support (so you're not limited to standard library)&lt;/li&gt;
&lt;li&gt;Better error handling (currently it just... fails silently 🙈)&lt;/li&gt;
&lt;li&gt;Shareable workflow templates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Still learning as I go. The Blockly integration was humbling - spent days building a custom solution when a "kids' tool" was perfect all along. And the Python runtime? Total hack job with exec() and prayer, but it works!&lt;/p&gt;

&lt;p&gt;And if anyone has experience with sandboxing Python execution at scale, please share your wisdom. I am sure someone will find a way to break out (and break my bank)&lt;br&gt;
Keep shipping! 🚀&lt;/p&gt;

&lt;p&gt;P.S. - &lt;em&gt;I do need to do something more important now.&lt;/em&gt; &lt;/p&gt;

</description>
      <category>api</category>
      <category>tooling</category>
      <category>python</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Built my own visual API builder because I needed more than mock endpoints</title>
      <dc:creator>Bao Ngo</dc:creator>
      <pubDate>Mon, 26 May 2025 16:39:45 +0000</pubDate>
      <link>https://dev.to/bao_ngo_48313312086d5b368/built-my-own-visual-api-builder-because-i-needed-more-than-mock-endpoints-44k</link>
      <guid>https://dev.to/bao_ngo_48313312086d5b368/built-my-own-visual-api-builder-because-i-needed-more-than-mock-endpoints-44k</guid>
      <description>&lt;p&gt;Hey devs,&lt;br&gt;
So I've been building side projects for a while, and I kept hitting this annoying pattern. I'd need a quick backend API - nothing fancy, just something to transform data, chain a few API calls, maybe query a data table.&lt;/p&gt;

&lt;p&gt;But every time, I'd end up writing the same boilerplate: set up Express, add auth, handle errors, deploy somewhere, configure rate limiting... you know the drill.&lt;/p&gt;

&lt;p&gt;I was using Beeceptor for mocking APIs during development (great tool btw), but I kept thinking "what if this could actually run real logic?" Like, what if I could just drag some components together and have a production API ready in minutes?&lt;/p&gt;

&lt;p&gt;I am a novice builder, so my code is basically a combination of a few reusable code blocks I copy-paste from one file to another. &lt;/p&gt;

&lt;p&gt;That's how I ended up building CFFBRW (&lt;a href="http://www.cffbrw.com" rel="noopener noreferrer"&gt;www.cffbrw.com&lt;/a&gt;). Started as a weekend project to scratch my own itch.&lt;/p&gt;

&lt;p&gt;Here's what it does - you drag components (Fetch, Filter, Loop, Aggregate, etc.) into a workflow, configure them, and boom - you get a real API endpoint. No servers to manage, auth, and rate limiting (😉 cannot get Cloudflare Ratelimit to work) built in.&lt;/p&gt;

&lt;p&gt;Example: I needed an API that fetches crypto prices and calculates average changes. Instead of spinning up a Node server, I just:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Dragged a Fetch component, pointed it to CoinGecko API&lt;/li&gt;
&lt;li&gt;Added an Aggregate component to calculate averages&lt;/li&gt;
&lt;li&gt;Hit deploy&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And got this endpoint in ~2 minutes:&lt;br&gt;
&lt;code&gt;curl -X POST 'https://api.cffbrw.com/v1/trigger/opensocialforall591b/averagePriceAndMarketcapChangePercentage24hTop5Cryptos'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Another one I use daily - filtering product catalogs from CSV:&lt;br&gt;
&lt;code&gt;curl -X POST "https://api.cffbrw.com/v1/trigger/opensocialforall591b/filterCatalogByCategory?category={{category}}"&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;The workflow is just: CSV component → Filter component. That's it. I also add JSONata to make it more flexible.&lt;/p&gt;

&lt;p&gt;I've been using it for all sorts of random stuff:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quick data transformations for client projects&lt;/li&gt;
&lt;li&gt;Webhook receivers that actually process data&lt;/li&gt;
&lt;li&gt;API aggregators (hitting multiple endpoints and combining results)&lt;/li&gt;
&lt;li&gt;CSV to JSON APIs for static data query for my minisite.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Is it perfect? Nah. Still working on error handling, better debugging, and few more components. But it's been super useful for getting MVPs out fast. No more "let me just set up a quick Express server" that takes 2 hours.&lt;/p&gt;

&lt;p&gt;If you're tired of writing boilerplate for simple APIs, give it a try. Would love feedback from other devs - what components would you want? What workflows would you build?&lt;/p&gt;

&lt;p&gt;Currently free while I figure things out. Just trying to make something useful for developers like me who want to ship fast without the DevOps overhead.&lt;br&gt;
Cheers!&lt;br&gt;
P/S: oh maybe join me! I am nothing but a "vibe" (oh I hate this word) learner.&lt;/p&gt;

</description>
      <category>api</category>
      <category>tooling</category>
      <category>json</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
