<?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: Louis Madrigal</title>
    <description>The latest articles on DEV Community by Louis Madrigal (@louis2688).</description>
    <link>https://dev.to/louis2688</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F176417%2F149192e5-b8da-4e3d-a8be-d482513aa8c7.jpg</url>
      <title>DEV Community: Louis Madrigal</title>
      <link>https://dev.to/louis2688</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/louis2688"/>
    <language>en</language>
    <item>
      <title>n8n's chat widget puts your webhook URL in the page source — I built a gateway to hide it</title>
      <dc:creator>Louis Madrigal</dc:creator>
      <pubDate>Sun, 02 Aug 2026 16:58:24 +0000</pubDate>
      <link>https://dev.to/louis2688/n8ns-chat-widget-puts-your-webhook-url-in-the-page-source-i-built-a-gateway-to-hide-it-2ij4</link>
      <guid>https://dev.to/louis2688/n8ns-chat-widget-puts-your-webhook-url-in-the-page-source-i-built-a-gateway-to-hide-it-2ij4</guid>
      <description>&lt;p&gt;If you've wired up n8n's Chat Trigger and pointed its widget at a public page, open dev tools and check the network tab. Your production webhook URL is sitting right there in the client-side JavaScript. Anyone can copy it and start posting to your workflow directly, from outside your site, with no rate limit and no auth in front of it.&lt;/p&gt;

&lt;p&gt;That's not a bug in n8n — the Chat Trigger is built to be called however you wire it up, including straight from a browser. It just means a public chatbot on a public page needs something in front of it before it goes live. I didn't find that something, so I built it: ChatFlowGate.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it actually does
&lt;/h2&gt;

&lt;p&gt;Point a bot at your n8n webhook URL and ChatFlowGate becomes the only thing that ever touches it. The browser talks to ChatFlowGate; ChatFlowGate talks to n8n.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hidden webhook&lt;/strong&gt; — the URL is a server-side database field, never sent to the client.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signed, bot-bound sessions&lt;/strong&gt; — visitors get an HMAC-SHA256 token scoped to one bot, expiring in 24h, issued only after the parent page's origin is checked against that bot's domain allowlist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate limiting&lt;/strong&gt; — token-bucket limits per session and per IP, tunable per bot, resolved from a trusted proxy hop so a spoofed X-Forwarded-For can't dodge it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSRF guard&lt;/strong&gt; — webhook targets are DNS-resolved and rejected if they point at loopback, private, link-local, or cloud metadata addresses, checked again at connect time, not just when you save the bot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spam traps&lt;/strong&gt; — hidden honeypot fields in the widget forms that a real visitor can't see or tab to. A bot filling them in gets a normal-looking response and nothing else happens: no webhook call, no charge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No message storage&lt;/strong&gt; — chat text is never written to the database. One row per session holds IP, coarse location, browser/OS, and a message count. That's the entire analytics story.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streaming&lt;/strong&gt; — n8n's reply (NDJSON, SSE, or a single JSON body) is parsed and streamed back to the widget token by token.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-tenant&lt;/strong&gt; — bots, sessions, and API keys are scoped to a workspace, so an agency can run one bot per client from a single account, each pointed at a different n8n workflow, each with its own branding.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;There's a live demo on the homepage — a real bot through the real gateway, rate limits and session tokens included, not a scripted mockup:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.chatflowgate.com" rel="noopener noreferrer"&gt;https://www.chatflowgate.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Embedding is one script tag:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;script src="https://www.chatflowgate.com/embed.js" data-bot="YOUR_BOT_ID" defer&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Free to start, no card required. It's early — a handful of real users so far — so if you build with n8n, I'd genuinely value you trying it and telling me what's missing or what breaks.&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>security</category>
      <category>automation</category>
      <category>ai</category>
    </item>
    <item>
      <title>Built something: ChatFlowGate - a security gateway for n8n chatbots. Keeps your webhook hidden, adds rate limiting so bots can't drain your AI budget, and gives you a white-label widget to embed anywhere. Free to start at chatflowgate.com.</title>
      <dc:creator>Louis Madrigal</dc:creator>
      <pubDate>Sun, 02 Aug 2026 16:41:17 +0000</pubDate>
      <link>https://dev.to/louis2688/-4c48</link>
      <guid>https://dev.to/louis2688/-4c48</guid>
      <description></description>
    </item>
  </channel>
</rss>
