If your web client uses the nostr-tools relay pool, it’s been silently breaking your browser for years. Nobody could figure out why. We solved it last night with a single line of code.
Jumble has been my go-to web client for more than a year, because of its versatility, customizability, and overall design. It’s built the way I like to use Nostr in the browser, doesn’t prioritize fluff influencer content, and supports features I actually use, like custom emojis and relay feeds.
A few months ago, I had the idea to attempt a massively challenging project to build a best-in-class NIP-07 signer that sits alongside your browser window as an active companion to your Nostr experience.
Anyway, for the longest time, I struggled to get Sidecar to work properly with Jumble. Reposts and reactions did absolutely nothing. I couldn’t find an error, just loading indicators that pulsed forever as if the client was waiting for something that never arrived. Relay authentication took 30 seconds or more, when it even worked at all. Clearing the cache and restarting the browser usually fixed it, and not long after, it was broken again.
I began to think the bug was somewhere in Sidecar. I went looking through the app’s signing queue, its relay handling, and its permissions. I found bugs in all three and fixed them, but none of it made any difference. Then I checked the relays themselves from outside the browser and every one of them answered almost instantly. The relays were working. Sidecar was signing normally. But there was something else in the way.
The answer turned out to be the browser’s network tab. It was full of connections to the same handful of relays, over and over, seven to one relay alone. Every one of them had connected successfully and then transferred nothing at all. Some had been sitting open for more than an hour. In that one session the browser had opened roughly 700 of them.
That’s when it all made sense. The problem had to be in the client’s own dependencies. Jumble, like many other Nostr web clients including Sidecar, relies on the nostr-tools library. When the client needs to talk to a relay, it opens a websocket, and when one of those connections fails, it stays open for the entire life of that browser session. Clients that use the outbox model connect to the relays of everyone you follow to find their latest notes, and that list piles up very quickly. A browser is only designed to hold a limited number of these connections, and once those are exhausted, nothing else can connect. Not Jumble, not Sidecar, not any other tab you have open. Signing still works, because signing doesn’t need a relay, so your client hands you a perfectly good signed event that can’t go anywhere. That’s exactly why nothing seemed to be happening.
I worked through these problems methodically using two different agent sessions, one with Claude Opus 5 and the other with GLM 5.3-Flash. We passed information back and forth, and ultimately, Claude came back with the fix. I opened an issue with a full explanation of the problem and a solution in code. Within half an hour,
The fix is one line, in two places, slightly modified from the original:
this.ws?.close?.()
That’s it. That’s the fix. Close the broken socket you left open.
Now, every client using the nostr-tools relay pool gets this with a dependency bump. Other clients that run on NDK or maintain their own networking layer don’t need the fix, and were never affected by this issue.
This is what I love about open source software, and it’s what keeps drawing me in deeper. I don’t have a strong background in handwritten code, but I have a career of solving complex problems in creative ways, and as any of you who know me well will probably agree, I am fucking relentless when I set my mind on accomplishing something.
In the past two years, I pivoted my entire career direction, for at least the third time in under a decade. In that time, I received two awards in the Breez challenge. I got accepted into the
I choose to build on the Nostr and Bitcoin ecosystem because nothing else I’ve found has ever given me this level of ownership, and personal fulfillment, and I couldn’t imagine being anywhere else. Even if almost nobody gets it yet.
#NostrForever
Dr. The Daniel 🖖
I make stuff for Nostr and Lightning. 💜⚡️🖖 Powered by Spite-as-a-Service. #NostrForever Sidecar mixologist. 🍸🍊 https://sidecar.top Ghost in the machine 👻⚙️ https://ghostr.org Spacewalker at nostr:npub1fmunwy3lljfyzlgyuyman79lxwm4efz6pzlgqjwc400pr9l708qquvje8w ✨👩🚀 https://resolvr.io Short order vibecook 👨🏻🍳🍳 https://zap.cooking 2025 nostr:npub1jugar2agq6369p0l86razavs9shj2p6pscxecevs8j94ap37hkqsjlfc28 </time2build> winner 🏆 Sats Factory worker ⚡️🏭 https://satsfactory.com Nodestrich runner 🏃♂️⚡️💜♾️ https://nodestrich.com Zombie hunter 🏹🧟♂️ https://plebsvszombies.cc Mute list maximalist 🤫🔇 https://mutable.top Meetup disorganizer 🗽🧡 https://harlembitcoin.com Chief band namer 🤘🎸 nostr:npub12cqtmej8mutnwu0yzfmshznaxltetmn7nkzranps7v4dsxuc6mnqdf5pmv Crash test dummy wallet tester in residence 💥⚠️ Created 2008.jpeg, the first NFT on Nostr (sort of) Are you a Dan? Ask about membership in #OnlyDans 🫂 Follow the best dog ever 🐶💜 nostr:npub1cudap5kkjdvnv78v08m3748afshj0u3zh9h34svrf4nhn07gn4lscflujc I helped invent the Blocktron 🧠💡 https://blocktron.io Someone once called me a Nostr “fake-fluencer” because I said their app didn’t work (it didn’t) Muted by the guy who thinks sats aren’t the standard #SatsAreTheStandard ✨ Reported for “spam” by nostr:npub1lh273a4wpkup00stw8dzqjvvrqrfdrv2v3v4t8pynuezlfe5vjnsnaa9nk for saying “BLV is DOA” 🤡 The ex-head engineer at Truth Social called me a slop coder but nostr:npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6 said I saved Nostr forever 🫶 Unapologetic globetard 🌎🌍🌏 I was #1 on the #NostrRichList for 4 hours 💰 I’m not a real doctor, but I play one on Nostr. 🎓 Used to work at a bar, but then I grew up 🍻 GM ☀️ PV 🖖 since: 767700 No DMs, please. ⛔️
daniel@sidecar.top
I make stuff for Nostr and Lightning. 💜⚡️🖖 Powered by Spite-as-a-Service. #NostrForever Sidecar mixologist. 🍸🍊 https://sidecar.top Ghost in the machine 👻⚙️ https://ghostr.org Spacewalker at nostr:npub1fmunwy3lljfyzlgyuyman79lxwm4efz6pzlgqjwc400pr9l708qquvje8w ✨👩🚀 https://resolvr.io Short order vibecook 👨🏻🍳🍳 https://zap.cooking 2025 nostr:npub1jugar2agq6369p0l86razavs9shj2p6pscxecevs8j94ap37hkqsjlfc28 </time2build> winner 🏆 Sats Factory worker ⚡️🏭 https://satsfactory.com Nodestrich runner 🏃♂️⚡️💜♾️ https://nodestrich.com Zombie hunter 🏹🧟♂️ https://plebsvszombies.cc Mute list maximalist 🤫🔇 https://mutable.top Meetup disorganizer 🗽🧡 https://harlembitcoin.com Chief band namer 🤘🎸 nostr:npub12cqtmej8mutnwu0yzfmshznaxltetmn7nkzranps7v4dsxuc6mnqdf5pmv Crash test dummy wallet tester in residence 💥⚠️ Created 2008.jpeg, the first NFT on Nostr (sort of) Are you a Dan? Ask about membership in #OnlyDans 🫂 Follow the best dog ever 🐶💜 nostr:npub1cudap5kkjdvnv78v08m3748afshj0u3zh9h34svrf4nhn07gn4lscflujc I helped invent the Blocktron 🧠💡 https://blocktron.io Someone once called me a Nostr “fake-fluencer” because I said their app didn’t work (it didn’t) Muted by the guy who thinks sats aren’t the standard #SatsAreTheStandard ✨ Reported for “spam” by nostr:npub1lh273a4wpkup00stw8dzqjvvrqrfdrv2v3v4t8pynuezlfe5vjnsnaa9nk for saying “BLV is DOA” 🤡 The ex-head engineer at Truth Social called me a slop coder but nostr:npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6 said I saved Nostr forever 🫶 Unapologetic globetard 🌎🌍🌏 I was #1 on the #NostrRichList for 4 hours 💰 I’m not a real doctor, but I play one on Nostr. 🎓 Used to work at a bar, but then I grew up 🍻 GM ☀️ PV 🖖 since: 767700 No DMs, please. ⛔️