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. โ๏ธ