<?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: Jacob</title>
    <description>The latest articles on DEV Community by Jacob (@jorbach).</description>
    <link>https://dev.to/jorbach</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%2F3913105%2F0342b458-3288-4b15-8994-90825f5d048d.png</url>
      <title>DEV Community: Jacob</title>
      <link>https://dev.to/jorbach</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jorbach"/>
    <language>en</language>
    <item>
      <title>How I Built a 10KB Embeddable Chat Widget on Cloudflare Workers</title>
      <dc:creator>Jacob</dc:creator>
      <pubDate>Tue, 05 May 2026 03:56:51 +0000</pubDate>
      <link>https://dev.to/jorbach/how-i-built-a-10kb-embeddable-chat-widget-on-cloudflare-workers-37i8</link>
      <guid>https://dev.to/jorbach/how-i-built-a-10kb-embeddable-chat-widget-on-cloudflare-workers-37i8</guid>
      <description>&lt;p&gt;I wanted to add live chat to my WordPress sites without loading a 500KB third-party script. So I built my own.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ghostchat.dev" rel="noopener noreferrer"&gt;GhostChat&lt;/a&gt; is an open source embeddable &lt;br&gt;
chat widget that runs on Cloudflare Workers and Durable Objects. &lt;br&gt;
The client widget is under 10KB. Here's how it works.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Widget:&lt;/strong&gt; Vanilla JS, no framework, ~10KB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Cloudflare Workers + Durable Objects for 
persistent WebSocket connections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payments:&lt;/strong&gt; Stripe for the hosted tier&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-hostable:&lt;/strong&gt; Bring your own Cloudflare account&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Cloudflare Durable Objects?
&lt;/h2&gt;

&lt;p&gt;Durable Objects give you stateful serverless — each chat session &lt;br&gt;
lives in its own DO instance. No Redis, no external DB needed for &lt;br&gt;
real-time state. It's genuinely elegant for this use case.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "bring your own agent" model
&lt;/h2&gt;

&lt;p&gt;GhostChat supports a webhook architecture so you can pipe messages to any AI agent, your own backend, or a human operator. You're not locked into our AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  WordPress plugin
&lt;/h2&gt;

&lt;p&gt;There's a WordPress plugin available so site owners can drop it in without touching code:&lt;br&gt;
&lt;a href="https://wordpress.org/plugins/ghostchat" rel="noopener noreferrer"&gt;wordpress.org/plugins/ghostchat&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://ghostchat.dev" rel="noopener noreferrer"&gt;ghostchat.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;WordPress plugin: &lt;a href="https://wordpress.org/plugins/ghostchat" rel="noopener noreferrer"&gt;wordpress.org/plugins/ghostchat&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Widget source: &lt;a href="https://github.com/jacoborbach/ghostchat-widget" rel="noopener noreferrer"&gt;github.com/jacoborbach/ghostchat-widget&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy to answer questions about the Durable Objects architecture &lt;br&gt;
in the comments&lt;/p&gt;

</description>
      <category>cloudflare</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
