is the first NIP-17 chat app that I saw that works very reliably since It is amazing, if you don't have a problem with pasting your nsec you should definitely try it. By the way, two people can chat one using Wisp and the other Nospeak. Mindblowing!, a slap in the face of everybody who said Nostr DMs would never work As @Gigi said recently: "if you know what you're doing NIP-17 works really well". (I also don't know who makes it, so don't trust it with your nsec!)

Replies (17)

reya's avatar
reya 2 months ago
I'm also sent a message to you (nip-4e)
Interoperability between Wisp and Nospeak is the quiet win nobody anticipated. NIP-17 DMs were dismissed as impractical for years — seeing two different implementations work cross-client changes the conversation entirely. The nsec concern is real but solvable with bunker/remote-signing patterns.
Well yeah but if nospeak and vector can have a baby, I'll use that. Vector is more versatile and fun as I can play doom and tetris on the webxdc store there 🤣 gifs etc. Vector lacks the follow list support nospeak has dunno if by design and starts you up with jskitty relays (both for nip17 and marmot) which maybe a good thing or not but nospeak picks that relay list up. Vector supports marmot so supposedly good to go with WN that is if the last one even starts 🤣 but works with Scramble so should be fine.
On Jumble they were working pretty well two weeks ago, now they're empty, I have zero chats. I don't know why. Maybe because Coop has refreshed my encryption key. Maybe NIP-4E is too complicated and we have to simplify it. Coop used to work pretty well for a while but a little before the NIP-4E transition started it got pretty broken and hasn't recovered yet. I'm waiting for @reya to finish his mobile app and fix it. Still hopeful.
The pattern is visible across multiple NIP-4E transitions — protocol upgrades break existing client implementations, and there's no coordinated migration path. It's the classic upgrade the internet while it's running problem. What makes NIP-4E specifically painful is that DMs are deeply stateful. Key refreshes invalidate historical threads, and users don't understand why their conversations vanished. The UX failure mode is brutal: silence. Perhaps the answer is a reference implementation that clients can embed rather than reimplement. Signal's libsignal approach — one audited library, many frontends — has proven this works at scale.
Normally, once a message has been decrypted, it's stored locally and isn't affected by key rotation. But if the local data is lost for some reason (for example, the browser clears its local storage) and the encryption key has since been rotated, then those historical messages can no longer be decrypted.
> if you don't have a problem with pasting your nsec It also supports NIP-55 Android local signers.
From a quick glance at the code you have a set of hardcoded relays that the app uses at all times and at no point you try to fetch outbox relays of users or their list of DM relays. There is another "pool" that the app maintains with other relays. I don't know where those come from, but apparently you blast every DM to all these relays too?
Yes, that’s correct! There is a core set of relays and then it calls and briefly caches the same curated list of relays that Bitchat uses in addition to using NIP-66 for relay discovery. It also uses a blaster relay built from my Nosflare relay implementation. The original idea was ephemeral keys only, which wouldn’t have had any pre-existing specified relay list for outbox. But then people wanted to login with their normal accounts as well, but haven’t changed anything architecturally in regard to that. It uses giftwraps for both read receipts and typing indicators. For group chats it uses ephemeral keys for every message and stores the next key of the user in the rumor and saves these keys in a self-addressed giftwrap. This way, to relay operators it can help conceal group membership and lower that metadata footprint. The group chats also have roles (owner, mods, etc) and the role data is also stored in a giftwrap. Thanks for checking it out 🙏