<?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: Mock Bolt</title>
    <description>The latest articles on DEV Community by Mock Bolt (@mockbolt02).</description>
    <link>https://dev.to/mockbolt02</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%2F3870355%2F4e796547-aeed-4baa-9a79-0decf5eb0d20.png</url>
      <title>DEV Community: Mock Bolt</title>
      <link>https://dev.to/mockbolt02</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mockbolt02"/>
    <language>en</language>
    <item>
      <title>I pasted my Swagger spec and got 30 mock APIs in 2 seconds</title>
      <dc:creator>Mock Bolt</dc:creator>
      <pubDate>Mon, 18 May 2026 18:19:25 +0000</pubDate>
      <link>https://dev.to/mockbolt02/i-pasted-my-swagger-spec-and-got-30-mock-apis-in-2-seconds-cnj</link>
      <guid>https://dev.to/mockbolt02/i-pasted-my-swagger-spec-and-got-30-mock-apis-in-2-seconds-cnj</guid>
      <description>&lt;p&gt;Last Tuesday I had a Swagger spec, a frontend kanban board UI to build, and a backend team who promised the API would be ready "by Thursday for sure this time".&lt;/p&gt;

&lt;p&gt;Forty-something endpoints. No real backend yet. Standup in four hours.&lt;/p&gt;

&lt;p&gt;I've been here before — usually I spin up &lt;code&gt;json-server&lt;/code&gt;, hand-write a routes file, deal with CORS, copy each endpoint's URL into a &lt;code&gt;.env&lt;/code&gt;, and so on. By the time mocks are "done" I've spent more time on plumbing than on the UI I was supposed to be working on.&lt;/p&gt;

&lt;p&gt;This time I did something different. I pasted the spec into a tool called &lt;strong&gt;MockBolt&lt;/strong&gt;, clicked one button, and got back 40 live public URLs — one per operation, each returning the example response from the spec.&lt;/p&gt;

&lt;p&gt;Total time: about two seconds.&lt;/p&gt;

&lt;p&gt;This is the story of that two seconds, what it actually does behind the scenes, and the couple of gotchas you should know about.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I pasted
&lt;/h2&gt;

&lt;p&gt;Here's a trimmed-down version of the spec — same shape as what you'd get out of FastAPI's &lt;code&gt;/openapi.json&lt;/code&gt;, NestJS's Swagger module, or any tool that follows the OpenAPI 3.x format:&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="na"&gt;openapi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.0.0"&lt;/span&gt;
&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Kanban API&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.0.0"&lt;/span&gt;
&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;/boards&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;List all boards&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;example&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;boards&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Sprint&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;12"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;cards&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;18&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
                  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Backlog"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;cards&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;47&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create a board&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;201"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;example&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
                &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;New&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Board"&lt;/span&gt;
                &lt;span class="na"&gt;cards&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;

  &lt;span class="s"&gt;/boards/{id}/cards&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/Card"&lt;/span&gt;

&lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schemas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;Card&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;integer&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;string&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;assignee&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;string&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing special — just a normal OpenAPI 3.0 spec in YAML. Real one had 40 operations across 12 paths. I'll show three here so this article fits on one page.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happened when I pasted
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;[Screenshot 1: the MockBolt /openapi-import page with the spec pasted into the editor, "Parse spec" button visible at the bottom right]&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I hit &lt;strong&gt;Parse spec&lt;/strong&gt;. The page switched to a preview list:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;[Screenshot 2: the preview list with each endpoint as a checkbox row — METHOD, path, status code, "synthesised" badge on the one that fell back to schema]&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Three rows for three operations. Each one shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The HTTP method (with a colour-coded badge)&lt;/li&gt;
&lt;li&gt;The original path from the spec&lt;/li&gt;
&lt;li&gt;The status code the mock will return (matches the response code from the spec — &lt;code&gt;201&lt;/code&gt; for POST, &lt;code&gt;200&lt;/code&gt; for GET, etc.)&lt;/li&gt;
&lt;li&gt;A small &lt;code&gt;synthesised&lt;/code&gt; badge on any row where the response had to be generated from the schema because the spec didn't include a literal example&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I left all three selected, hit &lt;strong&gt;Create 3 mocks →&lt;/strong&gt;, and a couple of seconds later got the result page:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;[Screenshot 3: the "Done" page with the three URLs listed, each with a Copy button and a Manage link]&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET    /boards            → https://mockbolt.com/b/8e47…
POST   /boards            → https://mockbolt.com/b/3f91…
GET    /boards/{id}/cards → https://mockbolt.com/b/c2a8…
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each URL is live, public, and returns the example I defined in the spec. I tested the first one immediately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl https://mockbolt.com/b/8e47…
&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"boards"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
    &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"id"&lt;/span&gt;: 1, &lt;span class="s2"&gt;"name"&lt;/span&gt;: &lt;span class="s2"&gt;"Sprint 12"&lt;/span&gt;, &lt;span class="s2"&gt;"cards"&lt;/span&gt;: 18 &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"id"&lt;/span&gt;: 2, &lt;span class="s2"&gt;"name"&lt;/span&gt;: &lt;span class="s2"&gt;"Backlog"&lt;/span&gt;, &lt;span class="s2"&gt;"cards"&lt;/span&gt;: 47 &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same JSON I put in the spec. Open CORS, so my React app could hit it directly from &lt;code&gt;localhost:3000&lt;/code&gt; with no proxy. I dropped the URLs into &lt;code&gt;.env&lt;/code&gt;, pointed my fetches at them, and went back to building the actual UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it figures out the response
&lt;/h2&gt;

&lt;p&gt;This is the part I dug into, because I was curious what happens when a spec doesn't have an explicit &lt;code&gt;example&lt;/code&gt; field (which is, honestly, most specs).&lt;/p&gt;

&lt;p&gt;The parser walks each response with a fallback chain. For OpenAPI 3.x:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Direct example&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;example&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;                  &lt;span class="c1"&gt;# ← takes this&lt;/span&gt;
          &lt;span class="na"&gt;foo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bar"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Named examples map&lt;/strong&gt; (it picks the first one):&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;examples&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;happy_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;                 &lt;span class="c1"&gt;# ← takes .value of the first&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;foo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bar"&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Schema-level example&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;example&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;                    &lt;span class="c1"&gt;# ← takes this&lt;/span&gt;
        &lt;span class="na"&gt;foo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bar"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Synthesised from schema shape&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
  &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;    &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;integer&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;     &lt;span class="c1"&gt;# → 0&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;string&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;      &lt;span class="c1"&gt;# → "string"&lt;/span&gt;
    &lt;span class="na"&gt;assignee&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;string&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;   &lt;span class="c1"&gt;# → "string"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;code&gt;$ref&lt;/code&gt; is resolved recursively (with a depth limit to prevent infinite loops on circular references), and the resulting JSON is what the mock returns. It's not pretty data, but it's structurally valid — your TypeScript types won't complain.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fallback to &lt;code&gt;{}&lt;/code&gt;&lt;/strong&gt; if there's no schema either.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Mocks created from steps 4 and 5 get the &lt;code&gt;synthesised&lt;/code&gt; badge in the preview list, so you know which ones to either (a) live with, (b) edit on the mock's manage page after import, or (c) go back and add real examples to your spec.&lt;/p&gt;

&lt;p&gt;Swagger 2.0 follows a similar fallback (&lt;code&gt;examples["application/json"]&lt;/code&gt; → &lt;code&gt;schema.example&lt;/code&gt; → synthesis), just with different field names.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two gotchas worth knowing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The mock URL is not your spec path.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every mock gets a random &lt;code&gt;/b/{uuid}&lt;/code&gt; URL. The &lt;code&gt;path&lt;/code&gt; from your spec (&lt;code&gt;/boards/{id}/cards&lt;/code&gt;) is shown as a label so you can map them mentally, but if your client code expects &lt;code&gt;/boards/...&lt;/code&gt; you need to either rewrite it to point at the mock URL, or set up a local proxy that maps spec paths to mock URLs. Most of the time the rewrite is fine for dev work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Request body and query params are ignored by default.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The mock always returns the same example response. It doesn't check that you sent the right query params, didn't validate your POST body against the schema, doesn't return a different shape for &lt;code&gt;/boards?archived=true&lt;/code&gt;. If you need that, every mock has a manage page where you can configure error-rate simulation, header-triggered errors, response delays, dynamic variables (&lt;code&gt;{{uuid}}&lt;/code&gt;, &lt;code&gt;{{timestamp}}&lt;/code&gt;), and so on — but you're configuring it per mock, by hand.&lt;/p&gt;

&lt;p&gt;Honestly, for most "frontend dev wants to start before backend is ready" cases, that's fine. You want representative data, not contract enforcement.&lt;/p&gt;

&lt;h2&gt;
  
  
  When NOT to use this
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You need contract testing.&lt;/strong&gt; Use something like Prism (&lt;code&gt;@stoplight/prism-cli&lt;/code&gt;) which actually validates requests against the spec.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You're testing complex multi-route behaviours&lt;/strong&gt; with conditionals, state, scripted responses. Mockoon's desktop app or a real local mock server is closer to what you want.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can't have your mocks on a public URL.&lt;/strong&gt; MockBolt URLs are public (unlisted, but anyone with the URL can hit them). If you need private mocks, run something local.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For everything else — sharing mock URLs with the team, demos, mobile dev where localhost is painful, CI integration tests that need a stable HTTPS endpoint — public mocks are exactly right.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Open &lt;a href="https://mockbolt.com/openapi-import" rel="noopener noreferrer"&gt;https://mockbolt.com/openapi-import&lt;/a&gt;, hit &lt;strong&gt;Use sample&lt;/strong&gt; if you don't have a spec handy, and watch your endpoint count go from 0 to N in a couple of seconds.&lt;/p&gt;

&lt;p&gt;No signup, free, up to 50 mocks per import.&lt;/p&gt;

&lt;p&gt;If you find yourself coming back to it (or want the mocks to outlive their 7-day free window), each one has a &lt;code&gt;$2 one-time → permanent&lt;/code&gt; button on its manage page. I upgraded the three I built the kanban board against, because by the time the real backend shipped, the mock URLs were in three Slack threads and a doc, and I didn't want them disappearing.&lt;/p&gt;

&lt;p&gt;Curious to hear what specs people import — especially the weird-shaped ones the parser hasn't seen yet. Drop a comment if anything breaks.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>api</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Stop using ngrok just to inspect webhooks — 5-second alternative</title>
      <dc:creator>Mock Bolt</dc:creator>
      <pubDate>Sat, 25 Apr 2026 07:02:28 +0000</pubDate>
      <link>https://dev.to/mockbolt02/stop-using-ngrok-just-to-inspect-webhooks-5-second-alternative-5gjg</link>
      <guid>https://dev.to/mockbolt02/stop-using-ngrok-just-to-inspect-webhooks-5-second-alternative-5gjg</guid>
      <description>&lt;p&gt;Every time I integrate a third-party webhook I do the same annoying dance:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start a local server&lt;/li&gt;
&lt;li&gt;Open a terminal, run &lt;code&gt;ngrok http 3000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Copy the URL&lt;/li&gt;
&lt;li&gt;Paste it into the webhook dashboard&lt;/li&gt;
&lt;li&gt;Trigger a test event&lt;/li&gt;
&lt;li&gt;Stare at the ngrok terminal output&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's 5 minutes of setup &lt;em&gt;before&lt;/em&gt; I've written a single line of handler code.&lt;br&gt;
And the URL changes every restart.&lt;/p&gt;
&lt;h2&gt;
  
  
  The read-only trap
&lt;/h2&gt;

&lt;p&gt;The next tool most developers reach for is &lt;strong&gt;webhook.site&lt;/strong&gt;. &lt;br&gt;
It's much faster — you get a URL instantly, no install.&lt;/p&gt;

&lt;p&gt;But it has one big limitation: &lt;strong&gt;it's read-only&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Your webhook source gets a fixed &lt;code&gt;200 OK&lt;/code&gt; with no body. That means you can't test:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How your code handles a &lt;code&gt;422&lt;/code&gt; response (retry logic)&lt;/li&gt;
&lt;li&gt;Whether your handler correctly parses a &lt;code&gt;201&lt;/code&gt; with a payload&lt;/li&gt;
&lt;li&gt;What actually gets returned to the calling service&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For pure inspection ("what does Stripe actually send?") it's fine.&lt;br&gt;
For anything more, you're stuck.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I use instead
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://mockbolt.com" rel="noopener noreferrer"&gt;MockBolt&lt;/a&gt; is an instant mock API — paste JSON, &lt;br&gt;
get a live public HTTPS endpoint in seconds. Every request is logged in real time.&lt;/p&gt;

&lt;p&gt;For webhook testing it means you get &lt;strong&gt;both sides&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;See the full incoming request (body, headers, IP, timing)&lt;/li&gt;
&lt;li&gt;Control exactly what goes back to the webhook source&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No install. No account. No CLI. No local server.&lt;/p&gt;


&lt;h2&gt;
  
  
  Testing a Stripe webhook in 60 seconds
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Create the endpoint&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to &lt;a href="https://mockbolt.com" rel="noopener noreferrer"&gt;mockbolt.com&lt;/a&gt;, paste the response Stripe expects back:&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;"received"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;Set status code to &lt;code&gt;200&lt;/code&gt;. Click &lt;strong&gt;Generate Mock&lt;/strong&gt;. &lt;br&gt;
You get a URL like &lt;code&gt;https://mockbolt.com/b/7f3d2c1a-...&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 — Add it in Stripe&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dashboard → Developers → Webhooks → Add endpoint → paste your MockBolt URL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 — Send a test event&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Click "Send test webhook" → pick &lt;code&gt;payment_intent.succeeded&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Open the MockBolt manage tab. The full Stripe payload appears in the &lt;br&gt;
real-time inspector instantly — headers, body, everything Stripe sends.&lt;/p&gt;

&lt;p&gt;No terminal. No restart. No port forwarding.&lt;/p&gt;


&lt;h2&gt;
  
  
  Testing a GitHub webhook
&lt;/h2&gt;

&lt;p&gt;Same flow:&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;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ok"&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;Status &lt;code&gt;200&lt;/code&gt;. Generate Mock. Copy URL.&lt;/p&gt;

&lt;p&gt;Repo → Settings → Webhooks → Add webhook → paste URL.&lt;br&gt;
Select &lt;code&gt;application/json&lt;/code&gt;. Choose events (&lt;code&gt;push&lt;/code&gt;, &lt;code&gt;pull_request&lt;/code&gt;, etc.)&lt;/p&gt;

&lt;p&gt;GitHub fires a ping immediately when you save. You'll see the full &lt;br&gt;
ping payload arrive in MockBolt within 2 seconds.&lt;/p&gt;


&lt;h2&gt;
  
  
  Testing a Shopify order webhook
&lt;/h2&gt;

&lt;p&gt;Shopify expects &lt;code&gt;200&lt;/code&gt; with an empty body on success:&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the endpoint in your Shopify Partners app settings.&lt;br&gt;
Trigger a test order from the Shopify admin.&lt;br&gt;
See the exact &lt;code&gt;orders/create&lt;/code&gt; payload — line items, customer, totals, everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  When to use each tool
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Best tool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Just need to see what payload a webhook sends&lt;/td&gt;
&lt;td&gt;webhook.site or MockBolt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need to control the response (status + body)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;MockBolt&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need to forward to your local running server&lt;/td&gt;
&lt;td&gt;ngrok&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testing retry logic end-to-end&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;MockBolt&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permanent staging webhook endpoint&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;MockBolt&lt;/strong&gt; ($2 one-time, never expires)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debugging a webhook that fires infrequently&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;MockBolt&lt;/strong&gt; (auto-extends if active)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  One more thing: request replay
&lt;/h2&gt;

&lt;p&gt;MockBolt logs every request. There's a replay button (↩) on each row — &lt;br&gt;
re-sends the exact request to your endpoint with one click.&lt;/p&gt;

&lt;p&gt;Useful when you want to test a handler change without triggering &lt;br&gt;
a new real event from Stripe/GitHub/Shopify.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;→ &lt;a href="https://mockbolt.com/webhook-testing" rel="noopener noreferrer"&gt;mockbolt.com/webhook-testing&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create a free endpoint in 5 seconds. No account, no install.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What webhook services are you integrating? Drop a comment and I'll show &lt;br&gt;
the exact payload setup for each one.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>testing</category>
      <category>webhooks</category>
    </item>
    <item>
      <title>Stop setting up json-server for every prototype. There's a faster way.</title>
      <dc:creator>Mock Bolt</dc:creator>
      <pubDate>Mon, 20 Apr 2026 17:37:13 +0000</pubDate>
      <link>https://dev.to/mockbolt02/stop-setting-up-json-server-for-every-prototype-theres-a-faster-way-33bl</link>
      <guid>https://dev.to/mockbolt02/stop-setting-up-json-server-for-every-prototype-theres-a-faster-way-33bl</guid>
      <description>&lt;p&gt;You're building a frontend. The backend isn't ready. You need one endpoint that returns a list of users.&lt;/p&gt;

&lt;p&gt;So you do what you always do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; json-server
&lt;span class="nb"&gt;mkdir &lt;/span&gt;mock-server &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;mock-server
&lt;span class="nb"&gt;touch &lt;/span&gt;db.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you write the JSON, configure the routes, figure out why CORS is blocking your React app, fix it, run the server — and 15 minutes later you finally have a &lt;code&gt;GET /users&lt;/code&gt; endpoint returning fake data.&lt;/p&gt;

&lt;p&gt;For something you'll throw away tomorrow.&lt;/p&gt;

&lt;p&gt;I've done this probably 200 times. Every single time I think: &lt;em&gt;there has to be a faster way.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What I actually tried first
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Postman mock servers&lt;/strong&gt; — require an account, a workspace, a collection. Too much setup for a throwaway endpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beeceptor&lt;/strong&gt; — requires signup. Gets in the way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mockoon&lt;/strong&gt; — great tool, but runs locally. Useless when you want to share the endpoint with a teammate or test from a mobile device.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RequestBin&lt;/strong&gt; — receives requests, doesn't respond with data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A quick Express server&lt;/strong&gt; — still requires Node, a file, and remembering to kill the process later.&lt;/p&gt;

&lt;p&gt;None of these solve the actual problem: I want to paste JSON and get a URL. Right now. From any machine. Without installing anything.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;I spent a weekend building &lt;strong&gt;&lt;a href="https://mockbolt.com" rel="noopener noreferrer"&gt;MockBolt&lt;/a&gt;&lt;/strong&gt; — paste JSON, get a live API endpoint instantly.&lt;/p&gt;

&lt;p&gt;No account. No install. No CLI. No local server.&lt;/p&gt;

&lt;p&gt;Here's the full flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://mockbolt.com" rel="noopener noreferrer"&gt;mockbolt.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Paste your JSON response&lt;/li&gt;
&lt;li&gt;Pick which HTTP methods it should accept&lt;/li&gt;
&lt;li&gt;Optionally set a custom status code, response delay, or custom headers&lt;/li&gt;
&lt;li&gt;Click Generate&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You get a URL like &lt;code&gt;https://mockbolt.com/b/abc123&lt;/code&gt;. That's your live API. Takes about 10 seconds.&lt;/p&gt;




&lt;h2&gt;
  
  
  Using it from a React app
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://mockbolt.com/b/abc123&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="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setUsers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No proxy config. No CORS headers to set. &lt;code&gt;Access-Control-Allow-Origin: *&lt;/code&gt; is open by default.&lt;/p&gt;




&lt;h2&gt;
  
  
  Things I use it for constantly
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Testing error handling
&lt;/h3&gt;

&lt;p&gt;Set the status code to 500 or 503, point your app at it, verify your error boundary actually works.&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="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://mockbolt.com/b/your-endpoint&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="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Server error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Caught:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Frontend before backend is ready
&lt;/h3&gt;

&lt;p&gt;Share the mock URL with your team. Everyone points at the same endpoint. When the real API is ready — swap one URL.&lt;/p&gt;

&lt;h3&gt;
  
  
  Demoing to clients
&lt;/h3&gt;

&lt;p&gt;Spin up a mock with realistic data, build the UI on top of it, demo without any backend running. Works from their browser, their phone, anywhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workshops and tutorials
&lt;/h3&gt;

&lt;p&gt;I've run internal workshops where I needed everyone to hit the same API instantly. Creating a mock took 10 seconds. No one installed anything.&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing Postman collections
&lt;/h3&gt;

&lt;p&gt;Point a collection at a mock endpoint to verify request structure and headers before the real endpoint exists.&lt;/p&gt;




&lt;h2&gt;
  
  
  Simulating a slow API
&lt;/h2&gt;

&lt;p&gt;Set response delay to 2000ms and your mock simulates a slow server:&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 loading skeleton should show for 2 seconds&lt;/span&gt;
&lt;span class="c1"&gt;// Your timeout logic should kick in at the right time&lt;/span&gt;
&lt;span class="c1"&gt;// This exercises real fetch lifecycle — not a fake setTimeout&lt;/span&gt;
&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://mockbolt.com/b/your-slow-endpoint&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;Way more realistic than wrapping mock data in &lt;code&gt;setTimeout&lt;/code&gt; inside your component. It exercises actual fetch lifecycle including cancellation and &lt;code&gt;AbortController&lt;/code&gt; behavior.&lt;/p&gt;




&lt;h2&gt;
  
  
  Competitor 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;MockBolt&lt;/th&gt;
&lt;th&gt;Beeceptor&lt;/th&gt;
&lt;th&gt;Mockoon&lt;/th&gt;
&lt;th&gt;json-server&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No signup&lt;/td&gt;
&lt;td&gt;✅&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;No install&lt;/td&gt;
&lt;td&gt;✅&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;Live in &amp;lt; 10s&lt;/td&gt;
&lt;td&gt;✅&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;Open CORS&lt;/td&gt;
&lt;td&gt;✅&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;Response delay&lt;/td&gt;
&lt;td&gt;✅&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;Custom headers&lt;/td&gt;
&lt;td&gt;✅&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;Shareable URL&lt;/td&gt;
&lt;td&gt;✅&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;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: FastAPI + PostgreSQL, async SQLAlchemy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: React 18, TypeScript, Tailwind CSS, Vite&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting&lt;/strong&gt;: AWS Lightsail behind Cloudflare&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payments&lt;/strong&gt;: Lemon Squeezy (HMAC-signed webhooks)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The webhook validation was the most interesting part to build — mode-aware HMAC secrets, idempotent payment recording, atomic upgrade transactions. Worth a separate post if anyone's interested.&lt;/p&gt;




&lt;h2&gt;
  
  
  What MockBolt can do today
&lt;/h2&gt;

&lt;p&gt;Since I originally wrote this article, MockBolt has shipped a lot. &lt;br&gt;
Here's what it actually supports now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real-time request inspector&lt;/strong&gt; — every hit is logged with method, IP, country, query params, request body, and response time. Updates live as requests come in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request replay&lt;/strong&gt; — re-send any logged request with one click (great for testing handler changes)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error rate simulation&lt;/strong&gt; — randomly return errors at a configurable %, or trigger errors on a specific header value&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IP allowlist&lt;/strong&gt; — restrict which IPs can hit your endpoint&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic variables&lt;/strong&gt; — &lt;code&gt;{{uuid}}&lt;/code&gt;, &lt;code&gt;{{timestamp}}&lt;/code&gt;, &lt;code&gt;{{randomInt}}&lt;/code&gt;, &lt;code&gt;{{name}}&lt;/code&gt; replaced at serve time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhook testing&lt;/strong&gt; — point any webhook source (Stripe, GitHub, Shopify) at a MockBolt URL and inspect the full payload in real time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vault&lt;/strong&gt; — anonymous account (no email) that saves all your mocks in one dashboard&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Activity-based TTL&lt;/strong&gt; — free mocks that get 10+ requests in 7 days auto-extend (don't expire)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For permanent endpoints: $2 one-time per mock, never expires.&lt;/p&gt;

&lt;p&gt;Full feature breakdown: &lt;a href="https://mockbolt.com/pricing" rel="noopener noreferrer"&gt;mockbolt.com/pricing&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Try it: &lt;strong&gt;&lt;a href="https://mockbolt.com" rel="noopener noreferrer"&gt;mockbolt.com&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
No signup. Takes 10 seconds. Let it expire or delete it when you're done.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Happy to answer questions in the comments — especially if you have use cases I haven't thought of.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>testing</category>
      <category>tutorial</category>
      <category>api</category>
    </item>
    <item>
      <title>I was tired of json-server — so I built a free mock API tool (no signup needed)</title>
      <dc:creator>Mock Bolt</dc:creator>
      <pubDate>Sat, 11 Apr 2026 06:21:45 +0000</pubDate>
      <link>https://dev.to/mockbolt02/i-was-tired-of-json-server-so-i-built-a-free-mock-api-tool-no-signup-needed-fkn</link>
      <guid>https://dev.to/mockbolt02/i-was-tired-of-json-server-so-i-built-a-free-mock-api-tool-no-signup-needed-fkn</guid>
      <description>&lt;p&gt;Every frontend project I start hits the same wall.&lt;/p&gt;

&lt;p&gt;I have a UI to build. I know what the API responses should look like. But the backend isn't ready yet.&lt;/p&gt;

&lt;p&gt;So I spend 15–20 minutes doing the same setup ritual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; json-server
&lt;span class="c"&gt;# create db.json&lt;/span&gt;
&lt;span class="c"&gt;# configure routes&lt;/span&gt;
&lt;span class="c"&gt;# run json-server --watch db.json --port 3001&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's the &lt;em&gt;fast&lt;/em&gt; version. If I need CORS headers, custom status codes, or simulated delay, it gets longer.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;MockBolt&lt;/strong&gt; to remove that setup time entirely.&lt;/p&gt;




&lt;h2&gt;
  
  
  What MockBolt does
&lt;/h2&gt;

&lt;p&gt;Paste JSON → click Generate → get a live public API URL.&lt;/p&gt;

&lt;p&gt;That's it. No npm install. No terminal tab. No local port.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://mockbolt.com/b/7f3d2c1a-9b8e-4f5a-b6d0-3e2c1f4a8b7d
&lt;span class="c"&gt;# returns your JSON immediately&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The endpoint:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supports all HTTP methods (GET, POST, PUT, PATCH, DELETE)&lt;/li&gt;
&lt;li&gt;Returns your JSON with the right status code&lt;/li&gt;
&lt;li&gt;Has open CORS — works from any browser origin&lt;/li&gt;
&lt;li&gt;Accepts custom response headers&lt;/li&gt;
&lt;li&gt;Can simulate latency up to 10 seconds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each mock gives you two URLs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Public URL&lt;/strong&gt; — share this with your frontend or teammates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Management URL&lt;/strong&gt; — keep this private; edit payload, status code, methods, and delay anytime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No account. No email. No credit card. Free for 7 days, auto-renews with traffic.&lt;/p&gt;




&lt;h2&gt;
  
  
  A real example
&lt;/h2&gt;

&lt;p&gt;Say I'm building a frontend that needs a &lt;code&gt;/users&lt;/code&gt; endpoint but the backend isn't ready. In MockBolt:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Paste this JSON:&lt;/strong&gt;&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;"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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"admin"&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="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bob"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"viewer"&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="nl"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&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;&lt;strong&gt;2.&lt;/strong&gt; Select GET, click &lt;strong&gt;Generate Endpoint&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; Get a URL like &lt;code&gt;https://mockbolt.com/b/e8bdb0ce-8ed9-44a8-adcc-b0af6a054443&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; Hit it immediately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://mockbolt.com/b/e8bdb0ce-8ed9-44a8-adcc-b0af6a054443
&lt;span class="c"&gt;# {"users":[{"id":1,"name":"Alice","role":"admin"},{"id":2,"name":"Bob","role":"viewer"}],"total":2}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Done in under 30 seconds.&lt;/p&gt;




&lt;h2&gt;
  
  
  Testing error states and slow responses
&lt;/h2&gt;

&lt;p&gt;MockBolt lets you set any status code from 100 to 599 and add a response delay.&lt;/p&gt;

&lt;p&gt;Want to test how your app handles a &lt;code&gt;503 Service Unavailable&lt;/code&gt;? Set the status code, generate the endpoint, point your error-state tests at it.&lt;/p&gt;

&lt;p&gt;Want to test loading spinners and skeleton screens? Set a 2000ms delay.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;copy-as-code&lt;/strong&gt; panel also generates ready-to-run snippets in curl, fetch, axios, and Python requests — paste directly into your test file.&lt;/p&gt;




&lt;h2&gt;
  
  
  How I built it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backend: FastAPI (Python) + PostgreSQL&lt;/li&gt;
&lt;li&gt;Frontend: React + TypeScript + Vite + Tailwind CSS&lt;/li&gt;
&lt;li&gt;Deployed on AWS Lightsail behind Cloudflare&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A few interesting decisions along the way:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rate limiting behind Cloudflare&lt;/strong&gt; — &lt;code&gt;slowapi&lt;/code&gt; needs to read &lt;code&gt;CF-Connecting-IP&lt;/code&gt; instead of &lt;code&gt;request.client.host&lt;/code&gt; (which returns the Docker bridge IP behind Nginx). Took a couple of iterations to get this right.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hit count accuracy&lt;/strong&gt; — early on the counter was off because Cloudflare was caching GET responses. Fixed it with aggressive cache-busting headers: &lt;code&gt;Cache-Control: no-cache, no-store, must-revalidate, max-age=0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anonymous management&lt;/strong&gt; — instead of accounts, each mock gets a UUID secret token as the only credential. Tradeoff: if you lose the management URL you can't recover it. But it removes signup friction entirely and means zero user data to protect.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's shipped since launch
&lt;/h2&gt;

&lt;p&gt;I've shipped a lot since this article. Here's what MockBolt does now:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Request inspector (the big one)&lt;/strong&gt;&lt;br&gt;
Every request to your mock is logged — method, IP, country flag, query params, &lt;br&gt;
request body, response time. Updates live via streaming as hits come in. &lt;br&gt;
Free tier shows last 25 requests. Premium shows full history with CSV export.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Request replay&lt;/strong&gt;&lt;br&gt;
↩ button on every log row. Resends the exact request to your endpoint.&lt;br&gt;
Useful when you tweak a handler and want to re-test without triggering a new real event.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Webhook testing&lt;/strong&gt;&lt;br&gt;
MockBolt turns out to be a great webhook testing tool too — point Stripe, GitHub, &lt;br&gt;
or Shopify at your URL, trigger an event, see the full payload instantly.&lt;br&gt;
Unlike webhook.site, you also control what goes back to the caller.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Error simulation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Random error rate: "return 500 on 20% of requests"&lt;/li&gt;
&lt;li&gt;Header-triggered: "if &lt;code&gt;X-Test: true&lt;/code&gt; header → return 422"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;IP allowlist&lt;/strong&gt;&lt;br&gt;
Restrict which IPs can reach your endpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dynamic variables&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;{{uuid}}&lt;/code&gt;, &lt;code&gt;{{timestamp}}&lt;/code&gt;, &lt;code&gt;{{randomInt}}&lt;/code&gt;, &lt;code&gt;{{name}}&lt;/code&gt; replaced at serve time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vault (anonymous accounts)&lt;/strong&gt;&lt;br&gt;
Create a vault with one click — no email, no password, just a key saved in your browser.&lt;br&gt;
All mocks link to it automatically. Dashboard shows hit counts, expiry, payment history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Activity-based TTL&lt;/strong&gt;&lt;br&gt;
Free mocks that get 10+ requests in 7 days auto-extend — they don't expire while active.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://mockbolt.com" rel="noopener noreferrer"&gt;mockbolt.com&lt;/a&gt; — still free, still no signup&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://mockbolt.com" rel="noopener noreferrer"&gt;mockbolt.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Free, requires zero setup, works from any browser or terminal.&lt;/p&gt;

&lt;p&gt;Would love your feedback — especially on:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Is the public URL + secret management URL flow clear on first use?&lt;/li&gt;
&lt;li&gt;What would make this a daily tool for you vs. a one-off utility?&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;Solo project, built over a few weekends. Happy to answer questions about the stack or any of the design decisions.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devtools</category>
      <category>api</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
