<?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: rabbxdev</title>
    <description>The latest articles on DEV Community by rabbxdev (@rabbxdev).</description>
    <link>https://dev.to/rabbxdev</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%2F3916595%2F4fcd0b28-6445-4f14-971b-bf6b8fa93c42.jpg</url>
      <title>DEV Community: rabbxdev</title>
      <link>https://dev.to/rabbxdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rabbxdev"/>
    <language>en</language>
    <item>
      <title>Why are we still using a 15-year-old WebSocket library?</title>
      <dc:creator>rabbxdev</dc:creator>
      <pubDate>Thu, 16 Jul 2026 19:48:37 +0000</pubDate>
      <link>https://dev.to/rabbxdev/why-are-we-still-using-a-15-year-old-websocket-library-5d58</link>
      <guid>https://dev.to/rabbxdev/why-are-we-still-using-a-15-year-old-websocket-library-5d58</guid>
      <description>&lt;p&gt;Why are we still using a 15-year-old WebSocket library?&lt;br&gt;
​Don't get me wrong, the classic ws package is a legend. But it was built in a Node-only world. Today, we’re deploying to Cloudflare Workers, running servers on Bun, and testing in Deno. Fighting polyfills and native dependency errors just to get a socket connection open in 2026 is exhausting.&lt;br&gt;
​So, I built a zero-dependency, runtime-agnostic alternative&lt;br&gt;
&lt;a href="https://github.com/rabbxdev/ws" rel="noopener noreferrer"&gt;@rabbx/ws&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>bunjs</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>Why I rewrote `sirv` for Edge Runtimes (and added a plugin system)</title>
      <dc:creator>rabbxdev</dc:creator>
      <pubDate>Sat, 11 Jul 2026 15:59:09 +0000</pubDate>
      <link>https://dev.to/rabbxdev/why-i-rewrote-sirv-for-edge-runtimes-and-added-a-plugin-system-213p</link>
      <guid>https://dev.to/rabbxdev/why-i-rewrote-sirv-for-edge-runtimes-and-added-a-plugin-system-213p</guid>
      <description>&lt;p&gt;Lukeed's &lt;code&gt;sirv&lt;/code&gt; is legendary, but the edge runtime landscape has shifted. We need zero-copy streaming, native Web APIs, and composable transforms without pulling in Node-specific shims. &lt;/p&gt;

&lt;p&gt;Enter &lt;code&gt;@rabbx/sirv&lt;/code&gt;. It’s an ultra-fast, zero-dependency static file middleware for Bun, Deno, Node.js, and Cloudflare Workers.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Problem with Existing Middleware
&lt;/h4&gt;

&lt;p&gt;Most static servers are built for Node.js. When you try to run them on Deno or CF Workers, you end up polyfilling half the Node standard library, which kills performance and bloats the bundle. &lt;/p&gt;

&lt;h4&gt;
  
  
  The Solution: Edge-Native &amp;amp; Composable
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;@rabbx/sirv&lt;/code&gt; uses native Web APIs (&lt;code&gt;Request&lt;/code&gt;, &lt;code&gt;Response&lt;/code&gt;, &lt;code&gt;ReadableStream&lt;/code&gt;) from the ground up. &lt;/p&gt;

&lt;p&gt;But the real unlock is the plugin system. Instead of a rigid middleware chain, you get composable &lt;code&gt;setHeaders&lt;/code&gt; and &lt;code&gt;transform&lt;/code&gt; hooks with ordering and conditions.&lt;/p&gt;

&lt;p&gt;Here’s how easy it is to build a Markdown-to-HTML static site generator in 20 lines of code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;sirv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;plugin&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@rabbx/sirv&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;marked&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;marked&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;markdown&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;markdown&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.md&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ctx&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;marked&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/html; charset=utf-8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Length&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Let the runtime handle it&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;!DOCTYPE html&amp;gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;`&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="nx"&gt;Bun&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;serve&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;sirv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;posts&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="na"&gt;extensions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;md&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;markdown&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;h4&gt;
  
  
  Performance
&lt;/h4&gt;

&lt;p&gt;Because it relies on zero-copy streaming on Bun and avoids buffer allocations, you're looking at ~95k req/s with 0.3ms latency. &lt;/p&gt;

&lt;p&gt;It’s MIT, zero deps, and ready for production. Check out the repo: &lt;a href="https://github.com/rabbxdev/sirv" rel="noopener noreferrer"&gt;github&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>bunjs</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>@rabbx/watcher -tinny crossplatform file watcher,node,bun,deno ,chokidar-alternative</title>
      <dc:creator>rabbxdev</dc:creator>
      <pubDate>Thu, 14 May 2026 11:14:04 +0000</pubDate>
      <link>https://dev.to/rabbxdev/rabbxwatcher-tinny-crossplatform-file-watchernodebundeno-chokidar-alternative-2fil</link>
      <guid>https://dev.to/rabbxdev/rabbxwatcher-tinny-crossplatform-file-watchernodebundeno-chokidar-alternative-2fil</guid>
      <description>&lt;p&gt;Just shipped a 0-dep file watcher that actually works on Node, Bun, and Deno.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auto-fallback to polling if native watch dies&lt;/li&gt;
&lt;li&gt;Glob support: *&lt;em&gt;/&lt;/em&gt;.ts, exclude node_modules&lt;/li&gt;
&lt;li&gt;AwaitWriteFinish for VSCode saves&lt;/li&gt;
&lt;li&gt;No memory leaks, no crashes on Deno&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop-in chokidar alternative at 1/10th the size.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/rabbxdev/watcher" rel="noopener noreferrer"&gt;repo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>node</category>
      <category>bunjs</category>
      <category>deno</category>
    </item>
    <item>
      <title>The "WS" Evolution: Why I’m Switching to @rabbx/ws in 2026</title>
      <dc:creator>rabbxdev</dc:creator>
      <pubDate>Thu, 14 May 2026 04:46:08 +0000</pubDate>
      <link>https://dev.to/rabbxdev/the-ws-evolution-why-im-switching-to-rabbxws-in-2026-23go</link>
      <guid>https://dev.to/rabbxdev/the-ws-evolution-why-im-switching-to-rabbxws-in-2026-23go</guid>
      <description>&lt;p&gt;If you’ve been in the Node.js ecosystem for a while, you know the ws library is the bedrock of real-time apps. But as we move further into a multi-runtime world—juggling Node, Bun, Deno, and Cloudflare Workers—the "old way" is starting to show its age.&lt;br&gt;
I just came across &lt;strong&gt;@rabbx/ws&lt;/strong&gt;, and it feels like the upgrade we've been waiting for. Here is why it’s making waves:&lt;br&gt;
🚀 &lt;strong&gt;Zero Copy, Zero Deps:&lt;/strong&gt; It’s a tiny 9KB (compared to 80KB+ for traditional setups). No native dependencies means no "node-gyp" headaches and lightning-fast installs.&lt;br&gt;
🌍 &lt;strong&gt;True Cross-Platform:&lt;/strong&gt; It runs the exact same code on Node, Bun, Deno, and the browser. It uses native hooks (like Bun.serve.websocket) where available to squeeze out maximum performance.&lt;br&gt;
📈 &lt;strong&gt;Massive Scalability:&lt;/strong&gt; Benchmarks show it handling &lt;strong&gt;180k concurrent connections&lt;/strong&gt; on Node with 2.6x less memory than the standard ws library.&lt;/p&gt;
&lt;h3&gt;
  
  
  One API, Every Runtime
&lt;/h3&gt;

&lt;p&gt;The best part? It uses the &lt;strong&gt;Web Standard API&lt;/strong&gt; (EventTarget, MessageEvent). No custom emitters to learn.&lt;br&gt;
Here is how simple it is to spin up a server in &lt;strong&gt;Bun&lt;/strong&gt;:&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createBunServer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@rabbx/ws/server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// 1. Setup the WebSocket logic&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;wss&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createBunServer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/ws&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;wss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;connection&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="na"&gt;detail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;socket&lt;/span&gt; &lt;span class="p"&gt;}&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="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&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="nx"&gt;e&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="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Echo: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;e&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="s2"&gt;`&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="c1"&gt;// 2. Serve it&lt;/span&gt;
&lt;span class="nx"&gt;Bun&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;serve&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;websocket&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;websocket&lt;/span&gt;
&lt;span class="p"&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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Server running on port 3000&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;h3&gt;
  
  
  The Verdict
&lt;/h3&gt;

&lt;p&gt;If you are looking to reduce your bundle size, lower your server costs, or finally write WebSocket code that actually runs on the Edge, give @rabbx/ws a look.&lt;br&gt;
Check it out on GitHub: &lt;a href="https://github.com/rabbxdev/ws" rel="noopener noreferrer"&gt;github.com/rabbxdev/ws&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  WebSockets #Nodejs #BunJS #WebDev #OpenSource #SoftwareEngineering
&lt;/h1&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>javascript</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>The End of "Heavy" WebSockets: Introducing @rabbx/ws</title>
      <dc:creator>rabbxdev</dc:creator>
      <pubDate>Mon, 11 May 2026 18:45:31 +0000</pubDate>
      <link>https://dev.to/rabbxdev/the-end-of-heavy-websockets-introducing-rabbxws-j3e</link>
      <guid>https://dev.to/rabbxdev/the-end-of-heavy-websockets-introducing-rabbxws-j3e</guid>
      <description>&lt;p&gt;The Node.js ecosystem has relied on the ws library for 15 years. It’s reliable, but it was built for a different era—one before &lt;strong&gt;Bun&lt;/strong&gt;, &lt;strong&gt;Deno&lt;/strong&gt;, and &lt;strong&gt;Cloudflare Workers&lt;/strong&gt; redefined the edge.&lt;br&gt;
Enter &lt;strong&gt;@rabbx/ws&lt;/strong&gt;: a zero-dependency, zero-copy WebSocket library designed for 2026. It’s smaller, faster, and truly universal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Move Away from ws?
&lt;/h3&gt;

&lt;p&gt;While the classic ws package is the industry standard, it carries baggage. It’s roughly 80KB with dependencies and relies heavily on Node-specific native hooks.&lt;br&gt;
&lt;strong&gt;@rabbx/ws&lt;/strong&gt; strips away the bloat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ultra-Lightweight:&lt;/strong&gt; Only &lt;strong&gt;9KB&lt;/strong&gt; gzipped with &lt;strong&gt;zero dependencies&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Standard API:&lt;/strong&gt; No more learning custom event emitters. It uses EventTarget, MessageEvent, and CloseEvent—the same API you use in the browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance First:&lt;/strong&gt; It’s &lt;strong&gt;3x faster on Bun&lt;/strong&gt; (by leveraging native Bun.serve) and uses &lt;strong&gt;2.6x less memory&lt;/strong&gt; than traditional libraries.
### Performance Breakdown
If you're running high-concurrency applications, the memory savings alone are a game changer.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;ws (Node 20)&lt;/th&gt;
&lt;th&gt;
&lt;strong&gt;@rabbx/ws&lt;/strong&gt; (Node 20)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Throughput&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;380k msg/s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;450k msg/s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Max Connections&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;65k&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;180k&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RAM (10k conns)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.8GB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;680MB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  One Import, Every Runtime
&lt;/h3&gt;

&lt;p&gt;The biggest headache in modern web dev is writing code that works on Node but breaks on a Cloudflare Worker. @rabbx/ws solves this by providing specialized helpers for every major runtime while keeping the socket API identical.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Bun (The Speed King)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createBunServer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@rabbx/ws/server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;wss&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createBunServer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/ws&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;Bun&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;serve&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;websocket&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;websocket&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;wss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;connection&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="na"&gt;detail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;socket&lt;/span&gt; &lt;span class="p"&gt;}&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="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello from Bun!&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Node.js (The Reliable Standard)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createServer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createServer&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;createWSS&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@rabbx/ws/server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;httpServer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createWSS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;httpServer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/ws&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;wss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;connection&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="na"&gt;detail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;socket&lt;/span&gt; &lt;span class="p"&gt;}&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="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&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="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Should You Switch?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Use @rabbx/ws if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You are building cross-platform tools.&lt;/li&gt;
&lt;li&gt;You are running on Bun or Edge functions (Deno/Workers).&lt;/li&gt;
&lt;li&gt;You need to maximize connections per GB of RAM.&lt;/li&gt;
&lt;li&gt;You prefer the standard Web API over proprietary emitters.
&lt;strong&gt;Stick with ws if:&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You require permessage-deflate (compression) immediately (support for this is coming to @rabbx/ws soon in RFC 7692).
### Get Started
Ready to lighten your stack? Installation is a one-liner:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; Pick your poison
npm i @rabbx/ws
bun add @rabbx/ws
pnpm add @rabbx/ws
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check out the GitHub Repository to see the full documentation and benchmarks.&lt;br&gt;
&lt;a href="https://github.com/rabbxdev/ws" rel="noopener noreferrer"&gt;https://github.com/rabbxdev/ws&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>node</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Go Edge-native fast</title>
      <dc:creator>rabbxdev</dc:creator>
      <pubDate>Fri, 08 May 2026 20:46:42 +0000</pubDate>
      <link>https://dev.to/rabbxdev/go-edge-native-fast-dm8</link>
      <guid>https://dev.to/rabbxdev/go-edge-native-fast-dm8</guid>
      <description>&lt;p&gt;Ditch the bloat and go edge-native. ⚡️&lt;br&gt;
Say hello to &lt;strong&gt;@rabbx/ws&lt;/strong&gt;: the ultra-lean WebSocket library designed for the modern web.&lt;br&gt;
✅ &lt;strong&gt;Zero dependencies&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Edge-native performance&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Tiny footprint, massive scale&lt;/strong&gt;&lt;br&gt;
Stop fighting your tools and start building. 🚀&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rabbxdev/ws" rel="noopener noreferrer"&gt;https://github.com/rabbxdev/ws&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>javascript</category>
      <category>node</category>
    </item>
    <item>
      <title>I replaced ws with 2.5KB of code and deleted 14 dependencies</title>
      <dc:creator>rabbxdev</dc:creator>
      <pubDate>Thu, 07 May 2026 18:26:19 +0000</pubDate>
      <link>https://dev.to/rabbxdev/i-replaced-ws-with-25kb-of-code-and-deleted-14-dependencies-2352</link>
      <guid>https://dev.to/rabbxdev/i-replaced-ws-with-25kb-of-code-and-deleted-14-dependencies-2352</guid>
      <description>&lt;p&gt;npm install ws = 1.2MB.&lt;/p&gt;

&lt;p&gt;For a WebSocket.&lt;/p&gt;

&lt;p&gt;I checked &lt;code&gt;node_modules/ws&lt;/code&gt; and found 14 dependencies. To send &lt;code&gt;{"type": "ping"}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So I spent a weekend fixing it.&lt;/p&gt;

&lt;p&gt;Meet @rabbx/ws: 2.5KB gzipped, zero dependencies&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa38fy7ydoboc2b3xu9zd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa38fy7ydoboc2b3xu9zd.jpg" alt=" " width="720" height="1612"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6.4KB minified. 2.5KB gzipped. 0 deps. Tree-shakeable. Side-effect free.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Same Web Standard API you know:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;RbxSocket&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@rabbx/ws&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RbxSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;wss://echo.websocket.org&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;open&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;e&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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But it runs everywhere &lt;code&gt;ws&lt;/code&gt; can't.&lt;/p&gt;

&lt;p&gt;The problem with &lt;code&gt;ws&lt;/code&gt; in 2026&lt;br&gt;
    ws  @rabbx/ws&lt;br&gt;
&lt;strong&gt;Install size&lt;/strong&gt;    1.2 MB  &lt;strong&gt;6.4 KB&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Gzipped&lt;/strong&gt; ~300 KB &lt;strong&gt;2.5 KB&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Dependencies&lt;/strong&gt;    14  &lt;strong&gt;0&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Cold start&lt;/strong&gt;  118ms   &lt;strong&gt;8ms&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Cloudflare Workers&lt;/strong&gt;  ❌ Needs polyfills ✅ Native&lt;br&gt;
&lt;strong&gt;Bun&lt;/strong&gt; 🟡 Works  ✅ Native&lt;br&gt;
&lt;strong&gt;Deno&lt;/strong&gt;    ❌ Needs npm:  ✅ Native&lt;br&gt;
&lt;code&gt;ws&lt;/code&gt; was written in 2011. The web moved on. It still ships &lt;code&gt;bufferutil&lt;/code&gt; and &lt;code&gt;utf-8-validate&lt;/code&gt; native bindings that break edge runtimes.&lt;/p&gt;

&lt;p&gt;Cloudflare Workers gives you 50ms CPU time. &lt;code&gt;import 'ws'&lt;/code&gt; eats 118ms before your code runs. You literally cannot use it.&lt;/p&gt;

&lt;p&gt;Why 2.5KB matters&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Cold starts&lt;/em&gt;: Workers, Bun, Deno wake up in &amp;lt;10ms. Your deps shouldn't 12x that.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Bundle size&lt;/em&gt;: 2.5KB gzipped is smaller than most favicons. Your WebSocket lib shouldn't be your biggest dep.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Supply chain&lt;/em&gt;: 0 deps = 0 &lt;code&gt;left-pad&lt;/code&gt; incidents. 0 CVEs. 0 &lt;code&gt;node_modules&lt;/code&gt; surprises.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;DX&lt;/em&gt;: Same code locally and on the edge. No &lt;code&gt;if (platform.env === 'workerd')&lt;/code&gt; checks.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Migrating from &lt;code&gt;ws&lt;/code&gt; takes 30 seconds&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="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;uninstall&lt;/span&gt; &lt;span class="nx"&gt;ws&lt;/span&gt;
&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;rabbx&lt;/span&gt;&lt;span class="sr"&gt;/w&lt;/span&gt;&lt;span class="err"&gt;s
&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;WebSocket&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ws&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;RbxSocket&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@rabbx/ws&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;WebSocket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WebSocketPair&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RbxSocketServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;wss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;connection&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;wss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;open&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;For&lt;/span&gt; &lt;span class="nx"&gt;clients&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;it&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;s a drop-in:
- import WebSocket from &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;
+ import { RbxSocket } from &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;rabbx&lt;/span&gt;&lt;span class="sr"&gt;/ws&lt;/span&gt;&lt;span class="err"&gt;'
&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WebSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;wss://...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RbxSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;wss://...&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;We dogfood this&lt;/p&gt;

&lt;p&gt;2M+ messages/day. 0 crashes. 8ms cold starts.&lt;/p&gt;

&lt;p&gt;The post-npm era&lt;/p&gt;

&lt;p&gt;Your deps have deps. Our tools have none.&lt;/p&gt;

&lt;p&gt;We're building edge-native JS primitives. Zero dependencies. Web standard. Everywhere.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@rabbx/ws&lt;/code&gt; is just the start.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Star the repo if you're tired of npm bloat: &lt;a href="https://github.com/rabbxdev/ws" rel="noopener noreferrer"&gt;https://github.com/rabbxdev/ws&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Benchmark it. Break it. Roast me in the comments.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;What's the heaviest package in your &lt;code&gt;node_modules&lt;/code&gt; right now? I'll rewrite it next.&lt;/p&gt;




</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>node</category>
    </item>
    <item>
      <title>@rabbx/ws – WebSocket for Node/Bun/Deno/Workers in 9KB, zero deps</title>
      <dc:creator>rabbxdev</dc:creator>
      <pubDate>Wed, 06 May 2026 19:31:15 +0000</pubDate>
      <link>https://dev.to/rabbxdev/rabbxws-websocket-for-nodebundenoworkers-in-9kb-zero-deps-45bp</link>
      <guid>https://dev.to/rabbxdev/rabbxws-websocket-for-nodebundenoworkers-in-9kb-zero-deps-45bp</guid>
      <description>&lt;p&gt;Hey devs, I got tired of ws + isomorphic-ws + cross-fetch + polyfills just to open a socket that works everywhere.&lt;/p&gt;

&lt;p&gt;So I wrote @rabbx/ws: a 9KB WebSocket client/server that runs on Node, Bun, Deno, and Cloudflare Workers with the same code. Zero dependencies. Web standard APIs only.&lt;/p&gt;

&lt;p&gt;Why:&lt;br&gt;
9KB vs 1.2MB - ws pulls 14 deps. socket.io-client is 85KB gzipped. This is 9KB total.&lt;br&gt;
Zero deps - No debug, no safe-buffer, no ultron. Just EventTarget and WebSocket.&lt;br&gt;
Same code everywhere - new RbxSocket(url) works in Node 20, Bun, Deno, Workers. No if (isBrowser) branches.&lt;br&gt;
Cold starts matter - On Cloudflare Workers, importing ws costs 120ms. This costs 8ms. That’s the difference between 50ms and 170ms TTFB.&lt;br&gt;
star us help us grow&lt;br&gt;
&lt;a href="https://github.com/rabbxdev/ws" rel="noopener noreferrer"&gt;github&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>javascriptlibraries</category>
      <category>node</category>
    </item>
  </channel>
</rss>
