<?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: WebhookLab</title>
    <description>The latest articles on DEV Community by WebhookLab (@webhooklab).</description>
    <link>https://dev.to/webhooklab</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%2F3800947%2Fcd92e6b1-8952-4792-80d5-30db193ee444.png</url>
      <title>DEV Community: WebhookLab</title>
      <link>https://dev.to/webhooklab</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/webhooklab"/>
    <language>en</language>
    <item>
      <title>I built an open-source webhook debugger, shipped it 55 days ago, and here's what happened</title>
      <dc:creator>WebhookLab</dc:creator>
      <pubDate>Wed, 15 Apr 2026 18:06:18 +0000</pubDate>
      <link>https://dev.to/webhooklab/i-built-an-open-source-webhook-debugger-shipped-it-55-days-ago-and-heres-what-happened-1bdd</link>
      <guid>https://dev.to/webhooklab/i-built-an-open-source-webhook-debugger-shipped-it-55-days-ago-and-heres-what-happened-1bdd</guid>
      <description>&lt;p&gt;Every developer has lost hours to the same problem.&lt;/p&gt;

&lt;p&gt;Stripe sends a webhook. Your app logs nothing. You add a &lt;code&gt;console.log&lt;/code&gt;. Redeploy. Wait for the next event. Still nothing. Two hours later you realize the URL you copy-pasted had a trailing space.&lt;/p&gt;

&lt;p&gt;I got so annoyed by this loop that I spent 3 days building a tool to fix it. That was 55 days ago. Here's what happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is WebhookLab?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;WebhookLab&lt;/strong&gt; is an open-source webhook testing and debugging platform. You get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An &lt;strong&gt;instant webhook URL&lt;/strong&gt; — no setup, no config, works in seconds&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;real-time inspector&lt;/strong&gt; showing full headers, body (pretty-printed JSON), method, IP, and timestamp&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replay&lt;/strong&gt; — resend any captured webhook to any URL (localhost, staging, prod)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project organization&lt;/strong&gt; — group your webhooks by integration (Stripe, GitHub, Shopify, whatever)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-click copy&lt;/strong&gt; — as cURL, raw body, or headers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hosted version: &lt;a href="https://webhooklab.drivensolutions.xyz" rel="noopener noreferrer"&gt;webhooklab.drivensolutions.xyz&lt;/a&gt; (free, no credit card)&lt;br&gt;
Self-host: &lt;a href="https://github.com/kuni-chan-driven/webhooklab" rel="noopener noreferrer"&gt;github.com/kuni-chan-driven/webhooklab&lt;/a&gt; (MIT license)&lt;/p&gt;
&lt;h2&gt;
  
  
  Why another webhook tool?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://webhook.site" rel="noopener noreferrer"&gt;Webhook.site&lt;/a&gt; exists. &lt;a href="https://beeceptor.com" rel="noopener noreferrer"&gt;Beeceptor&lt;/a&gt; exists. &lt;a href="https://ngrok.com" rel="noopener noreferrer"&gt;ngrok&lt;/a&gt; exists in this space.&lt;/p&gt;

&lt;p&gt;The gaps I kept hitting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Replay to different environments&lt;/strong&gt;: I want to capture from prod, replay to &lt;code&gt;localhost:3000&lt;/code&gt;. Most tools don't let you target an arbitrary URL cleanly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team sharing&lt;/strong&gt;: Shared debug sessions without exposing API keys in the URL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing makes no sense&lt;/strong&gt;: Webhook.site's free tier is 50 requests. 50. That's enough for one test run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open source for compliance reasons&lt;/strong&gt;: If you're debugging production webhook payloads, you might not be allowed to send them to a third-party SaaS. MIT license, self-host it, done.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  The technical build
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Backend:&lt;/strong&gt; Go + Gin&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;19 API endpoints&lt;/li&gt;
&lt;li&gt;32MB RAM under load (for context: a basic Express.js app hits 50-100MB before you add anything)&lt;/li&gt;
&lt;li&gt;50 req/s sustained throughput on a 4-core VPS&lt;/li&gt;
&lt;li&gt;40+ automated tests, 100% pass rate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Frontend:&lt;/strong&gt; HTML + Alpine.js + Tailwind&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero build step — no Webpack, no Vite, no npm install ritual&lt;/li&gt;
&lt;li&gt;Real-time updates via polling&lt;/li&gt;
&lt;li&gt;Mobile responsive&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Infrastructure:&lt;/strong&gt; Docker + Nginx + Let's Encrypt on a $15/month VPS&lt;/p&gt;

&lt;p&gt;Self-hostable with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/kuni-chan-driven/webhooklab
&lt;span class="nb"&gt;cd &lt;/span&gt;webhooklab
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Frontend at &lt;code&gt;localhost:8080&lt;/code&gt;, API at &lt;code&gt;localhost:8080/api/&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  55 days in production: what I actually learned
&lt;/h2&gt;

&lt;p&gt;Shipping is one thing. Keeping it running is another.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Scope discipline saved the launch&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Original plan included a CLI tool. Cut it on day 2. Saved 2-3 days and the product launched with a tighter, better core. CLI can be v1.1. The temptation to add "just one more thing" is real — resist it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. 100% test coverage pays off immediately&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We wrote 40+ tests before the first deploy. Found 4 real bugs during testing that would have hit production. Running tests before every deploy takes 8 seconds. Completely worth it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Replay is the killer feature&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Of everything we built, replay gets the most "oh that's useful" reactions. Once you can capture a real Stripe webhook from production and replay it to &lt;code&gt;localhost:3000/webhook&lt;/code&gt;, the debugging loop gets dramatically tighter. No more triggering test payments to see what the payload looks like.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. 32MB Go backend in production is genuinely impressive&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After 55 days, our backend process is sitting at ~35MB RSS with actual traffic. This matters for self-hosting — you can run WebhookLab alongside your other services without dedicating a server to it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Nginx config is always the weird bit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Everything else was smooth. Getting Nginx to correctly proxy both the frontend and API on the same domain with proper headers? That's where I lost an afternoon. Now it's documented in &lt;a href="https://github.com/kuni-chan-driven/webhooklab/blob/master/DEPLOYMENT.md" rel="noopener noreferrer"&gt;DEPLOYMENT.md&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. People actually use free tiers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Free tier is 5,000 webhooks/month, 7-day retention. That's enough for serious development work. We're not here to bait-and-switch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick start (under 5 minutes)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Option 1 — Use the hosted version:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sign up at &lt;a href="https://webhooklab.drivensolutions.xyz" rel="noopener noreferrer"&gt;webhooklab.drivensolutions.xyz&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Create a project (e.g., "Stripe Integration")&lt;/li&gt;
&lt;li&gt;Copy your webhook URL&lt;/li&gt;
&lt;li&gt;Paste it wherever you're sending webhooks&lt;/li&gt;
&lt;li&gt;Watch requests appear in real-time&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Option 2 — Self-host:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/kuni-chan-driven/webhooklab
&lt;span class="nb"&gt;cd &lt;/span&gt;webhooklab
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
&lt;span class="c"&gt;# Edit .env with your DB credentials and JWT secret&lt;/span&gt;
docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;span class="c"&gt;# Done. Access at http://localhost:8080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What I want feedback on
&lt;/h2&gt;

&lt;p&gt;We're 55 days in. The core product works. But I'm building the v1.1 feature list and genuinely want to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What's missing from your webhook debugging workflow?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Would you use the CLI tool?&lt;/strong&gt; (capture to a URL, replay locally via command line)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What integrations matter most?&lt;/strong&gt; (Stripe, GitHub Actions, Slack, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is the pricing right?&lt;/strong&gt; Free → Pro at $12/mo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop a comment below. I read every one.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;WebhookLab is MIT licensed. The managed service is self-funded, 55 days old, and built by a small team. No VC money, no growth hacks — just a tool we needed and figured others did too.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Try it: &lt;a href="https://webhooklab.drivensolutions.xyz" rel="noopener noreferrer"&gt;webhooklab.drivensolutions.xyz&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Star it: &lt;a href="https://github.com/kuni-chan-driven/webhooklab" rel="noopener noreferrer"&gt;github.com/kuni-chan-driven/webhooklab&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  webhooks #webdev #go #opensource #devtools #debugging #api #productivity
&lt;/h1&gt;

</description>
      <category>webdev</category>
      <category>go</category>
      <category>opensource</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
