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