<?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.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>@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>
