<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Newsletters on Nostr Compass</title><link>https://nostrcompass.org/en/newsletters/</link><description>Recent content in Newsletters on Nostr Compass</description><generator>Hugo</generator><language>en</language><atom:link href="https://nostrcompass.org/en/newsletters/feed.xml" rel="self" type="application/rss+xml"/><item><title>Nostr Compass #31</title><link>https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/</link><pubDate>Wed, 15 Jul 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#vector-v040-moves-group-chats-from-marmot-to-concord-and-amethyst-ships-its-own-concord-client-days-later">Vector v0.4.0&lt;/a> retires &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> as the default transport for Group Chats in favor of &lt;a href="https://nostrcompass.org/en/topics/concord-protocol/">Concord&lt;/a>, an open, MIT-licensed community protocol also used by Soapbox&amp;rsquo;s Armada, and ships Concord v2 four days later with a slash-command picker for bots, a self-destruct timer, and NIP-58 badges. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#amethyst-ships-a-clean-room-concord-implementation-for-end-to-end-encrypted-communities">Amethyst merges its own clean-room, wire-compatible Concord implementation&lt;/a> the same week. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#sonar-splits-off-from-bitchat-with-a-cross-platform-alpha-and-a-sticker-pack-spec">Sonar&lt;/a> splits off from Bitchat with a cross-platform alpha and is the cited spec source for this week&amp;rsquo;s sticker-pack kinds proposal. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#divine-mobile-1016-ships-a-deeper-video-editor-at-rest-encryption-and-proofmode-provenance">Divine Mobile 1.0.16&lt;/a> ships a deeper video editor, at-rest encryption, and ProofMode provenance that survives watermarked-clip downloads. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#bitchat-v170-adds-live-push-to-talk-voice-for-dms-and-the-public-mesh">Bitchat v1.7.0&lt;/a> adds live push-to-talk voice for DMs and signed push-to-talk on the public mesh. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#mdk-v094-bounds-external-signer-login-and-adds-draft-persistence">MDK v0.9.4&lt;/a> bounds external-signer login and adds draft persistence, continuing its hardening pass the same week Vector steps away from the spec for group chat.&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#vector-v040-moves-group-chats-from-marmot-to-concord-and-amethyst-ships-its-own-concord-client-days-later">Vector v0.4.0&lt;/a> retires &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> as the default transport for Group Chats in favor of &lt;a href="https://nostrcompass.org/en/topics/concord-protocol/">Concord&lt;/a>, an open, MIT-licensed community protocol also used by Soapbox&amp;rsquo;s Armada, and ships Concord v2 four days later with a slash-command picker for bots, a self-destruct timer, and NIP-58 badges. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#amethyst-ships-a-clean-room-concord-implementation-for-end-to-end-encrypted-communities">Amethyst merges its own clean-room, wire-compatible Concord implementation&lt;/a> the same week. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#sonar-splits-off-from-bitchat-with-a-cross-platform-alpha-and-a-sticker-pack-spec">Sonar&lt;/a> splits off from Bitchat with a cross-platform alpha and is the cited spec source for this week&amp;rsquo;s sticker-pack kinds proposal. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#divine-mobile-1016-ships-a-deeper-video-editor-at-rest-encryption-and-proofmode-provenance">Divine Mobile 1.0.16&lt;/a> ships a deeper video editor, at-rest encryption, and ProofMode provenance that survives watermarked-clip downloads. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#bitchat-v170-adds-live-push-to-talk-voice-for-dms-and-the-public-mesh">Bitchat v1.7.0&lt;/a> adds live push-to-talk voice for DMs and signed push-to-talk on the public mesh. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#mdk-v094-bounds-external-signer-login-and-adds-draft-persistence">MDK v0.9.4&lt;/a> bounds external-signer login and adds draft persistence, continuing its hardening pass the same week Vector steps away from the spec for group chat.&lt;/p>
&lt;p>Tagged releases bring &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#n_cord-v11-adds-nsec-bunker-support">n_cord v1.1&lt;/a> adding NSEC Bunker support, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#cdk-v0173-adds-nip-47-wallet-service-support-across-cdk-cdk-nwc-and-cdk-ffi">cdk v0.17.3&lt;/a> adding NIP-47 wallet-service support across cdk, cdk-nwc, and cdk-ffi, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#coop-mobile-v024-improves-nostr-connect-and-adds-ncryptsec1-import">Coop Mobile v0.2.4&lt;/a> improving Nostr Connect and adding ncryptsec1 import, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#nmail-v0140-ships-on-macos-with-scheduled-send-and-push-notifications">Nmail v0.14.0&lt;/a> landing on macOS with scheduled send, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#nostrord-v220-adds-a-dm-master-toggle-and-richer-direct-messages">Nostrord v2.2.0&lt;/a> adding a DM master toggle, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#nostr-wot-0386-hardens-key-backups-and-signing-prompts">Nostr WoT 0.3.86&lt;/a> hardening key backups to NIP-49 format, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#keep-android-v118-adds-first-run-frost-onboarding">Keep Android v1.1.8&lt;/a> adding first-run FROST onboarding, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#noscall-v060-adds-a-cashu-wallet-and-relay-based-push-notifications">Noscall v0.6.0&lt;/a> adding a Cashu wallet and relay-based push notifications, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#kubo-ships-tablet-mode-and-group-chat-photos">Kubo&lt;/a> adding tablet mode and group-chat photos, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#nostr-codex-phone-v029-adds-gitdiffread-file-helper-requests">Nostr Codex Phone v0.2.9&lt;/a> adding git, diff, and read-file helper requests.&lt;/p>
&lt;p>On the unreleased side, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#amethyst-lets-accounts-nickname-contacts-with-encrypted-nip-85-cards">Amethyst&lt;/a> lets accounts nickname contacts with encrypted NIP-85 cards across 54 merged PRs, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#zap-cooking-ships-my-kitchen-phase-3-and-fixes-an-ndk-pool-quorum-bug">Zap Cooking&lt;/a> ships My Kitchen Phase 3 and fixes an NDK pool quorum bug, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#kehto-streams-outbox-reads-before-relay-discovery">Kehto&lt;/a> streams outbox reads before relay discovery finishes, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#wired-and-tao-add-nip-57-creator-revenue-sharing">Wired and TAO&lt;/a> add NIP-57 creator revenue sharing, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#conduit-mono-rebuilds-the-merchant-orders-inbox-around-ephemeral-guest-checkout">Conduit Mono&lt;/a> rebuilds its merchant orders inbox around ephemeral guest checkout, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#buzz-hardens-channel-creator-provisioning-around-kind-39002">Buzz&lt;/a> hardens channel-creator provisioning across 240 merged PRs, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#nostr-docs-adopts-a-nip-49-signer-with-multi-account-and-qr-pairing">Nostr Docs&lt;/a> adopts a NIP-49 signer with multi-account and QR pairing. Newly tracked this week: &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#opendiscord-v101-launches-as-a-discord-style-client-on-nostr">OpenDiscord v1.0.1&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#auditable-voting-v01140-aligns-organiser-voter-and-audit-proxy-roles">Auditable Voting v0.1.140&lt;/a>, and Discovery pick &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#cambium-v032-pairs-with-heartwood-as-a-keyless-nip-55-signer">Cambium v0.3.2&lt;/a>, a keyless NIP-55 signer that proxies to a Heartwood hardware companion.&lt;/p>
&lt;p>The NIPs repository merges nothing in the last week and opens six proposals: &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#open-kind10011-favorite-follow-sets">kind:10011 favorite follow sets&lt;/a>, a &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#open-private-encrypted-drive-extends-nip-4e">private encrypted drive extending NIP-4E&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#open-nip-da-permissioned-private-data-sharing">NIP-DA permissioned private data sharing&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#open-sticker-pack-kinds-10031-and-30031">sticker pack kinds 10031 and 30031&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#open-nip-29-message-pinning-with-kind9010-and-kind39005">NIP-29 message pinning&lt;/a>, and a &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#open-nip-66-relay-discovery-restructure">NIP-66 relay discovery restructure&lt;/a>. The Deep Dive covers &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#nip-deep-dive-nip-99-and-the-gamma-markets-commerce-extension">NIP-99 and the Gamma Markets commerce extension&lt;/a>.&lt;/p>
&lt;hr>
&lt;h2 id="lead-stories">Lead stories&lt;/h2>
&lt;h3 id="vector-v040-moves-group-chats-from-marmot-to-concord-and-amethyst-ships-its-own-concord-client-days-later">Vector v0.4.0 moves Group Chats from Marmot to Concord, and Amethyst ships its own Concord client days later&lt;/h3>
&lt;p>&lt;a href="https://github.com/VectorPrivacy/Vector">Vector&lt;/a> is a Nostr messenger built around a single-binary, privacy-first client for DMs and group chats. &lt;a href="https://github.com/VectorPrivacy/Vector/releases/tag/v0.4.0">Vector v0.4.0&lt;/a> rewrites the app&amp;rsquo;s messaging engine into a shared &lt;code>vector-core&lt;/code> library and, in the same release, retires &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> (MLS-over-Nostr) as the default transport for Group Chats in favor of &lt;a href="https://nostrcompass.org/en/topics/concord-protocol/">Concord&lt;/a>, an end-to-end encrypted community protocol; existing Marmot group history does not carry over, and the release notes tell users to back up any Marmot group data before upgrading. Vector&amp;rsquo;s own release notes describe Concord as &amp;ldquo;our custom messaging protocol,&amp;rdquo; but the underlying &lt;a href="https://github.com/concord-protocol/concord">CORD-01 through CORD-07 specs&lt;/a> are published separately, MIT-licensed, and already implemented outside Vector: Soapbox&amp;rsquo;s Discord-style client &lt;a href="https://gitlab.com/soapbox-pub/armada">Armada&lt;/a> builds its Communities feature on the same Concord spec, and one day later, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3566">Amethyst merged its own clean-room, wire-compatible Concord implementation&lt;/a>, covered in full below. The same Vector release adds optional Tor routing for all traffic, &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote-signer login by QR or pasted bunker URI, multiple accounts with an in-app switcher, and custom emoji packs shared across clients. Message deletion removes a message for both sides in DMs and group chats, and Vector deliberately keeps the ephemeral signing key instead of following the standard &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> deletion flow, a privacy-motivated departure the project calls out explicitly in the release notes. Four days later, &lt;a href="https://github.com/VectorPrivacy/Vector/releases/tag/v0.4.1">v0.4.1&lt;/a> ships &lt;strong>Concord v2&lt;/strong>, described as bringing major privacy and stability improvements to Communities while keeping existing ones working, alongside a Discord-style slash-command picker for bots with typed parameters, a per-chat self-destruct timer, and a NIP-58 badge system for bug hunters. The move away from Marmot for group chat comes the same week &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#mdk-v094-bounds-external-signer-login-and-adds-draft-persistence">MDK v0.9.4&lt;/a> below continues investing in the spec.&lt;/p>
&lt;h3 id="amethyst-ships-a-clean-room-concord-implementation-for-end-to-end-encrypted-communities">Amethyst ships a clean-room Concord implementation for end-to-end encrypted communities&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> is a feature-rich Android and multiplatform Nostr client. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3566">PR #3566&lt;/a> adds a full implementation of &lt;a href="https://nostrcompass.org/en/topics/concord-protocol/">Concord&lt;/a> (CORD-01 through CORD-07) covering serverless, end-to-end encrypted communities: gift-wrapped control, chat, and guestbook planes over ordinary relays, owner-rooted role and ban enforcement that every client verifies locally instead of trusting a server, and rekeying to cut off removed members. Protocol and crypto code lives in &lt;code>quartz/&lt;/code>, state and view models in &lt;code>commons/&lt;/code>, and screens and navigation in &lt;code>amethyst/&lt;/code> for Android, with thin CLI verbs under &lt;code>cli/&lt;/code>; there is no desktop UI yet, since the shared logic sits in &lt;code>quartz&lt;/code>/&lt;code>commons&lt;/code> for Desktop to adopt later. The implementation is clean-room: built from the public CORD specs and observed wire constants, under Amethyst&amp;rsquo;s own MIT license, distinct from Armada&amp;rsquo;s AGPL-3.0 codebase. Armada&amp;rsquo;s own test-vector values were ported into Quartz&amp;rsquo;s unit tests to confirm the two clients actually interoperate on the wire, giving Concord three independent implementations within days of each other: Vector shipping first, Armada as Soapbox&amp;rsquo;s reference client, and now Amethyst&amp;rsquo;s from-spec build.&lt;/p>
&lt;h3 id="sonar-splits-off-from-bitchat-with-a-cross-platform-alpha-and-a-sticker-pack-spec">Sonar splits off from Bitchat with a cross-platform alpha and a sticker-pack spec&lt;/h3>
&lt;p>&lt;a href="https://sonarprivacy.xyz/">Sonar&lt;/a> is a Bluetooth-mesh-plus-Nostr messenger and wallet grown out of Bitchat, with Marmot group DMs interoperable with White Noise. Code lives at &lt;a href="https://github.com/hedwig-corp/bitchat-to-sonar">hedwig-corp/bitchat-to-sonar&lt;/a>. &lt;a href="https://github.com/hedwig-corp/bitchat-to-sonar/releases/tag/v0.1-alpha.7">v0.1-alpha.7&lt;/a> adds Signal-style bounded transcript windowing so open and scroll performance stays local-first, synchronizes nearby-discovery state across peers, and fixes Blossom media uploads that were failing on content-type and HTTP-status handling; the preceding &lt;a href="https://github.com/hedwig-corp/bitchat-to-sonar/releases/tag/v0.1-alpha.6">alpha.6&lt;/a> drained live Marmot events for faster chat refresh and closed Android-to-iOS feature parity gaps across calls, messaging, wallet, and push. Sonar is also the cited spec source for &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#open-sticker-pack-kinds-10031-and-30031">PR #2410&lt;/a>, which registers sticker-pack event kinds under the project&amp;rsquo;s own &amp;ldquo;Sonar Stickers&amp;rdquo; specification, giving this launch a direct hub link into this week&amp;rsquo;s protocol work.&lt;/p>
&lt;h3 id="divine-mobile-1016-ships-a-deeper-video-editor-at-rest-encryption-and-proofmode-provenance">Divine Mobile 1.0.16 ships a deeper video editor, at-rest encryption, and ProofMode provenance&lt;/h3>
&lt;p>&lt;a href="https://github.com/divinevideo/divine-mobile">Divine&lt;/a> is a short-video client built on Nostr with Web-of-Trust feed curation. &lt;a href="https://github.com/divinevideo/divine-mobile/releases/tag/1.0.16">v1.0.16&lt;/a>, the first tagged release since #30, adds clip transitions, reverse playback, a voice-over recorder, and timeline beat markers to the video editor, alongside a feed-tuning control that lets a user swipe to adjust recommendations directly instead of leaving them to opaque engagement signals. The release also turns on at-rest encryption for local data, adds background uploads that survive the app being suspended, and carries &lt;a href="https://nostrcompass.org/en/topics/proofmode/">ProofMode&lt;/a> provenance data forward when a watermarked clip is downloaded so the human-made attestation is not stripped in transit. Divine also ships new protections for under-16 accounts and expands localization to 17 languages and 284 translated strings.&lt;/p>
&lt;h3 id="bitchat-v170-adds-live-push-to-talk-voice-for-dms-and-the-public-mesh">Bitchat v1.7.0 adds live push-to-talk voice for DMs and the public mesh&lt;/h3>
&lt;p>&lt;a href="https://github.com/permissionlesstech/bitchat">Bitchat&lt;/a> is a Bluetooth-mesh chat app with an opt-in gateway onto Nostr relays. &lt;a href="https://github.com/permissionlesstech/bitchat/releases/tag/v1.7.0">v1.7.0&lt;/a>, released the evening #30 published, adds live push-to-talk voice in &lt;a href="https://github.com/permissionlesstech/bitchat/pull/1403">PR #1403&lt;/a> that streams audio while the sender holds the button and falls back to a voice note if the stream drops, plus signed public-mesh push-to-talk in &lt;a href="https://github.com/permissionlesstech/bitchat/pull/1406">PR #1406&lt;/a> so live voice bursts on the shared mesh channel carry sender authentication. The release also heals peer-ID rotation by rebinding the link on a verified re-announce, recognizing the same peer under its new ID (&lt;a href="https://github.com/permissionlesstech/bitchat/pull/1401">PR #1401&lt;/a>), and direct messages to a currently unreachable peer now queue with store-and-forward delivery instead of failing outright (&lt;a href="https://github.com/permissionlesstech/bitchat/pull/1415">PR #1415&lt;/a>). This continues directly from #30&amp;rsquo;s coverage of v1.6.0&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-13/">NIP-13&lt;/a> proof-of-work and mesh-to-Nostr gateway work.&lt;/p>
&lt;h3 id="mdk-v094-bounds-external-signer-login-and-adds-draft-persistence">MDK v0.9.4 bounds external-signer login and adds draft persistence&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/mdk">MDK&lt;/a> is the reference SDK for the &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> protocol, the MLS-over-Nostr messaging layer that #30 covered marking its spec adopted. &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.9.4">v0.9.4&lt;/a> bounds the advisory-directory steps a client walks through during external-signer login in &lt;a href="https://github.com/marmot-protocol/mdk/pull/793">PR #793&lt;/a>, preventing an unbounded retry loop when a remote signer is slow or unresponsive. The same release adds draft-message persistence and profile-website bindings in &lt;a href="https://github.com/marmot-protocol/mdk/pull/812">PR #812&lt;/a>, continuing the incremental hardening pass MDK has run since cutting v0.9.0.&lt;/p>
&lt;hr>
&lt;h2 id="tagged-releases">Tagged releases&lt;/h2>
&lt;h3 id="n_cord-v11-adds-nsec-bunker-support">n_cord v1.1 adds NSEC Bunker support&lt;/h3>
&lt;p>&lt;a href="https://github.com/0n4t3/n_cord">n_cord&lt;/a> is a Nostr-powered chat client inspired by Discord and IRC. &lt;a href="https://github.com/0n4t3/n_cord/releases/tag/v1.1">v1.1&lt;/a> adds &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> NSEC Bunker support alongside a reply-handling bug fix.&lt;/p>
&lt;h3 id="cdk-v0173-adds-nip-47-wallet-service-support-across-cdk-cdk-nwc-and-cdk-ffi">cdk v0.17.3 adds NIP-47 wallet-service support across cdk, cdk-nwc, and cdk-ffi&lt;/h3>
&lt;p>&lt;a href="https://github.com/cashubtc/cdk">cdk&lt;/a> is a Cashu development kit; this release is Bitcoin/Lightning-only in most respects, but &lt;a href="https://github.com/cashubtc/cdk/releases/tag/v0.17.3">v0.17.3&lt;/a> adds &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> (Nostr Wallet Connect) service support with a dedicated NWC service crate, wallet integration, FFI bindings for &lt;code>cdk-ffi&lt;/code>, and end-to-end test coverage, giving Cashu wallets built on cdk a standard Nostr Wallet Connect surface.&lt;/p>
&lt;h3 id="coop-mobile-v024-improves-nostr-connect-and-adds-ncryptsec1-import">Coop Mobile v0.2.4 improves Nostr Connect and adds ncryptsec1 import&lt;/h3>
&lt;p>&lt;a href="https://git.reya.su/reya/coop-mobile">Coop Mobile&lt;/a> is a &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> private-messaging client for mobile platforms. &lt;a href="https://git.reya.su/reya/coop-mobile/releases/tag/v0.2.4">v0.2.4&lt;/a> improves its &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> Nostr Connect flow, fixes a loading indicator that stuck permanently on some connections, and adds import support for the &lt;a href="https://nostrcompass.org/en/topics/nip-49/">NIP-49&lt;/a> &lt;code>ncryptsec1&lt;/code> encrypted key format alongside a redesigned identity-import screen.&lt;/p>
&lt;h3 id="nmail-v0140-ships-on-macos-with-scheduled-send-and-push-notifications">Nmail v0.14.0 ships on macOS with scheduled send and push notifications&lt;/h3>
&lt;p>&lt;a href="https://github.com/nogringo/nostr-mail-client">Nmail&lt;/a> is a mail client built on Nostr; &lt;a href="https://github.com/nogringo/nostr-mail-client/releases/tag/v0.14.0">v0.14.0&lt;/a> brings the app to macOS, adds scheduled send with a dedicated Scheduled mailbox for queued messages, and adds push notifications. The release also switches address-book Nostr identifier resolution to NDK&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-05/">NIP-05&lt;/a> resolver in place of a bespoke implementation.&lt;/p>
&lt;h3 id="nostrord-v220-adds-a-dm-master-toggle-and-richer-direct-messages">Nostrord v2.2.0 adds a DM master toggle and richer direct messages&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostrord/nostrord">Nostrord&lt;/a> is a &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> relay-based group-chat client for Android, iOS, web, and desktop. &lt;a href="https://github.com/nostrord/nostrord/releases/tag/v2.2.0">v2.2.0&lt;/a> adds a master toggle to disable all direct-message features at once (&lt;a href="https://github.com/nostrord/nostrord/pull/175">PR #175&lt;/a>) and ships &amp;ldquo;richer direct messages&amp;rdquo; (&lt;a href="https://github.com/nostrord/nostrord/pull/186">PR #186&lt;/a>), continuing from #30&amp;rsquo;s coverage of the release folding the relay pool and detecting zombie WebSockets.&lt;/p>
&lt;h3 id="nostr-wot-0386-hardens-key-backups-and-signing-prompts">Nostr WoT 0.3.86 hardens key backups and signing prompts&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-wot/nostr-wot-extension">Nostr WoT&lt;/a> is a browser extension pairing a Nostr identity with a Lightning wallet. &lt;a href="https://github.com/nostr-wot/nostr-wot-extension/releases/tag/v0.3.86">v0.3.86&lt;/a> moves encrypted-key backups to the standard &lt;a href="https://nostrcompass.org/en/topics/nip-49/">NIP-49&lt;/a> format, makes signing prompts show the full event and all tags instead of a summary, verifies relay data against its signature, and stops exposing the active identity when switching accounts. The extension also drops the unused &lt;code>scripting&lt;/code> browser permission.&lt;/p>
&lt;h3 id="keep-android-v118-adds-first-run-frost-onboarding">Keep Android v1.1.8 adds first-run FROST onboarding&lt;/h3>
&lt;p>&lt;a href="https://github.com/privkeyio/keep-android">Keep&lt;/a> is an Android signer built on threshold FROST key shares. &lt;a href="https://github.com/privkeyio/keep-android/releases/tag/v1.1.8">v1.1.8&lt;/a> adds a first-run flow that explains FROST key shares and lets a new user pick a signing policy of Manual, Basic, or Auto before the first signature request arrives, the first Android-side onboarding for the underlying keep-mobile crate&amp;rsquo;s threshold-signing model.&lt;/p>
&lt;h3 id="noscall-v060-adds-a-cashu-wallet-and-relay-based-push-notifications">Noscall v0.6.0 adds a Cashu wallet and relay-based push notifications&lt;/h3>
&lt;p>&lt;a href="https://github.com/sanah9/noscall">Noscall&lt;/a> is a secure audio- and video-calling app built on Nostr. &lt;a href="https://github.com/sanah9/noscall/releases/tag/v0.6.0-release">v0.6.0&lt;/a> adds an account-scoped Cashu wallet with multi-mint balances, ecash send and receive, and Lightning pay and receive with quote persistence. The release also migrates Android push notifications off Firebase Cloud Messaging to a Nostr-relay-based delivery path through UnifiedPush, and improves iOS VoIP and APNs push reliability during login retries.&lt;/p>
&lt;h3 id="kubo-ships-tablet-mode-and-group-chat-photos">Kubo ships tablet mode and group-chat photos&lt;/h3>
&lt;p>&lt;a href="https://github.com/JeroenOnNostr/kubo">Kubo&lt;/a> is a child-safe Nostr video platform with Web-of-Trust feed curation. &lt;a href="https://github.com/JeroenOnNostr/kubo/releases/tag/kubo-v2026.07.05">kubo-v2026.07.05&lt;/a> adds an opt-in tablet grid layout for the child feed and support for attaching photos to group-chat messages, plus fixes for the sign-up button hiding behind the on-screen keyboard on Android.&lt;/p>
&lt;h3 id="nostr-codex-phone-v029-adds-gitdiffread-file-helper-requests">Nostr Codex Phone v0.2.9 adds git/diff/read-file helper requests&lt;/h3>
&lt;p>&lt;a href="https://github.com/tidley/nostr-codex-phone">Nostr Codex Phone&lt;/a> is a mobile control surface for a local coding-assistant worker communicating over encrypted Nostr DMs. &lt;a href="https://github.com/tidley/nostr-codex-phone/releases/tag/v0.2.9">v0.2.9&lt;/a> adds mobile OpenCode tool actions including git, diff, read-file, status, and history helper requests, session pin and search improvements, and a task-stop control, alongside an encrypted &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> upload wrapper that shipped in the preceding v0.2.8.&lt;/p>
&lt;h3 id="gitworkshop-v303-fixes-newly-announced-refs-in-the-repo-explorer-and-ships-its-first-android-build">GitWorkshop v3.0.3 fixes newly announced refs in the repo explorer, and ships its first Android build&lt;/h3>
&lt;p>&lt;a href="https://github.com/DanConwayDev/gitworkshop">GitWorkshop&lt;/a> is a git-over-Nostr web UI for browsing and reviewing NIP-34 repositories. &lt;a href="https://github.com/DanConwayDev/gitworkshop/releases/tag/v3.0.3">v3.0.3&lt;/a> fixes the branches, tags, commits, and code-browsing views failing to resolve a ref that a repo announces after the explorer has already loaded it, alongside CI workflow-timing cleanup, confirmed directly against the tag and commit history. The same week, GitWorkshop published its first native Android build to &lt;a href="https://zapstore.dev">Zapstore&lt;/a>, starting at v3.0.0 and reaching v3.0.3 within hours; the web UI stays the primary interface, and the Android package brings the same NIP-34 repository browsing to a phone for the first time.&lt;/p>
&lt;h3 id="bitcoin-safe-reaches-flathub-spotlighting-its-nostr-sync--chat-plugin">Bitcoin-Safe reaches Flathub, spotlighting its Nostr Sync &amp;amp; Chat plugin&lt;/h3>
&lt;p>&lt;a href="https://bitcoin-safe.org">Bitcoin-Safe&lt;/a> is a self-custody Bitcoin wallet built around hardware-signer workflows. The project &lt;a href="https://flathub.org/apps/org.bitcoin_safe.BitcoinSafe">shipped a Flathub package&lt;/a> this week, its first listing in a mainstream Linux app store. The Flathub release puts Bitcoin-Safe&amp;rsquo;s Sync &amp;amp; Chat plugin in front of a wider audience: the plugin uses &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> direct messages, via the project&amp;rsquo;s own &lt;a href="https://github.com/andreasgriffin/bitcoin-nostr-chat">bitcoin-nostr-chat&lt;/a> library, to synchronize wallet labels between a user&amp;rsquo;s devices and to send and receive PSBTs for remote multisig co-signing between trusted participants. The Nostr layer itself shipped earlier, in &lt;a href="https://github.com/andreasgriffin/bitcoin-safe/releases/tag/2.0.0">2.0.0&lt;/a> (2026-06-29), which redesigned transaction signing around a &amp;ldquo;Share via Chat &amp;amp; Sync&amp;rdquo; connection type alongside QR, USB, and Bluetooth. This week&amp;rsquo;s news is the Flathub packaging putting that existing feature in front of a mainstream Linux audience for the first time.&lt;/p>
&lt;hr>
&lt;h2 id="unreleased-changes">Unreleased changes&lt;/h2>
&lt;h3 id="amethyst-lets-accounts-nickname-contacts-with-encrypted-nip-85-cards">Amethyst lets accounts nickname contacts with encrypted NIP-85 cards&lt;/h3>
&lt;p>Beyond the &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#amethyst-ships-a-clean-room-concord-implementation-for-end-to-end-encrypted-communities">Concord implementation&lt;/a> covered above, Amethyst merged 54 other PRs in the last week. The headline among them is &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3548">PR #3548&lt;/a>, which lets an account nickname any other user by publishing its own kind 30382 &lt;a href="https://nostrcompass.org/en/topics/nip-85/">NIP-85&lt;/a> contact card about them. The petname, a private note, and any custom &lt;a href="https://nostrcompass.org/en/topics/nip-30/">NIP-30&lt;/a> emoji-shortcode mappings live inside the card&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a>-encrypted content, so only the signing account can read them, and cards sync through the account&amp;rsquo;s extended outbox relay set on login and incrementally afterward. Feeds, chats, and mentions render the petname in place of the public display name, with a tappable nickname card on the profile page above the user&amp;rsquo;s real name.&lt;/p>
&lt;h3 id="zap-cooking-ships-my-kitchen-phase-3-and-fixes-an-ndk-pool-quorum-bug">Zap Cooking ships My Kitchen Phase 3 and fixes an NDK pool quorum bug&lt;/h3>
&lt;p>&lt;a href="https://github.com/zapcooking/frontend">Zap Cooking&lt;/a> is a recipe-sharing and cooking-community app built on Nostr. It merged 43 PRs continuing its &amp;ldquo;My Kitchen&amp;rdquo; meal-planning feature, landing grocery-list generation, a recipe picker, and a planner week grid in this phase. The same set of changes fixes an &lt;a href="https://github.com/nostr-dev-kit/ndk">NDK&lt;/a> (Nostr Development Kit) connection-pool quorum-readiness bug that could leave relay reads waiting past the point a quorum of relays had already answered.&lt;/p>
&lt;h3 id="kehto-streams-outbox-reads-before-relay-discovery">Kehto streams outbox reads before relay discovery&lt;/h3>
&lt;p>&lt;a href="https://github.com/kehto/web">Kehto&lt;/a> is an early web-based runtime for &lt;a href="https://nostrcompass.org/en/topics/nip-5d/">NIP-5D&lt;/a> Nostr applets, or &amp;ldquo;napplets.&amp;rdquo; It merged 26 PRs. &lt;a href="https://github.com/kehto/web/pull/193">PR #193&lt;/a> fixes outbox reads that previously waited on &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> relay-list loading to finish before opening any relay at all, so a relay-list load that never settled could block both event delivery and query timeouts; the fix opens validated relay hints immediately and streams results as write relays are discovered. A second change (&lt;a href="https://github.com/kehto/web/pull/196">PR #196&lt;/a>) aligns the project&amp;rsquo;s identity-audit page with NAP-SHELL, the Napplet platform&amp;rsquo;s lifecycle contract, part of the same protocol-alignment work visible elsewhere in this week&amp;rsquo;s &lt;code>napplet/web&lt;/code> release.&lt;/p>
&lt;h3 id="wired-and-tao-add-nip-57-creator-revenue-sharing">Wired and TAO add NIP-57 creator revenue sharing&lt;/h3>
&lt;p>&lt;a href="https://github.com/smolgrrr/Wired">Wired&lt;/a> and &lt;a href="https://github.com/smolgrrr/TAO">TAO&lt;/a> are twin free-speech-focused social clients built on Nostr, sharing the same PR list; both merged &lt;a href="https://github.com/smolgrrr/Wired/pull/121">PR #121&lt;/a>, which implements &lt;a href="https://nostrcompass.org/en/topics/nip-57/">NIP-57&lt;/a> creator revenue sharing so zaps sent to a post can split automatically to contributors beyond the original poster. This continues #30&amp;rsquo;s coverage of the pair raising their proof-of-work signal to 21 bits as unreleased work.&lt;/p>
&lt;h3 id="conduit-mono-rebuilds-the-merchant-orders-inbox-around-ephemeral-guest-checkout">Conduit Mono rebuilds the merchant orders inbox around ephemeral guest checkout&lt;/h3>
&lt;p>&lt;a href="https://github.com/Conduit-BTC/conduit-mono">Conduit Mono&lt;/a> is a marketplace protocol adjacent to &lt;a href="https://nostrcompass.org/en/topics/nip-99/">NIP-99&lt;/a> classified listings. &lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/174">PR #174&lt;/a> adds guest checkout using a browser-generated ephemeral key: the guest sends an encrypted order and a payment report to the merchant using that one-time key, and the merchant follows up out of band by phone or email, so the buyer never needs a durable inbox identity. &lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/175">PR #175&lt;/a> rebuilds the merchant orders inbox around a single shared order-state model, separating buyer and merchant roles and requiring a tracking code and carrier before a physical or mixed order can move to shipped. The project&amp;rsquo;s checkout flow builds on &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> private messages, &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encryption, and &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> gift wrap. This week&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#nip-deep-dive-nip-99-and-the-gamma-markets-commerce-extension">NIP Deep Dive&lt;/a> covers the &lt;a href="https://nostrcompass.org/en/topics/gamma-markets/">Gamma Markets&lt;/a> conventions this same order-state problem builds toward.&lt;/p>
&lt;h3 id="buzz-hardens-channel-creator-provisioning-around-kind-39002">Buzz hardens channel-creator provisioning around kind 39002&lt;/h3>
&lt;p>&lt;a href="https://github.com/block/buzz">Buzz&lt;/a> is a hive-mind communication platform connecting AI agents and humans over Nostr. It merged 240 PRs in the last week, continuing its relay-layer hardening arc from #30&amp;rsquo;s coverage of kind 44200 agent-turn metrics. This week&amp;rsquo;s fix (&lt;a href="https://github.com/block/buzz/pull/1830">PR #1830&lt;/a>) treats a channel&amp;rsquo;s creator as a member before kind 39002 channel-provisioning logic runs, closing a race where the creator&amp;rsquo;s own channel could reject them during setup.&lt;/p>
&lt;h3 id="nostr-docs-adopts-a-nip-49-signer-with-multi-account-and-qr-pairing">Nostr Docs adopts a NIP-49 signer with multi-account and QR pairing&lt;/h3>
&lt;p>&lt;a href="https://github.com/formstr-hq/nostr-docs">Nostr Docs&lt;/a> is a Nostr-native collaborative docs application. It merged 5 PRs, the notable one (&lt;a href="https://github.com/formstr-hq/nostr-docs/pull/50">PR #50&lt;/a>) adopting the &lt;code>@formstr/signer&lt;/code> package for full &lt;a href="https://nostrcompass.org/en/topics/nip-49/">NIP-49&lt;/a> authentication with multi-account switching and QR pairing, replacing an earlier bespoke signing path.&lt;/p>
&lt;h3 id="also-shipped">Also shipped&lt;/h3>
&lt;p>Smaller signer-interop and reliability fixes landed across several tracked projects in the last week without enough new surface for their own paragraphs: &lt;a href="https://github.com/DanConwayDev/ngit-cli">ngit-cli&lt;/a>, a command-line client for a Nostr-based GitHub alternative, ships &lt;a href="https://github.com/DanConwayDev/ngit-cli/releases/tag/v2.6.3">v2.6.3&lt;/a> making &lt;code>ngit init&lt;/code> give actionable setup guidance instead of repeatedly prompting for an nsec; &lt;a href="https://github.com/dtonon/manent">Manent&lt;/a>, a private encrypted notes-and-files app built on Nostr, ships &lt;a href="https://github.com/dtonon/manent/releases/tag/v1.4.1">v1.4.1&lt;/a> fixing Android signer login broken when Amber returns a hex pubkey and improving bunker-login scrolling; &lt;a href="https://github.com/77elements/noornote">NoorNote&lt;/a>, a slim, Google-service-free Nostr client, ships &lt;a href="https://github.com/77elements/noornote/releases/tag/v1.2.8">v1.2.8&lt;/a> fixing missed Nostrord-group notifications and adding a self-post alert toggle; &lt;a href="https://github.com/forgesworn/bray">Bray&lt;/a>, a trust-aware Nostr MCP server for AI agents and humans, ships &lt;a href="https://github.com/forgesworn/bray/releases/tag/v1.34.0">v1.34.0&lt;/a> sending client-name metadata on &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> bunker connect; &lt;a href="https://github.com/TsukemonoGit/lumilumi">Lumilumi&lt;/a>, a Nostr web client, caches &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> relay lists in local storage for offline fallback; &lt;a href="https://github.com/moogmodular/earthly">Earthly&lt;/a>, a Nostr-based local city and community app, adds &lt;a href="https://nostrcompass.org/en/topics/nip-50/">NIP-50&lt;/a> geo search; and &lt;a href="https://github.com/lnbits/lnbits">lnbits&lt;/a>, a free and open-source Lightning wallet and accounts system, ships &lt;a href="https://github.com/lnbits/lnbits/pull/3925">PR #3925&lt;/a> making &lt;code>send_nostr_dm&lt;/code> publish non-blocking inside an otherwise Lightning-focused release.&lt;/p>
&lt;hr>
&lt;h2 id="newly-tracked-and-discovered">Newly tracked and discovered&lt;/h2>
&lt;h3 id="opendiscord-v101-launches-as-a-discord-style-client-on-nostr">OpenDiscord v1.0.1 launches as a Discord-style client on Nostr&lt;/h3>
&lt;p>&lt;a href="https://github.com/sofia-gros/open-discord">OpenDiscord&lt;/a> is a Discord-style server-and-channel client built on Nostr with role-based permissions and WebRTC/SFU voice lobbies. &lt;a href="https://github.com/sofia-gros/open-discord/releases/tag/v1.0.1">v1.0.1&lt;/a> is the project&amp;rsquo;s first tagged installer release.&lt;/p>
&lt;h3 id="auditable-voting-v01140-aligns-organiser-voter-and-audit-proxy-roles">Auditable Voting v0.1.140 aligns organiser, voter, and audit-proxy roles&lt;/h3>
&lt;p>&lt;a href="https://github.com/tidley/auditable-voting">Auditable Voting&lt;/a> is a client-only Nostr voting shell. &lt;a href="https://github.com/tidley/auditable-voting/releases/tag/v0.1.140">v0.1.140&lt;/a> aligns the organiser, voter, and audit-proxy roles with the exact organiser-signed public questionnaire-definition event, closing a gap where an audit proxy could act on stale generated accounts or state persisted from a different worker or organiser.&lt;/p>
&lt;h3 id="cambium-v032-pairs-with-heartwood-as-a-keyless-nip-55-signer">Cambium v0.3.2 pairs with Heartwood as a keyless NIP-55 signer&lt;/h3>
&lt;p>&lt;a href="https://github.com/forgesworn/cambium">Cambium&lt;/a> is this issue&amp;rsquo;s Discovery pick: an Android &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> signer that holds no private key material of its own, proxying every signing request over &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> to a companion Heartwood hardware signer. The project shares the &lt;code>forgesworn&lt;/code> GitHub org with tracked project Bray, and Heartwood itself was covered in #30 shipping the relay-to-serial signing bridge that Cambium&amp;rsquo;s Android side now talks to. &lt;a href="https://github.com/forgesworn/cambium">v0.3.2&lt;/a> polishes the approval sheet to warn live when the selected identity differs from the app&amp;rsquo;s existing binding and moves activity-log writes to a single non-blocking queue.&lt;/p>
&lt;h3 id="also-launching-this-week-echoes-dispatch-and-linky">Also launching this week: echoes, Dispatch, and Linky&lt;/h3>
&lt;p>Three more launches are worth a mention this week. &lt;a href="https://github.com/Lwb89dev/echoes">echoes&lt;/a> is an offline-first, end-to-end encrypted notes app that syncs privately over Nostr. &lt;a href="https://github.com/freecritter/dispatch">Dispatch&lt;/a> is a local-first travel organizer where every save is &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a>-encrypted and backed up over Nostr under a dedicated, unlinkable key, and its &lt;a href="https://github.com/freecritter/dispatch">v0.3.0&lt;/a> release adds Amber &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> login so the app never touches the user&amp;rsquo;s private key directly. &lt;a href="https://github.com/hynek-jina/linky">Linky&lt;/a> combines Nostr contacts and DMs with Lightning and Cashu payments in a single progressive web app.&lt;/p>
&lt;hr>
&lt;h2 id="protocol-work-and-nip-updates">Protocol work and NIP updates&lt;/h2>
&lt;p>No PRs merged into the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a> in the last week. Six proposals opened.&lt;/p>
&lt;h3 id="open-kind10011-favorite-follow-sets">Open: kind:10011 favorite follow sets&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2413">PR #2413&lt;/a>, from fiatjaf, adds kind:10011 favorite follow sets. It mirrors the existing pattern where kind:10012 (favorite relay sets) holds &lt;code>a&lt;/code> tags pointing at kind:30002 relay sets, extending the same favoriting mechanism to kind:30000 follow sets so a client can bookmark a curated follow list without replacing its own contact list.&lt;/p>
&lt;h3 id="open-private-encrypted-drive-extends-nip-4e">Open: private encrypted drive extends NIP-4E&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2412">PR #2412&lt;/a>, from the Form* team, proposes a generic Metadata event, kind 34578, distinguished by a &lt;code>d&lt;/code> identifier tag and a &lt;code>t&lt;/code> sub-type tag, along with a private encrypted file system built on top of it that is already implemented in Form*&amp;rsquo;s own, still-experimental Form* Drive client. A file record is a Metadata event with &lt;code>t=files&lt;/code>: file blobs live on &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> servers while only an encrypted index sits on relays, and each file chunk gets its own ephemeral keypair with &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> v2 HKDF-derived encryption. A companion Decoupled Encryption Key event holds one drive-wide symmetric key that every file&amp;rsquo;s metadata decrypts against, and it explicitly builds on &lt;a href="https://nostrcompass.org/en/topics/nip-4e/">NIP-4E&lt;/a>, fiatjaf&amp;rsquo;s still-open storage-abstraction draft (&lt;a href="https://github.com/nostr-protocol/nips/pull/1647">PR #1647&lt;/a>, open since December 2024).&lt;/p>
&lt;p>That single drive-wide key means a leaked key exposes every file&amp;rsquo;s metadata in the drive, not just one file, since the per-file ephemeral keypairs only vary the chunk-encryption key, not the metadata-decryption key; no rotation or revocation path exists yet beyond publishing a new Metadata event warning that older events may be lost. A second, narrower proposal reaches for the same underlying NIP-4E idea from a different angle: &lt;a href="https://github.com/nostr-protocol/nips/pull/2361">PR #2361&lt;/a>, from fiatjaf, decouples identity and encryption keys inside &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> messaging specifically, open since June 1. Both PRs are unmerged, leaving this an active, contested corner of the design space. Form* says the Drive client is experimental with an update coming soon.&lt;/p>
&lt;h3 id="open-nip-da-permissioned-private-data-sharing">Open: NIP-DA permissioned private data sharing&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2411">PR #2411&lt;/a>, from JAFairweather, is a new NIP-DA draft for permissioned private data sharing through scoped data grants. Each user keeps one encrypted, authoritative record per scope on relays, and access is granted by privately delivering that scope&amp;rsquo;s symmetric key inside a &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> gift wrap, so relays store only ciphertext and never learn who granted access to whom; a revocation is just a key rotation, with no need to rewrite every consumer&amp;rsquo;s copy. The author positions it as distinct from &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> DMs (which can carry a data snapshot but not live updates or revocation) and from NIP-51 private lists (which carry no key material), and cites two independent implementations, a JavaScript reference library and a Go CLI on go-nostr, cross-tested against relay.damus.io, nos.lol, and relay.primal.net.&lt;/p>
&lt;h3 id="open-sticker-pack-kinds-10031-and-30031">Open: sticker pack kinds 10031 and 30031&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2410">PR #2410&lt;/a>, from vincenzopalazzo, registers kind 30031 (addressable sticker packs) and kind 10031 (a user&amp;rsquo;s sticker pack list) in the Event Kinds table, specified by the &amp;ldquo;Sonar Stickers&amp;rdquo; format that &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#sonar-splits-off-from-bitchat-with-a-cross-platform-alpha-and-a-sticker-pack-spec">Sonar&lt;/a> ships this week. The kinds sit deliberately one slot above the &lt;a href="https://nostrcompass.org/en/topics/nip-30/">NIP-30&lt;/a> custom-emoji kinds 30030 and 10030 so a client cannot mistake a sticker pack for an emoji set; sticker image bytes live on HTTPS &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a>-compatible servers, and sent-sticker references carry a plaintext hash so an edited addressable pack cannot silently change the appearance of stickers already sent in old messages. A companion PR registers the same kinds in the separate &lt;code>registry-of-kinds&lt;/code> project.&lt;/p>
&lt;h3 id="open-nip-29-message-pinning-with-kind9010-and-kind39005">Open: NIP-29 message pinning with kind:9010 and kind:39005&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2379">PR #2379&lt;/a>, from Anderson-Juhasc, adds message pinning to &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> relay-based groups: kind:9010 &lt;code>update-pin-list&lt;/code> is a moderation event carrying the full pinned-event list as &lt;code>e&lt;/code> tags in display order, so a single event can pin, unpin, reorder, or clear the pinned set, and kind:39005 is a relay-generated mirror exposing the latest accepted list. The design supersedes an earlier add/remove-pair approach from &lt;a href="https://github.com/nostr-protocol/nips/pull/1163">PR #1163&lt;/a> after review feedback, and picks kind numbers 9010/39005 because 9009 and 39003 have since been claimed by &lt;code>create-invite&lt;/code> and group roles. Anderson-Juhasc also maintains &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#nostrord-v220-adds-a-dm-master-toggle-and-richer-direct-messages">Nostrord&lt;/a>, whose &lt;a href="https://github.com/nostrord/nostrord/releases/tag/v2.2.0">v2.2.0&lt;/a> ships this same week.&lt;/p>
&lt;h3 id="open-nip-66-relay-discovery-restructure">Open: NIP-66 relay discovery restructure&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2241">PR #2241&lt;/a>, from VincenzoImp, is a substantial restructure of &lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a> relay discovery. It replaces the loose &amp;ldquo;Other tags include&amp;rdquo; prose with a structured Indexed Tags section, adds a &lt;code>W&lt;/code> tag mirroring NIP-11&amp;rsquo;s &lt;code>attributes&lt;/code> field for relay-discovery filtering, adds an &lt;code>l&lt;/code> label tag using standardized namespaces (&lt;code>ISO-639-1&lt;/code>, &lt;code>ISO-3166-1&lt;/code>, &lt;code>IANA-asn&lt;/code>, &lt;code>IANA-tz&lt;/code>, &lt;code>nip66.label.city&lt;/code>), and organizes RTT, SSL/TLS, network, geographic, DNS, and HTTP tags into dedicated sections alongside a new Check Types table. It also fixes broken example events that had wrong field names, a missing &lt;code>kind&lt;/code>, and invalid check-type names, and closes out &lt;a href="https://github.com/nostr-protocol/nips/issues/2171">issue #2171&lt;/a>. All changes stay backward compatible since every added tag is optional.&lt;/p>
&lt;hr>
&lt;h2 id="nip-deep-dive-nip-99-and-the-gamma-markets-commerce-extension">NIP Deep Dive: NIP-99 and the Gamma Markets commerce extension&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-15/">NIP-15&lt;/a>, the original Nostr Marketplace spec, is legacy at this point: it modeled a merchant stall (kind 30017) with products (kind 30018) filed underneath it, and the clients that once ran on it, Shopstr among them, have since moved to &lt;a href="https://nostrcompass.org/en/topics/nip-99/">NIP-99&lt;/a> classified listings as the active spec. NIP-99 itself is a single addressable event, kind 30402 for an active listing or kind 30403 for a draft, with no stall to create first. It leaves everything past the listing undefined: shipping cost, order status, receipts, reviews, and a way to group several listings under one storefront, exactly the parts of NIP-15 that never carried over. &lt;a href="https://nostrcompass.org/en/topics/gamma-markets/">Gamma Markets&lt;/a> fills that gap, and is the modern commerce layer worth understanding today.&lt;/p>
&lt;h3 id="the-gap-nip-99-leaves-open">The gap NIP-99 leaves open&lt;/h3>
&lt;p>A NIP-99 listing&amp;rsquo;s &lt;code>content&lt;/code> field carries a Markdown description, &lt;code>price&lt;/code> and &lt;code>location&lt;/code> sit directly on the event, and &lt;code>t&lt;/code> tags make it searchable as ordinary hashtag content. Because it is addressable on the pubkey, kind, and &lt;code>d&lt;/code> tag tuple, a seller edits a listing in place by publishing a new version with the same &lt;code>d&lt;/code> tag:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">30402&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Vintage mechanical keyboard, Cherry MX Blue switches, barely used.&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;keyboard-mx-blue-01&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;title&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Vintage Mechanical Keyboard&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;summary&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Cherry MX Blue, barely used&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;published_at&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;1752537600&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;location&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;NYC&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;price&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;100&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;USD&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;t&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;electronics&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>That is the entire spec: a signed, updatable classified ad. Every client implementing NIP-99 for real e-commerce, beyond a one-off classified, ended up inventing its own private conventions for shipping, order messages, and reviews. Two NIP-99 clients could each render a listing correctly and still have no shared way to complete a checkout between them.&lt;/p>
&lt;h3 id="gamma-markets-standardizing-what-nip-99-left-out">Gamma Markets: standardizing what NIP-99 left out&lt;/h3>
&lt;p>Gamma Markets is the name a working group of Nostr marketplace developers, the teams behind Shopstr, Cypher, Plebeian Market, and Conduit Market, gave to a shared set of e-commerce conventions built on top of NIP-99&amp;rsquo;s existing kind 30402 event. The spec is linked from the canonical NIP-99 document via &lt;a href="https://github.com/nostr-protocol/nips/pull/1784">PR #1784&lt;/a> and maintained in its own repository, &lt;a href="https://github.com/GammaMarkets/market-spec">GammaMarkets/market-spec&lt;/a>.&lt;/p>
&lt;p>Gamma Markets adds two standalone listing-adjacent kinds. Kind 30405 groups multiple listings into a product collection, referencing each one by an explicit &lt;code>a&lt;/code> tag:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">30405&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Summer sale picks&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;summer-picks&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;title&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Summer Sale&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;a&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;30402:&amp;lt;merchant-pubkey&amp;gt;:keyboard-mx-blue-01&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;shipping_option&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;30406:&amp;lt;merchant-pubkey&amp;gt;:standard-regional&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Kind 30406 defines a shipping option with per-country pricing and optional weight- or distance-based cost rules:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">30406&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Standard Regional Shipping&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;standard-regional&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;title&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Standard Shipping&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;price&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;5.99&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;USD&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;country&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;US&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;service&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;standard&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;duration&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;24&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;72&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;H&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;weight-max&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;30&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;kg&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Order creation, payment requests, status and shipping updates, and payment receipts all move as ordinary &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> gift-wrapped private messages, split across three kinds by role, not by rewrapping the transport: kind 14 carries free-form buyer/merchant communication, kind 16 carries every order-state transition (a &lt;code>type&lt;/code> tag of 1 through 4 marks order creation, payment request, status update, or shipping update), and kind 17 carries the buyer&amp;rsquo;s payment receipt. An order creation message looks like this before gift-wrapping:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">16&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Please leave the package with the doorman.&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;lt;merchant-pubkey&amp;gt;&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;subject&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;New order&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;type&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;1&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;order&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;order-8f21&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;amount&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;115000&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;item&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;30402:&amp;lt;merchant-pubkey&amp;gt;:keyboard-mx-blue-01&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;1&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;shipping&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;30406:&amp;lt;merchant-pubkey&amp;gt;:standard-regional&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Rating a completed purchase is a separate addressable kind, 31555, pointing back at the listing it reviews:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">31555&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Arrived fast, exactly as described.&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;a:30402:&amp;lt;merchant-pubkey&amp;gt;:keyboard-mx-blue-01&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;rating&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;1&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;thumb&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;rating&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;1.0&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;quality&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;rating&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;0.9&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;delivery&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Riding order messages on NIP-17 means a Gamma Markets checkout uses the same private-message transport clients already ship for DMs, instead of a bespoke order-message kind.&lt;/p>
&lt;p>The spec&amp;rsquo;s core design choice is that nothing cascades. A listing that belongs to a collection references it explicitly with an &lt;code>a&lt;/code> tag instead of inheriting the collection&amp;rsquo;s shipping options or description automatically, and a shipping option a listing uses is referenced the same explicit way. That is a deliberate reversal of NIP-15&amp;rsquo;s stall model, where a product silently inherited whatever currency and shipping table its parent stall defined. The tradeoff is more explicit tagging on every listing, in exchange for a listing&amp;rsquo;s full configuration always being readable from the event itself, with no parent object to resolve first.&lt;/p>
&lt;h3 id="where-this-shows-up-in-practice">Where this shows up in practice&lt;/h3>
&lt;p>This week&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/#conduit-mono-rebuilds-the-merchant-orders-inbox-around-ephemeral-guest-checkout">Conduit Mono&lt;/a> work sits in the same order-message territory Gamma Markets standardizes: &lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/174">PR #174&lt;/a>&amp;rsquo;s ephemeral-key guest checkout and &lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/175">PR #175&lt;/a>&amp;rsquo;s merchant-orders-inbox rebuild both solve the buyer/merchant order-state problem that Gamma Markets&amp;rsquo; kind 14, 16, and 17 messages formalize; Conduit Mono runs its own order-state model alongside those kinds, without adopting them directly. Shopstr, one of the four projects that authored the spec, kept its own commerce plumbing moving in the last week too: &lt;a href="https://github.com/shopstr-eng/shopstr/pull/568">PR #568&lt;/a> extracts duplicated NIP-17 gift-wrap logic into a shared module, and &lt;a href="https://github.com/shopstr-eng/shopstr/pull/567">PR #567&lt;/a> brings its &lt;a href="https://nostrcompass.org/en/topics/nip-98/">NIP-98&lt;/a> HTTP-auth parser to full test coverage, maintenance on exactly the messaging and auth layers a Gamma Markets order flow depends on to reach a buyer and merchant safely.&lt;/p>
&lt;p>NIP-15 lost the storefront role by standardizing a stall and a product, then leaving payments, shipping, reviews, and order status as an application problem. Gamma Markets fills most of that missing surface without touching NIP-99&amp;rsquo;s single-listing shape, building on Nostr&amp;rsquo;s existing DM stack, NIP-17, instead of inventing a new messaging layer.&lt;/p>
&lt;hr>
&lt;p>That&amp;rsquo;s it for this week. Building something or have news to share? Reach out via NIP-17 DM or find us on Nostr.&lt;/p></content:encoded></item><item><title>Nostr Compass #30</title><link>https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/</link><pubDate>Wed, 08 Jul 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> the &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#marmot-marks-the-spec-adopted-and-mdk-cuts-v09x">Marmot spec is marked adopted&lt;/a> across 42 files as MDK cuts v0.9.0 through v0.9.3 with encrypted group avatars, external signer support, and MarmotKit iOS and Android bindings. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#mostro-v0180-and-mobile-v130-ship-transport-v2-on-nip-44">Mostro ships Transport v2&lt;/a> on NIP-44 direct messages with anti-spam gates and a coexistence window in both mostrod v0.18.0 and Mobile v1.3.0. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#bitchat-160-adds-nip-13-proof-of-work-and-an-opt-in-mesh-to-nostr-gateway">Bitchat 1.6.0 adds NIP-13 proof-of-work&lt;/a> to geohash channel messages, an opt-in mesh-to-Nostr gateway that lets one online phone uplink a whole crowd, prekey bundles, transitive verification, and creator-managed encrypted private groups. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#amber-v623-scopes-profile-subscriptions-and-adds-a-tor-status-notification">Amber&lt;/a> scopes profile subscriptions per account, fetches NIP-65 relay lists before profile metadata, and adds a live Tor status notification with a restart action. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#rust-nostr-adds-nip-40-expiration-to-gift-wrap-and-private-dm-builders">rust-nostr&lt;/a> adds NIP-40 expiration to gift wrap and NIP-17 DM builders, anchored to the wrap&amp;rsquo;s randomized timestamp. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#amethyst-spends-the-week-hardening-negentropy-sync-and-adding-nip-50-search">Amethyst&lt;/a> merges 43 PRs of negentropy sync hardening, NIP-50 full-text search infrastructure, and event kinds for niche verticals. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#nostrord-v200-and-v210-fold-the-relay-pool-and-heal-zombie-websockets">Nostrord ships v2.0.0 and v2.1.0&lt;/a> with a folded relay pool, zombie WebSocket detection, and a full disk-first cache seam. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#ngit-v262-stops-duplicate-pr-status-events-on-default-branch-push">Ngit v2.6.2&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#jumble-v2671-makes-blossom-the-default-upload-service-in-a-dm-focused-cut">Jumble v26.7.1&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#applesauce-signers-622-drops-an-nbunksec-dependency">Applesauce signers 6.2.2&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#bray-v1330-cli-picks-up-a-bunker-profile-persona-and-tor-outbound">Bray v1.33.0&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#deepmarks-100-hardens-the-nostr-bookmarking-surface">Deepmarks 1.0.0&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#bitcredit-core-v0513-unencrypts-block-metadata-on-the-nostr-wire">Bitcredit Core v0.5.13&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#coop-mobile-v023-and-v024">Coop Mobile v0.2.4&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#granary-v110-adds-nip-71-video-event-support">Granary v11.0&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#nostr-relay-v00244-adds-a-firestore-backend">Nostr-relay v0.0.244&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#manent-v140-fixes-nip-42-auth-and-adds-media-clipboard-flows">Manent v1.4.0&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#routstrd-v037-makes-the-nostr-event-store-the-persistent-source-of-truth">Routstrd v0.3.7&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#nymchat-101-launches-as-a-progressive-web-app-on-nip-17">Nymchat 1.0.1&lt;/a>, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#21meetup-110-launches-nostr-signed-attendance-badges">21Meetup 1.1.0&lt;/a> also ship, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#safebox-publishes-a-phase-3-progress-report-and-a-freebsd-jail-runbook">SafeBox marks Phase 3 substantially complete&lt;/a> alongside a FreeBSD jail deployment runbook and an OpenETR spin-off for electronic transferable records. The NIPs repository merges a &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#merged-nip-51-and-nip-37-align-the-kind-10013-name">NIP-51 and NIP-37 name alignment&lt;/a> and opens five proposals: &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#open-nip-ad-nostr-web-addresses-via-well-known-lookup">NIP-AD Nostr Web Addresses&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#open-nip-86-claim-management-for-invite-codes">NIP-86 invite-code claim management&lt;/a>, an &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#open-role-color-as-h-s-l-tuple">HSL role color format&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#open-nip-80-hardware-attested-media-provenance">NIP-80 hardware-attested media provenance&lt;/a>, and a &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#open-nip-01-pagination-hardening">pagination fix in NIP-01&lt;/a>. Deep dives cover &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#nip-deep-dive-nip-13-proof-of-work">NIP-13 (proof-of-work)&lt;/a> and &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#nip-deep-dive-nip-40-expiration-timestamp">NIP-40 (expiration timestamp)&lt;/a>.&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> the &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#marmot-marks-the-spec-adopted-and-mdk-cuts-v09x">Marmot spec is marked adopted&lt;/a> across 42 files as MDK cuts v0.9.0 through v0.9.3 with encrypted group avatars, external signer support, and MarmotKit iOS and Android bindings. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#mostro-v0180-and-mobile-v130-ship-transport-v2-on-nip-44">Mostro ships Transport v2&lt;/a> on NIP-44 direct messages with anti-spam gates and a coexistence window in both mostrod v0.18.0 and Mobile v1.3.0. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#bitchat-160-adds-nip-13-proof-of-work-and-an-opt-in-mesh-to-nostr-gateway">Bitchat 1.6.0 adds NIP-13 proof-of-work&lt;/a> to geohash channel messages, an opt-in mesh-to-Nostr gateway that lets one online phone uplink a whole crowd, prekey bundles, transitive verification, and creator-managed encrypted private groups. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#amber-v623-scopes-profile-subscriptions-and-adds-a-tor-status-notification">Amber&lt;/a> scopes profile subscriptions per account, fetches NIP-65 relay lists before profile metadata, and adds a live Tor status notification with a restart action. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#rust-nostr-adds-nip-40-expiration-to-gift-wrap-and-private-dm-builders">rust-nostr&lt;/a> adds NIP-40 expiration to gift wrap and NIP-17 DM builders, anchored to the wrap&amp;rsquo;s randomized timestamp. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#amethyst-spends-the-week-hardening-negentropy-sync-and-adding-nip-50-search">Amethyst&lt;/a> merges 43 PRs of negentropy sync hardening, NIP-50 full-text search infrastructure, and event kinds for niche verticals. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#nostrord-v200-and-v210-fold-the-relay-pool-and-heal-zombie-websockets">Nostrord ships v2.0.0 and v2.1.0&lt;/a> with a folded relay pool, zombie WebSocket detection, and a full disk-first cache seam. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#ngit-v262-stops-duplicate-pr-status-events-on-default-branch-push">Ngit v2.6.2&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#jumble-v2671-makes-blossom-the-default-upload-service-in-a-dm-focused-cut">Jumble v26.7.1&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#applesauce-signers-622-drops-an-nbunksec-dependency">Applesauce signers 6.2.2&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#bray-v1330-cli-picks-up-a-bunker-profile-persona-and-tor-outbound">Bray v1.33.0&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#deepmarks-100-hardens-the-nostr-bookmarking-surface">Deepmarks 1.0.0&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#bitcredit-core-v0513-unencrypts-block-metadata-on-the-nostr-wire">Bitcredit Core v0.5.13&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#coop-mobile-v023-and-v024">Coop Mobile v0.2.4&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#granary-v110-adds-nip-71-video-event-support">Granary v11.0&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#nostr-relay-v00244-adds-a-firestore-backend">Nostr-relay v0.0.244&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#manent-v140-fixes-nip-42-auth-and-adds-media-clipboard-flows">Manent v1.4.0&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#routstrd-v037-makes-the-nostr-event-store-the-persistent-source-of-truth">Routstrd v0.3.7&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#nymchat-101-launches-as-a-progressive-web-app-on-nip-17">Nymchat 1.0.1&lt;/a>, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#21meetup-110-launches-nostr-signed-attendance-badges">21Meetup 1.1.0&lt;/a> also ship, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#safebox-publishes-a-phase-3-progress-report-and-a-freebsd-jail-runbook">SafeBox marks Phase 3 substantially complete&lt;/a> alongside a FreeBSD jail deployment runbook and an OpenETR spin-off for electronic transferable records. The NIPs repository merges a &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#merged-nip-51-and-nip-37-align-the-kind-10013-name">NIP-51 and NIP-37 name alignment&lt;/a> and opens five proposals: &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#open-nip-ad-nostr-web-addresses-via-well-known-lookup">NIP-AD Nostr Web Addresses&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#open-nip-86-claim-management-for-invite-codes">NIP-86 invite-code claim management&lt;/a>, an &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#open-role-color-as-h-s-l-tuple">HSL role color format&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#open-nip-80-hardware-attested-media-provenance">NIP-80 hardware-attested media provenance&lt;/a>, and a &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#open-nip-01-pagination-hardening">pagination fix in NIP-01&lt;/a>. Deep dives cover &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#nip-deep-dive-nip-13-proof-of-work">NIP-13 (proof-of-work)&lt;/a> and &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-08-newsletter/#nip-deep-dive-nip-40-expiration-timestamp">NIP-40 (expiration timestamp)&lt;/a>.&lt;/p>
&lt;hr>
&lt;h2 id="lead-stories">Lead stories&lt;/h2>
&lt;h3 id="marmot-marks-the-spec-adopted-and-mdk-cuts-v09x">Marmot marks the spec adopted and MDK cuts v0.9.x&lt;/h3>
&lt;p>The &lt;a href="https://github.com/marmot-protocol/marmot">Marmot protocol repository&lt;/a> merged &lt;a href="https://github.com/marmot-protocol/marmot/pull/170">PR #170&lt;/a> on July 3, changing 42 files from &lt;code>Status: draft for internal review&lt;/code> (and &lt;code>experimental draft&lt;/code>) to &lt;code>Status: adopted&lt;/code>. The README title moved from framing the repo as a work in progress to &amp;ldquo;Marmot Protocol&amp;rdquo; as the adopted text, the MIP-era documents were re-framed as the deprecated version of the protocol, and the &amp;ldquo;Review Status&amp;rdquo; section (&amp;ldquo;This is not adopted spec text yet&amp;rdquo;) became &amp;ldquo;Review Guidance&amp;rdquo; for editing the current spec. The &lt;code>v2&lt;/code> label disappears throughout: MIP-contrast phrasing (&amp;ldquo;new in v2&amp;rdquo;, &amp;ldquo;the v2 spec keeps&amp;rdquo;) is replaced with &amp;ldquo;this spec&amp;rdquo; and &amp;ldquo;under this spec&amp;rdquo;. Two documents keep their draft status by design: &lt;code>implementation-model.md&lt;/code> remains non-normative, and the multi-device feature&amp;rsquo;s own document stays a draft.&lt;/p>
&lt;p>The same repository landed &lt;a href="https://github.com/marmot-protocol/marmot/pull/171">PR #171&lt;/a> aligning admin-policy, membership, and role-change invariants. The cross-component check that a Remove cannot orphan an admin is now stated as a property of every resulting epoch, evaluated against the prior epoch&amp;rsquo;s admin set when a commit does not carry an admin-policy update. Convergence&amp;rsquo;s candidate-branch rule is tightened so &amp;ldquo;validates&amp;rdquo; means full commit validity including cross-component resulting-epoch checks, which prevents an invariant-violating commit from creating a candidate edge on any branch. State notifications derived from a superseded commit MUST be withdrawn when branch selection replaces it, which closes the &amp;ldquo;losing rename renders as a successful system message&amp;rdquo; bug at the spec level. A new &amp;ldquo;Realizing removal&amp;rdquo; section in &lt;code>member-departure.md&lt;/code> defines the primary realization input (the accepted canonical commit removing your last leaf) and the fallback for clients that never applied the removing commit: authenticated post-eviction evidence now surfaces as a &lt;code>SelfEvicted&lt;/code> outcome with retain-inactive semantics for the removed group copy. &lt;a href="https://github.com/marmot-protocol/marmot/pull/236">PR #236&lt;/a> then tightened wire-boundary validation, pinning KeyPackage lifetime acceptance to 84 days plus a one-hour skew margin, adding a Nostr tag-cardinality table for group &lt;code>h&lt;/code>, gift-wrap &lt;code>p&lt;/code>, welcome &lt;code>e&lt;/code> and &lt;code>relays&lt;/code>, and KeyPackage tags, and stating that unverified Nostr event ids and metadata are not trusted routing, replay, or telemetry evidence.&lt;/p>
&lt;p>Downstream, the &lt;a href="https://github.com/marmot-protocol/mdk">MDK workspace&lt;/a> cut &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.9.0">v0.9.0&lt;/a> on July 6 with a full workspace version bump, followed by &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.9.1">v0.9.1&lt;/a>, &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.9.2">v0.9.2&lt;/a>, and &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.9.3">v0.9.3&lt;/a> over the following two days. v0.9.0 rotates stale keyring entries when a new SQLite database is created and lands validate-before-mutate discipline across the storage layer. v0.9.1 routes every outbound connection through one host-safety dial chokepoint via &lt;a href="https://github.com/marmot-protocol/mdk/pull/732">PR #732&lt;/a>, closing the class of bugs where different call sites reached the network with different validation. v0.9.3 exposes encrypted group avatars to the uniffi bindings through &lt;code>download_group_image&lt;/code> and &lt;code>image_hash_hex&lt;/code> via &lt;a href="https://github.com/marmot-protocol/mdk/pull/771">PR #771&lt;/a>, adds external-signer support, and marks &lt;code>wn-opencode&lt;/code> production-ready via &lt;a href="https://github.com/marmot-protocol/mdk/pull/781">PR #781&lt;/a>. Alongside the MDK cuts, MarmotKit ships iOS and Android bindings at each version (a MarmotKit.xcframework plus Swift bindings for iOS and Kotlin bindings plus JNI libraries for Android, both generated from a pinned MDK commit hash), and a new wn-agent release channel provides shell installers that pin the WN Agent version to an immutable release tag so downstream apps can pull the current agent with a single &lt;code>curl&lt;/code> command.&lt;/p>
&lt;h3 id="mostro-v0180-and-mobile-v130-ship-transport-v2-on-nip-44">Mostro v0.18.0 and Mobile v1.3.0 ship Transport v2 on NIP-44&lt;/h3>
&lt;p>Mostro is the peer-to-peer Bitcoin trading protocol that runs order books, escrow, and dispute resolution over Nostr events, coordinated by a daemon (&lt;code>mostrod&lt;/code>) that clients speak to over encrypted DMs. Until this week the wire protocol between clients and mostrod was Transport v1. &lt;a href="https://github.com/MostroP2P/mostro/releases/tag/v0.18.0">Mostro v0.18.0&lt;/a> lands Transport v2, wiring the protocol onto &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> direct messages with anti-spam gates and dual-receive support running server-side. &lt;a href="https://github.com/MostroP2P/mostro/pull/776">PR #776&lt;/a> is the Phase 1 wire change, &lt;a href="https://github.com/MostroP2P/mostro/pull/780">PR #780&lt;/a> adds the Phase 2 anti-spam gates for protocol v2, and &lt;a href="https://github.com/MostroP2P/mostro/pull/785">PR #785&lt;/a> makes the inner protocol version follow the active transport so a v2 client and a v1 client can coexist during the migration window. A related &lt;a href="https://github.com/MostroP2P/mostro/pull/782">PR #782&lt;/a> fixes a NIP-33 info tag by renaming &lt;code>protocol_versions&lt;/code> to the singular &lt;code>protocol_version&lt;/code>. Alongside the transport work, the release lands a Phase 4 unified live-quote path with cache-and-staleness enforcement (&lt;a href="https://github.com/MostroP2P/mostro/pull/783">PR #783&lt;/a>) and an El Toque fiat-cross provider covering the Cuban CUP and MLC pairs (&lt;a href="https://github.com/MostroP2P/mostro/pull/778">PR #778&lt;/a>). &lt;a href="https://github.com/MostroP2P/mostro/pull/779">PR #779&lt;/a> adds a slashed-party notification on dispute slash so a user who lost their bond hears from the daemon directly; the previous behavior surfaced only as a missing wallet balance.&lt;/p>
&lt;p>&lt;a href="https://github.com/MostroP2P/mobile/releases/tag/v1.3.0">Mostro Mobile v1.3.0&lt;/a> is the client half of the migration. &lt;a href="https://github.com/MostroP2P/mobile/pull/613">PR #613&lt;/a> migrates the app to Riverpod 3.x, Phase A (&lt;a href="https://github.com/MostroP2P/mobile/pull/620">PR #620&lt;/a>) adds dual-receive support for NIP-44 direct messages on the main isolate and in the background isolate so a v2 mostrod and a v1 client can talk during the migration, Phase B in &lt;a href="https://github.com/MostroP2P/mobile/pull/624">PR #624&lt;/a> adds dual-send, &lt;a href="https://github.com/MostroP2P/mobile/pull/632">PR #632&lt;/a> re-applies dual-send after the Riverpod 3.x cut, and Phase C in &lt;a href="https://github.com/MostroP2P/mobile/pull/637">PR #637&lt;/a> finalizes the migration. The release also adds African payment method coverage: &lt;a href="https://github.com/MostroP2P/mobile/pull/625">PR #625&lt;/a> adds Malawi Kwacha payment methods and &lt;a href="https://github.com/MostroP2P/mobile/pull/627">PR #627&lt;/a> adds KES (Kenyan Shilling), MZN (Mozambican Metical), TZS (Tanzanian Shilling), UGX (Ugandan Shilling), ZAR (South African Rand), and ZMW (Zambian Kwacha) methods while expanding NGN (Nigerian Naira). A restore flow now waits for node connectivity before issuing restore requests, and cause-aware handling distinguishes a dispute-driven bond slash from a timeout-driven one.&lt;/p>
&lt;h3 id="bitchat-160-adds-nip-13-proof-of-work-and-an-opt-in-mesh-to-nostr-gateway">Bitchat 1.6.0 adds NIP-13 proof-of-work and an opt-in mesh-to-Nostr gateway&lt;/h3>
&lt;p>&lt;a href="https://github.com/permissionlesstech/bitchat/releases/tag/v1.6.0">Bitchat 1.6.0&lt;/a> is the Bluetooth-mesh chat app that uses Nostr for its geohash channels and DM handoff. The release does two Nostr-shaped things worth reading. &lt;a href="https://github.com/permissionlesstech/bitchat/pull/1382">PR #1382&lt;/a> adds &lt;a href="https://nostrcompass.org/en/topics/nip-13/">NIP-13 (proof-of-work)&lt;/a> to outbound geohash channel messages (kind 20000 ephemeral events): each send mines a &lt;code>[&amp;quot;nonce&amp;quot;, &amp;quot;&amp;lt;value&amp;gt;&amp;quot;, &amp;quot;&amp;lt;target&amp;gt;&amp;quot;]&lt;/code> tag before publishing, targeting 8 leading zero bits, which averages 256 hash attempts and completes in under one millisecond on an M-series Mac. Inbound events with validated PoW relax the per-sender intake rate limit, so a spammer pays compute per message while a regular sender does not feel the cost. Scope is deliberately narrow: only kind 20000 channel messages mine PoW, and presence heartbeats (kind 20001), kind-1 location notes, and DMs are untouched.&lt;/p>
&lt;p>&lt;a href="https://github.com/permissionlesstech/bitchat/pull/1384">PR #1384&lt;/a> adds gateway mode, an opt-in mesh-to-Nostr uplink for geohash channels. When a mesh-only user (no internet, no reachable relay) sends in a geohash channel and another peer on the mesh advertises the &lt;code>.gateway&lt;/code> capability, the signed kind 20000 event is wrapped in a new &lt;code>MessageType.nostrCarrier = 0x28&lt;/code> TLV envelope and sent directed to one gateway. The gateway peer publishes the event to Nostr on the sender&amp;rsquo;s behalf and rebroadcasts inbound channel traffic back onto the mesh with default TTL. Uplink deposits ride the courier envelope path (directed, relayed multi-hop); downlink rides broadcast. The signature happens before the event leaves the sender, so the gateway can decide whether to publish but cannot forge attribution. The stated motivation is disaster and protest scenarios where one connected phone in a crowd is enough to give the whole geohash channel a working Nostr uplink.&lt;/p>
&lt;p>The same release ships a second batch of Nostr-adjacent work. &lt;a href="https://github.com/permissionlesstech/bitchat/pull/1381">PR #1381&lt;/a> adds prekey bundles for forward-secret asynchronous first contact on the courier mail path, so a sender can compose a message to a peer who is offline and hand it to the mesh without having done a live Noise handshake first. &lt;a href="https://github.com/permissionlesstech/bitchat/pull/1380">PR #1380&lt;/a> adds transitive verification: a peer that has completed the Noise handshake with someone you have already verified is now vouched for over the Noise session, so the trust graph propagates one hop at a time instead of requiring a fresh in-person verification for every new contact. &lt;a href="https://github.com/permissionlesstech/bitchat/pull/1383">PR #1383&lt;/a> adds creator-managed encrypted private groups over the mesh, &lt;a href="https://github.com/permissionlesstech/bitchat/pull/1376">PR #1376&lt;/a> detects, renders, and redeems Cashu ecash tokens with a &lt;code>/pay&lt;/code> command, and &lt;a href="https://github.com/permissionlesstech/bitchat/pull/1379">PR #1379&lt;/a> adds a persistent signed geohash bulletin board layered on mesh sync. &lt;a href="https://github.com/permissionlesstech/bitchat/pull/1372">PR #1372&lt;/a> expands store-and-forward with open couriers, spray-and-wait routing, a persistent outbox, and a six-hour public history window. Bitchat 1.5.4 shipped &lt;a href="https://github.com/permissionlesstech/bitchat/releases/tag/v1.5.4">earlier in the week&lt;/a> with the end-to-end favorites fix in &lt;a href="https://github.com/permissionlesstech/bitchat/pull/1367">PR #1367&lt;/a> that cleans up peer-list duplicates, Nostr sync, and &lt;code>/fav&lt;/code> key corruption.&lt;/p>
&lt;hr>
&lt;h2 id="tagged-releases">Tagged releases&lt;/h2>
&lt;h3 id="amber-v623-scopes-profile-subscriptions-and-adds-a-tor-status-notification">Amber v6.2.3 scopes profile subscriptions and adds a Tor status notification&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.2.3">Amber v6.2.3&lt;/a> is a performance and correctness pass on the Android &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> signer, and the merged PRs in the week around it point at a coherent theme. The release itself adds a configurable profile fetch interval setting with never and always options (&lt;a href="https://github.com/greenart7c3/Amber/pull/492">PR #492&lt;/a>), shows a profile picture in the account switch bottom sheet, and scopes profile subscriptions by the current account so a signer holding multiple accounts stops fanning out subscriptions for accounts the user is not currently signing with. Bunker permission parsing gains explicit error handling on parse failures. Several StrictMode violations are fixed: a DiskReadViolation from Coil&amp;rsquo;s &lt;code>onSuccess&lt;/code> logging, a keystore violation from loading the account on the main thread, main-thread reads for the account name and picture in the account switch sheet, and eager &lt;code>KeyPair()&lt;/code> construction on the login and signup screens now moved off the main thread. In the days after v6.2.3 shipped, &lt;a href="https://github.com/greenart7c3/Amber/pull/493">PR #493&lt;/a> reordered the boot path to fetch the user&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> relay list before profile metadata (so the profile fetch queries the relays the user publishes to), and &lt;a href="https://github.com/greenart7c3/Amber/pull/494">PR #494&lt;/a> turned the built-in Tor notification into a live status indicator with a restart action, so a user whose Tor daemon dies during a signing session sees the failure and can bounce it without leaving the signer. &lt;a href="https://github.com/greenart7c3/Amber/pull/495">PR #495&lt;/a> enabled Android Lint in strict warnings-as-errors mode across the codebase.&lt;/p>
&lt;h3 id="jumble-v2671-makes-blossom-the-default-upload-service-in-a-dm-focused-cut">Jumble v26.7.1 makes Blossom the default upload service in a DM-focused cut&lt;/h3>
&lt;p>&lt;a href="https://github.com/CodyTseng/jumble/releases/tag/v26.7.1">Jumble v26.7.1&lt;/a> is a Nostr web client cut focused on direct messages and media. The release redesigns media upload settings and makes &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> the default upload service, replacing the previous NIP-96 default. DM handling gets a mobile message menu, improved desktop message actions, a &amp;ldquo;scroll to latest&amp;rdquo; button, long-press reactions on DM media, and a retry path for failed outgoing DMs from the message list. Custom emoji editing gains a detail view, message bubble sizing improves for invoices and embedded content, several DM scrolling and message ordering issues are fixed, and post-editor issues around emoji insertion, text copy, and file drag are cleaned up. Image orientation is corrected when metadata is stripped on upload, and Linux ARM64 downloads are added to the release matrix.&lt;/p>
&lt;h3 id="applesauce-signers-622-drops-an-nbunksec-dependency">Applesauce signers 6.2.2 drops an nbunksec dependency&lt;/h3>
&lt;p>&lt;a href="https://github.com/hzrd149/applesauce/releases/tag/applesauce-signers%406.2.2">applesauce-signers@6.2.2&lt;/a> drops the sub-package&amp;rsquo;s &lt;code>@sandwichfarm/encoded-entities&lt;/code> dependency in favor of a built-in &lt;a href="https://nostrcompass.org/en/topics/nip-46/">nbunksec&lt;/a> helper via &lt;a href="https://github.com/hzrd149/applesauce/commit/d654349">commit d654349&lt;/a>. Applesauce&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> bunker session encoding, added last week, no longer requires the external encoding library, cutting one supply-chain surface for downstream clients that consume the signers package.&lt;/p>
&lt;h3 id="ngit-v262-stops-duplicate-pr-status-events-on-default-branch-push">Ngit v2.6.2 stops duplicate PR status events on default-branch push&lt;/h3>
&lt;p>&lt;a href="https://github.com/DanConwayDev/ngit-cli/releases/tag/v2.6.2">Ngit v2.6.2&lt;/a> is a bug-fix release for the git-over-Nostr CLI. &lt;code>git push&lt;/code> to the default branch stops publishing duplicate PR merge/applied status events for PRs that are already marked applied, because merge detection now reads the pre-push Nostr repo state (the source of truth for whether a PR was already resolved on the &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> side of the workflow); the previous heuristic relied on git internals and duplicated the status event. Active repositories using ngit for git-over-Nostr push flows stop emitting duplicate kind-1621 status events into their audience.&lt;/p>
&lt;h3 id="bray-v1330-cli-picks-up-a-bunker-profile-persona-and-tor-outbound">Bray v1.33.0 CLI picks up a bunker profile, persona, and Tor outbound&lt;/h3>
&lt;p>&lt;a href="https://github.com/forgesworn/bray/releases/tag/v1.33.0">Bray v1.33.0&lt;/a> is a Nostr SDK-plus-CLI release. &lt;code>bunker --profile &amp;lt;name&amp;gt;&lt;/code> gets an auto-stable connection key and relay fallback so a saved profile can survive a relay outage; &lt;code>bunker --persona &amp;lt;name&amp;gt;&lt;/code> signs as a derived nsec-tree identity, letting one signer act as multiple pubkeys from a single derived tree; and all HTTP fetches can be routed through a Tor SOCKS proxy when configured. The release adds wallet subcommands for &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> NWC, &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> group admin write operations (create, update, add-user, remove-user, set-roles), NIP-86 admin verbs, and &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> outbox helpers. Publishing verbs pick up &lt;code>--jsonl&lt;/code>, &lt;code>--csv&lt;/code>, and &lt;code>--tsv&lt;/code> output flags, a &lt;code>req&lt;/code> verb for generic NIP-01 filter queries, an &lt;code>event&lt;/code> verb for arbitrary event construction, a &lt;code>publish-raw&lt;/code> command that signs and broadcasts pre-built events, a &lt;code>bunker sign&lt;/code> one-shot NIP-46 signing command, and a per-command &lt;code>--relay&lt;/code> flag on every publishing command. Security work covers three batches of audit deferrals: secret zeroisation discipline, HTTP transport bearer-auth and rate-limit hardening, and SSRF validation on relay URLs. The npm tarball ships at 533,844 bytes with a byte-identical reproducible build verified across two independent CI runners.&lt;/p>
&lt;h3 id="deepmarks-100-hardens-the-nostr-bookmarking-surface">Deepmarks 1.0.0 hardens the Nostr bookmarking surface&lt;/h3>
&lt;p>&lt;a href="https://github.com/ostermayer/deepmarks-public/releases/tag/v1.0.0">Deepmarks 1.0.0&lt;/a> is a security-hardening 1.0 milestone for a public Nostr bookmarking service. Every bookmark is still a signed Nostr event that any client can read. The API and archive worker sit in a privileged network position (they can reach internal Redis, the bunker&amp;rsquo;s relay path, and cloud metadata), so the SSRF guard is load-bearing, and the release fixes a critical IPv6-literal bypass in &lt;code>isPrivateIp&lt;/code>: bracketed IPv6 literals were being classified as public, so &lt;code>[::1]&lt;/code>, &lt;code>[fd00::1]&lt;/code>, and IPv4-mapped &lt;code>[::ffff:10.0.0.4]&lt;/code> all reached internal targets over dual-stack connect. The guard now strips brackets and folds IPv4-mapped and IPv4-compatible IPv6 down to the embedded v4 before the private-range check on both boxes. Ingested &lt;code>kind:0&lt;/code> profiles from external relays are now signature-verified at the sink so a hostile relay cannot forge a &lt;code>nip05&lt;/code> or &lt;code>lud16&lt;/code> for an arbitrary victim pubkey, and bookmark URLs are scheme-checked at every render sink so a &lt;code>kind:39701&lt;/code> bookmark published straight to the relay with a &lt;code>javascript:&lt;/code> or &lt;code>data:&lt;/code> &lt;code>d&lt;/code>-tag stops reaching an &lt;code>&amp;lt;a href&amp;gt;&lt;/code>. Zap receipts now survive a transient bunker outage: the settlement handler atomically claims the pending zap, finalizes only after signing succeeds, and releases the claim on failure so a redelivered &lt;code>invoice_updated&lt;/code> can retry. The &lt;code>/publish&lt;/code> fan-out drain uses &lt;code>BLMOVE&lt;/code> into a per-worker processing list with heartbeat-gated recovery so a crashed worker preserves a signed event the client was already 202&amp;rsquo;d for.&lt;/p>
&lt;h3 id="bitcredit-core-v0513-unencrypts-block-metadata-on-the-nostr-wire">Bitcredit Core v0.5.13 unencrypts block metadata on the Nostr wire&lt;/h3>
&lt;p>&lt;a href="https://github.com/BitcreditProtocol/Bitcredit-Core/releases/tag/v0.5.13">Bitcredit Core v0.5.13&lt;/a> removes an encryption layer from the Nostr public events used by the credit-bill protocol. Block metadata (block id, hash, signature) is now unencrypted on the Nostr wire; only the block data itself remains encrypted with the corresponding bill key. New apps process old chains, old apps do not process new chains. The release also adds a bill-service function to fetch the bill chain, and switches publishing to an optimistic threshold model: once a configured relay threshold (default one) accepts a publish, remaining relays receive the event asynchronously so publishing is no longer blocked by the slowest relay.&lt;/p>
&lt;h3 id="coop-mobile-v023-and-v024">Coop Mobile v0.2.3 and v0.2.4&lt;/h3>
&lt;p>&lt;a href="https://git.reya.su/reya/coop-mobile">Coop Mobile&lt;/a> shipped &lt;a href="https://git.reya.su/reya/coop-mobile/releases/tag/v0.2.3">v0.2.3&lt;/a> on July 4 and &lt;a href="https://git.reya.su/reya/coop-mobile/releases/tag/v0.2.4">v0.2.4&lt;/a> on July 7, continuing the Android &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> direct-messaging client&amp;rsquo;s steady release cadence. v0.2.3 adds inline image and link rendering in chat messages, image attachments, speech-to-text input, and a confirmation dialog for contact removal. v0.2.4 fixes an indicator that got stuck forever, improves the Nostr Connect handshake, and adds &lt;code>ncryptsec1&lt;/code> import (the &lt;a href="https://nostrcompass.org/en/topics/nip-49/">NIP-49&lt;/a> encrypted-private-key format) alongside a redesigned import identity screen.&lt;/p>
&lt;h3 id="granary-v110-adds-nip-71-video-event-support">Granary v11.0 adds NIP-71 video event support&lt;/h3>
&lt;p>&lt;a href="https://github.com/snarfed/granary/releases/tag/v11.0">Granary v11.0&lt;/a> is the multi-protocol conversion library that powers Bridgy Fed&amp;rsquo;s cross-network bridging. The Nostr module gets three visible changes. &lt;a href="https://nostrcompass.org/en/topics/nip-71/">NIP-71&lt;/a> video events (kinds 21, 22, 34235, and 34236) now convert into ActivityStreams 1 notes with video attachments, and the converter extracts the &lt;code>imeta&lt;/code> image (thumbnail), the video duration, the top-level &lt;code>published_at&lt;/code> tag, and the &lt;code>alt&lt;/code> tag as a fallback &lt;code>displayName&lt;/code> on the first video or audio attachment. On the API side, &lt;code>sign&lt;/code> is renamed to &lt;code>hash_and_sign&lt;/code> and &lt;code>verify&lt;/code> now raises &lt;code>ValueError&lt;/code> on failure; the &lt;code>Nostr&lt;/code> constructor raises &lt;code>ValueError&lt;/code> on an invalid relay URL, and &lt;code>Nostr.query&lt;/code> skips the &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> AUTH challenge gracefully when the caller has not set a &lt;code>privkey&lt;/code>. A follow-up conversion fix stops crashes when a Nostr &lt;code>article&lt;/code> object arrives without an &lt;code>id&lt;/code>. Any bridge or reader consuming NIP-71 video events through Granary can now surface them in the format the target reader expects.&lt;/p>
&lt;h3 id="nostr-relay-v00244-adds-a-firestore-backend">Nostr-relay v0.0.244 adds a Firestore backend&lt;/h3>
&lt;p>&lt;a href="https://github.com/mattn/nostr-relay/releases/tag/v0.0.244">mattn/nostr-relay v0.0.244&lt;/a> adds a Firestore backend via &lt;a href="https://github.com/mattn/nostr-relay/pull/12">PR #12&lt;/a>, extending the Go relay&amp;rsquo;s storage layer with a Google Cloud Firestore option alongside its existing backends. The change is small but opens Firestore as a managed serverless database option for a relay operator.&lt;/p>
&lt;h3 id="manent-v140-fixes-nip-42-auth-and-adds-media-clipboard-flows">Manent v1.4.0 fixes NIP-42 AUTH and adds media clipboard flows&lt;/h3>
&lt;p>&lt;a href="https://github.com/dtonon/manent/releases/tag/v1.4.0">Manent v1.4.0&lt;/a> is the encrypted notes and file storage app built on Nostr with &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encryption, &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> and &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> signer support, &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> outbox routing, and Blossom storage. The release fixes &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> relay authentication (previously broken), corrects Blossom uploads to &lt;code>http://&lt;/code> hosts (previously mishandled), and rewrites the compression flow. On the media side, users can now copy an image to the clipboard, paste an image from the clipboard, drag and drop files, crop and rotate images, play video and gifs, and take a video with a long press on the camera icon. On Linux, the primary clipboard is accessible via mouse middle-click. Note-loading and scrolling receive several optimizations.&lt;/p>
&lt;h3 id="routstrd-v037-makes-the-nostr-event-store-the-persistent-source-of-truth">Routstrd v0.3.7 makes the Nostr event store the persistent source of truth&lt;/h3>
&lt;p>&lt;a href="https://github.com/routstr/routstrd/releases/tag/v0.3.7">Routstrd v0.3.7&lt;/a> is the local daemon for the Routstr decentralized AI inference network, which routes LLM requests via Nostr kind 38421 provider discovery and kind 38425 LGTM reviews. The release adds a &lt;code>routstrd update&lt;/code> subcommand that downloads new binaries for both routstrd and cocod and gracefully restarts running daemons; the daemon now calls &lt;code>refreshNostrEvents()&lt;/code> on startup and every 21 minutes so provider discovery and reviews stay fresh without manual intervention. The bundled &lt;code>@routstr/sdk&lt;/code> upgrades from 0.3.12 to 0.3.15, removing the ProviderRegistry layer in favor of direct &lt;code>DiscoveryAdapter&lt;/code> use, cleaning up models from disappeared Nostr providers so they no longer leak into rankings, and treating the Nostr event store as a persistent source of truth (the erroneous 210-minute TTL on cached events is gone). Xcashu refund handling tightens: refund tokens are tried before originals in the error path, 404s retry 3× with two-minute intervals, and 425 Too Early is handled without throwing.&lt;/p>
&lt;h3 id="nymchat-101-launches-as-a-progressive-web-app-on-nip-17">Nymchat 1.0.1 launches as a Progressive Web App on NIP-17&lt;/h3>
&lt;p>&lt;a href="https://github.com/Spl0itable/NYM">Nymchat 1.0.1&lt;/a> (also known as NYM, Nostr Ynstant Messenger) is a Progressive Web App and native iOS/Android messenger for ephemeral chat over Nostr, bridged with Bitchat. Channels use kind 20000 ephemeral events for geohash channels and kind 23333 for named channels; private messages and group chats ride &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> gift-wrapped events (kind 1059) with rotating ephemeral recipient keys and automatic post-compromise recovery. Users can generate a per-session ephemeral keypair with no registration or log in with a persistent identity via &lt;a href="https://nostrcompass.org/en/topics/nip-07/">NIP-07&lt;/a> browser extensions, a &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote signer, or an nsec. Optional device-local identity encryption uses password, PIN, passkey, or biometric unlock via WebAuthn PRF (passkey and biometric) or PBKDF2 (password and PIN), with the plaintext key never written to disk while encryption is on. Voice and video calls use NIP-17 gift wraps for signaling and WebRTC for the media path. Message reactions use &lt;a href="https://github.com/nostr-protocol/nips/blob/master/25.md">NIP-25&lt;/a>, custom emoji use &lt;a href="https://nostrcompass.org/en/topics/nip-30/">NIP-30&lt;/a>, and the web app is served as static files plus Cloudflare Pages Functions acting as a privacy proxy for relays and media.&lt;/p>
&lt;h3 id="21meetup-110-launches-nostr-signed-attendance-badges">21Meetup 1.1.0 launches Nostr-signed attendance badges&lt;/h3>
&lt;p>&lt;a href="https://github.com/louisthecat86/Einundzwanzig-Meetup-App">21Meetup 1.1.0&lt;/a> is a Flutter app for the German Einundzwanzig Bitcoin community that records meetup attendance via NFC tags and rolling QR codes. Each attendance badge is a Nostr event (kind 21000) signed by the meetup organizer using BIP-340 Schnorr, so a participant accumulates a set of signed events attesting to specific meetups at specific block heights. The rolling QR code rotates every 10 seconds, so a badge cannot be minted remotely, and the NFC tag is only readable in physical proximity. A trust score is computed locally from the collected badges; the score can be presented as a QR code for verification during peer-to-peer trades. The app targets Bitcoin community reputation, not general-purpose Nostr social, but the badge events themselves are ordinary Nostr events any reader can verify.&lt;/p>
&lt;h3 id="nostrord-v200-and-v210-fold-the-relay-pool-and-heal-zombie-websockets">Nostrord v2.0.0 and v2.1.0 fold the relay pool and heal zombie WebSockets&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostrord/nostrord/releases/tag/v2.0.0">Nostrord v2.0.0&lt;/a> is a major cut of the KMP/WASM Nostr client that speaks NIP-29, NIP-42, NIP-44, NIP-46, NIP-57, NIP-65, and NIP-98. &lt;a href="https://github.com/nostrord/nostrord/releases/tag/v2.0.1">v2.0.1&lt;/a> shipped one day later via &lt;a href="https://github.com/nostrord/nostrord/pull/166">PR #166&lt;/a> with a release-blocking desktop fix: the packaged 2.0.0 (deb, rpm, msi, dmg) crashed at startup with &lt;code>NoClassDefFoundError: java/sql/DriverManager&lt;/code> because the jpackage jlink image was missing the &lt;code>java.sql&lt;/code> module the SQLDelight sqlite driver depends on; the fix adds &lt;code>java.sql&lt;/code> to the runtime image, and the same PR routes optimistic send through the network layer so the message reaches the relay (the previous code path cached silently and never delivered), plus keyboard and scroll behavior on mobile web.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostrord/nostrord/releases/tag/v2.1.0">v2.1.0&lt;/a> followed on July 7 with the &amp;ldquo;relay pool fold&amp;rdquo; (&lt;a href="https://github.com/nostrord/nostrord/pull/176">PR #176&lt;/a>), which unifies the previously separate NIP-29 focused relay socket into the shared pool. One reconnect scheduler now covers all relays, &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> AUTH signing is bounded with retry, publishes fail closed and retry on auth-required, request-storm races in &lt;code>requestPrivateGroupData&lt;/code> and &lt;code>fetchGroupPreviews&lt;/code> are closed, kind-10009 user-group-list fetches batch per relay, and the &lt;code>mux_chat&lt;/code> live subscription now covers every joined group (not just the opened one) and self-heals when a relay silently drops the subscription. UI-side changes replace the layout-shifting &amp;ldquo;Sending&amp;hellip;&amp;rdquo; row with an inline clock-then-check icon and turn stalled scroll-back into an explicit Retry row. &lt;a href="https://github.com/nostrord/nostrord/pull/179">PR #179&lt;/a> landed the same day to detect zombie WebSockets on Android: mobile networks and Doze mode kill TCP without a close frame, so writes into the dead socket buffer locally without throwing and &lt;code>isConnected()&lt;/code> stays true even though nothing will ever be received. &lt;code>NostrGroupClient&lt;/code> now stamps &lt;code>lastInboundAtMs&lt;/code> on every frame, gains &lt;code>markDead()&lt;/code> (which cancels the frame loop so the normal reconnect and resubscribe path runs), and &lt;code>probeLiveness()&lt;/code> (a REQ any relay must answer within 5 seconds), triggered on OK timeout with zero inbound frames or on mux stale plus socket frame silence. A second bug fix in the same PR stops optimistic messages being written to the persistent cache at insert time; they now write only after delivery confirmation. &lt;a href="https://github.com/nostrord/nostrord/releases/tag/v2.1.1">v2.1.1&lt;/a> shipped one day later via &lt;a href="https://github.com/nostrord/nostrord/pull/178">PR #178&lt;/a> adding iOS platform actuals, native test support, and app icons alongside the v2.1.0 zombie-WebSocket work.&lt;/p>
&lt;hr>
&lt;h2 id="unreleased-changes">Unreleased changes&lt;/h2>
&lt;h3 id="rust-nostr-adds-nip-40-expiration-to-gift-wrap-and-private-dm-builders">rust-nostr adds NIP-40 expiration to gift wrap and private DM builders&lt;/h3>
&lt;p>&lt;a href="https://github.com/rust-nostr/nostr/pull/1384">rust-nostr merged PR #1384&lt;/a> adding an &lt;code>expiration&lt;/code> option to &lt;code>GiftWrapBuilder&lt;/code> and &lt;code>PrivateDirectMessageBuilder&lt;/code>. The library takes a &lt;code>Duration&lt;/code> from the caller: the &lt;a href="https://nostrcompass.org/en/topics/nip-40/">NIP-40&lt;/a> expiration tag is anchored to the gift wrap&amp;rsquo;s randomized &lt;code>created_at&lt;/code> (created_at + duration), which decouples it from the real send time. Letting a caller pass an absolute timestamp would leak the send time to a relay observer (subtract the duration and you recover the original send time), so the library builds the tag internally from the randomized wrap timestamp. The expiration tag goes on the gift wrap event, not on the kind:13 seal (which &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> requires to have empty tags). NIP-17 hands the same value down to the gift wrap builder from &lt;code>PrivateDirectMessageBuilder&lt;/code>. The change closes &lt;a href="https://github.com/rust-nostr/nostr/issues/1381">issue #1381&lt;/a> and lands via the same builder pattern rust-nostr uses for &lt;code>extra_tags&lt;/code>. rust-nostr also merged &lt;a href="https://github.com/rust-nostr/nostr/pull/1387">PR #1387&lt;/a> consolidating &lt;code>nostr-relay-builder&lt;/code> into &lt;code>nostr-sdk&lt;/code>, a workspace-flattening move.&lt;/p>
&lt;h3 id="amethyst-spends-the-week-hardening-negentropy-sync-and-adding-nip-50-search">Amethyst spends the week hardening negentropy sync and adding NIP-50 search&lt;/h3>
&lt;p>Amethyst&amp;rsquo;s &lt;a href="https://github.com/vitorpamplona/amethyst">main branch&lt;/a> merged 43 PRs across three coherent themes. The largest thread is negentropy sync on the geode-to-strfry boundary: a refused-window failure mode that used to storm the client into a window-split loop now backs off cleanly (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3480">PR #3480&lt;/a>), the underlying &lt;code>negentropyKmp&lt;/code> dependency moves to v1.1.1 (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3475">PR #3475&lt;/a>), a 1-million-event geode-to-strfry benchmark lands with a strfry-parity mirror (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3478">PR #3478&lt;/a>), and production benchmarks join the CI matrix alongside broader sync optimizations (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3458">PR #3458&lt;/a>, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3466">PR #3466&lt;/a>). Lock-free concurrent collections replace the previous mutex-per-relay pattern and a UDP socket threading fix rides along (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3459">PR #3459&lt;/a>).&lt;/p>
&lt;p>The second thread is &lt;a href="https://nostrcompass.org/en/topics/nip-50/">NIP-50&lt;/a> full-text search infrastructure. A &lt;code>SearchableEvent&lt;/code> interface lands so events can carry index metadata directly (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3452">PR #3452&lt;/a>), and NIP-50 search extensions are now stripped before querying SQLite FTS so the local search engine no longer chokes on server-side extension syntax (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3464">PR #3464&lt;/a>). Default search relays get centralized (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3446">PR #3446&lt;/a>).&lt;/p>
&lt;p>The third thread is protocol integrations for niche verticals. Support for Birdstar bird-detection events (kind 2473) reaches an Android client (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3473">PR #3473&lt;/a>), and PS1 memory-card save states can be published as signed events on kind 38192 (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3482">PR #3482&lt;/a>). Rounding out the week: a compose-signature setting auto-appends custom text to posts (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3450">PR #3450&lt;/a>), the desktop notifications view is redesigned with native OS toasts and a shared filter (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3457">PR #3457&lt;/a>), the Messages column picks up a privacy lock (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3432">PR #3432&lt;/a>), &lt;code>NostrServer.ingest&lt;/code> adds a local write path with per-submission verify skip (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3469">PR #3469&lt;/a>), and &lt;code>equals&lt;/code>/&lt;code>hashCode&lt;/code> contracts are repaired in the OpenTimestamps verify path (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3477">PR #3477&lt;/a>).&lt;/p>
&lt;h3 id="buzz-keeps-hardening-the-relay-and-defines-kind-44200-for-agent-turn-metrics">Buzz keeps hardening the relay and defines kind 44200 for agent turn metrics&lt;/h3>
&lt;p>&lt;a href="https://github.com/block/buzz">Buzz&lt;/a> (the project formerly named Sprout) landed 123 PRs merged in the July 1 through July 7 window. Two threads carry most of the weight. The first is a new event kind for agent telemetry: &lt;a href="https://github.com/block/buzz/pull/1441">PR #1441&lt;/a> defines NIP-AM durable encrypted agent turn metrics as kind 44200, which lands the telemetry as a signed event the user&amp;rsquo;s own relay archives, keeping metrics on user-owned infrastructure. A local archive for the kind follows (&lt;a href="https://github.com/block/buzz/pull/1555">PR #1555&lt;/a>), the remove-kind path is made atomic (&lt;a href="https://github.com/block/buzz/pull/1562">PR #1562&lt;/a>), and the model name is threaded through the emit path so downstream readers can distinguish which model produced which turn (&lt;a href="https://github.com/block/buzz/pull/1564">PR #1564&lt;/a>).&lt;/p>
&lt;p>The second thread is relay performance. Post-commit dispatch is deferred and a verify clone is avoided (&lt;a href="https://github.com/block/buzz/pull/1453">PR #1453&lt;/a>), ingest and fan-out DB round trips are batched with measured p99 ack drops of 7 to 16 percent and p999 tail drops of 29 to 53 percent versus the prior tip (&lt;a href="https://github.com/block/buzz/pull/1454">PR #1454&lt;/a>), multi-filter query execution runs with bounded concurrency (&lt;a href="https://github.com/block/buzz/pull/1457">PR #1457&lt;/a>), and outbound WebSocket data frames batch on send (&lt;a href="https://github.com/block/buzz/pull/1464">PR #1464&lt;/a>). Alongside the perf work, a per-community workspace icon set that admins configure and the relay serves via &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> extends NIP-11&amp;rsquo;s information document with a per-community customization surface (&lt;a href="https://github.com/block/buzz/pull/1463">PR #1463&lt;/a>), agent owners can delete their agent&amp;rsquo;s messages via relay kind:5 events plus matching desktop and mobile UX (&lt;a href="https://github.com/block/buzz/pull/1519">PR #1519&lt;/a>), OpenTelemetry tracing joins Prometheus metrics on the relay (&lt;a href="https://github.com/block/buzz/pull/1398">PR #1398&lt;/a>), and the git repo-name registry moves to Postgres (&lt;a href="https://github.com/block/buzz/pull/1432">PR #1432&lt;/a>).&lt;/p>
&lt;h3 id="divine-video-wires-up-relay-signature-verification-and-a-nostrconnect-extraction">Divine Video wires up relay signature verification and a NostrConnect extraction&lt;/h3>
&lt;p>Divine Video&amp;rsquo;s &lt;a href="https://github.com/divinevideo/divine-mobile">mobile app&lt;/a> merged 97 PRs in the window, and the Nostr-facing thread is trust boundary hardening plus authentication cleanup. &lt;a href="https://github.com/divinevideo/divine-mobile/pull/5774">PR #5774&lt;/a> verifies inbound relay event signatures, closing a class of trust-in-the-relay bugs; &lt;a href="https://github.com/divinevideo/divine-mobile/pull/5828">PR #5828&lt;/a> encrypts the FCM push token in the kind-3080 deregistration event so the user&amp;rsquo;s device token stops appearing in cleartext on the relay when they unsubscribe; and &lt;a href="https://github.com/divinevideo/divine-mobile/pull/5831">PR #5831&lt;/a> chunks the kind:5 deletion REQ so a user with a large delete history no longer overflows the relay frame. On the authentication side, &lt;a href="https://github.com/divinevideo/divine-mobile/pull/5826">PR #5826&lt;/a> extracts a &lt;code>NostrConnectCoordinator&lt;/code> for the &lt;code>nostrconnect://&lt;/code> flow, cleaning up the &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> client-initiated bunker code path ahead of a broader auth refactor tracked under &lt;a href="https://github.com/divinevideo/divine-mobile/issues/4741">issue #4741&lt;/a>. &lt;a href="https://github.com/divinevideo/divine-mobile/pull/5709">PR #5709&lt;/a> maps kind-16 reposts when &lt;code>notification_type&lt;/code> is absent so a repost notification renders correctly even when the sending client omits the hint.&lt;/p>
&lt;h3 id="zap-cooking-fixes-nip-46-bunker-login-and-adds-nip-50-recipe-search">Zap Cooking fixes NIP-46 bunker login and adds NIP-50 recipe search&lt;/h3>
&lt;p>&lt;a href="https://github.com/zapcooking/frontend">Zap Cooking&amp;rsquo;s frontend&lt;/a> merged 18 PRs in the window along one theme: making Nostr auth surfaces recover from failure. &lt;a href="https://github.com/zapcooking/frontend/pull/503">PR #503&lt;/a> fixes bunker login with an explicit connect handshake, authUrl handling, and error surfacing so a user attaching an external signer sees a real error message on failure where the previous cut hung the login screen. &lt;a href="https://github.com/zapcooking/frontend/pull/495">PR #495&lt;/a> adds NIP-98 auth to the extract-recipe endpoint&amp;rsquo;s image and text upload paths so uploads are pubkey-attributed. A separate feature thread lands NIP-50 full-text recipe search via the nostrarchives search relay backend (&lt;a href="https://github.com/zapcooking/frontend/pull/483">PR #483&lt;/a>), letting a user query recipes across the relay corpus without a client-side index. Content-rendering polish ships alongside: quoted-note content and media now surface directly in the parent note replacing the previous buried-link fallback (&lt;a href="https://github.com/zapcooking/frontend/pull/491">PR #491&lt;/a>), link previews and hashtag sizing land (&lt;a href="https://github.com/zapcooking/frontend/pull/492">PR #492&lt;/a>), multi-word search queries work (&lt;a href="https://github.com/zapcooking/frontend/pull/482">PR #482&lt;/a>), and server-side social preview cards are generated for note, reads, and profile links (&lt;a href="https://github.com/zapcooking/frontend/pull/494">PR #494&lt;/a>).&lt;/p>
&lt;h3 id="swift-nostr-client-v060-progresses-toward-a-first-stable-cut">swift-nostr-client v0.6.0 progresses toward a first stable cut&lt;/h3>
&lt;p>&lt;a href="https://github.com/yysskk/swift-nostr-client">yysskk/swift-nostr-client&lt;/a> shipped &lt;a href="https://github.com/yysskk/swift-nostr-client/releases/tag/0.6.0">v0.6.0&lt;/a> alongside 30 merged PRs. The Swift Nostr library moves closer to a first stable API surface for Swift Nostr clients that avoid linking the MDK or MarmotKit toolchains.&lt;/p>
&lt;h3 id="nostr-applet-protocol-naps-tightens-nap-outbox-routing-and-fanout">Nostr Applet Protocol (NAPS) tightens NAP-OUTBOX Routing and Fanout&lt;/h3>
&lt;p>NAPS had a meaningful cleanup week, mostly in &lt;a href="https://github.com/napplet/naps/pull/32">NAP-OUTBOX&lt;/a>. The headline is tighter boundaries: less caller-controlled routing, fewer leaked relay details, and a shared event result shape that can carry relay hints and resource sidecars, tying into &lt;a href="https://github.com/napplet/naps/pull/80">NAP-RESOURCE&lt;/a>. Publishing is clearer too: explicit outbox, inbox, and relay fanout rules. Net effect: less ambiguity, better interoperability.&lt;/p>
&lt;h3 id="napplet-toolchain-tightens-protocol-alignment-and-ships-its-cli">Napplet Toolchain Tightens Protocol Alignment and Ships Its CLI&lt;/h3>
&lt;p>This week, Napplet’s packages moved from “useful SDK” toward a tighter protocol toolchain. The big story is alignment with the live NAP specs: &lt;a href="https://github.com/napplet/web/pull/104">NAP-COUNT query support&lt;/a>, &lt;a href="https://github.com/napplet/web/pull/112">OUTBOX’s runtime-owned lifecycle&lt;/a>, and &lt;a href="https://github.com/napplet/web/pull/108">RelayEventResult sidecars&lt;/a> all landed, making shell-mediated reads and subscriptions more precise. Several domains were sharpened too: CVM registry support, DM error envelopes, MEDIA session context, LISTS count fields, COMMON profile results, and the htree: RESOURCE scheme. On tooling, the new &lt;a href="https://github.com/napplet/web/pull/103">@napplet/cli&lt;/a> is a major milestone, adding config discovery, deploy planning, signing, Blossom uploads, and manifest generation. Finally, the &lt;a href="https://github.com/napplet/web/pull/127">host-injectable shim prelude&lt;/a> and &lt;a href="https://github.com/napplet/web/pull/145">JSR readiness work&lt;/a> made the stack easier to inject, publish, and verify.&lt;/p>
&lt;h3 id="primal-android-extends-the-remote-signer-surface">primal-android extends the remote-signer surface&lt;/h3>
&lt;p>&lt;a href="https://github.com/PrimalHQ/primal-android-app">Primal Android&lt;/a> merged 18 PRs in the window. On the Nostr side, &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/1075">PR #1075&lt;/a> implements &lt;code>switch_relays&lt;/code> and &lt;code>logout&lt;/code> methods for the app&amp;rsquo;s remote-signer role, extending Primal&amp;rsquo;s NIP-46 signer surface. &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/1083">PR #1083&lt;/a> adds a splash-gated local app-migration framework, and &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/1080">PR #1080&lt;/a> implements note-feed prefetching in the splash view-model. The rest is UI polish across the Home top and bottom bar, Explore hints, and the profile screen.&lt;/p>
&lt;h3 id="wisp-adds-a-multi-account-switcher-and-blossom-parser-tests">Wisp adds a multi-account switcher and Blossom parser tests&lt;/h3>
&lt;p>&lt;a href="https://github.com/barrydeen/wisp">Wisp&lt;/a> merged 9 PRs. &lt;a href="https://github.com/barrydeen/wisp/pull/604">PR #604&lt;/a> adds a multi-account switcher with an explicit cancel path on the add-account flow. &lt;a href="https://github.com/barrydeen/wisp/pull/613">PR #613&lt;/a> adds unit tests for &lt;code>Blossom.parseServerList&lt;/code>, tightening the &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> server-list parser. &lt;a href="https://github.com/barrydeen/wisp/pull/574">PR #574&lt;/a> rewrites the zap sheet for iOS layout with an instant-zap settings surface, &lt;a href="https://github.com/barrydeen/wisp/pull/605">PR #605&lt;/a> turns transaction history into a swipe-up bottom sheet, &lt;a href="https://github.com/barrydeen/wisp/pull/611">PR #611&lt;/a> parses hashtags with non-ASCII Unicode letters, &lt;a href="https://github.com/barrydeen/wisp/pull/609">PR #609&lt;/a> keeps the profile notes feed paginating and renders inline gallery media, and &lt;a href="https://github.com/barrydeen/wisp/pull/603">PR #603&lt;/a> preserves blank lines before inline profile and hashtag segments.&lt;/p>
&lt;h3 id="tao-and-wired-raise-the-pow-signal-to-21-bits-and-surface-fresh-pow-roots">TAO and Wired raise the PoW signal to 21 bits and surface fresh-PoW roots&lt;/h3>
&lt;p>&lt;a href="https://github.com/smolgrrr/TAO">smolgrrr/TAO&lt;/a> and &lt;a href="https://github.com/smolgrrr/Wired">smolgrrr/Wired&lt;/a> (the same commit set landed in both repos) merged 13 PRs. &lt;a href="https://github.com/smolgrrr/TAO/pull/84">PR #84&lt;/a> raises the default post-signal proof-of-work target to 21 leading zero bits, and &lt;a href="https://github.com/smolgrrr/TAO/pull/80">PR #80&lt;/a> surfaces feed roots from fresh PoW activity so a client can rank the timeline by recent NIP-13 work; the previous ranking was raw event age. &lt;a href="https://github.com/smolgrrr/TAO/pull/75">PR #75&lt;/a> restores a custom emoji picker and &lt;a href="https://github.com/smolgrrr/TAO/pull/65">PR #65&lt;/a> adds first-frame video previews. This is the second Nostr client this week to lean on NIP-13 as a first-class filter for user-generated content, complementing Bitchat&amp;rsquo;s channel-scoped PoW.&lt;/p>
&lt;h3 id="keep-android-polishes-nip-46-ux-and-lands-a-toctou-fix">keep-android polishes NIP-46 UX and lands a TOCTOU fix&lt;/h3>
&lt;p>&lt;a href="https://github.com/privkeyio/keep-android">privkeyio/keep-android&lt;/a> shipped &lt;a href="https://github.com/privkeyio/keep-android/releases/tag/v1.1.5">v1.1.5&lt;/a> alongside 13 merged PRs, then &lt;a href="https://github.com/privkeyio/keep-android/releases/tag/v1.1.6">v1.1.6&lt;/a> on July 8 pinning the underlying keep core to v0.5.0. Keep is a mobile identity vault (covered in &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/#custid-launches-as-a-mobile-identity-vault-with-nip-46-and-nfc-challenge-flow">Issue #29&lt;/a> as CustID). v1.1.5 was UX polish on the &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> challenge flow. v1.1.6 closes a check-then-set (TOCTOU) race in &lt;code>set_active_share&lt;/code> from the underlying keep-mobile crate, surfaces the URL and method being authorized on the &lt;a href="https://nostrcompass.org/en/topics/nip-98/">NIP-98&lt;/a> HTTP-auth approval prompt so a user can see what they are signing, and switches the RNG health check to fail closed (return an error) instead of panicking. An instrumented test covers the NIP-55 approval-flow kill switch. The v0.5.0 CLI features that came with the underlying release (threshold-OPRF unlock, software DKG, HD FROST wallets) are not surfaced in the Android app yet; v1.1.6 delivers the security fixes only.&lt;/p>
&lt;h3 id="heartwood-ships-the-relay-to-serial-signing-bridge">Heartwood ships the relay-to-serial signing bridge&lt;/h3>
&lt;p>&lt;a href="https://github.com/forgesworn/heartwood/releases/tag/v0.7.0">forgesworn/heartwood v0.7.0&lt;/a> lands the relay-to-serial signing bridge that was in flight last week, wiring the HSM-mode data plane for Bray&amp;rsquo;s serial-signer path. &lt;a href="https://github.com/forgesworn/heartwood/pull/11">PR #11&lt;/a> is the bridge itself, &lt;a href="https://github.com/forgesworn/heartwood/pull/13">PR #13&lt;/a> adds serial-frame coverage and fixes the device &lt;code>read_frame&lt;/code> payload offset, and &lt;a href="https://github.com/forgesworn/heartwood/pull/14">PR #14&lt;/a> extracts the serial frame codec into a shared &lt;code>heartwood-frame&lt;/code> crate.&lt;/p>
&lt;h3 id="safebox-publishes-a-phase-3-progress-report-and-a-freebsd-jail-runbook">SafeBox publishes a Phase 3 progress report and a FreeBSD jail runbook&lt;/h3>
&lt;p>&lt;a href="https://github.com/trbouma/safebox">SafeBox&lt;/a> is a private portable data vault on Nostr that combines &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> Nostr Wallet Connect, nAuth, nembed, and relay-mediated record transfer over QR and NFC into one operator-deployable service. A &lt;a href="https://github.com/trbouma/safebox/blob/main/docs/PROGRESS-REPORT-2026-07.md">July 2026 progress report&lt;/a> published on July 6 marks Phase 3 as substantially complete: 49 commits landed since the April report, bringing the repository to 1,136 commits, and the four Phase 3 engineering commitments (harden Phase 2 experiments, support interoperable instances, prepare for scale, add commercial-product discipline) are largely delivered. The report frames the next step as a bounded pilot, and discloses that a telecommunications provider under NDA is exploring a health-records pilot on SafeBox.&lt;/p>
&lt;p>The concrete Nostr-facing work landed earlier in Phase 3 and is summarized in the report: mutating NWC actions are now queued to avoid proof races, failed Lightning melts protect proofs before returning, long-lived NWC listeners now refresh proactively so a session survives past its idle threshold; the previous behavior was a silent stall, and LNURL callbacks use canonical origins with explicit JSON and CORS responses. QR and NFC record exchange gained a unified flow spec covering recipient-presented, sender-presented, and cross-device presentation modes with clearer KEM (Key Encapsulation Mechanism) handling and replay protection through the Open Quantum Safe library. The in-window commit is &lt;a href="https://github.com/trbouma/safebox/commit/6866dae">&lt;code>6866dae&lt;/code>&lt;/a>, which adds a &lt;a href="https://github.com/trbouma/safebox/blob/main/docs/devops/freebsd-jail-from-scratch.md">FreeBSD jail deployment and liboqs build runbook&lt;/a> alongside a &lt;a href="https://github.com/trbouma/safebox/blob/main/docs/devops/SAFEBOX-FREEBSD-APPLIANCE-SPEC.md">FreeBSD appliance specification&lt;/a>, documenting ZFS snapshots, jail isolation, &lt;code>rc.d&lt;/code> service management, host-level reverse proxy configuration, and rollback procedure for a SafeBox deployment on FreeBSD/ARM hardware.&lt;/p>
&lt;p>The report also announces &lt;a href="https://github.com/trbouma/openetr">OpenETR&lt;/a> as a distinct spin-off applying SafeBox&amp;rsquo;s cryptographic-control-plus-portable-records architecture to electronic transferable records: bills of lading, warehouse receipts, promissory notes, and certificates. OpenETR&amp;rsquo;s repo saw 7 commits on July 7 including &lt;a href="https://github.com/trbouma/openetr/commit/ea612a9">&lt;code>ea612a9&lt;/code>&lt;/a> separating attestation from the core record, &lt;a href="https://github.com/trbouma/openetr/commit/ca153a3">&lt;code>ca153a3&lt;/code>&lt;/a> on mandate-versus-effect handling, and &lt;a href="https://github.com/trbouma/openetr/commit/ba84b61">&lt;code>ba84b61&lt;/code>&lt;/a> adding a comparison to verifiable-credential formats.&lt;/p>
&lt;hr>
&lt;h2 id="protocol-work-and-nip-updates">Protocol work and NIP updates&lt;/h2>
&lt;h3 id="merged-nip-51-and-nip-37-align-the-kind-10013-name">Merged: NIP-51 and NIP-37 align the kind 10013 name&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2404">PR #2404&lt;/a> is a prose-only consistency fix. In &lt;a href="https://nostrcompass.org/en/topics/nip-37/">NIP-37&lt;/a>, kind 10013 is named &lt;code>Relay List for Private Content&lt;/code>; in &lt;a href="https://nostrcompass.org/en/topics/nip-51/">NIP-51&lt;/a> under &lt;code>Draft relays&lt;/code>, the same kind was described with different wording. NIP-51 now uses the NIP-37 name for the same event kind. No wire behavior changes and no new tag semantics; the value is that NIP-51 is the umbrella spec for list-shaped events and NIP-37 is the private-content follow-up, and misaligned naming between the two makes it easy to miss that they describe the same kind.&lt;/p>
&lt;h3 id="open-nip-ad-nostr-web-addresses-via-well-known-lookup">Open: NIP-AD Nostr Web Addresses via .well-known lookup&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2406">PR #2406&lt;/a> opens as the successor to a closed PR #2393 with a full spec draft at &lt;a href="https://github.com/nostr-protocol/nips/blob/2f4b09335c54a993d483bc220195e3f4a33df1ec/AD.md">&lt;code>AD.md&lt;/code>&lt;/a>. NIP-AD defines web URLs that carry an optional Nostr counterpart. A client that sees a URL like &lt;code>https://golf.com/players&lt;/code> requests &lt;code>https://golf.com/.well-known/nostr.json?ad=/players&lt;/code>, which returns a JSON object mapping paths to &lt;code>{filter, relays}&lt;/code> pairs. The returned filter is a standard NIP-01 filter (kinds, authors, &lt;code>#d&lt;/code>, &lt;code>limit&lt;/code>, etc.), and the relays array names which relays the client should query. With &lt;code>&amp;quot;limit&amp;quot;: 1&lt;/code> the URL resolves to a single event; without it, to a list. In a normal web browser the URL renders HTML like any other URL, so the same domain can serve web users and Nostr clients from one canonical path. The stated use cases include &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> group names resolving to a kind 39000 event on a specific relay (removing the need for group id farming), &lt;a href="https://nostrcompass.org/en/topics/nip-5a/">NIP-5A&lt;/a> nsite lookups, hosted feeds that publish a &lt;code>{&amp;quot;ids&amp;quot;: [...]}&lt;/code> filter, native rendering of pasted &lt;code>njump.me/nevent1...&lt;/code> and client-specific event URLs, and Nostr-fueled blogs that exist both natively inside Nostr and to visitors outside. The &lt;code>.well-known/nostr.json&lt;/code> reuse plus path-as-object-key layout is chosen so the resolver can be a static file.&lt;/p>
&lt;h3 id="open-nip-86-claim-management-for-invite-codes">Open: NIP-86 claim management for invite codes&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2408">PR #2408&lt;/a> proposes adding three methods to &lt;a href="https://nostrcompass.org/en/topics/nip-86/">NIP-86&lt;/a>: &lt;code>listclaims&lt;/code> (params &lt;code>[]&lt;/code>, returns an array of &lt;a href="https://nostrcompass.org/en/topics/nip-43/">NIP-43&lt;/a> invite codes), &lt;code>createclaim&lt;/code> (params &lt;code>[claim]&lt;/code>, returns &lt;code>true&lt;/code>), and &lt;code>deleteclaim&lt;/code> (params &lt;code>[claim]&lt;/code>, returns &lt;code>true&lt;/code>). Today NIP-86 lets a relay admin manage users and role assignments but has no invite-code surface. The PR author&amp;rsquo;s use case is community-relay onboarding: an admin creates an invite code associated with a role, collects payment before the user&amp;rsquo;s identity is created, hands the invite code to the user, and a bot listens for the resulting kind 28935 claim event on the relay and auto-assigns the role. The three methods let that flow run entirely through the relay management RPC.&lt;/p>
&lt;h3 id="open-role-color-as-h-s-l-tuple">Open: role color as (h, s, l) tuple&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2402">PR #2402&lt;/a> changes the role color format in &lt;a href="https://nostrcompass.org/en/topics/nip-43/">NIP-43&lt;/a> from a single &lt;code>hue&lt;/code> value (0 to 360) to a tuple of &lt;code>hue&lt;/code> (0 to 360), &lt;code>saturation&lt;/code> (0 to 1), and &lt;code>lightness&lt;/code> (0 to 1). Empty strings are permitted for any component so clients can supply their own defaults for a coherent palette, and the spec text recommends providing only &lt;code>hue&lt;/code> unless a specific color like silver is desired. The change threads through NIP-86 in the same PR: &lt;code>createrole&lt;/code> and &lt;code>editrole&lt;/code> now take &lt;code>[id, label, description, [h, s, l], order]&lt;/code>; the previous signature carried a single-color parameter in the same slot. The motivation is that hue alone forces clients to pick saturation and lightness for the operator, so different clients render the same role at visibly different intensities.&lt;/p>
&lt;h3 id="open-nip-80-hardware-attested-media-provenance">Open: NIP-80 hardware-attested media provenance&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2409">PR #2409&lt;/a> opens NIP-80, an event format for media provenance anchored in capture hardware. A camera signs each photo at the moment of capture and publishes the proof to relays keyed by the content itself, so verification survives metadata stripping, re-hosting, and platform takedowns. The proposal defines six new event kinds: kind 1080 for capture attestations, kind 1081 for derivation attestations covering resize, crop, recompress, or redact operations (with a reveal mode or zero-knowledge option), kind 1082 for revocations (regular events, permanent, author-scoped, monotonic), kind 11080 for device announcements, kind 31080 for device endorsements, and kind 31081 for a device set for anonymous attestations (marked experimental and possibly split into a companion NIP). Reused primitives include NIP-94 &lt;code>x&lt;/code>-tag semantics, &lt;a href="https://nostrcompass.org/en/topics/nip-92/">NIP-92&lt;/a> &lt;code>imeta&lt;/code>, &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> for revocation discovery, &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> for media storage, and optional &lt;a href="https://github.com/nostr-protocol/nips/blob/master/03.md">NIP-03&lt;/a> timestamp anchoring. The signing model pairs a BIP-340 device key with a hardware ECDSA key because mainstream secure elements do not yet produce BIP-340 signatures (Microchip ATECC608 supports P-256, NXP SE050 supports secp256k1 but only ECDSA, TPM 2.0 modules and Infineon OPTIGA Trust M cover P-256/RSA, Apple Secure Enclave and Android StrongBox use P-256). The stated scope explicitly does not attempt to prove the scene is real: an attestation proves this exact image came from this device at approximately this time and was modified only in declared, provable ways, and the specification forbids clients from collapsing results into a bare &amp;ldquo;authentic&amp;rdquo; badge. A working prototype &lt;a href="https://github.com/PrarthanaPurohit/OpenVeilCam">OpenVeilCam&lt;/a>, a Rust camera runtime for Raspberry Pi using the ATECC608 secure element, is being updated to publish the proposed event kinds alongside a standalone verifier.&lt;/p>
&lt;h3 id="open-nip-01-pagination-hardening">Open: NIP-01 pagination hardening&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2407">PR #2407&lt;/a> adds a &amp;ldquo;Pagination &amp;amp; limits&amp;rdquo; subsection to NIP-01. The concrete rules: a relay that imposes a maximum &lt;code>limit&lt;/code> MUST set it greater than the largest number of events sharing a single &lt;code>created_at&lt;/code> in its database, so no single second can fill a page and stall pagination. Clients paging backwards MUST repeat requests with &lt;code>until = oldest&lt;/code> (inclusive) and MUST deduplicate by &lt;code>id&lt;/code> (since the oldest second is re-fetched each round), and paging is complete when a round yields no new events after deduplication. If a full page has oldest and newest events sharing one &lt;code>created_at&lt;/code>, the client MUST retry that second with a larger &lt;code>limit&lt;/code>, and if the relay clamps the larger &lt;code>limit&lt;/code> and still returns a page confined to one second, the client MUST either advance with &lt;code>until = oldest - 1&lt;/code> (treating unretrieved events as dropped) or abort. Normal paging MUST NOT set &lt;code>limit&lt;/code>; the relay maximum is authoritative, and a smaller value reintroduces the stall. Raising &lt;code>limit&lt;/code> to drain a stuck second is the one exception. This fix matters because a naive &lt;code>since&lt;/code>/&lt;code>until&lt;/code> cursor either misses events with duplicate timestamps or reprocesses them, and the current NIP-01 text does not tell either side how to escape the trap.&lt;/p>
&lt;hr>
&lt;h2 id="nip-deep-dive-nip-13-proof-of-work">NIP Deep Dive: NIP-13 (Proof of Work)&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-13/">NIP-13&lt;/a> defines a proof-of-work mechanism for Nostr events. It exists because email-style spam is trivial to produce on a public relay network: anyone can generate a keypair and flood a topic, and there is no economic cost per event. NIP-13 lets an event author impose a computational cost per event that a spammer would have to pay in aggregate but a regular sender pays only once per message. Relays and clients can then require or prefer events that meet a difficulty threshold.&lt;/p>
&lt;h3 id="the-mechanism">The mechanism&lt;/h3>
&lt;p>An event author picks a difficulty target expressed in bits and mines the event&amp;rsquo;s id (the sha256 hash of the serialized event) until it has at least that many leading zero bits. Because the event id includes the &lt;code>created_at&lt;/code> timestamp, the tags, and the content, mining requires changing something in the event body to search the hash space. NIP-13 defines a &lt;code>nonce&lt;/code> tag for exactly this purpose:&lt;/p>
&lt;pre tabindex="0">&lt;code>[&amp;#34;nonce&amp;#34;, &amp;#34;&amp;lt;nonce_value&amp;gt;&amp;#34;, &amp;#34;&amp;lt;target_bits&amp;gt;&amp;#34;]
&lt;/code>&lt;/pre>&lt;p>The &lt;code>nonce_value&lt;/code> is any string the miner picks; the &lt;code>target_bits&lt;/code> is the difficulty the miner committed to. A verifier counts the leading zero bits of the event id and compares against &lt;code>target_bits&lt;/code>. The &lt;code>target_bits&lt;/code> in the tag is a claim, and a verifier measures the actual leading-zero count of the id to confirm it.&lt;/p>
&lt;p>The number of leading zero bits in a random sha256 output follows a geometric distribution: each additional bit doubles the expected work. 8 bits averages 256 hash attempts, 20 bits averages roughly one million, and 28 bits averages roughly 268 million. Bitchat&amp;rsquo;s 8-bit target for geohash-channel messages costs under one millisecond of CPU on modern hardware and completes below any perceptible latency. TAO and Wired&amp;rsquo;s 21-bit default is roughly two million hash attempts per post, which is fast on a laptop but expensive at scale for a bot farm. NIP-13 does not mandate a difficulty; each relay and client picks its own.&lt;/p>
&lt;h3 id="example-event">Example event&lt;/h3>
&lt;p>A minimal NIP-13-mined kind-1 note looks like:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;000000000e9d97a1ab09fc381030b346cdd7a1a8a6f27c9c88f68c8b9d0f6c8a&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1720368000&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;nonce&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;72847&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;28&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;hello, this cost me 28 bits of PoW&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;b1a5c9c74cff59f8a48e5c3b3d8e1c8e7e2c1d4a8e2b9f7d1c3e8b4f6a2c8d1e9f4b3c7a1d8e5b2f9c6a3d7e1b8f4c9a2d6e3b7f1c8a4d9e2b5f8c1a7d4e6b9f3c2&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>id&lt;/code> starts with seven hex zeros (28 leading zero bits, matching the &lt;code>target_bits&lt;/code> in the nonce tag). The miner varied the &lt;code>nonce_value&lt;/code> &lt;code>72847&lt;/code> until the id met the target. A verifier hashes the serialized event and confirms the id has at least 28 leading zero bits, then verifies the signature. NIP-13 adds no new fields; it adds the &lt;code>nonce&lt;/code> tag and constrains the id&amp;rsquo;s zero-bit count.&lt;/p>
&lt;h3 id="where-it-is-used">Where it is used&lt;/h3>
&lt;p>Bitchat&amp;rsquo;s 1.5.4 release uses 8-bit PoW on kind 20000 geohash-channel messages: outbound sends mine the tag before publishing and inbound events with validated PoW relax the per-sender intake rate limit. TAO and Wired use 21-bit PoW as the default post-signal threshold and surface feed roots from fresh PoW activity, treating PoW as a timeline ranking signal. &lt;a href="https://github.com/mattn/algia">cagliostr&lt;/a> enforces NIP-13 at the relay layer, rejecting events below a threshold. NoStrudel exposes a client-side PoW mining setting for authors who want to signal to filtering clients. Damus and Amethyst compute leading-zero bits when displaying events, letting a user see the PoW commitment on notes. Coracle exposes PoW both for mining and filtering. NDK and nostr-tools expose PoW mining helpers to library consumers.&lt;/p>
&lt;p>The design property that shapes NIP-13&amp;rsquo;s deployment is that PoW is unforgeable: a claim of &lt;code>target_bits&lt;/code> counts as evidence only when the id has that many leading zeros, and a counterfeit requires redoing the work. That property lets Bitchat use inbound PoW as a rate-limit relaxer even when a spammer claims a high difficulty; the check is a hash count, not a trust decision. The complementary property is that PoW does not commit the miner to any specific pubkey or content; a spammer can still choose to mine at 8 bits and burn compute, but the compute is a real cost. NIP-13 shifts the spam problem from &amp;ldquo;impossible&amp;rdquo; to &amp;ldquo;quantifiable&amp;rdquo; and lets clients set their own price.&lt;/p>
&lt;hr>
&lt;h2 id="nip-deep-dive-nip-40-expiration-timestamp">NIP Deep Dive: NIP-40 (Expiration Timestamp)&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-40/">NIP-40&lt;/a> defines an &lt;code>expiration&lt;/code> tag that instructs a relay and a client that an event should be considered expired after a given Unix timestamp. It exists because Nostr events are otherwise permanent: once a signed event lands on a relay, the only way to remove it is a NIP-09 delete event, and even then a relay may retain the original. NIP-40 lets an author declare at publication time that an event is short-lived, and asks relays to stop serving it and clients to stop displaying it after the timestamp.&lt;/p>
&lt;h3 id="the-mechanism-1">The mechanism&lt;/h3>
&lt;p>An author adds an &lt;code>expiration&lt;/code> tag to an event:&lt;/p>
&lt;pre tabindex="0">&lt;code>[&amp;#34;expiration&amp;#34;, &amp;#34;&amp;lt;unix_timestamp&amp;gt;&amp;#34;]
&lt;/code>&lt;/pre>&lt;p>The timestamp is Unix seconds. A relay MAY reject events whose expiration is already in the past at ingest, MAY stop serving events whose expiration has passed, and SHOULD respect the author&amp;rsquo;s stated expiration. A client SHOULD hide expired events from the user. NIP-40 does not require the relay to delete the event, and it does not overrule NIP-70 protected-event semantics; it is a hint plus a soft contract.&lt;/p>
&lt;p>The tag lives on the event itself (or in the case of wrapped messaging, on the outer wrap). NIP-40 does not define delete semantics; the event remains a signed event that anyone who has it can still read. What NIP-40 gives is a coordinated expectation that the relay and the client will stop surfacing the event after the deadline. This makes NIP-40 useful for ephemeral posts, timed announcements, live-event notes that should stop being served after the event, and NIP-17 direct messages that should not linger past a stated horizon.&lt;/p>
&lt;h3 id="interaction-with-gift-wrap">Interaction with gift wrap&lt;/h3>
&lt;p>The rust-nostr PR that landed this week (&lt;a href="https://github.com/rust-nostr/nostr/pull/1384">PR #1384&lt;/a>) is a case study in how NIP-40 interacts with &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> gift wrap. NIP-59 defines a two-layer envelope: a kind:13 &amp;ldquo;seal&amp;rdquo; event signed by the sender&amp;rsquo;s real key, and a kind:1059 &amp;ldquo;gift wrap&amp;rdquo; event signed by an ephemeral key. Both layers have randomized &lt;code>created_at&lt;/code> values, up to 48 hours before the real send time, so a relay observer cannot recover the true send timestamp. NIP-59 mandates that the seal have empty tags.&lt;/p>
&lt;p>That mandate is why the expiration tag has to go on the gift wrap and stay off the seal, and why anchoring the tag to the real send time would defeat gift wrap&amp;rsquo;s timing privacy: if a caller passes an absolute expiration timestamp, an observer subtracts the caller&amp;rsquo;s intended TTL and recovers the real send time. rust-nostr&amp;rsquo;s design decision is to expose the API as a &lt;code>Duration&lt;/code> from the caller, then compute &lt;code>expiration = wrap.created_at + duration&lt;/code> inside the library. The wrap&amp;rsquo;s &lt;code>created_at&lt;/code> is already randomized inside the library, so the expiration timestamp inherits the same randomization and does not leak the true send time.&lt;/p>
&lt;h3 id="example-event-1">Example event&lt;/h3>
&lt;p>A minimal NIP-40 example on a kind-1 note:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1720368000&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;expiration&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;1720454400&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;this note expires in 24 hours&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;d2e5b8a1c4f7b0d3e6a9c2f5b8d1e4a7c0f3b6d9e2a5c8f1b4d7e0a3c6f9b2d5e8a1c4f7b0d3e6a9c2f5b8d1e4a7c0f3b6d9e2a5c8f1b4d7e0a3c6f9b2d5e8a1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>created_at&lt;/code> is the Unix timestamp of publication; the expiration tag says the event should stop being served 86,400 seconds (24 hours) later. A relay that respects NIP-40 stops returning this event to REQs after &lt;code>1720454400&lt;/code>, and a client that respects NIP-40 hides it from the user after that time.&lt;/p>
&lt;h3 id="where-it-is-used-1">Where it is used&lt;/h3>
&lt;p>rust-nostr&amp;rsquo;s builders (&lt;code>GiftWrapBuilder&lt;/code>, &lt;code>PrivateDirectMessageBuilder&lt;/code>) now expose expiration as a first-class &lt;code>Duration&lt;/code> parameter. NDK exposes an expiration helper for kind-1 and DM builders. nostr-tools has a &lt;code>getExpiration&lt;/code> and &lt;code>isExpired&lt;/code> pair for reading and enforcing the tag. strfry, nostr-rs-relay, khatru, and other relay implementations respect NIP-40 in REQ handling (rejecting or omitting expired events depending on the operator&amp;rsquo;s policy). Damus, Amethyst, noStrudel, Coracle, and Primal all filter expired events from their timeline rendering. Live-activity clients like zap.stream use NIP-40 on the associated kind-1311 chat events so a live chat stops persisting after the stream ends.&lt;/p>
&lt;p>The design property that lands NIP-40 cleanly in most implementations is that it is opt-in per event and does not require coordinated deployment. An author can add the tag today; a relay that honors it gets a cleaner working set; a relay that ignores it does no worse than before; and a client that hides expired events gives the author what they asked for. The rust-nostr change this week reinforces that the tag&amp;rsquo;s placement matters as much as its presence: in a privacy-preserving envelope like NIP-59 gift wrap, the tag sits on the layer whose timestamp is already randomized, and the API surface prevents a caller from accidentally leaking a real timestamp back into the wrap.&lt;/p>
&lt;hr>
&lt;p>That&amp;rsquo;s it for this week. Building something or have news to share? Reach out via NIP-17 DM or find us on Nostr.&lt;/p></content:encoded></item><item><title>Nostr Compass #29</title><link>https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/#fips-v040-ships-nym-mixnet-transport-mdns-discovery-and-a-data-plane-overhaul">FIPS v0.4.0&lt;/a> ships a Nym mixnet transport, opt-in mDNS LAN discovery, hitless rekey under loss, and a data-plane overhaul, wire-compatible with v0.3.0. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/#whitenoise-linux-surfaces-as-a-desktop-marmot-client">Whitenoise Linux&lt;/a> surfaces as a desktop Marmot client in Rust and Slint with a protocol proposal to move message effects to a dedicated kind-9 event. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/#custid-launches-as-a-mobile-identity-vault-with-nip-46-and-nfc-challenge-flow">CustID v0.1.10-beta&lt;/a> launches as a hardware-backed mobile identity vault acting as a NIP-46 remote signer and answering physical access challenges over NFC. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/#myco-launches-peer-to-peer-nsite-sharing-over-the-fips-mesh">myco&lt;/a> launches peer-to-peer nsite sharing over the FIPS mesh with a new BLE L2CAP transport in v0.1.0. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/#nostr-codex-phone-launches-as-a-mobile-control-surface-for-a-local-codex-worker-over-nostr">Nostr Codex Phone&lt;/a> launches as an Android control surface for a local Codex coding-assistant over encrypted Nostr DMs. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/#amethyst-builds-nip-89-aware-ui-a-git-repositories-feed-and-a-napplet-browser-discover-section">Amethyst&amp;rsquo;s unreleased line&lt;/a> adds NIP-89 app-handler parsing, a Git Repositories feed for NIP-34, and a Discover section for nSites and napplets. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/#notedeck-implements-nip-37-private-sync-relays-nip-52-calendar-and-nip-22-comments">Notedeck&lt;/a> lands NIP-37, NIP-52, and NIP-22 in one week. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/#applesauce-ships-12-sub-packages-in-a-coordinated-62x-cut">Applesauce&lt;/a> cuts 12 sub-package releases with nbunksec NIP-46 helpers and a Cashu-ts v4 wallet upgrade. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/#meiso-v140-ships-shared-key-collaborative-lists-that-replace-mls-for-task-sharing">Meiso v1.4.0&lt;/a> ships Shared-Key Collaborative Lists on addressable kind-35000. The NIPs repository merged five PRs including a relay roles event, the NIP-44 65,535-byte limit removal, NIP-34 fork semantics, NIP-46 client metadata, and a NIP-86 signevent method. Deep dives cover &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/#nip-deep-dive-nip-86-relay-management-api">NIP-86 (Relay Management API)&lt;/a> and &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/#nip-deep-dive-nip-89-recommended-application-handlers">NIP-89 (Recommended Application Handlers)&lt;/a>.&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/#fips-v040-ships-nym-mixnet-transport-mdns-discovery-and-a-data-plane-overhaul">FIPS v0.4.0&lt;/a> ships a Nym mixnet transport, opt-in mDNS LAN discovery, hitless rekey under loss, and a data-plane overhaul, wire-compatible with v0.3.0. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/#whitenoise-linux-surfaces-as-a-desktop-marmot-client">Whitenoise Linux&lt;/a> surfaces as a desktop Marmot client in Rust and Slint with a protocol proposal to move message effects to a dedicated kind-9 event. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/#custid-launches-as-a-mobile-identity-vault-with-nip-46-and-nfc-challenge-flow">CustID v0.1.10-beta&lt;/a> launches as a hardware-backed mobile identity vault acting as a NIP-46 remote signer and answering physical access challenges over NFC. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/#myco-launches-peer-to-peer-nsite-sharing-over-the-fips-mesh">myco&lt;/a> launches peer-to-peer nsite sharing over the FIPS mesh with a new BLE L2CAP transport in v0.1.0. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/#nostr-codex-phone-launches-as-a-mobile-control-surface-for-a-local-codex-worker-over-nostr">Nostr Codex Phone&lt;/a> launches as an Android control surface for a local Codex coding-assistant over encrypted Nostr DMs. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/#amethyst-builds-nip-89-aware-ui-a-git-repositories-feed-and-a-napplet-browser-discover-section">Amethyst&amp;rsquo;s unreleased line&lt;/a> adds NIP-89 app-handler parsing, a Git Repositories feed for NIP-34, and a Discover section for nSites and napplets. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/#notedeck-implements-nip-37-private-sync-relays-nip-52-calendar-and-nip-22-comments">Notedeck&lt;/a> lands NIP-37, NIP-52, and NIP-22 in one week. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/#applesauce-ships-12-sub-packages-in-a-coordinated-62x-cut">Applesauce&lt;/a> cuts 12 sub-package releases with nbunksec NIP-46 helpers and a Cashu-ts v4 wallet upgrade. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/#meiso-v140-ships-shared-key-collaborative-lists-that-replace-mls-for-task-sharing">Meiso v1.4.0&lt;/a> ships Shared-Key Collaborative Lists on addressable kind-35000. The NIPs repository merged five PRs including a relay roles event, the NIP-44 65,535-byte limit removal, NIP-34 fork semantics, NIP-46 client metadata, and a NIP-86 signevent method. Deep dives cover &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/#nip-deep-dive-nip-86-relay-management-api">NIP-86 (Relay Management API)&lt;/a> and &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-01-newsletter/#nip-deep-dive-nip-89-recommended-application-handlers">NIP-89 (Recommended Application Handlers)&lt;/a>.&lt;/p>
&lt;hr>
&lt;h2 id="lead-stories">Lead stories&lt;/h2>
&lt;h3 id="fips-v040-ships-nym-mixnet-transport-mdns-discovery-and-a-data-plane-overhaul">FIPS v0.4.0 ships Nym mixnet transport, mDNS discovery, and a data-plane overhaul&lt;/h3>
&lt;p>&lt;a href="https://github.com/jmcorgan/fips">FIPS&lt;/a> is a private, self-organizing peer-to-peer mesh network for Nostr where nodes discover each other and route traffic without central infrastructure. &lt;a href="https://github.com/jmcorgan/fips/releases/tag/v0.4.0">FIPS v0.4.0&lt;/a> lands a Nym mixnet transport, opt-in mDNS LAN discovery, a data-plane overhaul, hitless rekey under packet loss, a rewritten &lt;code>fipstop&lt;/code> TUI on a render-snapshot harness, an off-hot-path observability plane, and new OpenWrt apk and Nix flake packaging targets, all wire-compatible with v0.3.0 so mixed meshes interoperate during a rolling upgrade. Two new transports for peer discovery anchor the release. A new &lt;a href="https://github.com/jmcorgan/fips/releases/tag/v0.4.0">outbound Nym mixnet transport&lt;/a> routes FIPS traffic through a &lt;code>nym-socks5-client&lt;/code> SOCKS5 proxy, mixing it into the &lt;a href="https://nymtech.net/">Nym&lt;/a> cover-traffic network so link-level observers cannot correlate which mesh peers are talking, and an &lt;code>examples/sidecar-nostr-mixnet-relay/&lt;/code> directory demonstrates a Nostr relay reachable over a FIPS link peered end-to-end across the mixnet. Opt-in mDNS / DNS-SD LAN discovery lets nodes on the same local link find each other with no address configuration and no STUN, advertising and adopting peers through a standard service record on &lt;code>node.discovery.lan.enabled: true&lt;/code>.&lt;/p>
&lt;p>The data plane was reworked for higher single-node throughput. Per-peer encrypt and decrypt now run on dedicated worker tasks off the receive loop, so one busy peer cannot serialize the whole node&amp;rsquo;s crypto. The Linux send path uses generic segmentation offload and a connected-UDP socket where available, the receive hot path avoids buffer copies it previously made per packet, and macOS picks up a &lt;code>recvmsg_x&lt;/code> batched receive to mirror the Linux &lt;code>recvmmsg&lt;/code> batching from v0.3.0. The entire &lt;code>show_*&lt;/code> read surface for &lt;code>fipsctl&lt;/code> and &lt;code>fipstop&lt;/code> now serves from a per-tick snapshot published into a lock-free &lt;code>ArcSwap&lt;/code> from the control accept task, so operator queries answer promptly on a node whose receive loop is busy. A new counter-only &lt;code>show_metrics&lt;/code> query (surfaced as &lt;code>fipsctl stats metrics&lt;/code>) enables Prometheus scraping at no hot-path cost.&lt;/p>
&lt;p>FMP and FSP session rekey are now hitless under packet loss and reordering in both directions: inbound frames authenticate against the pending session before the K-bit cutover promotes it (so a stale or spoofed frame cannot derail rekey), rekey message-1 retransmission is bounded, the link-dead heartbeat is rekey-aware, and dual-initiation races on high-latency links are desynchronized with symmetric jitter. The &lt;code>fipstop&lt;/code> TUI is rebuilt on a render-snapshot harness that asserts the exact text grid and per-cell style of every view against canned control-socket output. New packaging targets ship alongside: an OpenWrt &lt;code>.apk&lt;/code> for OpenWrt 25+ (built SDK-free, reusing the existing &lt;code>.ipk&lt;/code> cross-compile and installed-filesystem payload) and a &lt;code>flake.nix&lt;/code> at the project root that builds all four binaries (&lt;code>fips&lt;/code>, &lt;code>fipsctl&lt;/code>, &lt;code>fips-gateway&lt;/code>, &lt;code>fipstop&lt;/code>) from source on Nix/NixOS with the pinned toolchain.&lt;/p>
&lt;h3 id="whitenoise-linux-surfaces-as-a-desktop-marmot-client">Whitenoise Linux surfaces as a desktop Marmot client&lt;/h3>
&lt;p>&lt;a href="https://relay.ngit.dev/npub1ven4zk8xxw873876gx8y9g9l9fazkye9qnwnglcptgvfwxmygscqsxddfh/darkmatter-linux.git">Whitenoise Linux&lt;/a> is a desktop &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> client: MLS group messaging over Nostr relays, packaged as a single Rust binary with a Slint UI that keeps every secret in one password-encrypted vault.&lt;/p>
&lt;p>The most consequential thread this week proposes carrying Whitenoise message effects as a dedicated kind-9 event referencing the parent message. Today&amp;rsquo;s wire format appends a marker like &lt;code>dmfx:sparkle&lt;/code> to the end of the message body, which pollutes the text for any renderer that does not know the convention. Moving effects to their own event keeps message text clean, and it opens a design question the wider Marmot stack is going to face: inline body conventions or sidecar events for optional rich features.&lt;/p>
&lt;h3 id="custid-launches-as-a-mobile-identity-vault-with-nip-46-and-nfc-challenge-flow">CustID launches as a mobile identity vault with NIP-46 and NFC challenge flow&lt;/h3>
&lt;p>&lt;a href="https://zapstore.dev/apps/naddr1qq9rzqtdwfshxwf0wccsygqv94d2qg37755z67q9yjz6q60lcejldsc3ttak83333gjqgyvf3aqpsgqqqyf6w24n0c">CustID v0.1.10-beta&lt;/a> is the first public beta of CustID, a mobile identity vault built on Nostr and the SISTR protocol. CustID stores multiple Nostr identities in hardware-backed secure storage, acts as a &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote signer for other clients, and answers physical and online access challenges over NFC and QR codes.&lt;/p>
&lt;p>The beta is feature-complete for the NIP-46 signer and NFC challenge-response flow; zero-knowledge-proof access flows remain a future milestone. This release also drops the app&amp;rsquo;s background &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> keep-alive layer, which had been opening a WebSocket per profile per read relay and ingesting kinds the client immediately discarded. Only the NIP-46 sockets that carry signing-request notifications are kept alive in the background now, which is the fix that makes running CustID as a bunker for other clients viable on a phone.&lt;/p>
&lt;h3 id="myco-launches-peer-to-peer-nsite-sharing-over-the-fips-mesh">myco launches peer-to-peer nsite sharing over the FIPS mesh&lt;/h3>
&lt;p>&lt;a href="https://github.com/Origami74/myco/releases/tag/v0.1.0">myco v0.1.0&lt;/a> opened this week on June 27 and reached v0.1.0 on July 1. myco is a Rust Android app that installs apps from the people around you: peer-to-peer &lt;a href="https://nostrcompass.org/en/topics/nip-5a/">nsite&lt;/a> sharing over a FIPS mesh, with any transport the mesh can carry (UDP, TCP, Tor, Bluetooth), working fully offline. The design pairs directly with FIPS as the transport substrate and with NIP-5A&amp;rsquo;s static-website event format as the payload, letting an app distributed as an nsite move between mesh peers without depending on relays or HTTP.&lt;/p>
&lt;p>v0.1.0 adds an L2CAP Bluetooth radio path so two phones with FIPS installed can peer over BLE without any network, plus a per-peer speedtest and NFC-triggered sharing from the app&amp;rsquo;s Circle bottom-sheet. myco is also published to Zapstore for direct install.&lt;/p>
&lt;h3 id="nostr-codex-phone-launches-as-a-mobile-control-surface-for-a-local-codex-worker-over-nostr">Nostr Codex Phone launches as a mobile control surface for a local Codex worker over Nostr&lt;/h3>
&lt;p>&lt;a href="https://github.com/tidley/nostr-codex-phone">Nostr Codex Phone v0.1.122&lt;/a> launches this week as an Android client that controls a local Codex coding-assistant worker over encrypted Nostr direct messages. The app supports multiple repository sessions, voice transcription, routed worker sessions, Blossom media uploads, and optional spoken responses, so a developer running a Codex worker at home can dispatch requests from their phone anywhere the phone has relay access.&lt;/p>
&lt;p>The project is a direct sibling to &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#codedeck-remote-agentic-coding-over-nostr">CodeDeck&lt;/a> launched in #28. Both put agentic-coding workflows on Nostr transport with encrypted DMs, and both treat Nostr as the pairing and messaging layer that lets a phone reach a home worker without punching holes through the network. Nostr as a control-plane for local agents is becoming an established pattern.&lt;/p>
&lt;h3 id="coop-mobile-publishes-its-first-versioned-builds">Coop Mobile publishes its first versioned builds&lt;/h3>
&lt;p>&lt;a href="https://git.reya.su/reya/coop-mobile/releases/tag/v0.2.1">Coop Mobile v0.2.1&lt;/a> and &lt;a href="https://git.reya.su/reya/coop-mobile/releases/tag/v0.2.2">v0.2.2&lt;/a> shipped this week as the first versioned builds of Coop Mobile, a &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> encrypted direct-messaging client for Android. The two releases tighten crash safety around message parsing and QR handling, and wipe all stored data on logout.&lt;/p>
&lt;h3 id="amethyst-builds-nip-89-aware-ui-a-git-repositories-feed-and-a-napplet-discover-section">Amethyst builds NIP-89-aware UI, a Git Repositories feed, and a napplet Discover section&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&amp;rsquo;s&lt;/a> main branch built out several new surfaces this week. A &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3406">Git Repositories feed&lt;/a> turns &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> repos into a browsable Android timeline category, filterable by community and author, paired with a &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3415">smart-HTTP git browser&lt;/a> that reads repo contents and commits without leaving the app. The napplet host gained a &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3409">Discover section&lt;/a> listing curated web apps plus followed nSites and napplets, sourced from &lt;a href="https://nostrcompass.org/en/topics/nip-89/">NIP-89&lt;/a> handler events and &lt;a href="https://nostrcompass.org/en/topics/nip-5a/">NIP-5A&lt;/a> site events. Note display now &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3422">reveals which Nostr app authored an event&lt;/a> via NIP-89 tags. On the sync side, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3434">NIP-77 negentropy support&lt;/a> lands with streaming reconciliation and automatic &lt;code>created_at&lt;/code> windowing to work around relay-side result caps, cutting bandwidth needed to keep large local event sets in sync with a relay.&lt;/p>
&lt;h3 id="buzz-v0338-hardens-the-relay-attack-surface-and-adds-provider-agnostic-model-selection">Buzz v0.3.38 hardens the relay attack surface and adds provider-agnostic model selection&lt;/h3>
&lt;p>&lt;a href="https://github.com/block/buzz/releases/tag/v0.3.38">Buzz v0.3.38&lt;/a> hardens the &lt;a href="https://github.com/block/buzz/pull/1369">relay attack surface&lt;/a> that Buzz exposes when it publishes personas, teams, managed agents, and NIP-OA owner attestations as signed Nostr events. A Buzz relay is a public record of the team&amp;rsquo;s Nostr identities and their state, and this release tightens input validation and replay protection on the well-known event kinds Buzz defines. The release also generalizes model selection so a Buzz team can point at any provider Buzz has adapters for, including a new Databricks AI Gateway v2 backend.&lt;/p>
&lt;h3 id="notedeck-implements-nip-37-private-sync-relays-nip-52-calendar-and-nip-22-comments">Notedeck implements NIP-37 private-sync relays, NIP-52 calendar, and NIP-22 comments&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/notedeck">Notedeck&lt;/a>, the Damus team&amp;rsquo;s native Rust desktop client, landed three protocol implementations in one week. Private-sync relays now persist as a kind &lt;code>10013&lt;/code> &lt;a href="https://nostrcompass.org/en/topics/nip-37/">NIP-37&lt;/a> list, separating the user&amp;rsquo;s private-content relay set from their public NIP-65 outbox. The &lt;code>horizon&lt;/code> calendar pane reads &lt;a href="https://nostrcompass.org/en/topics/nip-52/">NIP-52&lt;/a> events from nostrdb and got a three-pane layout redesign. The &lt;code>headway&lt;/code> pane added a &lt;a href="https://nostrcompass.org/en/topics/nip-22/">NIP-22&lt;/a> comment-event model on kind &lt;code>1111&lt;/code>, the kind NIP-22 defines for the unified comment surface that replaces NIP-10 reply threading.&lt;/p>
&lt;h3 id="applesauce-lands-nbunksec-nip-46-sessions-and-a-cashu-v4-wallet-upgrade">Applesauce lands nbunksec NIP-46 sessions and a Cashu v4 wallet upgrade&lt;/h3>
&lt;p>&lt;a href="https://github.com/hzrd149/applesauce">Applesauce&lt;/a>, the modular Nostr toolkit for signers, relays, wallets, and content, cut a coordinated &lt;a href="https://github.com/hzrd149/applesauce/releases">6.2.x release&lt;/a> across its sub-packages. The signers package gained &lt;code>nbunksec&lt;/code> import and export helpers, treating a &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> bunker session as a portable artifact that can move between clients. The wallet package upgraded its &lt;a href="https://nostrcompass.org/en/topics/nip-60/">Cashu&lt;/a> bindings to &lt;code>@cashu/cashu-ts&lt;/code> v4, where proof amounts become &lt;code>Amount&lt;/code> value objects and the token-decoding API changes.&lt;/p>
&lt;hr>
&lt;h2 id="tagged-releases">Tagged releases&lt;/h2>
&lt;h3 id="mostro-core-v0140">mostro-core v0.14.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/MostroP2P/mostro-core/releases/tag/v0.14.0">mostro-core v0.14.0&lt;/a> lands the next protocol iteration for the &lt;a href="https://nostrcompass.org/en/topics/nip-69/">Mostro&lt;/a> P2P fiat trading network. The release follows &lt;a href="https://github.com/MostroP2P/mostro-core/releases/tag/v0.13.2">v0.13.2&lt;/a> and ships alongside &lt;a href="https://github.com/MostroP2P/mostro-cli/releases/tag/v0.16.0">mostro-cli v0.16.0&lt;/a> which adopts the new core. Three merged PRs landed in the core repository this week; the surrounding stack (mostro daemon and Mostro mobile) tracks against v0.14.0 of the shared types crate.&lt;/p>
&lt;h3 id="ngit-v261">ngit v2.6.1&lt;/h3>
&lt;p>&lt;a href="https://github.com/DanConwayDev/ngit-cli">ngit v2.6.1&lt;/a>, the canonical git-over-nostr CLI for &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> repositories, implements this week&amp;rsquo;s merged &lt;a href="https://github.com/nostr-protocol/nips/pull/2395">NIP-34 GRASP-06 fork semantics&lt;/a> that replace the &lt;code>personal-fork&lt;/code> tag with a &lt;code>u&lt;/code> tag on repo-state events.&lt;/p>
&lt;h3 id="mesh-llm-v0720-and-v0721">mesh-llm v0.72.0 and v0.72.1&lt;/h3>
&lt;p>&lt;a href="https://github.com/Mesh-LLM/mesh-llm">mesh-llm&lt;/a>, the inference component of the ContextVM stack that runs open-source LLMs behind a Nostr-addressable JSON-RPC surface, shipped &lt;a href="https://github.com/Mesh-LLM/mesh-llm/releases/tag/v0.72.0">v0.72.0&lt;/a> and &lt;a href="https://github.com/Mesh-LLM/mesh-llm/releases/tag/v0.72.1">v0.72.1&lt;/a> with a fix for a batching crash on large single prompts and an MCP-bridge migration off deprecated helpers.&lt;/p>
&lt;h3 id="meiso-v140-ships-shared-key-collaborative-lists-that-replace-mls-for-task-sharing">Meiso v1.4.0 ships Shared-Key Collaborative Lists that replace MLS for task sharing&lt;/h3>
&lt;p>&lt;a href="https://github.com/higedamc/meiso/releases/tag/v1.4.0">Meiso v1.4.0&lt;/a> introduces a Shared-Key Collaborative Lists model that replaces the project&amp;rsquo;s prior MLS-based task sharing with a simpler addressable-event design. Each shared list generates a dedicated Nostr key distributed to members, tasks are addressable events on kind &lt;code>35000&lt;/code> keyed by &lt;code>d=task-id&lt;/code> with &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> self-encrypted content, and relays enforce Last-Write-Wins per task. The design surrenders MLS&amp;rsquo;s forward secrecy and post-compromise security in exchange for simpler client implementation and relay-level conflict resolution.&lt;/p>
&lt;h3 id="cordn-032">Cordn 0.3.2&lt;/h3>
&lt;p>&lt;a href="https://github.com/Cordn-msg/cordn">Cordn 0.3.2&lt;/a> ships a &amp;ldquo;more-private-coordinator&amp;rdquo; track that removes ephemeral sender pubkeys from group message posting and hardens the join-request flow against stale re-requests. Cordn is the MLS-based messaging stack covered in &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#cordn-ad-hoc-cvm-a-browser-based-mls-coordinator">#28&amp;rsquo;s Cordn Ad-hoc CVM launch&lt;/a>; this release is the matching coordinator-side update.&lt;/p>
&lt;hr>
&lt;h2 id="unreleased-changes">Unreleased changes&lt;/h2>
&lt;h3 id="divine-pushes-108-merged-prs-of-post-launch-polish">diVine pushes 108 merged PRs of post-launch polish&lt;/h3>
&lt;p>&lt;a href="https://github.com/divinevideo/divine-mobile">diVine&lt;/a>, the short-form looping video client bringing back Vine, is in a heavy post-launch polish wave. The Nostr-visible work this week is a &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> connect-flow stability pass that migrates &lt;code>nostrconnect://&lt;/code> failures onto structured reason codes.&lt;/p>
&lt;h3 id="zap-cooking-continues-the-cross-project-nip-46-fix-and-composer-overhaul">Zap Cooking continues the cross-project NIP-46 fix and composer overhaul&lt;/h3>
&lt;p>&lt;a href="https://github.com/zapcooking/frontend">Zap Cooking&lt;/a> is a Nostr recipe-sharing client where recipes are published as long-form Nostr events. This week&amp;rsquo;s work continues the cross-project &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> fix and composer overhaul covered as unreleased in &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#unreleased-changes">#28&lt;/a>.&lt;/p>
&lt;h3 id="conduit-hardens-listing-flow-and-marketplace-correctness">Conduit hardens listing flow and marketplace correctness&lt;/h3>
&lt;p>&lt;a href="https://github.com/Conduit-BTC/conduit-mono">Conduit&lt;/a> is a three-app marketplace monorepo on Nostr covering the buyer market, merchant portal, and store builder. This week&amp;rsquo;s work continues the marketplace correctness push covered in &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#conduit-hardens-the-marketplace-mvp-and-switches-to-its-public-relay-by-default">#28&amp;rsquo;s launch coverage&lt;/a>, building on the &lt;a href="https://nostrcompass.org/en/topics/nip-99/">NIP-99&lt;/a> commerce wave that was the protocol-side story last issue.&lt;/p>
&lt;h3 id="pollerama-v112-through-v1131-add-client-tag-choice-profile-tabs-and-thread-caps">Pollerama v1.12 through v1.13.1 add client-tag choice, profile tabs, and thread caps&lt;/h3>
&lt;p>&lt;a href="https://github.com/formstr-hq/nostr-polls">Pollerama&lt;/a>, an Android Nostr client focused on polls and notes with a strong web-of-trust discovery layer, shipped v1.12.0, v1.13.0, and v1.13.1 to Zapstore this week. Users can now pick which client tag is attached to their authored notes and polls, choosing from a preset list or entering their own. Deeply nested comment and reply chains now stop after a few levels and link out to the full thread on the note&amp;rsquo;s page. Profile pages open on Notes by default, split into a Posts tab and a Conversations tab. A follow-persistence bug where newly-followed accounts disappeared after an app restart is fixed, and follow buttons now show progress.&lt;/p>
&lt;h3 id="getwiredapp-and-get-taoapp-fix-the-nip-13-confess-submission-flow">getwired.app and get-tao.app fix the NIP-13 confess submission flow&lt;/h3>
&lt;p>&lt;a href="https://github.com/smolgrrr/Wired">getwired.app&lt;/a> and &lt;a href="https://github.com/smolgrrr/TAO">get-tao.app&lt;/a>, which share an anonymous-posting flow that adds NIP-13 proof-of-work to suppress spam at submit time, fixed the &lt;a href="https://github.com/smolgrrr/Wired/pull/57">confess submission flow&lt;/a> so the UX during PoW mining is coherent.&lt;/p>
&lt;h3 id="nostui-adds-a-mention-timeline-tab">nostui adds a mention timeline tab&lt;/h3>
&lt;p>&lt;a href="https://github.com/akiomik/nostui">nostui&lt;/a>, a terminal Nostr client in Rust, added a &lt;a href="https://github.com/akiomik/nostui/pull/463">mention timeline tab&lt;/a> that surfaces kind:1 events tagging the active pubkey as a dedicated view in the TUI.&lt;/p>
&lt;h3 id="heartwood-lands-per-identity-nip-46-bunker-uris-and-an-hsm-mode-signing-bridge">Heartwood lands per-identity NIP-46 bunker URIs and an HSM-mode signing bridge&lt;/h3>
&lt;p>&lt;a href="https://github.com/forgesworn/heartwood">Heartwood&lt;/a> is a &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> signer where the signing key never reaches the client at all: the client speaks NIP-46 to a small relay, and the relay speaks a serial frame protocol to an attached hardware device that performs the signature. This week the project landed a &lt;a href="https://github.com/forgesworn/heartwood/pull/11">relay-to-serial signing bridge&lt;/a> and &lt;a href="https://github.com/forgesworn/heartwood/pull/16">per-identity bunker connections&lt;/a>, so a single hardware device holding multiple identities exposes a distinct bunker URI for each one.&lt;/p>
&lt;h3 id="nostter-auth-and-signer-refactor">Nostter auth and signer refactor&lt;/h3>
&lt;p>&lt;a href="https://github.com/SnowCait/nostter">Nostter&lt;/a> reworked its &lt;a href="https://github.com/SnowCait/nostter/pulls?q=is%3Amerged&amp;#43;auth">auth and signer layer&lt;/a> this week, moving login state onto a single signal and extracting the signer dispatch into strategy modules. The trajectory is a clean signer abstraction where NIP-07 web extension, NIP-46 remote bunker, and raw nsec all share one code path.&lt;/p>
&lt;h3 id="dart-ndk-extracts-the-nip-07-signer-and-randomizes-nip-59-timestamps">Dart NDK extracts the NIP-07 signer and randomizes NIP-59 timestamps&lt;/h3>
&lt;p>&lt;a href="https://github.com/relaystr/dart_ndk">Dart NDK&lt;/a> moved its &lt;a href="https://nostrcompass.org/en/topics/nip-07/">NIP-07&lt;/a> signer out of the core package and into &lt;code>ndk_flutter&lt;/code> (where the Flutter WebView lives), and &lt;a href="https://github.com/relaystr/dart_ndk/pull/667">randomized its NIP-59 gift-wrap timestamps&lt;/a> to harden against timing correlation of encrypted messages.&lt;/p>
&lt;h3 id="milk-market-adds-nip-23-storefront-pages-and-square-payment-processing">Milk Market adds NIP-23 storefront pages and Square payment processing&lt;/h3>
&lt;p>&lt;a href="https://github.com/shopstr-eng/milk-market">Milk Market&lt;/a>, the Shopstr-team marketplace storefront, gave every storefront a blog page backed by the seller&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-23/">NIP-23&lt;/a> long-form events, with editable sections and a direct blog-setting route. The same week added &lt;a href="https://github.com/shopstr-eng/milk-market/pull/30">Square&lt;/a> as an alternative payment processor for sellers and automatic shipping-label purchases for paid orders.&lt;/p>
&lt;h3 id="calendar-by-formstr-ships-an-ios-app">Calendar by Formstr ships an iOS app&lt;/h3>
&lt;p>&lt;a href="https://github.com/formstr-hq/nostr-calendar">Calendar by Formstr&lt;/a> merged &lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/159">PR #159 IOS App&lt;/a> this week, bringing the &lt;a href="https://nostrcompass.org/en/topics/nip-52/">NIP-52&lt;/a> calendar client to iOS. &lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/197">PR #197&lt;/a> fixes calendar-date parsing in local time, and &lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/201">PR #201&lt;/a> adds a Playwright E2E workflow triggered by a &lt;code>run-tests&lt;/code> label.&lt;/p>
&lt;h3 id="cagliostr-enforces-nip-22-nip-09-by-coordinate-and-nip-13-proof-of-work">cagliostr enforces NIP-22, NIP-09 by coordinate, and NIP-13 proof-of-work&lt;/h3>
&lt;p>&lt;a href="https://github.com/mattn/cagliostr">cagliostr&lt;/a>, a Go relay implementation, tightened three enforcement paths this week: &lt;a href="https://github.com/mattn/cagliostr/pull/7">configurable NIP-13 proof-of-work&lt;/a> on incoming events, &lt;a href="https://github.com/mattn/cagliostr/pull/8">NIP-09 deletion by addressable coordinate&lt;/a> so replaceable events can be deleted by their &lt;code>a&lt;/code> tag (which event-id deletion alone cannot reach), and &lt;a href="https://github.com/mattn/cagliostr/pull/9">configurable NIP-22 timestamp limits&lt;/a> that reject events stamped too far in past or future.&lt;/p>
&lt;hr>
&lt;h2 id="newly-tracked-and-discovered">Newly tracked and discovered&lt;/h2>
&lt;p>The &lt;a href="https://git.vanderwarker.family/wellbeing">Vanderwarker wellbeing suite&lt;/a> publishes physical-world telemetry as Nostr events under a shared publisher signing key. It consists of five sibling apps: &lt;a href="https://git.vanderwarker.family/wellbeing/holyfit-android">Holy Fit&lt;/a> is a step tracker anchoring fitness data to Nostr as &lt;code>kind:30078&lt;/code>, &lt;a href="https://git.vanderwarker.family/wellbeing/nunlock-android">Nunlock&lt;/a> publishes a daily phone-unlock counter, &lt;a href="https://git.vanderwarker.family/wellbeing/saintstream-android">Saint Stream&lt;/a> publishes current media playback as a User Status, &lt;a href="https://git.vanderwarker.family/wellbeing/sistercharge-android">Sister Charge&lt;/a> publishes battery level, voltage, and temperature every 15 minutes, and &lt;a href="https://git.vanderwarker.family/wellbeing/cellibacy-android">Cellibacy&lt;/a> publishes daily data usage. All five appeared on Zapstore between June 24 and June 30.&lt;/p>
&lt;p>&lt;a href="https://github.com/f321x/ntrack/releases/tag/v0.1.9">ntrack v0.1.9&lt;/a> is an encrypted serverless live location-sharing Android app built in Rust and Slint, released June 29. It is a sibling to the &lt;a href="https://github.com/mehmetefeumit/Haven-App">Haven&lt;/a> &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a>-based location sharer covered in &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#haven-launches-private-location-sharing-on-marmot">#28&lt;/a>, with a different transport architecture: encrypted Nostr DMs carry the location updates, where Haven uses Marmot group messages.&lt;/p>
&lt;p>&lt;a href="https://git.nostrdev.com/stuff/NostrAppShell">NostrAppShell&lt;/a> is an early-stage application shell scaffold for building Nostr apps. The project published its first user-facing documentation this week.&lt;/p>
&lt;p>&lt;a href="https://nips.pollerama.fun">NIPs by Pollerama&lt;/a> (repository &lt;a href="https://github.com/abh3po/better-nips">abh3po/better-nips&lt;/a>, created 2026-06-29) is a new client for &lt;a href="https://nostrhub.io">NostrHub&amp;rsquo;s&lt;/a> &lt;code>kind:30817&lt;/code> community-authored NIPs, positioned as a trust-weighted alternative surface to nostrhub.io. Each &lt;code>kind:30817&lt;/code> NIP has its own shareable URL (&lt;code>#/nip/&amp;lt;naddr&amp;gt;&lt;/code>) with full Markdown rendering and the event kinds it defines. The client offers three feeds: Following, Web of Trust (follows-of-follows), and Global, each sortable by trust-weighted approvals or by newest. Approvals publish as &lt;a href="https://nostrcompass.org/en/topics/nip-32/">NIP-32&lt;/a> labels on kind &lt;code>1985&lt;/code> with tags &lt;code>[&amp;quot;L&amp;quot;,&amp;quot;nostrhub&amp;quot;]&lt;/code> and &lt;code>[&amp;quot;l&amp;quot;,&amp;quot;approve&amp;quot;,&amp;quot;nostrhub&amp;quot;]&lt;/code> plus an &lt;code>a&lt;/code> tag pointing at the target NIP address and a &lt;code>client&lt;/code> tag advertising &lt;code>better-nips&lt;/code>, which is the exact event shape NostrHub itself signs so approvals are cross-compatible between the two clients. A direct follow&amp;rsquo;s approval carries more weight in the ranking than a second-degree follows-of-follows approval.&lt;/p>
&lt;p>The signing stack is &lt;a href="https://www.npmjs.com/package/@formstr/signer">&lt;code>@formstr/signer&lt;/code>&lt;/a> with a full login modal covering &lt;a href="https://nostrcompass.org/en/topics/nip-07/">NIP-07&lt;/a>, &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> bunker and nostrconnect, &lt;a href="https://nostrcompass.org/en/topics/nip-49/">NIP-49&lt;/a> ncryptsec, and &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> Android signer, and sessions silently re-attach on reload. The network layer runs through &lt;a href="https://www.npmjs.com/package/@formstr/local-relay">&lt;code>@formstr/local-relay&lt;/code>&lt;/a>, a Web Worker that partitions the user&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> outbox across relays so a large web-of-trust set does not fan out to a single relay. The design position is that community NIPs (whether hosted at NostrHub, in &lt;code>better-nips&lt;/code>, or by other future clients) are all equal at the protocol level; ranking comes from the social graph, not from moderator curation, which pairs directly with the NIP-32 labeling flow the deep dive in &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-03-newsletter/#nip-deep-dive-nip-32-labeling">#25&lt;/a> covered.&lt;/p>
&lt;p>Two new &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> repo clusters appeared this week. &lt;a href="https://git.shakespeare.diy/npub14rg4vrt2v374q95ezeeydu3hkdhmzglcj950mggacap4x0lv0gyq04wun7/vidstr.git">Vidstr&lt;/a> is a video-focused Nostr client, and a &lt;a href="#ZgotmplZ">nostrapps.com cluster&lt;/a> publishes three sibling projects: &lt;a href="https://gitnostr.com/npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6/verdana.git">verdana&lt;/a> (a napp VM for desktop), &lt;a href="https://gitnostr.com/npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6/hallway.git">hallway&lt;/a> (a customizable communities client), and &lt;a href="https://gitnostr.com/npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6/napps.git">napps&lt;/a> (an HTML microapps spec and runtime). The cluster sits parallel to the &lt;a href="https://nostrcompass.org/en/topics/nip-5d/">napplet&lt;/a> work covered in last issue&amp;rsquo;s lead story.&lt;/p>
&lt;hr>
&lt;h2 id="protocol-work-and-nip-updates">Protocol work and NIP updates&lt;/h2>
&lt;h3 id="merged-nip-44-lifts-the-65535-byte-payload-limit">Merged: NIP-44 lifts the 65,535-byte payload limit&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/1907">PR #1907&lt;/a> merged on June 28 after sitting open since 2024-09. The change removes the 65,535-byte upper bound on the plaintext payload of a &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> versioned-encryption envelope, raising it to a 4-GiB cap (&lt;code>uint32_max&lt;/code>). NIP-44 encodes payload length as a &lt;code>uint16&lt;/code> in the wire format, which the original spec required strictly for interop; the merged change adopts a longer-length field tagged into the version byte so v2 implementations stay wire-compatible and v3+ implementations carry the longer length. Clients using NIP-44 for &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> direct messages, &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> gift wraps, &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote-signer payloads, or any other NIP-44-encrypted Nostr message can now exchange single events larger than 64 KiB without splitting at the application layer.&lt;/p>
&lt;h3 id="merged-nip-86-gains-a-signevent-method-and-a-relay-roles-event">Merged: NIP-86 gains a signevent method and a Relay Roles event&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2389">PR #2389&lt;/a> adds a &lt;code>signevent&lt;/code> method to the &lt;a href="https://nostrcompass.org/en/topics/nip-86/">NIP-86&lt;/a> relay management JSON-RPC API, letting an administrator ask the relay to sign an event with the relay&amp;rsquo;s own pubkey. The companion &lt;a href="https://github.com/nostr-protocol/nips/pull/2390">PR #2390&lt;/a> defines a Relay Roles event: a replaceable event a relay publishes to declare its administrators and moderators. Together they let NIP-86 clients introspect a relay&amp;rsquo;s admin list and verify an authenticated request came from a current admin, without out-of-band trust. Deep dive on both changes below.&lt;/p>
&lt;h3 id="merged-nip-34-replaces-personal-fork-with-u-for-grasp-06">Merged: NIP-34 replaces personal-fork with &lt;code>u&lt;/code> for GRASP-06&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2395">PR #2395&lt;/a> merged on June 24 and replaces the &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> &lt;code>personal-fork&lt;/code> tag on repo-state events (&lt;code>kind:30618&lt;/code>) with a &lt;code>u&lt;/code> tag (for &amp;ldquo;upstream&amp;rdquo;), aligning the wire format with the GRASP-06 fork semantics the GitWorkshop suite has been implementing. The change closes &lt;a href="https://github.com/nostr-protocol/nips/pull/2384">PR #2384&lt;/a> (&lt;code>NIP-34: remove maintainers to solve expiry issues&lt;/code>), which proposed a different fork-semantics fix. The merged direction is the one ngit v2.6.x implements, so the merged spec and the reference CLI are now aligned. Existing repos using &lt;code>personal-fork&lt;/code> continue to interoperate; new repos and the ngit v2.6 line publish the &lt;code>u&lt;/code> tag.&lt;/p>
&lt;h3 id="merged-nip-46-client-metadata-now-upstream-after-amber-shipped-it">Merged: NIP-46 client metadata (now upstream after Amber shipped it)&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2381">PR #2381&lt;/a> merged on June 23 and adds optional client metadata to the &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> &lt;code>connect&lt;/code> request, letting a client publish its name, an icon URL, and a homepage URL at signer-connect time. &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.2.2">Amber v6.2.2&lt;/a> shipped the metadata extension last week (covered in &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#amber-v622-implements-nip-46-client-metadata">#28&lt;/a>); this week the upstream NIP catches up to the shipping implementation.&lt;/p>
&lt;h3 id="open-epoch-based-deterministic-nip-17-wrapper-keys">Open: epoch-based deterministic NIP-17 wrapper keys&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2397">PR #2397&lt;/a> and &lt;a href="https://github.com/nostr-protocol/nips/pull/2396">PR #2396&lt;/a> cover two converging NIP-17 wrap-key proposals. PR #2397 proposes that the ephemeral signing key used to author a &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> gift wrap be derived deterministically from a per-conversation seed tied to a coarse time epoch, so a recipient who knows the conversation key can predict which pubkeys to subscribe to. The current spec requires a fresh random key per wrap, which makes that prediction impossible. PR #2396 is the companion change: wraps for a given conversation should be signed with the conversation key directly so the wrap pubkey doubles as the conversation identifier. Together they define a path to filterable NIP-17 conversations without metadata leakage. Both are open and under discussion.&lt;/p>
&lt;h3 id="open-nip-59-should-reject-kind13-seal-events-at-the-relay">Open: NIP-59 should reject kind:13 seal events at the relay&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2399">PR #2399&lt;/a> proposes that relays should reject kind:13 events (the inner seal of a &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> gift wrap) when they appear at the top level of a publish request, because a seal event is only meaningful inside a wrap and a leaked seal exposes the recipient pubkey. The companion &lt;a href="https://github.com/nostr-protocol/nips/issues/2398">issue #2398&lt;/a> goes further and argues that the seal should be re-defined as an ephemeral kind (NIP-01 ephemeral kinds are not stored by relays), which would harden the rule at the protocol level and remove the dependence on per-relay policy.&lt;/p>
&lt;h3 id="open-nip-29-group-states">Open: NIP-29 group states&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2372">PR #2372&lt;/a> adds explicit group-state semantics to &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> (relay-based groups), defining what it means for a group to be open, closed, public, private, or archived, and how state transitions interact with member events. The proposal pulls semantics that have been client-specific into the relay spec.&lt;/p>
&lt;h3 id="open-nip-34-optional-multi-maintainer-support">Open: NIP-34 optional multi-maintainer support&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2324">PR #2324&lt;/a> is the companion proposal to the merged &lt;a href="https://github.com/nostr-protocol/nips/pull/2395">PR #2395&lt;/a> (GRASP-06 fork semantics covered above). PR #2324 adds optional multi-maintainer support to &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> repo announcement events (&lt;code>kind:30617&lt;/code>), letting a repository declare more than one canonical maintainer pubkey via repeated &lt;code>maintainer&lt;/code> tags. Patches and issues signed by any declared maintainer are then trusted by clients as official, which addresses the long-standing gap where NIP-34 repos with co-maintainers must either route everything through one pubkey or fall back to off-protocol coordination.&lt;/p>
&lt;h3 id="open-nip-91-and-operator-for-filters-the-proposal-is-open-not-merged">Open: NIP-91 AND operator for filters (the proposal is open, not merged)&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2252">PR #2252&lt;/a> is the AND-operator proposal for Nostr &lt;a href="https://nostrcompass.org/en/topics/nip-01/">filters&lt;/a>, reopening a design first discussed in the earlier closed &lt;a href="https://github.com/nostr-protocol/nips/pull/1365">PR #1365&lt;/a>. Implementations already exist in &lt;a href="https://github.com/v0l/nostr-rs-relay">nostr-rs-relay&lt;/a>, applesauce, &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a>, and worker-relay, but the spec PR itself remains open.&lt;/p>
&lt;h3 id="closed-four-pats2sats-commerce-nips">Closed: four pats2sats commerce NIPs&lt;/h3>
&lt;p>Four commerce-on-Nostr proposals closed this week: Escrow (&lt;a href="https://github.com/nostr-protocol/nips/pull/2334">#2334&lt;/a>), Reservations (&lt;a href="https://github.com/nostr-protocol/nips/pull/2335">#2335&lt;/a>), a &lt;a href="https://nostrcompass.org/en/topics/nip-99/">NIP-99&lt;/a> Marketplace Listing Extension (&lt;a href="https://github.com/nostr-protocol/nips/pull/2346">#2346&lt;/a>), and an Accommodation Listing Profile (&lt;a href="https://github.com/nostr-protocol/nips/pull/2333">#2333&lt;/a>). The same commerce surface is now being consolidated in the &lt;a href="https://github.com/GammaMarkets/market-spec">Gamma Market Spec&lt;/a>, a project-owned extension repository that composes on top of NIP-99 marketplace listings with orders, checkout, escrow, and dispute semantics. Compass now tracks this repository alongside Marmot and Blossom as a protocol-spec repo external to the NIPs repository itself; open PRs there this week include client-attribution clarification (&lt;a href="https://github.com/GammaMarkets/market-spec/pull/11">#11&lt;/a>), a supersedes-tag for product-identity changes (&lt;a href="https://github.com/GammaMarkets/market-spec/pull/8">#8&lt;/a>), and merchant-review semantics (&lt;a href="https://github.com/GammaMarkets/market-spec/pull/7">#7&lt;/a>).&lt;/p>
&lt;h3 id="open-bitcoin-identity-linkage">Open: Bitcoin identity linkage&lt;/h3>
&lt;p>Two proposals opened this week for linking Bitcoin identities to Nostr identities: a &lt;a href="https://github.com/nostr-protocol/nips/pull/2392">NIP-352 Bitcoin Silent Payment Address&lt;/a> and a &lt;a href="https://github.com/nostr-protocol/nips/pull/2401">Bitcoin-OTC Identity Linkage Proof&lt;/a>.&lt;/p>
&lt;hr>
&lt;h2 id="nip-deep-dive-nip-86-relay-management-api">NIP Deep Dive: NIP-86 (Relay Management API)&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-86/">NIP-86&lt;/a> defines a JSON-RPC interface for relay management, letting authorized clients send administrative commands to relays over a standardized API. A single client can manage any NIP-86-compatible relay without per-relay tooling. Two spec merges this week (&lt;a href="https://github.com/nostr-protocol/nips/pull/2389">PR #2389&lt;/a> and &lt;a href="https://github.com/nostr-protocol/nips/pull/2390">PR #2390&lt;/a>) close the loop between relay-signed events and relay-declared administrators.&lt;/p>
&lt;h3 id="the-transport">The transport&lt;/h3>
&lt;p>A NIP-86 management request is an HTTP POST to the same URI the relay serves WebSocket connections from, with &lt;code>Content-Type: application/nostr+json+rpc&lt;/code>. The request body is a JSON document of the form:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;method&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;method-name&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;params&amp;#34;&lt;/span>: [&lt;span style="color:#960050;background-color:#1e0010">&amp;lt;arg&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">&amp;gt;&lt;/span>, &lt;span style="color:#960050;background-color:#1e0010">&amp;lt;arg&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">&amp;gt;&lt;/span>, &lt;span style="color:#960050;background-color:#1e0010">...&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Authentication uses a &lt;a href="https://nostrcompass.org/en/topics/nip-98/">NIP-98&lt;/a> HTTP-auth signed event in the &lt;code>Authorization&lt;/code> header. The relay verifies the signing pubkey is on its administrator list before executing the method. The relay&amp;rsquo;s response is a JSON document of the form:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;result&amp;#34;&lt;/span>: &lt;span style="color:#960050;background-color:#1e0010">&amp;lt;return-value&amp;gt;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;error&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;error-string-if-any&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="the-methods-that-existed-before-this-week">The methods that existed before this week&lt;/h3>
&lt;p>The pre-existing method set covers pubkey bans (&lt;code>banpubkey&lt;/code>, &lt;code>allowpubkey&lt;/code>, &lt;code>listbannedpubkeys&lt;/code>), event bans (&lt;code>banevent&lt;/code>, &lt;code>allowevent&lt;/code>, &lt;code>listbannedevents&lt;/code>), relay metadata (&lt;code>changerelayname&lt;/code>, &lt;code>changerelaydescription&lt;/code>, &lt;code>changerelayicon&lt;/code>), allowed-pubkey list management (&lt;code>allowkind&lt;/code>, &lt;code>disallowkind&lt;/code>, &lt;code>listallowedkinds&lt;/code>), and a &lt;code>stats&lt;/code> method that returns relay statistics. The shape is intentionally close to a standard JSON-RPC service so a client can layer typed bindings on top of it.&lt;/p>
&lt;h3 id="what-changed-this-week">What changed this week&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2389">PR #2389&lt;/a> adds a &lt;code>signevent&lt;/code> method to the spec. The method takes a partial event template (kind, tags, content) as its argument and asks the relay to sign and return a complete event with the relay&amp;rsquo;s own pubkey as the &lt;code>pubkey&lt;/code> field. This is the precondition for a relay to publish protocol-level events about itself: blocked-pubkey announcements, relay metadata, and the new Relay Roles event below all require the relay to sign with its operator-controlled key, but most relay operators do not want to hold a private key in their administrative client.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2390">PR #2390&lt;/a> defines a Relay Roles event: a parameterised replaceable event kind that a relay publishes (signed with its own pubkey via &lt;code>signevent&lt;/code>) declaring the pubkeys of its administrators and moderators with explicit role semantics. A NIP-86-aware client can fetch the Relay Roles event from any tracked relay, build the admin list from the event tags, and validate that an authenticated NIP-86 request came from a current admin without out-of-band trust or per-relay configuration. The two PRs together close the loop: &lt;code>signevent&lt;/code> is the mechanism, Relay Roles is the first event kind built on top of it.&lt;/p>
&lt;h3 id="a-nip-86-request-example">A NIP-86 request example&lt;/h3>
&lt;p>A complete NIP-86 &lt;code>banpubkey&lt;/code> request looks like:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;method&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;banpubkey&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;params&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;&amp;lt;64-char-hex-pubkey-to-ban&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;spam&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>with an &lt;code>Authorization&lt;/code> header carrying a NIP-98 signed event:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;5e1c2f9e1d3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1782824400&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">27235&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;u&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;https://relay.example.com/&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;method&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;POST&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;payload&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;lt;sha256-of-request-body&amp;gt;&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;f1e2d3c4b5a697887766554433221100ffeeddccbbaa99887766554433221100f1e2d3c4b5a697887766554433221100ffeeddccbbaa99887766554433221100&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The signing pubkey must be present in the relay&amp;rsquo;s admin set (now declared in the relay-roles event); the &lt;code>u&lt;/code> tag must match the relay&amp;rsquo;s HTTPS URL; the &lt;code>payload&lt;/code> tag must match the SHA-256 of the JSON request body. The relay returns:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;result&amp;#34;&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;error&amp;#34;&lt;/span>: &lt;span style="color:#66d9ef">null&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="implementations">Implementations&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> ships a NIP-86 relay management UI on Android (v1.07.0+).&lt;/li>
&lt;li>The reference relays that implement the spec include &lt;a href="https://github.com/hoytech/strfry">strfry&lt;/a>, &lt;a href="https://github.com/fiatjaf/khatru">khatru&lt;/a>, and several smaller implementations the spec links from its &lt;code>Implementation Status&lt;/code> section.&lt;/li>
&lt;/ul>
&lt;p>NIP-86-aware clients will begin treating the relay-roles event as the canonical source for a relay&amp;rsquo;s admin list, once implementers pick up the &lt;code>signevent&lt;/code> and Relay Roles changes.&lt;/p>
&lt;hr>
&lt;h2 id="nip-deep-dive-nip-89-recommended-application-handlers">NIP Deep Dive: NIP-89 (Recommended Application Handlers)&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-89/">NIP-89&lt;/a> defines two parameterised replaceable event kinds, &lt;code>kind:31990&lt;/code> (the application handler an app developer publishes) and &lt;code>kind:31989&lt;/code> (the recommendation a user publishes for an app they use). Together they let clients discover applications that handle an unknown event kind without out-of-band coordination: a longform reader that hits a &lt;code>kind:30030&lt;/code> event it does not handle natively can query the NIP-89 graph for handlers and offer the user an &lt;code>Open in...&lt;/code> flow to a published app that does. NIP-89 is the original infrastructure for the same cross-app routing problem that the napplet/napps work appearing across this issue is now extending into composable Nostr-native applets.&lt;/p>
&lt;h3 id="the-application-handler-event-kind31990">The application handler event (&lt;code>kind:31990&lt;/code>)&lt;/h3>
&lt;p>An app developer publishes one or more handler events describing which event kinds the app supports and how to open a Nostr entity in the app:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1782824400&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">31990&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;longform-reader-v1&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;k&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;30023&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;k&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;30024&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;web&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;https://reader.example.com/a/&amp;lt;bech32&amp;gt;&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;naddr&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;ios&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;longformreader://open/&amp;lt;bech32&amp;gt;&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;android&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;longformreader://open/&amp;lt;bech32&amp;gt;&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;{\&amp;#34;name\&amp;#34;: \&amp;#34;Longform Reader\&amp;#34;, \&amp;#34;picture\&amp;#34;: \&amp;#34;https://reader.example.com/icon.png\&amp;#34;, \&amp;#34;about\&amp;#34;: \&amp;#34;A native reader for NIP-23 longform.\&amp;#34;}&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;1f2e3d4c5b6a798877665544332211000ffeeddccbbaa99887766554433221100ffeeddccbbaa99887766554433221100ffeeddccbbaa9988776655443322110a&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>d&lt;/code> tag identifies the handler (so it can be replaced), each &lt;code>k&lt;/code> tag declares an event kind the app handles, and each platform tag (&lt;code>web&lt;/code>, &lt;code>ios&lt;/code>, &lt;code>android&lt;/code>, &amp;hellip;) gives a URL template with &lt;code>&amp;lt;bech32&amp;gt;&lt;/code> as the placeholder for a &lt;a href="https://nostrcompass.org/en/topics/nip-19/">NIP-19&lt;/a> encoded entity that the calling client substitutes at open time. One handler event can advertise several supported kinds if they share the same routing pattern, which keeps app discovery compact and avoids one handler event per kind.&lt;/p>
&lt;h3 id="the-user-recommendation-event-kind31989">The user recommendation event (&lt;code>kind:31989&lt;/code>)&lt;/h3>
&lt;p>A user publishes a recommendation declaring which apps they use for a given event kind:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1782824500&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">31989&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;30023&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;a&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;31990:c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2:longform-reader-v1&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.example.com&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;web&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;a&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;31990:e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6:reader-pro&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.example.com&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;ios&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>d&lt;/code> tag carries the event kind being recommended. Each &lt;code>a&lt;/code> tag is a NIP-01 address pointer to a &lt;code>kind:31990&lt;/code> handler event, with the suggested relay and the platform the recommendation applies to. The same recommendation can list multiple apps for different platforms.&lt;/p>
&lt;h3 id="the-client-tag-and-the-privacy-tradeoff">The client tag and the privacy tradeoff&lt;/h3>
&lt;p>NIP-89 also defines an optional &lt;code>client&lt;/code> tag that any publishing app can attach to events it authors:&lt;/p>
&lt;pre tabindex="0">&lt;code>[&amp;#34;client&amp;#34;, &amp;#34;Longform Reader&amp;#34;, &amp;#34;31990:c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2:longform-reader-v1&amp;#34;, &amp;#34;wss://relay.example.com&amp;#34;]
&lt;/code>&lt;/pre>&lt;p>This lets any client showing the event surface the app it came from, look up richer handler metadata, and respect handler-declared rendering hints. The spec also explicitly notes the privacy cost: a client that emits a &lt;code>client&lt;/code> tag on every event publishes the user&amp;rsquo;s software identity, which over time discloses usage patterns. The spec recommends clients give users an opt-out.&lt;/p>
&lt;p>Amethyst&amp;rsquo;s &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3422">PR #3422&lt;/a> parses and displays NIP-89 &lt;code>t&lt;/code>, &lt;code>i&lt;/code>, &lt;code>a&lt;/code>, and &lt;code>client&lt;/code> tags on event display, surfacing which app authored a note directly in the timeline.&lt;/p>
&lt;h3 id="how-the-discovery-flow-runs-in-practice">How the discovery flow runs in practice&lt;/h3>
&lt;p>A client receiving an unknown event kind takes the following steps. (1) Query the user&amp;rsquo;s follow graph for &lt;code>kind:31989&lt;/code> events with a &lt;code>d&lt;/code> tag matching the event kind. (2) Resolve each recommended &lt;code>a&lt;/code> tag to its &lt;code>kind:31990&lt;/code> handler event. (3) Pick the handler whose &lt;code>web&lt;/code>, &lt;code>ios&lt;/code>, or &lt;code>android&lt;/code> URL template matches the current platform. (4) Substitute the entity&amp;rsquo;s &lt;code>bech32&lt;/code> encoding into the URL template. (5) Offer the resulting URL to the user as an &lt;code>Open in...&lt;/code> choice. The flow is socially filtered: a client that queries arbitrary handler events from untrusted relays could end up redirecting users to malicious apps, so starting from people the user follows is a safer default than treating every published handler as equally trustworthy.&lt;/p>
&lt;h3 id="nip-89-and-the-napplet-layer">NIP-89 and the napplet layer&lt;/h3>
&lt;p>Amethyst&amp;rsquo;s Discover section, napplet-host runtime, and &lt;code>client&lt;/code>-tag display together build a full NIP-89 consumer surface on Android. The napplet spec, launched last issue, extends what those NIP-89 handler events can target: sandboxed applets that run a composable Nostr-native runtime over Nostr and Blossom. NIP-89 is the discovery and routing graph; the napplet runtime is one execution target it can point at.&lt;/p>
&lt;hr>
&lt;p>&lt;em>Feedback, corrections, and projects we missed: open an issue on &lt;a href="https://github.com/andotherstuff/nostr-compass">github.com/andotherstuff/nostr-compass&lt;/a> or reach us over NIP-17 DM at npub1wav4fae3gyfy3xj298kxj2mj8phavz7vavps34przq02j7w902qq902923.&lt;/em>&lt;/p></content:encoded></item><item><title>Nostr Compass #28</title><link>https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/</link><pubDate>Wed, 24 Jun 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#sprout-rebrands-to-buzz-and-publishes-personas-teams-and-managed-agents-as-relay-events">Sprout rebranded to Buzz&lt;/a> and started publishing personas, teams, and managed-agent records as Nostr relay events, with cross-device read state and per-message read markers replacing the old badge-frontier model. &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#napplets-composable-nostr-apps-with-a-defined-trust-boundary">Napplets&lt;/a> by sandwich.farm launches as a trust-boundary protocol for composable Nostr apps distributed over Nostr and Blossom. &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#conduit-hardens-the-marketplace-mvp-and-switches-to-its-public-relay-by-default">Conduit&lt;/a> (a three-app marketplace monorepo on Nostr: buyer market, merchant portal, store builder, with its own in-repo NIP and spec directories) lands 17 PRs hardening the marketplace MVP, switches to its public relay by default, and adds privacy-safe analytics. &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#bitblik-launches-a-p2p-blik-to-lightning-exchange-protocol-over-nostr">BitBlik&lt;/a> ships a P2P BLIK to Lightning exchange protocol over encrypted Nostr DMs, with a coordinator that settles atomically between fiat and Lightning hold invoices. &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#amethyst-patches-follow-up-the-v1120-launch">Amethyst&lt;/a> follows up last week&amp;rsquo;s wallets-podcasts-workouts launch with Health Connect Workouts, Road Events, collapsable replies, relay-latency health tracking with a classifier, and a macOS notarization fix. &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#amber-implements-nip-46-client-metadata">Amber&lt;/a> implements the NIP-46 client-metadata extension proposed last week, surfacing native app icons and identity on signer request screens. &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#haven-launches-private-location-sharing-on-marmot">Haven&lt;/a> launches private location sharing on the Marmot encrypted-messaging protocol. &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#codedeck-remote-agentic-coding-over-nostr">CodeDeck&lt;/a> lets you control Claude Code sessions on your laptop from your phone over encrypted Nostr relays, then collapses pairing to a single QR scan, then adds per-session model selection. &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#grain-ships-a-full-nostr-client-engine">Grain&lt;/a> ships an importable Go Nostr client library that speaks the outbox model. Mostro Core, Wisp plus Dark Wisp, Citrine, FIPS, Kubo (parent-curated YouTube channels and a mandatory trust-gated kid feed), and Pollerama (a web-of-trust score, an on-device relay engine, and a &amp;ldquo;People you may know&amp;rdquo; rail) ship follow-up patches. Unreleased work covers a browser-based MLS coordinator from sandwich.farm, nostter&amp;rsquo;s UX iteration sprint, Zap Cooking&amp;rsquo;s cross-project NIP-46 fix and composer overhaul, Shopstr&amp;rsquo;s Cashu escrow lifecycle, divine.video, and Nostur. Newly tracked include the Social Agents Prototype, PRana for git-over-Nostr issue triage, and routstr-chat. On the protocol side, NIP-99 picks up an on-graph checkout-and-escrow proposal that pairs directly with Conduit, BitBlik, and Shopstr&amp;rsquo;s commerce work. Since this is the last Compass of June, the issue closes with &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#six-years-of-nostr-junes">Six Years of Nostr Junes&lt;/a>.&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#sprout-rebrands-to-buzz-and-publishes-personas-teams-and-managed-agents-as-relay-events">Sprout rebranded to Buzz&lt;/a> and started publishing personas, teams, and managed-agent records as Nostr relay events, with cross-device read state and per-message read markers replacing the old badge-frontier model. &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#napplets-composable-nostr-apps-with-a-defined-trust-boundary">Napplets&lt;/a> by sandwich.farm launches as a trust-boundary protocol for composable Nostr apps distributed over Nostr and Blossom. &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#conduit-hardens-the-marketplace-mvp-and-switches-to-its-public-relay-by-default">Conduit&lt;/a> (a three-app marketplace monorepo on Nostr: buyer market, merchant portal, store builder, with its own in-repo NIP and spec directories) lands 17 PRs hardening the marketplace MVP, switches to its public relay by default, and adds privacy-safe analytics. &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#bitblik-launches-a-p2p-blik-to-lightning-exchange-protocol-over-nostr">BitBlik&lt;/a> ships a P2P BLIK to Lightning exchange protocol over encrypted Nostr DMs, with a coordinator that settles atomically between fiat and Lightning hold invoices. &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#amethyst-patches-follow-up-the-v1120-launch">Amethyst&lt;/a> follows up last week&amp;rsquo;s wallets-podcasts-workouts launch with Health Connect Workouts, Road Events, collapsable replies, relay-latency health tracking with a classifier, and a macOS notarization fix. &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#amber-implements-nip-46-client-metadata">Amber&lt;/a> implements the NIP-46 client-metadata extension proposed last week, surfacing native app icons and identity on signer request screens. &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#haven-launches-private-location-sharing-on-marmot">Haven&lt;/a> launches private location sharing on the Marmot encrypted-messaging protocol. &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#codedeck-remote-agentic-coding-over-nostr">CodeDeck&lt;/a> lets you control Claude Code sessions on your laptop from your phone over encrypted Nostr relays, then collapses pairing to a single QR scan, then adds per-session model selection. &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#grain-ships-a-full-nostr-client-engine">Grain&lt;/a> ships an importable Go Nostr client library that speaks the outbox model. Mostro Core, Wisp plus Dark Wisp, Citrine, FIPS, Kubo (parent-curated YouTube channels and a mandatory trust-gated kid feed), and Pollerama (a web-of-trust score, an on-device relay engine, and a &amp;ldquo;People you may know&amp;rdquo; rail) ship follow-up patches. Unreleased work covers a browser-based MLS coordinator from sandwich.farm, nostter&amp;rsquo;s UX iteration sprint, Zap Cooking&amp;rsquo;s cross-project NIP-46 fix and composer overhaul, Shopstr&amp;rsquo;s Cashu escrow lifecycle, divine.video, and Nostur. Newly tracked include the Social Agents Prototype, PRana for git-over-Nostr issue triage, and routstr-chat. On the protocol side, NIP-99 picks up an on-graph checkout-and-escrow proposal that pairs directly with Conduit, BitBlik, and Shopstr&amp;rsquo;s commerce work. Since this is the last Compass of June, the issue closes with &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#six-years-of-nostr-junes">Six Years of Nostr Junes&lt;/a>.&lt;/p>
&lt;hr>
&lt;h2 id="lead-stories">Lead stories&lt;/h2>
&lt;h3 id="amethyst-v1121-through-v1126-follow-up-the-v1120-launch">Amethyst v1.12.1 through v1.12.6 follow up the v1.12.0 launch&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> followed &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-17-newsletter/#amethyst-v1120-ships-cashu-wallets-nutzaps-a-clink-driver-and-tor-self-heal">last week&amp;rsquo;s v1.12.0 launch&lt;/a> with six rapid patches between Wednesday and Friday. &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.12.1">v1.12.1&lt;/a> adds Health Connect Workouts and a Share-as-Image action, and makes the Tor &lt;code>Active&lt;/code> flag deterministic so the bootstrap callback cannot race the gate. &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.12.2">v1.12.2&lt;/a> adds Road Events and collapsable replies, &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.12.3">v1.12.3&lt;/a> lands relay-latency health tracking with a classifier and a dashboard UI plus a macOS notarization fix, and &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.12.4">v1.12.4&lt;/a> through &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.12.6">v1.12.6&lt;/a> ship Crowdin translation passes and translator-credit automation.&lt;/p>
&lt;h3 id="sprout-rebrands-to-buzz-and-publishes-personas-teams-and-managed-agents-as-relay-events">Sprout rebrands to Buzz and publishes personas, teams, and managed agents as relay events&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#sprout-adds-owner-attestation-and-multi-workspace-support">Sprout&lt;/a>, Block&amp;rsquo;s self-hostable workspace where humans and AI agents collaborate in the same channels with every message, reaction, workflow step, review approval, and git event written as a signed Nostr event, was renamed to &lt;a href="https://github.com/block/buzz">Buzz&lt;/a> this week. GitHub now redirects the old &lt;code>block/sprout&lt;/code> slug to &lt;code>block/buzz&lt;/code>; the repository, license, and product direction are unchanged. Coverage of Sprout in past issues all refers to the same project.&lt;/p>
&lt;p>The week landed substantial product work alongside the rename. Personas, teams, and managed-agent records now publish as Nostr relay events through &lt;a href="https://github.com/block/buzz/pull/1189">PR #1189&lt;/a>, letting the same agent identity appear in multiple workspaces and audit logs without duplicating state. A new desktop pane shows NIP-OA owner attestations on profiles (&lt;a href="https://github.com/block/buzz/pull/1198">PR #1198&lt;/a>), the channel-thread unread badge frontier was replaced with per-message read markers so unread counts stay accurate across devices (&lt;a href="https://github.com/block/buzz/pull/1178">PR #1178&lt;/a>), and the inbox gains author and source attribution on reminder events (&lt;a href="https://github.com/block/buzz/pull/1176">PR #1176&lt;/a>).&lt;/p>
&lt;p>Temporary channels now default to a 7-day expiry (&lt;a href="https://github.com/block/buzz/pull/1182">PR #1182&lt;/a>), per-agent relay overrides honour the configured relay before falling back to the workspace default (&lt;a href="https://github.com/block/buzz/pull/1131">PR #1131&lt;/a>), and the Windows build now bundles a full Git-for-Windows toolchain for the shell tool (&lt;a href="https://github.com/block/buzz/pull/1145">PR #1145&lt;/a>).&lt;/p>
&lt;h3 id="napplets-composable-nostr-apps-with-a-defined-trust-boundary">Napplets: composable Nostr apps with a defined trust boundary&lt;/h3>
&lt;p>Sandwich.farm announced &lt;a href="https://napplet.run">napplet.run&lt;/a> this week as a protocol for composable Nostr applets, or napplets: tiny programs that do one thing, run in sandboxed environments, and are resolved over Nostr and Blossom using the same event shape as nsites. The project ships across three repositories: &lt;a href="https://github.com/napplet/web">napplet/web&lt;/a>, which holds the web packages and cut 51 sub-package version tags this week in a coordinated launch (&lt;code>@napplet/core&lt;/code>, &lt;code>@napplet/sdk&lt;/code>, &lt;code>@napplet/nap&lt;/code>, &lt;code>@napplet/shim&lt;/code>, &lt;code>@napplet/conformance&lt;/code>); &lt;a href="https://github.com/napplet/naps">napplet/naps&lt;/a>, the NAPs spec track with 15 merged PRs; and &lt;a href="https://github.com/kehto/web">kehto/web&lt;/a>, the web runtime with 41 merged PRs and a playground at &lt;a href="https://kehto.github.io/web/playground">kehto.github.io/web/playground&lt;/a>. The corresponding spec PR is &lt;a href="https://github.com/nostr-protocol/nips/pull/2303">NIP-5D #2303&lt;/a>, opened by dskvr (sandwich.farm).&lt;/p>
&lt;p>The architectural premise is a trust boundary defined at the protocol layer. A shell brokers dangerous operations (signing, key access, relay writes), a runtime handles implementation and higher-level UX, and napplets stay portable, disposable, and harder to capture by any single host. Napplets can talk to each other across the same shell, and there is no runtime lock-in by design. The author frames napplets in conversation with NMP (by Pablof7z) and Tiles (by Soapbox), positioning them as parallel takes on the same problem, and notes that Amethyst&amp;rsquo;s v1.12.6 &lt;a href="https://github.com/nostr-protocol/nips/blob/master/5A.md">NIP-5A&lt;/a> and &lt;a href="https://nostrcompass.org/en/topics/nip-5d/">NIP-5D&lt;/a> support gives napplets at least one shipping client at launch. A historical thread is included: sandwich.farm&amp;rsquo;s earlier &lt;code>napp.run&lt;/code> (a NIP-07 native-app prototype) and the Thorium-fork &lt;code>dryft&lt;/code> browser both informed the current design before being set aside.&lt;/p>
&lt;h3 id="conduit-hardens-the-marketplace-mvp-and-switches-to-its-public-relay-by-default">Conduit hardens the marketplace MVP and switches to its public relay by default&lt;/h3>
&lt;p>&lt;a href="https://github.com/Conduit-BTC/conduit-mono">Conduit&lt;/a> is the three-app marketplace monorepo at &lt;a href="https://conduit.market">conduit.market&lt;/a> (buyer Market, Merchant Portal, Store Builder) under the &lt;code>Conduit-BTC&lt;/code> org, with its own in-repo &lt;code>nips/&lt;/code> and &lt;code>specs/&lt;/code> directories defining Conduit-specific Nostr commerce primitives, and the &lt;a href="https://github.com/Conduit-BTC/conduit-relay">Conduit-BTC/conduit-relay&lt;/a> Scope-2 &lt;a href="https://github.com/fiatjaf/khatru">khatru&lt;/a> extension running underneath. Both repositories opened earlier this year; this week the project landed 17 merged PRs hardening the marketplace MVP.&lt;/p>
&lt;p>The shipping PRs cluster around marketplace correctness: listing safety states (&lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/110">PR #110&lt;/a>) and product pricing and shipping-zone hardening on the merchant side (&lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/115">PR #115&lt;/a>). On the relay side, &lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/102">PR #102&lt;/a> corrects commerce capability detection, &lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/112">PR #112&lt;/a> ignores third-party insecure relay hints, and &lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/128">PR #128&lt;/a> sets the public Conduit relay domain as the default for fresh clients. Privacy-safe analytics land in &lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/109">PR #109&lt;/a> and &lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/129">PR #129&lt;/a>, and a &lt;code>dompurify&lt;/code> bump closes an OSV advisory (&lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/116">PR #116&lt;/a>). The work sits inside a broader &lt;a href="https://nostrcompass.org/en/topics/nip-99/">NIP-99&lt;/a> commerce wave this week: &lt;a href="https://github.com/nostr-protocol/nips/pull/2323">PR #2323&lt;/a> proposes an on-graph checkout layer for NIP-99 markets covering order flow, escrow, and dispute, the longstanding &lt;a href="https://github.com/GammaMarkets/market-spec">Gamma Markets Market Spec&lt;/a> that extends NIP-99 for full e-commerce becomes the spec layer Conduit and others build against, and Shopstr shipped a Cashu escrow lifecycle the same week.&lt;/p>
&lt;h3 id="bitblik-launches-a-p2p-blik-to-lightning-exchange-protocol-over-nostr">BitBlik launches a P2P BLIK to Lightning exchange protocol over Nostr&lt;/h3>
&lt;p>&lt;a href="https://github.com/bit-blik/bitblik">BitBlik&lt;/a> opened this week as a peer-to-peer BLIK ↔ Lightning exchange protocol built on Nostr. BLIK is the Polish bank-issued instant-payment scheme; the BitBlik coordinator settles atomically between BLIK fiat (paid by takers) and Lightning hold invoices (funded by makers), with the trade lifecycle running over Nostr. The Flutter app, CLI, and coordinator share a &lt;code>core&lt;/code> package, and the project ships through the GitHub monorepo at &lt;code>bit-blik/bitblik&lt;/code>, the &lt;a href="https://www.bitblik.app">www.bitblik.app&lt;/a> web build, and the Zapstore app &lt;code>app.bitblik&lt;/code>.&lt;/p>
&lt;p>The protocol uses encrypted Nostr direct messages (&lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a>) for client-coordinator RPC. Offers publish as parameterised replaceable events on kind &lt;code>38383&lt;/code>, RPC requests on kind &lt;code>25195&lt;/code>, RPC responses on kind &lt;code>25196&lt;/code>, and status updates on kind &lt;code>25197&lt;/code>. The coordinator holds a Lightning hold invoice while a taker submits a BLIK code, releases the preimage when the BLIK transfer is confirmed, and routes the invoice settlement to the maker.&lt;/p>
&lt;hr>
&lt;h2 id="tagged-releases">Tagged releases&lt;/h2>
&lt;h3 id="amber-v622-implements-nip-46-client-metadata">Amber v6.2.2 implements NIP-46 client metadata&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a>, the dominant Android &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote signer maintained by greenart7c3, shipped &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.2.2">v6.2.2&lt;/a> the same week the corresponding spec PR merged. The release surfaces native app icons and the new client-metadata fields on request screens and the app list, persists client metadata on every connect, and captures the native app icon and name at connect and accept time. The change pairs directly with &lt;a href="https://github.com/nostr-protocol/nips/pull/2381">NIP-46 PR #2381&lt;/a> by DocNR, which adds optional client metadata to the connect request so signers can display a meaningful name and icon for the requester. Amber v6.2.2 also adds support for event kind 30618 and separates default and connection relays in the Active relays screen.&lt;/p>
&lt;p>The release tightens the signer&amp;rsquo;s security surface. Decrypted NIP-46 request and response bodies no longer hit logs, and encrypt and decrypt payloads are stored as ciphertext and decrypted on demand. All logcat output is gated behind &lt;code>BuildConfig.DEBUG&lt;/code>, browser callers (null-package) are forced to always-ask, and copies of &lt;code>nsec&lt;/code>, &lt;code>ncryptsec&lt;/code>, and seed words to clipboard are flagged as sensitive and cleared after a delay. Explicit backup and data-extraction excludes are added as defense in depth. The release also fixes a crash from nested scrolling in Active relays, a &lt;code>LazyColumn&lt;/code> duplicate-key crash from racy bunker request dedup, and an &lt;code>EOSE&lt;/code> race in the release update check.&lt;/p>
&lt;h3 id="haven-launches-private-location-sharing-on-marmot">Haven launches private location sharing on Marmot&lt;/h3>
&lt;p>&lt;a href="https://github.com/mehmetefeumit/Haven-App">Haven&lt;/a> opened this week as a private, censorship-resistant location-sharing app for Android and iOS that runs on Nostr using the &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> protocol. The repository shipped five releases between &lt;a href="https://github.com/mehmetefeumit/Haven-App/releases/tag/v0.1.0">v0.1.0&lt;/a> and &lt;a href="https://github.com/mehmetefeumit/Haven-App/releases/tag/v0.1.4">v0.1.4&lt;/a> over four days, the first releases of a new project. Haven is built in Dart and Flutter and publishes through Zapstore as a developer-signed app. Marmot, the MLS-based end-to-end encrypted messaging layer for Nostr, provides the group state and ciphertext distribution; Haven extends that pattern from messaging into location sharing, with each group&amp;rsquo;s encrypted state carrying the location updates the group has consented to share.&lt;/p>
&lt;h3 id="codedeck-remote-agentic-coding-over-nostr">CodeDeck remote agentic coding over Nostr&lt;/h3>
&lt;p>&lt;a href="https://github.com/JeroenOnNostr/codedeck">CodeDeck&lt;/a> opened this week as a multi-session agentic-coding interface for Android and desktop, built with Tauri v2, React 19, and a Rust backend, that lets a user control &lt;a href="https://www.anthropic.com/claude-code">Claude Code&lt;/a> sessions running on a laptop from their phone over encrypted Nostr relays. The project shipped &lt;a href="https://github.com/JeroenOnNostr/codedeck/releases/tag/v2026.06.17">v2026.06.17&lt;/a>, &lt;a href="https://github.com/JeroenOnNostr/codedeck/releases/tag/v2026.6.18">v2026.6.18&lt;/a>, and &lt;a href="https://github.com/JeroenOnNostr/codedeck/releases/tag/v2026.6.20">v2026.6.20&lt;/a> in the same four-day window. The transport model uses Nostr as the encrypted control plane: a CodeDeck phone publishes commands as encrypted events the bridge running next to the laptop subscribes to, and the laptop publishes session output back over the same relays.&lt;/p>
&lt;p>v2026.06.17 embeds the &lt;code>nostr-vpn&lt;/code> FIPS mesh as the app&amp;rsquo;s Android VPN service so a laptop can build, install, launch, and drive dev builds of an app on a physical test phone from anywhere, with CodeDeck the only software installed on the test phone. v2026.6.18 collapses pairing and mesh-invite into a single QR scan, and v2026.6.20 adds per-session model selection so each session starts on the chosen model.&lt;/p>
&lt;h3 id="grain-v080-rc1-ships-a-full-nostr-client-engine">Grain v0.8.0-rc1 ships a full Nostr client engine&lt;/h3>
&lt;p>&lt;a href="https://github.com/0ceanSlim/grain">Grain&lt;/a>, the Go relay maintained by 0ceanSlim, cut &lt;a href="https://github.com/0ceanSlim/grain/releases/tag/v0.8.0-rc1">v0.8.0-rc1&lt;/a> and is now both a Nostr relay and the importable Go client library it is built on. Where v0.7.x focused on operating the relay from a browser, the v0.8 line ships &lt;code>client/core&lt;/code>, a standalone outbox-model Nostr client engine in pure Go with no cgo or HTTP dependencies. The engine owns a shared relay pool, resolves each user&amp;rsquo;s relay lists, and routes every read and publish under the &lt;a href="https://mikedilger.com/gossip-model/">gossip / outbox model&lt;/a>: you read a user&amp;rsquo;s notes from their outbox relays, and a reply you publish reaches the parent author&amp;rsquo;s inbox relays. Grain&amp;rsquo;s own web frontend is now the reference consumer of that library, so the UI is both a usable app and a worked example for downstream Go projects.&lt;/p>
&lt;p>The release lands native &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encryption (v2 and v3), &lt;a href="https://github.com/nostr-protocol/nips/blob/master/42.md">NIP-42&lt;/a> relay AUTH, &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a>, &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a>, &lt;a href="https://nostrcompass.org/en/topics/nip-51/">NIP-51&lt;/a>, and &lt;a href="https://github.com/nostr-protocol/nips/blob/master/37.md">NIP-37&lt;/a> relay lists, &lt;a href="https://nostrcompass.org/en/topics/nip-89/">NIP-89&lt;/a> client tags, and &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> plus &lt;a href="https://nostrcompass.org/en/topics/nip-96/">NIP-96&lt;/a> media support. Downstream Go apps that previously had to reimplement relay routing can now &lt;code>import&lt;/code> the engine directly.&lt;/p>
&lt;h3 id="mostro-core-v0131-follows-up-protocol-v2">Mostro Core v0.13.1 follows up Protocol v2&lt;/h3>
&lt;p>&lt;a href="https://github.com/MostroP2P/mostro-core">Mostro Core&lt;/a> shipped &lt;a href="https://github.com/MostroP2P/mostro-core/releases/tag/v0.13.1">v0.13.1&lt;/a> as a follow-up to &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-17-newsletter/#mostro-core-v0130-cuts-the-relay-middleman-with-protocol-v2">last week&amp;rsquo;s Protocol v2 rollout&lt;/a>, introducing a &lt;code>PriceTooStale&lt;/code> error variant for the protocol&amp;rsquo;s price-feed contract. On the daemon side this week, &lt;a href="https://github.com/MostroP2P/mostro/pull/752">PR #752&lt;/a> makes invalid order IDs surface to clients as a &lt;code>CantDo(NotFound)&lt;/code> error in place of a silent drop, &lt;a href="https://github.com/MostroP2P/mostro/pull/785">PR #785&lt;/a> makes the inner protocol version follow the active transport, &lt;a href="https://github.com/MostroP2P/mostro/pull/778">PR #778&lt;/a> lands phase 3 of the El Toque fiat-cross provider for CUP and MLC, and &lt;a href="https://github.com/MostroP2P/mostro/pull/782">PR #782&lt;/a> renames the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/33.md">NIP-33&lt;/a> info tag &lt;code>protocol_versions&lt;/code> to &lt;code>protocol_version&lt;/code> for spec alignment.&lt;/p>
&lt;h3 id="wisp-v112-and-the-dark-wisp-variant">Wisp v1.1.2 and the Dark Wisp variant&lt;/h3>
&lt;p>&lt;a href="https://github.com/barrydeen/wisp">Wisp&lt;/a>, barrydeen&amp;rsquo;s Kotlin and Jetpack Compose Android client, shipped &lt;a href="https://github.com/barrydeen/wisp/releases/tag/v1.1.2">v1.1.2&lt;/a> with self-send wallet legs kept distinct in deterministic transaction order (&lt;a href="https://github.com/barrydeen/wisp/pull/586">PR #586&lt;/a>), lazily-created inline video players to survive media-heavy notes (&lt;a href="https://github.com/barrydeen/wisp/pull/592">PR #592&lt;/a>), a &lt;code>ConcurrentModificationException&lt;/code> fix in the event-relays set (&lt;a href="https://github.com/barrydeen/wisp/pull/595">PR #595&lt;/a>), and an intrinsic-measurement fix for chat bubble content to avoid a &lt;code>SubcomposeLayout&lt;/code> crash (&lt;a href="https://github.com/barrydeen/wisp/pull/596">PR #596&lt;/a>). The release also lands an incremental feed filter with off-lock spam scoring. The Wisp team also published Dark Wisp v1.1.0 over Zapstore this week as a multi-currency variant adding ZEC, DASH, BCH, and LTC zap targets plus an anon mode.&lt;/p>
&lt;h3 id="citrine-v301">Citrine v3.0.1&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Citrine">Citrine&lt;/a>, greenart7c3&amp;rsquo;s Android local Nostr relay, shipped &lt;a href="https://github.com/greenart7c3/Citrine/releases/tag/v3.0.1">v3.0.1&lt;/a> with a single fix: a crash when unregistering an unregistered Pokey receiver no longer takes down the relay.&lt;/p>
&lt;h3 id="fips-v040-rc2">FIPS v0.4.0-rc2&lt;/h3>
&lt;p>&lt;a href="https://github.com/jmcorgan/fips">FIPS&lt;/a>, the Free Internetworking Peering System, tagged &lt;a href="https://github.com/jmcorgan/fips/releases/tag/v0.4.0-rc2">v0.4.0-rc2&lt;/a> as a packaging-validation release candidate on top of the v0.3.x wire format. The v0.4.0 line adds a Nym mixnet transport and opt-in mDNS LAN discovery for peer reachability, overhauls the data plane for higher single-node throughput and lower per-packet CPU, moves the operator read surface off the data-plane hot path so observability stays responsive under load, ships a reworked &lt;code>fipstop&lt;/code> TUI, and hardens FMP and FSP rekey to be hitless under packet loss. This is a release candidate; the v0.4.0 stable cut is provisional for 2026-06-21.&lt;/p>
&lt;h3 id="kubo-v20260612-and-v20260620-lock-the-trust-gated-kid-feed-and-add-parent-curated-youtube">Kubo v2026.06.12 and v2026.06.20 lock the trust-gated kid feed and add parent-curated YouTube&lt;/h3>
&lt;p>&lt;a href="https://github.com/JeroenOnNostr/kubo">Kubo&lt;/a>, JeroenOnNostr&amp;rsquo;s Nostr-native YouTube Kids alternative built on the Trust Extended Permissions Protocol (TEPP), shipped two releases this week. &lt;a href="https://zapstore.dev/apps/com.kubo.app">v2026.06.12&lt;/a> (calendar versioning, derived &lt;code>versionCode&lt;/code> &lt;code>YYYYMMDD&lt;/code>) makes the trust-gated kid feed mandatory: every post, profile, reaction, and repost the child can see or interact with now flows through TEPP, scoped to people the parent has admitted. New installs start with the trust gate enabled and the child&amp;rsquo;s circle seeded during onboarding, so the feed is safe from first launch. The release also lands managed group chat for parents, routes trust events to the family&amp;rsquo;s private relay set, and fails closed (shows nothing) rather than leaking unvetted content if trust data cannot be loaded.&lt;/p>
&lt;p>&lt;a href="https://zapstore.dev/apps/com.kubo.app">v2026.06.20&lt;/a> adds parent-curated YouTube channels: parents can search for a channel and add it to the kid feed so children only see videos from channels the parent has approved, with an HTTP fast lane plus optimistic UI replacing the ~10-second add path. The release also removes the option to turn off Trust Extended Permissions (the project is built around mandatory trust, so the toggle is now always on), adds a dedicated Support page, fixes &lt;code>@mentions&lt;/code> in group chat so tagging someone renders the clickable &lt;code>@name&lt;/code> instead of a raw &lt;code>nostr:npub1…&lt;/code>, adds mention autocomplete, and fixes trust publishing to gate on actual enforcement state rather than a mirror flag. Both releases are tracked through Zapstore as the developer-signed Android app &lt;code>com.kubo.app&lt;/code>.&lt;/p>
&lt;h3 id="pollerama-v190-through-v194-add-a-web-of-trust-score-on-device-relay-engine-and-a-people-you-may-know-rail">Pollerama v1.9.0 through v1.9.4 add a web-of-trust score, on-device relay engine, and a &amp;ldquo;People you may know&amp;rdquo; rail&lt;/h3>
&lt;p>&lt;a href="https://github.com/formstr-hq/nostr-polls">Pollerama&lt;/a> by abh3po, the Form*-family Nostr polls and feeds client at &lt;a href="https://pollerama.fun">pollerama.fun&lt;/a>, shipped five releases on Zapstore this week. v1.9.0 lands a new on-device relay engine: a built-in local relay now stores everything the user has seen and answers the app from local cache first, so feeds, profiles, and threads load instantly (even offline) and stay in sync with the network in the background. All relay traffic (reads and writes) flows through this engine off the main thread, and notes, profiles, reactions, and zaps already loaded come straight from local storage instead of re-fetching.&lt;/p>
&lt;p>v1.9.2 fixes Home and Notes feeds (and any Following/Network view) sometimes showing nothing on launch or resume by caching the follow list independent of the sync engine, makes notes shared inside DMs load reliably by fetching the referenced note from relay hints even when the user doesn&amp;rsquo;t follow the author, and adds a Network settings panel showing relay connections, cache size, and sync state with controls to reconnect or clear the local cache. v1.9.3 fixes a crash on launch and a Home feed loading regression.&lt;/p>
&lt;p>v1.9.4 introduces a web-of-trust trust score on profiles (how many of the people you follow also follow this person, surfaced as a network chip) and a &amp;ldquo;People you may know&amp;rdquo; rail (follow suggestions drawn from your web of trust, ranked by how many of your follows follow them). Network settings now show web-of-trust size and last computed time with an on-demand recompute button. Trust scores and recommendations are computed in the background by the web-of-trust worker so they don&amp;rsquo;t block the app.&lt;/p>
&lt;h3 id="smaller-tagged-releases">Smaller tagged releases&lt;/h3>
&lt;p>&lt;a href="https://github.com/nogringo/nostr-mail-client/releases/tag/v0.13.1">nogringo/nostr-mail-client v0.13.1&lt;/a> restores &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> signer-app login for Amber, Aegis, and Primal, and stops repeatedly prompting signer apps to sign contacts. &lt;a href="https://github.com/Cameri/nostream/releases/tag/v3.0.0">Cameri/nostream v3.0.0&lt;/a> removes &lt;code>unsafe-inline&lt;/code> from the web-app factory and implements script nonces. &lt;a href="https://github.com/lawalletio/lawallet-nwc/releases/tag/v1.0.0">LaWallet NWC v1.0.0&lt;/a> cuts the project&amp;rsquo;s first 1.0 with shareable QR-link card activation, Remote Wallet recognition, and Lightning Address auto-provisioning. &lt;a href="https://github.com/formstr-hq/nostr-calendar/releases/tag/v2.0.2">Formstr Nostr Calendar v2.0.0 through v2.0.2&lt;/a> add a PWA, fix offline replaceable events (&lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/194">PR #194&lt;/a>), and bind signer methods so private-form submit works (&lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/199">PR #199&lt;/a>). Smaller releases from &lt;a href="https://github.com/Spl0itable/NYM">Spl0itable/NYM&lt;/a>, &lt;a href="https://github.com/codeswot/ZapBook">codeswot/ZapBook&lt;/a>, &lt;a href="https://github.com/77elements/noornote">77elements/noornote&lt;/a>, &lt;a href="https://github.com/mattn/nostr-relay">mattn/nostr-relay&lt;/a>, &lt;a href="https://github.com/mattn/algia">mattn/algia&lt;/a>, &lt;a href="https://github.com/mouse484/astraea">mouse484/astraea&lt;/a>, &lt;a href="https://github.com/dergigi/boris">dergigi/boris&lt;/a>, &lt;a href="https://github.com/fiatjaf/nak">fiatjaf/nak&lt;/a>, &lt;a href="https://github.com/Spl0itable/nosflare">Spl0itable/nosflare&lt;/a>, and &lt;a href="https://github.com/nostrord/nostrord">nostrord/nostrord&lt;/a> round out the week.&lt;/p>
&lt;hr>
&lt;h2 id="unreleased-changes">Unreleased changes&lt;/h2>
&lt;h3 id="cordn-ad-hoc-cvm-a-browser-based-mls-coordinator">Cordn Ad-hoc CVM: a browser-based MLS coordinator&lt;/h3>
&lt;p>&lt;a href="https://github.com/sandwichfarm/cordn-adhoc-cvm">Cordn Ad-hoc&lt;/a>, sandwich.farm&amp;rsquo;s new web app, opens publicly this week as an MLS coordinator that runs in a browser tab for ad-hoc &lt;a href="https://github.com/Cordn-msg/cordn">Cordn&lt;/a> groups. The pattern is unusual: a browser tab runs the &lt;a href="https://nostrcompass.org/en/topics/contextvm/">ContextVM&lt;/a> Nostr coordinator process, publishes its coordinator pubkey, receives MCP requests over Nostr relays, and stores MLS key packages, welcomes, join requests, and group messages in browser storage, with no backend. The app prevents multiple coordinators with the same pubkey from running at once and exposes an operator debug log for raw Nostr events, decoded requests, and instance heartbeats.&lt;/p>
&lt;h3 id="snowcaitnostter-ships-19-prs-of-ux-iteration">SnowCait/nostter ships 19 PRs of UX iteration&lt;/h3>
&lt;p>&lt;a href="https://github.com/SnowCait/nostter">nostter&lt;/a>, SnowCait&amp;rsquo;s web Nostr client, merged 19 PRs this week without cutting a release. The replacement of &lt;code>nostrapp.link&lt;/code> with &lt;code>app-manager.nostter.app&lt;/code> (&lt;a href="https://github.com/SnowCait/nostter/pull/2234">PR #2234&lt;/a>) and the addition of &lt;code>deck.nostter.app&lt;/code> to the &lt;code>frame-ancestors&lt;/code> allowlist (&lt;a href="https://github.com/SnowCait/nostter/pull/2233">PR #2233&lt;/a>) consolidate the project&amp;rsquo;s surface under the &lt;code>nostter.app&lt;/code> domain. Followees&amp;rsquo; replaceable events get cached in IndexedDB (&lt;a href="https://github.com/SnowCait/nostter/pull/2231">PR #2231&lt;/a>), and the seen-on relay state regains reactivity with split seen-on and via options (&lt;a href="https://github.com/SnowCait/nostter/pull/2230">PR #2230&lt;/a>).&lt;/p>
&lt;h3 id="zap-cooking-fixes-a-cross-project-nip-46-bug-and-overhauls-the-composer">Zap Cooking fixes a cross-project NIP-46 bug and overhauls the composer&lt;/h3>
&lt;p>&lt;a href="https://github.com/zapcooking/frontend">Zap Cooking&lt;/a>, the recipe-sharing client on Nostr, merged 16 PRs this week. The change with the widest blast radius is &lt;a href="https://github.com/zapcooking/frontend/pull/452">PR #452&lt;/a>: Primal remote signers were stamping events with the signer&amp;rsquo;s own pubkey, which broke uploads, zaps, and auth for any client routing through Primal. Zap Cooking caught and patched the path; the fix is local to the client but the bug exists across the &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> space. The composer rebuilds in &lt;a href="https://github.com/zapcooking/frontend/pull/458">PR #458&lt;/a> with a countdown timer, a unified reply/comment UI, and Write/Preview tabs. Three SSR fixes (&lt;a href="https://github.com/zapcooking/frontend/pull/460">PR #460&lt;/a>, &lt;a href="https://github.com/zapcooking/frontend/pull/461">PR #461&lt;/a>, &lt;a href="https://github.com/zapcooking/frontend/pull/462">PR #462&lt;/a>) and &lt;a href="https://github.com/zapcooking/frontend/pull/454">PR #454&lt;/a> stabilize the profile and recipe routes. The explore experience picks up drag-to-scroll rows, an avatar cursor with profile link, and a sticky-tab fix for communities (&lt;a href="https://github.com/zapcooking/frontend/pull/456">PR #456&lt;/a>).&lt;/p>
&lt;h3 id="shopstr-ships-a-cashu-escrow-lifecycle-and-storefront-tools">Shopstr ships a Cashu escrow lifecycle and storefront tools&lt;/h3>
&lt;p>&lt;a href="https://github.com/shopstr-eng/shopstr">Shopstr&lt;/a>, the &lt;a href="https://nostrcompass.org/en/topics/nip-99/">NIP-99&lt;/a> marketplace, merged a series of substantive PRs this week. &lt;a href="https://github.com/shopstr-eng/shopstr/pull/512">PR #512&lt;/a> implements an end-to-end P2PK Cashu escrow lifecycle for the marketplace, which connects to the broader commerce wave moving in the same week through &lt;a href="https://github.com/nostr-protocol/nips/pull/2323">NIP-99 PR #2323&lt;/a> (the on-graph checkout layer proposal) and the Conduit launch. Read tools land in &lt;a href="https://github.com/shopstr-eng/shopstr/pull/543">PR #543&lt;/a> for listing companies, getting company details, retrieving a storefront, and getting seller reputation. &lt;a href="https://github.com/shopstr-eng/shopstr/pull/229">PR #229&lt;/a> lands URL-paste support for profile and shop images, and &lt;a href="https://github.com/shopstr-eng/shopstr/pull/359">PR #359&lt;/a> updates marketplace stats fetch to include a timestamp.&lt;/p>
&lt;h3 id="divinevideo-mobile-and-desktop-work">divine.video mobile and desktop work&lt;/h3>
&lt;p>&lt;a href="https://github.com/divinevideo/divine-mobile">divine.video&lt;/a>, rabble&amp;rsquo;s short-form looping-video client with restored Vine archives, merged PRs this week clustered around playback and editing: addressable videos get deduplicated in the feed (&lt;a href="https://github.com/divinevideo/divine-mobile/pull/5465">PR #5465&lt;/a>), local Nostr tag filters now match exactly to avoid spurious results (&lt;a href="https://github.com/divinevideo/divine-mobile/pull/5463">PR #5463&lt;/a>), the video editor recovers drafts with sticker layers without crashing (&lt;a href="https://github.com/divinevideo/divine-mobile/pull/5474">PR #5474&lt;/a>), and the Messages badge counts followed-but-unreplied unread chats (&lt;a href="https://github.com/divinevideo/divine-mobile/pull/5473">PR #5473&lt;/a>).&lt;/p>
&lt;h3 id="nostur-ships-nip-46-client-metadata-support-and-dm-refresh-fixes">Nostur ships NIP-46 client-metadata support and DM refresh fixes&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostur-com/nostur-ios-public">Nostur&lt;/a>, the iOS client by Fabian, merged four PRs against the canonical repo following &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-17-newsletter/#nostur-1290-ships-anonymous-replies-and-remote-signer-logout">last week&amp;rsquo;s 1.29.0 release&lt;/a>. &lt;a href="https://github.com/nostur-com/nostur-ios-public/pull/74">PR #74&lt;/a> adds client metadata to NIP-46 bunker connect requests, the same shape DocNR proposed and Amber v6.2.2 ships this week. &lt;a href="https://github.com/nostur-com/nostur-ios-public/pull/75">PR #75&lt;/a> and &lt;a href="https://github.com/nostur-com/nostur-ios-public/pull/76">PR #76&lt;/a> fix DM refresh and foreground-recovery paths after an iPhone foreground transition, and &lt;a href="https://github.com/nostur-com/nostur-ios-public/pull/78">PR #78&lt;/a> adds QR scanning to the custom NWC setup.&lt;/p>
&lt;hr>
&lt;h2 id="newly-tracked-and-discovered">Newly tracked and discovered&lt;/h2>
&lt;h3 id="social-agents-prototype-nostr-native-ai-agent-collaboration-with-a-human-approval-gate">Social Agents Prototype: Nostr-native AI-agent collaboration with a human approval gate&lt;/h3>
&lt;p>&lt;a href="https://github.com/SrulyRosenblat/social_agents_prototype_nostr">Social Agents Prototype&lt;/a> is an experimental AI tool built on Nostr that explores decentralized agent-to-agent communication. Agents broadcast atomic questions across the network, only relevant agents respond, and every message sent or received passes through a human approval gate before transit. The author is Sruly Rosenblat. The project sits in the same agent-collaboration space as Buzz and NIP-100 SNIN this week, but takes a different shape: Social Agents Prototype models agents as broadcast-and-listen participants whose every message a human must approve. Multiple parallel approaches to the same problem are visible this week.&lt;/p>
&lt;h3 id="prana-a-worklist-for-nip-34-issues">PRana: a worklist for NIP-34 issues&lt;/h3>
&lt;p>&lt;a href="https://github.com/DocNR/prana">PRana&lt;/a> by DocNR is a worklist of correctly-open &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> issues across opt-in git-over-Nostr repos. The tool sits one layer above the git-over-Nostr stack: it consumes the NIP-34 issue events from participating repositories and presents them as a triage queue. The launch arrives the same week that &lt;a href="https://github.com/nostr-protocol/nips/pull/2384">NIP-34 PR #2384&lt;/a> proposes removing the maintainers tag to solve expiry issues, which directly affects how tools like PRana resolve issue authority across repos.&lt;/p>
&lt;h3 id="routstr-chat-local-llm-access-over-the-routstr-protocol-on-nostr">routstr-chat: local LLM access over the Routstr protocol on Nostr&lt;/h3>
&lt;p>&lt;a href="https://github.com/Routstr/routstr-chat">routstr-chat&lt;/a> by the Routstr team is a fully local chat interface that uses the Routstr protocol to access any LLM model over Nostr. The Routstr protocol routes inference requests through provider announcements published on Nostr (kind &lt;code>38421&lt;/code>) and settles with Cashu, as covered in &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#routstrd-launches-a-local-router-for-inference-over-nostr">Newsletter #20&lt;/a>. The chat client is the user-facing surface on top of that protocol; the routing daemon (Routstrd) handles discovery and payment, and the chat app provides the conversation UI.&lt;/p>
&lt;hr>
&lt;h2 id="protocol-work">Protocol work&lt;/h2>
&lt;h3 id="nip-updates">NIP updates&lt;/h3>
&lt;p>The week&amp;rsquo;s NIP activity was unusually heavy: two merges and a wave of substantive open proposals.&lt;/p>
&lt;h4 id="nip-46-client-metadata-ships-in-amber-and-nostur">NIP-46 client metadata ships in Amber and Nostur&lt;/h4>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2381">NIP-46 PR #2381&lt;/a>, which &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-17-newsletter/#clave-10-ships-to-the-app-store-with-push-woken-background-signing">Clave proposed last week&lt;/a>, now has shipping implementations on both sides. &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.2.2">Amber v6.2.2&lt;/a> reads the new optional &lt;code>optional_client_metadata&lt;/code> field on bunker connect requests and surfaces native app icons and metadata on its request screens and app list. &lt;a href="https://github.com/nostur-com/nostur-ios-public/pull/74">Nostur PR #74&lt;/a> adds the field on the client side. Together, the three projects close the loop on the bunker-pairing identity gap: a &lt;code>bunker://&lt;/code> pairing now carries the same &lt;code>name&lt;/code>, &lt;code>url&lt;/code>, and &lt;code>image&lt;/code> an app could already advertise over &lt;code>nostrconnect://&lt;/code>.&lt;/p>
&lt;h4 id="nip-86-signevent-and-a-companion-relay-roles-event">NIP-86 signevent and a companion relay roles event&lt;/h4>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2389">PR #2389 by staab&lt;/a> merged a &lt;code>signevent&lt;/code> operation into &lt;a href="https://nostrcompass.org/en/topics/nip-86/">NIP-86&lt;/a>, the relay-management API, letting relay admins manage &lt;a href="https://github.com/nostr-protocol/nips/blob/master/43.md">NIP-43&lt;/a> events on behalf of the relay. The companion open proposal &lt;a href="https://github.com/nostr-protocol/nips/pull/2390">PR #2390 by staab&lt;/a> defines a relay-roles event so relays can declare role definitions and admins can assign or unassign members to those roles. The two PRs are designed to compose: NIP-86 gives admins the operations, the roles event gives them the authorization model.&lt;/p>
&lt;h4 id="nip-99-on-graph-checkout-layer-for-marketplaces">NIP-99: on-graph checkout layer for marketplaces&lt;/h4>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2323">PR #2323 by Colabonate&lt;/a> is the strongest hub-link of the week. The proposal is framed as a design-feedback request and identifies two gaps in the &lt;a href="https://nostrcompass.org/en/topics/nip-99/">NIP-99&lt;/a> and Gamma Market Spec stack: a checkout flow that lives on-graph (post-buy-now state, order creation, payment, delivery confirmation as public addressable Nostr events any client can read), and escrow plus dispute resolution for the subset of transactions where web-of-trust signals alone are insufficient (high-value items, first-time counterparties, anonymous marketplaces, physical delivery). The proposal closes the cross-client silos in marketplaces the way NIP-99 closed silos for listings. It lands in the same week as the &lt;a href="https://github.com/Conduit-BTC/conduit-mono">Conduit&lt;/a> launch (which ships its own &lt;code>nips/&lt;/code> and &lt;code>specs/&lt;/code> directories), &lt;a href="https://github.com/shopstr-eng/shopstr/pull/512">Shopstr PR #512&lt;/a> (end-to-end Cashu escrow lifecycle), &lt;a href="https://github.com/bit-blik/bitblik">BitBlik&lt;/a> (P2P BLIK ↔ Lightning with its own escrow primitives), and the &lt;a href="https://github.com/GammaMarkets/market-spec">Gamma Markets Market Spec&lt;/a> standalone repository entering active tracking.&lt;/p>
&lt;h4 id="nip-34-remove-the-maintainers-tag-to-solve-expiry-issues">NIP-34: remove the maintainers tag to solve expiry issues&lt;/h4>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2384">PR #2384 by dhalsim&lt;/a> removes the maintainers tag from &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> repository announcements, addressing &lt;a href="https://github.com/nostr-protocol/nips/issues/2382">issue #2382&lt;/a>. The maintainers tag had no defined expiry semantics, which made it hard for downstream tools to know when a maintainer assignment was still authoritative. The change has wide blast radius: it affects flotilla-budabit patches (the only tracked NIP-34 repo with substantive patch activity this week), the Iris team&amp;rsquo;s eight-repo NIP-34 distribution setup, the BitBlik NIP-34 mirror, the new Amber NIP-34 mirror, and DocNR&amp;rsquo;s PRana issue-worklist tool. Cross-reviewers on the PR include DanConwayDev (ngit), vitorpamplona (Amethyst), TheAwiteb, and chebizarro.&lt;/p>
&lt;h4 id="nip-29-groups-states-work-in-progress">NIP-29 groups states (work in progress)&lt;/h4>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2372">PR #2372 by dtonon&lt;/a> proposes a groups-states framing for &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a>, shared as a work-in-progress for feedback. This continues the &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-17-newsletter/">NIP-29 evolution covered in #27&lt;/a>, now via a new framing.&lt;/p>
&lt;h4 id="nip-79-stories-and-nip-76-reels-feed-both-by-anaskmh">NIP-79 Stories and NIP-76 Reels Feed (both by anaskmh)&lt;/h4>
&lt;p>Two short-form media specs from the same author landed this week. &lt;a href="https://github.com/nostr-protocol/nips/pull/2386">PR #2386&lt;/a> proposes NIP-79 Stories: ephemeral full-screen photo, video, and text slides expiring after 24 hours, with kind &lt;code>19&lt;/code> for individual slides, kind &lt;code>34237&lt;/code> as an addressable event holding ordered &lt;code>e&lt;/code> tags to sequence multi-slide stories, and an optional privacy-preserving seen-by receipt on kind &lt;code>15750&lt;/code>. &lt;a href="https://github.com/nostr-protocol/nips/pull/2385">PR #2385&lt;/a> proposes NIP-76 for a short-form video Reels Feed. Both are parallel specs to anything existing video clients like divine.video are shipping, not implementations of it.&lt;/p>
&lt;h4 id="kind-1111-as-reply-to-kind-1-notes">kind 1111 as reply to kind 1 notes&lt;/h4>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2358">PR #2358 by zhoreeq&lt;/a> removes the line in the NIPs corpus that previously discouraged using kind &lt;code>1111&lt;/code> (&lt;a href="https://nostrcompass.org/en/topics/nip-22/">NIP-22&lt;/a>) comment-thread replies on kind &lt;code>1&lt;/code> notes (&lt;a href="https://github.com/nostr-protocol/nips/issues/2250">issue #2250&lt;/a>). The change is small in diff but wide in effect: any client that wants to use the threaded-comment shape from NIP-22 against ordinary kind-1 timeline notes now has explicit support to do so.&lt;/p>
&lt;hr>
&lt;h2 id="six-years-of-nostr-junes">Six Years of Nostr Junes&lt;/h2>
&lt;p>The NIP-99 and NIP-104 deep dives that would have run this week are deferred to #29 (2026-07-01).&lt;/p>
&lt;h3 id="june-2021-protocol-infancy">June 2021: protocol infancy&lt;/h3>
&lt;p>Nostr was about seven months old. fiatjaf&amp;rsquo;s &lt;a href="https://fiatjaf.com/nostr.html">original protocol post&lt;/a> had gone up in November 2020 along with the &lt;a href="https://github.com/fiatjaf/nostr">&lt;code>fiatjaf/nostr&lt;/code>&lt;/a> prototype repository, and the developer circle was still small enough that a handful of people on a single IRC channel could review nearly every change. The reference implementation was a Python script. There was no dedicated &lt;code>nostr-protocol/nips&lt;/code> repository yet; what would become the NIPs lived as informal proposals in the main repo and in chat. The protocol was not on most people&amp;rsquo;s radar. The Bitcoin developers who would later make it visible (Will Casarin, Pablo Fernandez, Vitor Pamplona, Mike Dilger) were either still on Twitter or not yet involved.&lt;/p>
&lt;h3 id="june-2022-the-nips-repo-forms">June 2022: the NIPs repo forms&lt;/h3>
&lt;p>By mid-2022 Nostr had picked up enough proposers to warrant its own specification repository: &lt;a href="https://github.com/nostr-protocol/nips">&lt;code>nostr-protocol/nips&lt;/code>&lt;/a> split off and around twenty NIPs were drafted by the time of summer 2022, covering the basic event format (&lt;a href="https://nostrcompass.org/en/topics/nip-01/">NIP-01&lt;/a>), follow lists (&lt;a href="https://nostrcompass.org/en/topics/nip-02/">NIP-02&lt;/a>), encrypted DMs (&lt;a href="https://nostrcompass.org/en/topics/nip-04/">NIP-04&lt;/a>, now deprecated), relay metadata (&lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a>), and identifiers (&lt;a href="https://nostrcompass.org/en/topics/nip-19/">NIP-19&lt;/a>). The first public web clients, including astral.ninja, anigma.io, and nostr.rocks, were live in early forms. William Casarin announced &lt;a href="https://damus.io">Damus&lt;/a> for iOS and began TestFlight distribution that summer. The protocol&amp;rsquo;s user base was still tiny; the developer community was still its primary user base.&lt;/p>
&lt;h3 id="june-2023-post-damus-adoption-surge">June 2023: post-Damus adoption surge&lt;/h3>
&lt;p>December 2022 changed Nostr&amp;rsquo;s trajectory. Twitter (under Elon Musk&amp;rsquo;s new ownership) banned Nostr links in late December 2022, which coincided with Damus&amp;rsquo;s broader public launch and triggered an adoption wave that carried into the first half of 2023. By June 2023, &lt;a href="mailto:jack@cash.app">jack@cash.app&lt;/a> (Jack Dorsey) was actively posting, Edward Snowden had joined, and large accounts started cross-posting from Twitter. &lt;a href="https://primal.net">Primal&lt;/a> and &lt;a href="https://iris.to">iris.to&lt;/a> were on visible launch trajectories. &lt;a href="https://github.com/hoytech/strfry">strfry&lt;/a> by hoytech shipped as a high-performance relay implementation. Protocol-level work focused on better identity (&lt;a href="https://github.com/nostr-protocol/nips/blob/master/26.md">NIP-26&lt;/a> delegations, deprecated later), the outbox model (&lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a>), and the &lt;a href="https://nostrcompass.org/en/topics/nip-57/">NIP-57&lt;/a> zap economy that connected Nostr to Lightning. Wallet of Satoshi added zap support, and the zap-economy framing pulled in Bitcoin-side wallet developers who had not been on Nostr previously.&lt;/p>
&lt;h3 id="june-2024-signers-gift-wrap-and-the-messaging-upgrade">June 2024: signers, gift-wrap, and the messaging upgrade&lt;/h3>
&lt;p>By June 2024 the &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote-signing space had stabilized into the &lt;code>bunker://&lt;/code> URI scheme and the &lt;a href="https://github.com/kind-0/nsecbunkerd">nsecBunker&lt;/a> reference implementation, and &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> by greenart7c3 had become the dominant Android signer. The messaging-layer evolution arrived through &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> (private DMs over NIP-59 gift-wrap), which solved the metadata-leakage problems of NIP-04 and gradually displaced the legacy DM kind in modern clients. &lt;a href="https://nostrcompass.org/en/topics/nip-89/">NIP-89&lt;/a> recommended-application tagging began rolling out across clients so that addressable events from one client (live streams, long-form, calendar events, polls) could be opened by another client that understood the same kind. MLS-over-Nostr discussions started during this period; the conversations would become the Marmot protocol. The first Nostr Asia conference ran in Tokyo and Taipei, marking the first regional conference outside the originally Western-developer-heavy community.&lt;/p>
&lt;h3 id="june-2025-marmot-git-over-nostr-maturity-and-the-long-tail-of-clients">June 2025: Marmot, git-over-Nostr maturity, and the long tail of clients&lt;/h3>
&lt;p>By June 2025 the MLS-over-Nostr work had a formal name (the &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> protocol, dropping the earlier provisional &amp;ldquo;NIP-EE&amp;rdquo; designation) and a flagship implementation (&lt;a href="https://github.com/marmot-protocol/whitenoise">White Noise&lt;/a> by erskingardner) in public alpha. &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> git-over-Nostr matured to the point where the combination of &lt;a href="https://codeberg.org/DanConwayDev/ngit-cli">ngit&lt;/a> by DanConwayDev and &lt;a href="https://gitworkshop.dev">GitWorkshop&lt;/a> was a usable code-review surface for Nostr-native projects. &lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a> crossed into the Nostr space through &lt;a href="https://nostrcompass.org/en/topics/nip-60/">NIP-60&lt;/a> wallets and &lt;a href="https://nostrcompass.org/en/topics/nip-61/">NIP-61&lt;/a> nutzaps; &lt;a href="https://wavlake.com">Wavlake&lt;/a> and the music-on-Nostr story took hold; &lt;a href="https://divine.video">divine.video&lt;/a> launched the Vine-style short-form video pattern restored from the Vine archives; and the &lt;a href="https://nostrcompass.org/en/topics/nip-99/">NIP-99&lt;/a> marketplace work resumed under &lt;a href="https://shopstr.store">Shopstr&lt;/a> and &lt;a href="https://plebeian.market">Plebeian Market&lt;/a> leadership. The protocol began carrying media types and commerce types with their own dedicated event kinds.&lt;/p>
&lt;h3 id="june-2026-a-launch-heavy-month">June 2026: a launch-heavy month&lt;/h3>
&lt;p>June 2026 carries the launches covered in this issue&amp;rsquo;s lead stories: &lt;a href="https://github.com/block/buzz">Buzz&lt;/a> by Block opens the self-hosted workspace-as-relay pattern for humans and AI agents in shared rooms; &lt;a href="https://napplet.run">Napplets&lt;/a> by sandwich.farm formalizes a trust-boundary protocol for composable Nostr apps over Nostr and Blossom; &lt;a href="https://conduit.market">Conduit&lt;/a> opens a three-app marketplace monorepo with its own in-repo &lt;code>nips/&lt;/code> and &lt;code>specs/&lt;/code> directories; &lt;a href="https://www.bitblik.app">BitBlik&lt;/a> ships a P2P BLIK ↔ Lightning exchange over Nostr; &lt;a href="https://github.com/JeroenOnNostr/codedeck">CodeDeck&lt;/a> puts Claude Code sessions on encrypted Nostr relays; and &lt;a href="https://github.com/mehmetefeumit/Haven-App">Haven&lt;/a> becomes the first Marmot consumer outside messaging. The protocol that started six years ago as a Python script and a handful of IRC participants now carries six-figure relay user counts, several layers of media and commerce, and a parallel agent-collaboration substrate that did not exist a year ago.&lt;/p></content:encoded></item><item><title>Nostr Compass #27</title><link>https://nostrcompass.org/en/newsletters/2026-06-17-newsletter/</link><pubDate>Wed, 17 Jun 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-06-17-newsletter/</guid><description>&lt;p>This week ran heavy on signer work, P2P trade protocols, and flagship client releases. &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.12.0">Amethyst v1.12.0&lt;/a> ships 170+ PRs adding &lt;a href="https://nostrcompass.org/en/topics/nip-60/">NIP-60&lt;/a> Cashu wallets, &lt;a href="https://nostrcompass.org/en/topics/nip-61/">NIP-61&lt;/a> nutzaps, &lt;a href="https://github.com/nostr-protocol/nips/blob/master/82.md">NIP-82&lt;/a> software-app feeds, &lt;a href="https://nostrcompass.org/en/topics/nip-f4/">NIP-F4&lt;/a> podcast support, CLINK on-chain zap verification, KMP phase-1/2 iOS migration, and a Tor self-heal driver. &lt;a href="https://github.com/DocNR/clave/releases/tag/v1.0.0">Clave v1.0.0 (build 102)&lt;/a> was submitted to the App Store, bringing push-woken background signing and incoming-signature verification to iOS. &lt;a href="https://github.com/MostroP2P/mostro-core/releases/tag/v0.13.0">Mostro Core v0.13.0&lt;/a> ships Protocol v2, replacing relay-based order communication with &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> gift-wrapped direct messages, and &lt;a href="https://github.com/MostroP2P/mostro/releases/tag/v0.17.5">Mostro v0.17.5&lt;/a> made the operator-side anti-abuse bond optional and configurable. &lt;a href="https://github.com/Letdown2491/signet/releases/tag/v1.11.0">Signet v1.11.0&lt;/a> patches a &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> (gift-wrapped private DMs) admin-command signature bypass that let anyone with public information forge kill-switch commands. &lt;a href="https://github.com/jesuspirate/chama">Chama&lt;/a> shipped seven escrow releases in six days, taking the trade room from a wall of controls to a per-seat conversation. On the signer side, &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.2.1">Amber v6.2.1&lt;/a>, Clave (builds &lt;a href="https://github.com/DocNR/clave/releases/tag/v0.2.0-build100">100&lt;/a>, &lt;a href="https://github.com/DocNR/clave/releases/tag/v0.2.0-build101">101&lt;/a>, and &lt;a href="https://github.com/DocNR/clave/releases/tag/v1.0.0">102&lt;/a>), and &lt;a href="https://github.com/nostur-com/nostur-ios-public/releases/tag/1.29.0-desktop">Nostur 1.29.0&lt;/a> all implement the new &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> logout method that merged this week (&lt;a href="https://github.com/nostr-protocol/nips/pull/2373">PR #2373&lt;/a>). &lt;a href="https://github.com/ZeusLN/zeus/releases/tag/v13.1.0-rc1">Zeus v13.1.0-rc1&lt;/a> and Amethyst both ship CLINK noffer support, the proposed common Lightning interface for Nostr keys. &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> relay groups picked up five open proposals covering banner tags, invite codes, message pinning, group reporting via &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> DMs, and role-based access control.&lt;/p></description><content:encoded>&lt;p>This week ran heavy on signer work, P2P trade protocols, and flagship client releases. &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.12.0">Amethyst v1.12.0&lt;/a> ships 170+ PRs adding &lt;a href="https://nostrcompass.org/en/topics/nip-60/">NIP-60&lt;/a> Cashu wallets, &lt;a href="https://nostrcompass.org/en/topics/nip-61/">NIP-61&lt;/a> nutzaps, &lt;a href="https://github.com/nostr-protocol/nips/blob/master/82.md">NIP-82&lt;/a> software-app feeds, &lt;a href="https://nostrcompass.org/en/topics/nip-f4/">NIP-F4&lt;/a> podcast support, CLINK on-chain zap verification, KMP phase-1/2 iOS migration, and a Tor self-heal driver. &lt;a href="https://github.com/DocNR/clave/releases/tag/v1.0.0">Clave v1.0.0 (build 102)&lt;/a> was submitted to the App Store, bringing push-woken background signing and incoming-signature verification to iOS. &lt;a href="https://github.com/MostroP2P/mostro-core/releases/tag/v0.13.0">Mostro Core v0.13.0&lt;/a> ships Protocol v2, replacing relay-based order communication with &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> gift-wrapped direct messages, and &lt;a href="https://github.com/MostroP2P/mostro/releases/tag/v0.17.5">Mostro v0.17.5&lt;/a> made the operator-side anti-abuse bond optional and configurable. &lt;a href="https://github.com/Letdown2491/signet/releases/tag/v1.11.0">Signet v1.11.0&lt;/a> patches a &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> (gift-wrapped private DMs) admin-command signature bypass that let anyone with public information forge kill-switch commands. &lt;a href="https://github.com/jesuspirate/chama">Chama&lt;/a> shipped seven escrow releases in six days, taking the trade room from a wall of controls to a per-seat conversation. On the signer side, &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.2.1">Amber v6.2.1&lt;/a>, Clave (builds &lt;a href="https://github.com/DocNR/clave/releases/tag/v0.2.0-build100">100&lt;/a>, &lt;a href="https://github.com/DocNR/clave/releases/tag/v0.2.0-build101">101&lt;/a>, and &lt;a href="https://github.com/DocNR/clave/releases/tag/v1.0.0">102&lt;/a>), and &lt;a href="https://github.com/nostur-com/nostur-ios-public/releases/tag/1.29.0-desktop">Nostur 1.29.0&lt;/a> all implement the new &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> logout method that merged this week (&lt;a href="https://github.com/nostr-protocol/nips/pull/2373">PR #2373&lt;/a>). &lt;a href="https://github.com/ZeusLN/zeus/releases/tag/v13.1.0-rc1">Zeus v13.1.0-rc1&lt;/a> and Amethyst both ship CLINK noffer support, the proposed common Lightning interface for Nostr keys. &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> relay groups picked up five open proposals covering banner tags, invite codes, message pinning, group reporting via &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> DMs, and role-based access control.&lt;/p>
&lt;h2 id="top-stories">Top stories&lt;/h2>
&lt;h3 id="amethyst-v1120-ships-cashu-wallets-nutzaps-a-clink-driver-and-tor-self-heal">Amethyst v1.12.0 ships Cashu wallets, nutzaps, a CLINK driver, and Tor self-heal&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> is the dominant Android Nostr client by Vitor Pamplona. &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.12.0">v1.12.0&lt;/a> bundles the 93 PRs covered as unreleased work in Newsletter #25 (&lt;a href="https://nostrcompass.org/en/topics/nip-32/">NIP-32&lt;/a> hashtag labeling, NIP-F4 podcast screen, music tracks, ephemeral signers, onchain zaps with NIP-05 filter) and Newsletter #26 (continued &lt;a href="https://nostrcompass.org/en/topics/nip-f4/">NIP-F4&lt;/a>, Tor watchdog groundwork), plus a substantial new tranche this week. The new work centers on a Cashu/nutzap surface, a CLINK on-chain zap driver, a Tor self-heal cluster, and the KMP iOS migration.&lt;/p>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-60/">NIP-60&lt;/a> Cashu wallet support and &lt;a href="https://nostrcompass.org/en/topics/nip-61/">NIP-61&lt;/a> nutzap rendering land in &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3075">PR #3075&lt;/a>, with a per-mint balance view (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3115">PR #3115&lt;/a>) and a unified payment card UI (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3191">PR #3191&lt;/a>) that consolidates Lightning addresses, on-chain zaps, Cashu mints, and NWC on a single profile-payment screen (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3185">PR #3185&lt;/a>). A CLINK driver for on-chain zap verification ships in &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3039">PR #3039&lt;/a>, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3177">PR #3177&lt;/a>, and &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3182">PR #3182&lt;/a>. CLINK is the Common Lightning Interface for Nostr Keys, the same noffer interface &lt;a href="https://github.com/ZeusLN/zeus/releases/tag/v13.1.0-rc1">Zeus v13.1.0-rc1&lt;/a> ships this week, and Amethyst adds a verification state machine, a reverify driver, and a minimum on-chain zap amount (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3030">PR #3030&lt;/a>). &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3201">PR #3201&lt;/a> introduces private notes by gift-wrapping kind-1 replies to p-tagged users per &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a>, so the composer produces a public note or a sealed group reply depending on the targeting.&lt;/p>
&lt;p>A Tor reliability cluster lands as a complete self-heal stack: &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3053">PR #3053&lt;/a> bumps Arti to v2.3.0 with a watchdog and integration tests, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3223">PR #3223&lt;/a> gates Tor-routed relay dials until Tor is ready, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3224">PR #3224&lt;/a> bounds the Arti bootstrap with a 60-second timeout so a hostile network cannot wedge the loop, and &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3231">PR #3231&lt;/a> self-heals when Tor is Active but every circuit is dead. The result is a Tor stack that recovers from network changes and sleep-resume cycles without manual intervention. Phase 1 and Phase 2 of the KMP iOS migration ship in &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3047">PR #3047&lt;/a> and &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3050">PR #3050&lt;/a>, unblocking iOS CI for the &lt;code>quartz&lt;/code> and &lt;code>commons&lt;/code> modules and laying the foundation for an iOS Amethyst build.&lt;/p>
&lt;h3 id="mostro-core-v0130-cuts-the-relay-middleman-with-protocol-v2">Mostro Core v0.13.0 cuts the relay middleman with Protocol v2&lt;/h3>
&lt;p>&lt;a href="https://github.com/MostroP2P/mostro">Mostro&lt;/a> is a Lightning-settled P2P Bitcoin exchange that uses Nostr as its order book and trade communication layer. &lt;a href="https://github.com/MostroP2P/mostro-core/releases/tag/v0.13.0">v0.13.0 of mostro-core&lt;/a>, the Rust library that defines the wire protocol, replaces the relay-routed messaging model with what the changelog describes as Protocol v2, an NIP-44 direct transport that rides on kind 14 events. Trade-specific actions now travel as kind 14 messages wrapped per &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> and bound to the per-trade key the participant generated at order creation, without round-tripping the trade conversation through public addressable events.&lt;/p>
&lt;p>Under the previous model, the entire trade conversation surface leaked to every relay carrying the events. Direct kind 14 transport keeps order setup, dispute flow, and settlement metadata between the two parties and the Mostro daemon, with the relays seeing only encrypted envelopes. Alongside the transport change, v0.13.0 also binds the v2 identity proof to the trade key (&lt;a href="https://github.com/MostroP2P/mostro-core/releases/tag/v0.13.0">commit log&lt;/a>), closing a class of replay risks against the new protocol. On the daemon side, &lt;a href="https://github.com/MostroP2P/mostro/releases/tag/v0.17.5">Mostro v0.17.5&lt;/a> made the anti-abuse bond optional and operator-configurable: before starting certain trades, each side may need to lock a small bond returned on normal completion and forfeited on stalling, no-show, or grief. The bond is enabled at the node-operator level, not imposed network-wide, so Mostro stays non-custodial and each operator chooses the tradeoff between marketplace friction and abuse-resistance. On the client side, &lt;a href="https://github.com/MostroP2P/mobile/releases/tag/v1.2.8">Mostro Mobile v1.2.8&lt;/a> shipped 17 features supporting the new path, including bootstrap relay discovery in place of pinned default relays (&lt;a href="https://github.com/MostroP2P/mobile/pull/610">PR #610&lt;/a>), maker anti-abuse bond on order creation as Phase 5 of the bond rollout (&lt;a href="https://github.com/MostroP2P/mobile/pull/608">PR #608&lt;/a>), and order cancellation persisted in notification history with context (&lt;a href="https://github.com/MostroP2P/mobile/pull/602">PR #602&lt;/a>). &lt;a href="https://github.com/MostroP2P/mobile/releases/tag/v1.2.9">v1.2.9&lt;/a> followed two days later, surfacing the anti-abuse bond policy from the node info event so a user can see the bond rules of the Mostro instance before opening an order (&lt;a href="https://github.com/MostroP2P/mobile/pull/617">PR #617&lt;/a>).&lt;/p>
&lt;h3 id="signet-v1110-patches-a-nip-17-admin-command-signature-bypass">Signet v1.11.0 patches a NIP-17 admin-command signature bypass&lt;/h3>
&lt;p>&lt;a href="https://github.com/Letdown2491/signet">Signet&lt;/a> is a remote bunker signer with a kill-switch surface that lets an administrator panic, revive, or check the signer over Nostr without touching the host machine. &lt;a href="https://github.com/Letdown2491/signet/releases/tag/v1.11.0">v1.11.0&lt;/a> fixes a security bug in that surface where the &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> gift-wrap admin-command path checked only the unsigned inner rumor&amp;rsquo;s claimed author, never verifying the signed seal. Because &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> conversation keys are symmetric, an attacker holding only public information (the signer pubkey, the admin npub, an admin relay) could forge a gift wrap from outside and execute any kill-switch command, including &lt;code>panic&lt;/code>, &lt;code>resumeall&lt;/code>, or &lt;code>alive&lt;/code>. The fix calls &lt;code>verifyEvent&lt;/code> on the seal and binds the rumor author to the seal signature, so unsigned forgeries are now rejected at the gate. Signet operators should upgrade promptly; the spec and the patched code path together give an attacker a clear repro recipe.&lt;/p>
&lt;h3 id="chama-v320-through-v350-redraw-the-trade-room-and-harden-the-money-path">Chama v3.2.0 through v3.5.0 redraw the trade room and harden the money path&lt;/h3>
&lt;p>&lt;a href="https://github.com/jesuspirate/chama">Chama&lt;/a> is a Nostr-native P2P escrow client that pairs Fedimint ecash with 2-of-3 Shamir secret sharing for serverless trade settlement. Newsletter #26 covered the v2.0.0 through v3.1.0 run that crossed the standalone-app line and added per-seller storefronts. This week&amp;rsquo;s six follow-on releases pick up at &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v3.2.0">v3.2.0&lt;/a> and end at &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v3.5.0">v3.5.0&lt;/a> on June 15, redrawing the trade-room UI around a single per-seat question (what do I do right now) and hardening the money path against partial failures. &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v3.2.0">v3.2.0&lt;/a> gave buyer, seller, and arbiter their own color-coded action prompts so every seat sees its own next move in every trade state. &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v3.3.0">v3.3.0&lt;/a> tightened two consensus rules in the trade engine and required coordinated client adoption to take effect. &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v3.3.1">v3.3.1&lt;/a> localized prices and payment methods to the trader&amp;rsquo;s community currency. &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v3.4.0">v3.4.0&lt;/a> added five hardening fixes to the money path so a hiccup, a race, or a closed tab cannot quietly cost the user sats. &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v3.5.0">v3.5.0&lt;/a> added two client-side guardrails around the arbiter role, the one seat that could otherwise quietly tilt a trade.&lt;/p>
&lt;h3 id="clave-10-ships-to-the-app-store-with-push-woken-background-signing">Clave 1.0 ships to the App Store with push-woken background signing&lt;/h3>
&lt;p>&lt;a href="https://github.com/DocNR/clave">Clave&lt;/a> is an iOS &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote signer that keeps the user&amp;rsquo;s Nostr private key in the iPhone Keychain. Apps request signatures over an end-to-end encrypted channel and never receive the key itself. &lt;a href="https://github.com/DocNR/clave/releases/tag/v1.0.0">v1.0.0 build 102&lt;/a> was submitted to the App Store this week, marking the 1.0 milestone after eight months of TestFlight betas. The release ships push-woken background signing: Clave can decrypt a request, check permissions, sign, and respond with the app closed, so the iOS foreground requirement that previously gated signer responsiveness is gone. Incoming-signature verification is enforced with BIP-340 Schnorr over the canonical &lt;a href="https://nostrcompass.org/en/topics/nip-01/">NIP-01&lt;/a> event-serialization format (the base spec defining how every signed Nostr event is hashed) plus a replay-freshness guard, so a malicious app cannot smuggle a re-signed event through the response channel.&lt;/p>
&lt;p>The release also lands the updated &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encryption layer with a kind-scoped permission model and three sensitivity tiers, fixes the low-trust signing edge case where an &amp;ldquo;ask every time&amp;rdquo; request returned an error before the user could approve, and adds multi-account pairing so one app pairing can flow through several identities. Bunker pairings now surface real app identity through the &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> connect-metadata extension Clave proposed in &lt;a href="https://github.com/nostr-protocol/nips/pull/2381">PR #2381&lt;/a>. The clean disconnect flow uses the new &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> &lt;code>logout&lt;/code> method that merged in &lt;a href="https://github.com/nostr-protocol/nips/pull/2373">PR #2373&lt;/a>, so a paired app can end its session cleanly without a manual unpair. Per-app trust levels (Full, Medium, Low) with per-event-kind overrides, an activity log for every signature, and bring-your-own push proxy round out the surface; the proxy stack is MIT-licensed and the per-client interop matrix is tracked in &lt;a href="https://github.com/DocNR/clave/blob/main/docs/nip46-compatibility.md">&lt;code>docs/nip46-compatibility.md&lt;/code>&lt;/a>.&lt;/p>
&lt;h2 id="releases">Releases&lt;/h2>
&lt;h3 id="amber-v621-adds-nip-46-logout-and-trims-signer-battery-drain">Amber v6.2.1 adds NIP-46 logout and trims signer battery drain&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> is the dominant Android Nostr signer. &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.2.1">v6.2.1&lt;/a> reduces battery drain from relay reconnects and websocket pings, drops dead relays from the subscription pool, and stops waking the device when updating the relay notification. The release also adds &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> logout method support so clients can end remote signer sessions cleanly (the same method merged into the spec this week as &lt;a href="https://github.com/nostr-protocol/nips/pull/2373">PR #2373&lt;/a>) and adds parsing for event kind 39701 (public web bookmark) so users can sign bookmark events directly from Amber. Settings was rebuilt with grouped Material 3 cards and distinct icons, a navigation crash on the application permissions screen was fixed, and a per-account database connection leak was closed by building databases atomically.&lt;/p>
&lt;h3 id="nostur-1290-ships-anonymous-replies-and-remote-signer-logout">Nostur 1.29.0 ships anonymous replies and remote-signer logout&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostur-com/nostur-ios-public">Nostur&lt;/a> is an iOS Nostr client by Fabian. &lt;a href="https://github.com/nostur-com/nostur-ios-public/releases/tag/1.29.0-desktop">1.29.0-desktop&lt;/a> adds support for replying to zap receipts and sending anonymous replies. On the signer side, the release improves the remote bunker connection flow, sends a &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> logout to the remote signer when the user logs out of an account, and fixes a stuck spinner when a remote signer connection fails. The release also fixes DM loading issues caused by DM relays conflicting with app relays, fixes duplicate posts when navigating to a reply and back, and shows a media thumbnail in notification rows.&lt;/p>
&lt;h3 id="citrine-v300-ships-negentropy-nip-42-auth-and-onion-relay-filtering">Citrine v3.0.0 ships Negentropy, NIP-42 AUTH, and onion-relay filtering&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Citrine">Citrine&lt;/a> is an Android local relay aggregator. &lt;a href="https://github.com/greenart7c3/Citrine/releases/tag/v3.0.0">v3.0.0&lt;/a> is a major version bump that adds &lt;a href="https://nostrcompass.org/en/topics/nip-77/">NIP-77&lt;/a> Negentropy support for set-reconciliation syncs, external signer and &lt;a href="https://github.com/nostr-protocol/nips/blob/master/42.md">NIP-42&lt;/a> AUTH support in the relay aggregator, and &lt;a href="https://github.com/nostr-protocol/nips/blob/master/51.md">NIP-51&lt;/a> mute-list honoring in aggregator fetches. The aggregator caps fetch at three relays per author with configurable source and indexer relays, reuses cached follow, mute, and metadata across restart and network change, pauses on limited or restricted networks, and filters onion relay URLs when the outbound proxy is disabled. Reposts that embed protected events are rejected, and mute lists are preserved from age-based deletion by default.&lt;/p>
&lt;h3 id="fips-v040-rc1-adds-a-nym-mixnet-transport-and-mdns-lan-discovery">FIPS v0.4.0-rc1 adds a Nym mixnet transport and mDNS LAN discovery&lt;/h3>
&lt;p>&lt;a href="https://github.com/jmcorgan/fips">FIPS&lt;/a> is the FIPS mesh sync protocol implementation. &lt;a href="https://github.com/jmcorgan/fips/releases/tag/v0.4.0-rc1">v0.4.0-rc1&lt;/a> is wire-compatible with v0.3.0, so mixed meshes interoperate and there is no flag-day upgrade. The release adds two new ways for nodes to find and reach each other: a Nym mixnet outbound transport with a single-container demo and a mixnet-relay example, and opt-in mDNS / DNS-SD discovery on the local link. A new counter-only &lt;code>show_metrics&lt;/code> query enables a Prometheus scraper at no hot-path cost, and FMP and FSP rekey were hardened to be hitless under packet loss in both directions.&lt;/p>
&lt;h3 id="calendar-by-formstr-v161-and-v162-add-per-event-notifications">Calendar by Formstr v1.6.1 and v1.6.2 add per-event notifications&lt;/h3>
&lt;p>&lt;a href="https://github.com/formstr-hq/nostr-calendar">Calendar by Formstr&lt;/a> is a &lt;a href="https://nostrcompass.org/en/topics/nip-52/">NIP-52&lt;/a> calendar client. &lt;a href="https://github.com/formstr-hq/nostr-calendar/releases/tag/v1.6.1">v1.6.1&lt;/a> adds per-event notification preferences (&lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/109">PR #109&lt;/a>) so a user can opt into or out of reminders for each individual calendar event. &lt;a href="https://github.com/formstr-hq/nostr-calendar/releases/tag/v1.6.2">v1.6.2&lt;/a> fixes login with Amber (&lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/185">PR #185&lt;/a>) so the new &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> handshake from Amber 6.2.x works end to end.&lt;/p>
&lt;h3 id="bitchat-v152-and-v153-harden-the-nostr-and-ble-transport">Bitchat v1.5.2 and v1.5.3 harden the Nostr-and-BLE transport&lt;/h3>
&lt;p>&lt;a href="https://github.com/permissionlesstech/bitchat">Bitchat&lt;/a> is a Bluetooth-and-Nostr mesh chat client. &lt;a href="https://github.com/permissionlesstech/bitchat/releases/tag/v1.5.2">v1.5.2&lt;/a> rate-limits iOS peer notifications to prevent flood (&lt;a href="https://github.com/permissionlesstech/bitchat/pull/972">PR #972&lt;/a>) and hardens Nostr validation and BLE announce checks (&lt;a href="https://github.com/permissionlesstech/bitchat/pull/1012">PR #1012&lt;/a>) so the relay-side Nostr ingest path now rejects malformed messages before they reach the local mesh handler. &lt;a href="https://github.com/permissionlesstech/bitchat/releases/tag/v1.5.3">v1.5.3&lt;/a> is a hotfix for a launch crash from a recursive &lt;code>dispatch_once&lt;/code> between &lt;code>NostrRelayManager&lt;/code> and &lt;code>NetworkActivationService&lt;/code> (&lt;a href="https://github.com/permissionlesstech/bitchat/pull/1343">PR #1343&lt;/a>).&lt;/p>
&lt;h3 id="keep-v105-moves-the-signer-policy-surface-into-the-audited-rust-core">Keep v1.0.5 moves the signer policy surface into the audited Rust core&lt;/h3>
&lt;p>&lt;a href="https://github.com/privkeyio/keep-android">Keep&lt;/a> is an Android signer that wraps the &lt;a href="https://github.com/privkeyio/keep">keep&lt;/a> Rust core. &lt;a href="https://github.com/privkeyio/keep-android/releases/tag/v1.0.5">v1.0.5&lt;/a> pins to &lt;a href="https://github.com/privkeyio/keep/releases/tag/v0.4.8">keep v0.4.8&lt;/a> and ships a bunker init race fix (&lt;a href="https://github.com/privkeyio/keep-android/pull/296">PR #296&lt;/a>) so the handshake no longer drops the first event under load, populates the Authorized Clients screen from the bunker &lt;code>onConnect&lt;/code> callback (&lt;a href="https://github.com/privkeyio/keep-android/pull/291">PR #291&lt;/a>), and consolidates the kill switch on a single source of truth in keep-mobile (&lt;a href="https://github.com/privkeyio/keep-android/pull/284">PR #284&lt;/a>). The upstream Rust core landed &lt;a href="https://github.com/privkeyio/keep/releases/tag/v0.4.9">v0.4.9&lt;/a> on June 13, which moves the &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> and &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> signer policy surface (permission decision, sensitive-kind duration clamp, expiry, keyed-HMAC tamper-evident audit chain, caller trust-on-first-use, persistent signing rate limiter) into the audited Rust core that previously duplicated logic in Kotlin, plus a &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> v3 cipher implementation; that core will ship in the next keep-mobile bump.&lt;/p>
&lt;h3 id="ants-v045-adds-article-portal-links-and-restores-habla-in-the-portal-set">ants v0.4.5 adds article portal links and restores Habla in the portal set&lt;/h3>
&lt;p>&lt;a href="https://github.com/dergigi/ants">ants&lt;/a> is dergigi&amp;rsquo;s Nostr search and reader tool. &lt;a href="https://github.com/dergigi/ants/releases/tag/v0.4.5">v0.4.5&lt;/a> adds article card actions for long-form posts, including article portal links, article-specific &lt;code>naddr&lt;/code> sharing, &lt;code>nevent&lt;/code> copy, and raw JSON access. The article portal set was refreshed by restoring Habla, replacing defunct destinations, and removing the imwald portal. The release also restores article footnote rendering with preserved in-article anchor navigation and waits for a relay connection before fetching the profile during login restore so the header avatar resolves correctly.&lt;/p>
&lt;h3 id="morganite-v003-ships-a-local-blossom-cache-for-android-with-tor-on-demand">Morganite v0.0.3 ships a local Blossom cache for Android with Tor on demand&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Morganite">Morganite&lt;/a> is a new local Blossom cache for Android by greenart7c3 (the author of Amber and Citrine). The cache acts as a &lt;a href="https://github.com/hzrd149/blossom/blob/master/buds/08.md">BUD-08&lt;/a> local mirror that prunes least-used blobs once it exceeds 1GB. &lt;a href="https://github.com/greenart7c3/Morganite/releases/tag/v0.0.3">v0.0.3&lt;/a> starts Tor on demand and stops it when idle to save battery, disconnects the Nostr relay after author lookup to stop background drain, fixes battery drain from an unfiltered logcat stream and leaked HTTP clients, and releases replaced &lt;code>OkHttp&lt;/code> clients off the main thread. The release also fetches the user&amp;rsquo;s inbox relays before querying the Blossom server list (so blob discovery follows the outbox model) and downloads the blob on &lt;code>HEAD&lt;/code> requests when it is not cached locally, which keeps cache warmup tied to actual client demand.&lt;/p>
&lt;h3 id="coracle-0634-and-0635-fix-nip-46-login-stale-feeds-and-reply-toggling">Coracle 0.6.34 and 0.6.35 fix NIP-46 login, stale feeds, and reply toggling&lt;/h3>
&lt;p>&lt;a href="https://github.com/coracle-social/coracle">Coracle&lt;/a> is a Nostr web client by hodlbod. &lt;a href="https://github.com/coracle-social/coracle/releases/tag/0.6.34">0.6.34&lt;/a> fixes &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> login, a stale feed state where the home timeline would not refresh after switching views, and a reply toggle that filtered everything out when toggled on. The release also rebuilds feed and list views, fixes a toast safe-area inset issue, and improves image loading. &lt;a href="https://github.com/coracle-social/coracle/releases/tag/0.6.35">0.6.35&lt;/a> is a small follow-up that fixes reposts being hidden when replies are disabled, so the repost filter no longer over-applies the reply filter.&lt;/p>
&lt;h3 id="zeus-v1310-rc1-ships-clink-noffers-and-queue-less-nwc">Zeus v13.1.0-rc1 ships CLINK noffers and queue-less NWC&lt;/h3>
&lt;p>&lt;a href="https://github.com/ZeusLN/zeus">Zeus&lt;/a> is a self-custody Bitcoin and Lightning wallet with a Nostr surface for wallet-connect and noffer payments. &lt;a href="https://github.com/ZeusLN/zeus/releases/tag/v13.1.0-rc1">v13.1.0-rc1&lt;/a> adds queue-less &lt;a href="https://github.com/nostr-protocol/nips/blob/master/47.md">NIP-47&lt;/a> Nostr Wallet Connect payments on iOS (in collaboration with Primal) so a paid NWC invoice no longer waits in a background queue, ships CLINK noffer payment support with Zeus Pay generating a CLINK noffer for every account so a sender can pay any Zeus user by Nostr key alone, and adds an opt-out for Nostr Zaps on Zeus Pay so a receiver can disable the kind 9735 receipt path without disabling NWC.&lt;/p>
&lt;h3 id="alby-extension-v3143-migrates-the-noblescure-crypto-stacks-used-by-the-nip-07-signer">Alby Extension v3.14.3 migrates the noble/scure crypto stacks used by the NIP-07 signer&lt;/h3>
&lt;p>&lt;a href="https://github.com/getAlby/lightning-browser-extension">Alby Extension&lt;/a> is the browser extension that provides &lt;a href="https://github.com/nostr-protocol/nips/blob/master/07.md">NIP-07&lt;/a> signing and Nostr Wallet Connect alongside its Lightning surface. &lt;a href="https://github.com/getAlby/lightning-browser-extension/releases/tag/v3.14.3">v3.14.3&lt;/a> migrates the &lt;code>@noble/curves&lt;/code>, &lt;code>@noble/hashes&lt;/code>, &lt;code>@noble/ciphers&lt;/code>, &lt;code>@noble/secp256k1&lt;/code>, &lt;code>@scure/bip32&lt;/code>, and &lt;code>@scure/base&lt;/code> stacks to v2 and v3 majors. Those are the cryptographic libraries the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/07.md">NIP-07&lt;/a> signer path relies on for event signing and &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encryption, so a major version bump touches the wire format the extension produces for every signed event request from a Nostr web client.&lt;/p>
&lt;h3 id="mostro-mobile-v128-and-v129-support-protocol-v2-and-surface-the-bond-policy">Mostro Mobile v1.2.8 and v1.2.9 support Protocol v2 and surface the bond policy&lt;/h3>
&lt;p>&lt;a href="https://github.com/MostroP2P/mobile">Mostro Mobile&lt;/a> is the mobile client for Mostro. &lt;a href="https://github.com/MostroP2P/mobile/releases/tag/v1.2.8">v1.2.8&lt;/a> lands the client-side support for &lt;a href="https://github.com/MostroP2P/mostro-core/releases/tag/v0.13.0">mostro-core v0.13.0 Protocol v2&lt;/a> (covered in the top story above) and adds 17 features total, including the maker anti-abuse bond from &lt;a href="https://github.com/MostroP2P/mobile/pull/608">PR #608&lt;/a>, bootstrap relay discovery from &lt;a href="https://github.com/MostroP2P/mobile/pull/610">PR #610&lt;/a>, order cancellation persisted in notification history from &lt;a href="https://github.com/MostroP2P/mobile/pull/602">PR #602&lt;/a>, and fiat amount limits in the create-order screen from &lt;a href="https://github.com/MostroP2P/mobile/pull/605">PR #605&lt;/a>. &lt;a href="https://github.com/MostroP2P/mobile/releases/tag/v1.2.9">v1.2.9&lt;/a> surfaces the anti-abuse bond policy from the node info event (&lt;a href="https://github.com/MostroP2P/mobile/pull/617">PR #617&lt;/a>) so a user can see the Mostro instance&amp;rsquo;s bond rules before opening an order.&lt;/p>
&lt;h3 id="zapbook-builds-4-through-27-ship-multi-account-marmot-key-publication-and-circle-re-invitations">ZapBook builds 4 through 27 ship multi-account, Marmot key publication, and circle re-invitations&lt;/h3>
&lt;p>&lt;a href="https://github.com/codeswot/ZapBook">ZapBook&lt;/a> is a Nostr-native social reading app by codeswot for iOS and Android, organized around reading circles of 1 to 100 people who share milestones and zap each other sats as encouragement. Between &lt;a href="https://github.com/codeswot/ZapBook/releases/tag/v1.0.0-build.4">build 4&lt;/a> on June 11 and &lt;a href="https://github.com/codeswot/ZapBook/releases/tag/v1.0.0-build.27">build 27&lt;/a> on June 15, the project shipped 17 tagged builds and 7 merged PRs. Multi-account support with fluid account switching landed in &lt;a href="https://github.com/codeswot/ZapBook/pull/25">PR #25&lt;/a>, so a user can hold several Nostr identities in the app and migrate sessions between them. Initial &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> key-package publication (kind 443) is now triggered automatically on onboarding completion (&lt;a href="https://github.com/codeswot/ZapBook/pull/20">PR #20&lt;/a>), which is the precondition for invite-only group messaging in the reading circles. Removed-circle-member handling now processes fresh re-invitations cleanly (&lt;a href="https://github.com/codeswot/ZapBook/pull/24">PR #24&lt;/a>), closing a class of bugs where re-added members did not receive new invites after being removed. The release line also offloads ONNX embedding inference to a background isolate (&lt;a href="https://github.com/codeswot/ZapBook/pull/19">PR #19&lt;/a>) for in-reader semantic search, and integrates the NWC service with an &lt;code>APP_ID_SUFFIX&lt;/code> for environment-specific configurations so a single hub can serve multiple ZapBook builds.&lt;/p>
&lt;h3 id="alby-hub-v1230-fixes-nip-47-publish-for-deleted-apps-and-switches-bitrefill-to-nwc">Alby Hub v1.23.0 fixes NIP-47 publish for deleted apps and switches Bitrefill to NWC&lt;/h3>
&lt;p>&lt;a href="https://github.com/getAlby/hub">Alby Hub&lt;/a> is a self-hosted Lightning-and-Nostr hub. The non-Nostr surface of &lt;a href="https://github.com/getAlby/hub/releases/tag/v1.23.0">v1.23.0&lt;/a> is large (Just-in-Time channels, a Cards page for debit-card top-ups, an experimental Ark payment backend, and a stories home page) and falls outside Compass scope. On the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/47.md">NIP-47&lt;/a> side, the release stops retrying NIP-47 info publish for deleted apps so a removed connection no longer keeps republishing its kind 13194 info event (&lt;a href="https://github.com/getAlby/hub/pull/2391">PR #2391&lt;/a>), and removes the Bitrefill custom app entry in favor of a standard NWC connection (&lt;a href="https://github.com/getAlby/hub/pull/2420">PR #2420&lt;/a>). The readonly option for app-store apps (&lt;a href="https://github.com/getAlby/hub/pull/2415">PR #2415&lt;/a>) tightens permission scopes for NWC apps published through the in-hub store.&lt;/p>
&lt;h3 id="also-shipped">Also shipped&lt;/h3>
&lt;p>Smaller releases this week with Nostr-relevant content but limited per-release substance: &lt;a href="https://github.com/nostria-app/nostria/releases">Nostria v3.1.48 through v3.1.50&lt;/a> continuing the Web Bookmarks rollout with notification reliability and event-thread database optimization in v3.1.50; &lt;a href="https://github.com/ostermayer/deepmarks-public/releases">Deepmarks v0.7.0 through v0.7.5&lt;/a> iterating on the &lt;a href="https://github.com/nostr-protocol/nips/pull/2280">NIP-B0&lt;/a> social-bookmark client (the project also landed its website link this week in &lt;a href="https://github.com/andotherstuff/nostr-compass/pull/96">PR #96&lt;/a>); &lt;a href="https://github.com/privkeyio/keep-android/releases">Keep v1.1.1 through v1.1.4&lt;/a> shipping four F-Droid reproducible-build fixes on top of the v1.0.5 signer release covered above; &lt;a href="https://github.com/77elements/noornote/releases">NoorNote v0.11.1, v0.12.0, v0.13.0, and v0.13.1&lt;/a> on the desktop note client; &lt;a href="https://github.com/dergigi/boris/releases/tag/v0.12.2">Boris v0.12.2&lt;/a> on the Boris reader; &lt;a href="https://github.com/nogringo/nostr-mail-client/releases/tag/v0.13.0">Nostr Mail Client v0.13.0&lt;/a>; &lt;a href="https://github.com/spacecowboy/Feeder/releases/tag/2.21.1">Feeder 2.21.1&lt;/a>; &lt;a href="https://github.com/fiatjaf/nak/releases/tag/v0.19.13">nak v0.19.13&lt;/a> as an empty maintenance bump on the Nostr CLI; &lt;a href="https://github.com/mmalmi/hashtree/releases">Hashtree v0.2.68 through v0.2.71&lt;/a> refreshing gateway mutable-root caches for the hash-tree-addressed release publisher; &lt;a href="https://github.com/Spl0itable/NYM/releases">NYM v3.72.501 and v3.72.502&lt;/a> bumping the Nostrify-based relay implementation; &lt;a href="https://github.com/yysskk/swift-nostr-client/releases">swift-nostr-client 0.3.0, 0.4.0, and 0.5.0&lt;/a> cutting three minor releases backed by 85 merged PRs on the iOS Nostr client; &lt;a href="https://github.com/lawalletio/lawallet-nwc/releases/tag/v0.11.0">lawallet-nwc v0.11.0&lt;/a> with 18 merged PRs on the LaWallet Nostr Wallet Connect bridge; and &lt;a href="https://github.com/mouse484/astraea/releases">Astraea v5.35.59 through v5.35.62&lt;/a> iterating on the Astraea Nostr client; and the &lt;a href="https://github.com/andotherstuff/nostr-compass/pull/101">BTC Recharge and giftcardshop NIP-05-verified Nostr DM bots&lt;/a> added to the project directory under a new Shops category.&lt;/p>
&lt;h2 id="unreleased-changes">Unreleased changes&lt;/h2>
&lt;h3 id="divine-merges-119-prs-toward-the-next-short-form-video-drop">diVine merges 119 PRs toward the next short-form video drop&lt;/h3>
&lt;p>&lt;a href="https://github.com/divinevideo/divine-mobile">diVine&lt;/a> is a Nostr-native short-form looping video client that restores the Vine archive on a Nostr backbone. The project merged 119 PRs this week without cutting a tagged release. The substantive Nostr-surface work covers a REST-first video publish path so a missing relay OK no longer surfaces as a failure (&lt;a href="https://github.com/divinevideo/divine-mobile/pull/5221">PR #5221&lt;/a> and &lt;a href="https://github.com/divinevideo/divine-mobile/pull/5220">PR #5220&lt;/a>), blocklist refilter on curated and liked grids when the broad blocklist changes (&lt;a href="https://github.com/divinevideo/divine-mobile/pull/5208">PR #5208&lt;/a>), DM conversation list recovery after a reinstall regression (&lt;a href="https://github.com/divinevideo/divine-mobile/pull/5202">PR #5202&lt;/a>), restoration of the Nostr badge display on profiles (&lt;a href="https://github.com/divinevideo/divine-mobile/pull/5218">PR #5218&lt;/a>), and linkified &lt;code>nostr:&lt;/code> references in comment quotes (&lt;a href="https://github.com/divinevideo/divine-mobile/pull/5225">PR #5225&lt;/a>). The video-editor stack added multi-select clip merge or delete, pinch-to-zoom canvas with a zoom-tracking letterbox scrim, and clip crop, rotate, flip transforms.&lt;/p>
&lt;h3 id="pollerama-merges-15-prs-in-window-with-a-signer-rework-and-a-feature-wave">Pollerama merges 15 PRs in window with a signer rework and a feature wave&lt;/h3>
&lt;p>&lt;a href="https://github.com/formstr-hq/nostr-polls">Pollerama&lt;/a> (repo &lt;code>formstr-hq/nostr-polls&lt;/code>) is the Form*-family Nostr-native polls and feeds client, sibling to &lt;a href="https://github.com/formstr-hq/nostr-calendar">Calendar by Form*&lt;/a> which shipped v1.6.2 this week. The latest tagged release on &lt;code>nostr-polls&lt;/code> is &lt;a href="https://github.com/formstr-hq/nostr-polls/releases/tag/v1.6.4">v1.6.4&lt;/a> from March, so the in-window work is queued for the next tag and has not yet shipped, but the merge stream is heavy: fifteen pull requests landed between June 9 and June 16, with contributions from abh3po, geralt-debugs, and SIDDHANTCOOKIE. On the signer side, the project replaced the existing signing surface in &lt;a href="https://github.com/formstr-hq/nostr-polls/pull/198">PR #198&lt;/a> and upgraded the replacement in &lt;a href="https://github.com/formstr-hq/nostr-polls/pull/201">PR #201&lt;/a>, and &lt;a href="https://github.com/formstr-hq/nostr-polls/pull/200">PR #200&lt;/a> stops kind-0 metadata updates from firing on login so a fresh sign-in no longer publishes a profile event the user did not request. The feature wave covers a profile editor with posting from the profile view (&lt;a href="https://github.com/formstr-hq/nostr-polls/pull/205">PR #205&lt;/a>), an improved repost flow (&lt;a href="https://github.com/formstr-hq/nostr-polls/pull/209">PR #209&lt;/a>), and an easier topic discovery path (&lt;a href="https://github.com/formstr-hq/nostr-polls/pull/202">PR #202&lt;/a>). The next tagged release will pick all of this up.&lt;/p>
&lt;h3 id="library-and-tooling-work">Library and tooling work&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-dev-kit/ndk/pull/375">NDK PR #375&lt;/a> and the merged work on the &lt;a href="https://github.com/rust-nostr/nostr">rust-nostr&lt;/a> and &lt;a href="https://github.com/nbd-wtf/nostr-tools">nostr-tools&lt;/a> repos were quiet this week, with one or two merged PRs each and no tagged releases. Activity on &lt;a href="https://github.com/contextvm/contextvm-sdk">ContextVM SDK&lt;/a> (1 merged PR), &lt;a href="https://github.com/agentvm/mesh-llm">mesh-llm&lt;/a> (37 merged PRs, 8 open PRs), &lt;a href="https://github.com/seth-for-real/zap-cooking">Zap Cooking&lt;/a> (26 merged PRs), and &lt;a href="https://github.com/routstrd/routstrd">Routstrd&lt;/a> (2 merged PRs) continued without a release tag in the window.&lt;/p>
&lt;h2 id="nip-updates-and-protocol-spec-work">NIP updates and protocol spec work&lt;/h2>
&lt;p>This week&amp;rsquo;s protocol work clusters in two places: signer hardening and &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> group governance.&lt;/p>
&lt;p>&lt;strong>Merged this week:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> (Nostr Connect).&lt;/strong> &lt;a href="https://github.com/nostr-protocol/nips/pull/2373">PR #2373&lt;/a> adds a &lt;code>logout&lt;/code> method that lets a client end a remote-signer session cleanly. Amber, Clave, and Nostur all shipped support in the same week.&lt;/li>
&lt;li>&lt;strong>NIP-CC (Community Chat).&lt;/strong> &lt;a href="https://github.com/nostr-protocol/nips/pull/2365">PR #2365&lt;/a> updates NIP-CC to reference the modern &lt;a href="https://github.com/nostr-protocol/nips/pull/2331">NIP-GC (Group Chat)&lt;/a> specification for the client-side machinery, aligning the community-room spec with the canonical group-chat primitive.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Open NIP-29 cluster (relay-based group governance):&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Banner tags.&lt;/strong> &lt;a href="https://github.com/nostr-protocol/nips/pull/2383">PR #2383&lt;/a> adds a &lt;code>banner&lt;/code> tag to the group metadata kind 39000 event.&lt;/li>
&lt;li>&lt;strong>Invite code suffix.&lt;/strong> &lt;a href="https://github.com/nostr-protocol/nips/pull/2380">PR #2380&lt;/a> introduces an invite-code suffix on the group identifier so a one-shot invite can be encoded in the group ID itself.&lt;/li>
&lt;li>&lt;strong>Message pinning.&lt;/strong> &lt;a href="https://github.com/nostr-protocol/nips/pull/2379">PR #2379&lt;/a> adds an update-pin-list moderation action and a kind 39005 event to broadcast the pinned set.&lt;/li>
&lt;li>&lt;strong>Group reporting via NIP-17 DMs.&lt;/strong> &lt;a href="https://github.com/nostr-protocol/nips/pull/2377">PR #2377&lt;/a> defines a reporting flow where members report group abuse to the relay&amp;rsquo;s administrative contact over &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> gift-wrapped DMs, keeping moderation traffic off the public group event stream.&lt;/li>
&lt;li>&lt;strong>Role-based access control.&lt;/strong> &lt;a href="https://github.com/nostr-protocol/nips/pull/2376">PR #2376&lt;/a> adds an RBAC role surface on top of the existing admin/member split.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Open NIP-46 follow-ups:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Client metadata in connect request.&lt;/strong> &lt;a href="https://github.com/nostr-protocol/nips/pull/2381">PR #2381&lt;/a> lets the connecting client send optional &lt;code>name&lt;/code>, &lt;code>url&lt;/code>, and &lt;code>icon&lt;/code> fields in its connect request so the signer can display the application&amp;rsquo;s identity on the pairing screen. Clave build 101 implements the proposal.&lt;/li>
&lt;li>&lt;strong>Avoid silent timeouts.&lt;/strong> &lt;a href="https://github.com/nostr-protocol/nips/pull/2375">PR #2375&lt;/a> tightens the spec so a signer that needs user input holds the request open until the user decides, fixing the failure mode Clave build 100 patched on the implementation side.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Other open work:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>NIP-100 Sovereign Agent Identity Network (SNIN).&lt;/strong> &lt;a href="https://github.com/nostr-protocol/nips/pull/2378">PR #2378&lt;/a> proposes an agent-to-agent protocol for autonomous-agent identity and capability discovery. The proposal is broad and is likely to get split into smaller pieces in review.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Blossom spec.&lt;/strong> &lt;a href="https://github.com/hzrd149/blossom/pull/108">BUD-00 PR #108&lt;/a> merged on June 15, broadening the BUD definition to cover client-side conventions and data formats built on Blossom blobs that servers do not implement. The change pulls BUDs like BUD-10 (the &lt;code>blossom:&lt;/code> URI scheme) and BUD-08 (local-cache conventions Morganite implements this week) inside the canonical numbering surface, where they were previously treated as out-of-band extensions.&lt;/p>
&lt;h2 id="nip-deep-dive-nip-77-negentropy">NIP deep dive: NIP-77 (Negentropy)&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-77/">NIP-77&lt;/a> defines a set-reconciliation protocol for Nostr relays. Two parties (a client and a relay, or two relays in a bridge) each hold a set of events matching a filter, and they want to converge to the union without re-sending everything. The naive approach is to dump all event IDs over the wire and diff; for a busy filter that cost scales with the size of the larger set, regardless of how much of the set differs. NIP-77 reduces that cost to proportional to the symmetric difference.&lt;/p>
&lt;p>The spec sits on top of two relay messages, &lt;code>NEG-OPEN&lt;/code> and &lt;code>NEG-MSG&lt;/code>. A client opens a reconciliation session with &lt;code>[&amp;quot;NEG-OPEN&amp;quot;, &amp;lt;subscription_id&amp;gt;, &amp;lt;filter&amp;gt;, &amp;lt;initial_message&amp;gt;]&lt;/code>, where &lt;code>&amp;lt;initial_message&amp;gt;&lt;/code> is a hex-encoded Negentropy payload describing the client&amp;rsquo;s view of the set. Replies arrive as &lt;code>NEG-MSG&lt;/code> frames, and both sides exchange messages until they reach a fixed point. Each &lt;code>NEG-MSG&lt;/code> either narrows the disagreement (by splitting a range into sub-ranges with their own fingerprints) or terminates a leaf (by listing the IDs in a small range, so the receiver can compute the diff directly). When a side decides the other has events it lacks, it sends a normal &lt;code>REQ&lt;/code> for those IDs; when it has events the other lacks, the spec leaves the upload path to a normal &lt;code>EVENT&lt;/code> publish on the other end.&lt;/p>
&lt;p>The data structure underneath is a sequenced Merkle-tree variant. Each event in the local set is keyed by &lt;code>(created_at, id)&lt;/code> and bucketed into ranges; each range carries a small fingerprint computed from the IDs it contains. When a fingerprint matches between client and relay, that range is converged and gets skipped. When it differs, the side replying splits the range into halves (or sub-ranges) and sends fingerprints for each, recursing into the disagreement. Leaf ranges (under a small threshold of events) get sent verbatim. The key property is that converged ranges cost almost nothing to confirm, regardless of how many events sit inside them.&lt;/p>
&lt;p>The framing in &lt;code>created_at&lt;/code> order matters for two reasons. First, Nostr&amp;rsquo;s existing pagination uses &lt;code>until&lt;/code> and &lt;code>since&lt;/code> against the same timestamp, so a reconciler can resume across sessions without re-syncing the whole archive: it caches the upper bound and starts the next sync from there. Second, range splits are deterministic given a sorted key, so client and relay always agree on which boundary to use next, with no need for a separate negotiation message. The cost of a sync is approximately O(d log n) where d is the size of the symmetric difference and n is the larger set, far below the O(n) cost of a naive ID-dump and far below the O(n) round trips of issuing N REQs.&lt;/p>
&lt;p>Three implementation tradeoffs are worth flagging. The fingerprint size (the spec uses 32 bytes per range) is a tradeoff between collision probability and bandwidth: smaller fingerprints save bytes but raise the chance of a spurious match that drops events on the floor. The leaf threshold (when to stop splitting and dump IDs verbatim) is a tradeoff between round trips and per-message bandwidth: smaller thresholds mean more rounds, larger thresholds mean larger leaf messages. And the protocol assumes both parties can compute the same fingerprint over the same range; this requires a stable serialization of &lt;code>(created_at, id)&lt;/code> pairs that both implementations agree on, which is why the spec is pedantic about the byte order in the fingerprint construction.&lt;/p>
&lt;p>A relay that advertises NIP-77 in its NIP-11 &lt;code>supported_nips&lt;/code> lets clients reconcile in place of (or alongside) a regular &lt;code>REQ&lt;/code>-based sync. The client picks the protocol based on what it needs: a fresh subscription that wants tail traffic uses &lt;code>REQ&lt;/code> because there is no prior state to reconcile; a long-running mirror that wants to catch up after downtime uses &lt;code>NEG-OPEN&lt;/code> because the symmetric difference is small relative to the archive. The two paths complement each other in different deployment contexts.&lt;/p>
&lt;p>Example &lt;code>NEG-OPEN&lt;/code> exchange:&lt;/p>
&lt;pre tabindex="0">&lt;code>→ [&amp;#34;NEG-OPEN&amp;#34;, &amp;#34;sync-1&amp;#34;, {&amp;#34;kinds&amp;#34;:[1],&amp;#34;authors&amp;#34;:[&amp;#34;abc...&amp;#34;]}, &amp;#34;&amp;lt;hex initial Negentropy message&amp;gt;&amp;#34;]
← [&amp;#34;NEG-MSG&amp;#34;, &amp;#34;sync-1&amp;#34;, &amp;#34;&amp;lt;hex relay response&amp;gt;&amp;#34;]
→ [&amp;#34;NEG-MSG&amp;#34;, &amp;#34;sync-1&amp;#34;, &amp;#34;&amp;lt;hex client refinement&amp;gt;&amp;#34;]
← [&amp;#34;NEG-MSG&amp;#34;, &amp;#34;sync-1&amp;#34;, &amp;#34;&amp;lt;hex leaf with IDs the relay has and client lacks&amp;gt;&amp;#34;]
→ [&amp;#34;REQ&amp;#34;, &amp;#34;fetch-1&amp;#34;, {&amp;#34;ids&amp;#34;:[...]}]
← [...EVENT messages...]
← [&amp;#34;EOSE&amp;#34;, &amp;#34;fetch-1&amp;#34;]
→ [&amp;#34;CLOSE&amp;#34;, &amp;#34;sync-1&amp;#34;]
&lt;/code>&lt;/pre>&lt;p>&lt;a href="https://github.com/greenart7c3/Citrine/releases/tag/v3.0.0">Citrine v3.0.0&lt;/a> ships &lt;a href="https://nostrcompass.org/en/topics/nip-77/">NIP-77&lt;/a> support in the relay aggregator this week, the first time the Android local-relay surface can reconcile against external relays in place of bulk &lt;code>REQ&lt;/code> pulls.&lt;/p>
&lt;h2 id="nip-deep-dive-nip-61-nutzaps">NIP deep dive: NIP-61 (Nutzaps)&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-61/">NIP-61&lt;/a> defines peer-to-peer Cashu ecash payments delivered as Nostr events. A sender publishes a Cashu token locked to the recipient&amp;rsquo;s Nostr-derived public key, and the recipient redeems it from the mint when convenient. Unlike NIP-57 zaps, which require the receiver to be reachable over Lightning at the moment of payment, a nutzap is a self-contained ecash token that the recipient can redeem on their own schedule.&lt;/p>
&lt;p>The spec composes three event kinds with Cashu&amp;rsquo;s P2PK lock primitive. Kind 10019 is the recipient&amp;rsquo;s mint recommendation: a replaceable event listing one or more mints the recipient accepts nutzaps from, plus the Cashu public key used to lock proofs to them. This key is distinct from the recipient&amp;rsquo;s Nostr identity key; it is a wallet-scoped key derived for nutzap receipt so the identity key never has to touch ecash secrets. Senders read kind 10019 before sending so the token they construct is one the recipient can redeem at a mint they already trust.&lt;/p>
&lt;p>Kind 9321 is the payment event. It carries one or more Cashu &lt;code>proof&lt;/code> tags (each holding a P2PK-locked proof bound to the recipient&amp;rsquo;s nutzap pubkey from kind 10019), a &lt;code>u&lt;/code> tag with the mint URL, optional &lt;code>e&lt;/code> and &lt;code>a&lt;/code> tags identifying a zapped note, and a &lt;code>p&lt;/code> tag for the recipient. The recipient receives the kind 9321 through their normal Nostr subscription, validates that the proofs are locked to their nutzap pubkey at a mint listed in their own kind 10019, unlocks the proofs with the corresponding private key, and either holds them in their &lt;a href="https://nostrcompass.org/en/topics/nip-60/">NIP-60&lt;/a> wallet or melts them to Lightning. Kind 7375 records the redeemed proofs in the recipient&amp;rsquo;s wallet event chain so a wallet that re-syncs from relays does not double-count nutzap proofs against the same source.&lt;/p>
&lt;p>The trust model is the explicit price of the design. Cashu mints hold the underlying value; a malicious or seized mint can refuse to redeem. NIP-61 inherits that custody risk from NIP-60 and does not try to remove it. What the design buys is offline-capable, instant-finality micropayments: the token is the payment, the recipient does not need to run a Lightning node or accept incoming HTLCs in real time, and a sender holding proofs at the same mint can pay without a single network hop to a custodian. The kind 10019 advertisement is the social-layer gate: senders that pick a mint outside the recipient&amp;rsquo;s trusted set risk an unredeemable token, which keeps the recipient&amp;rsquo;s redemption surface predictable.&lt;/p>
&lt;p>Compared to NIP-57, the verification path is also simpler. A NIP-57 zap receipt is a kind 9735 published by the recipient&amp;rsquo;s LNURL service, requiring the verifier to fetch the LNURL endpoint and confirm the receipt&amp;rsquo;s signing key matches what the endpoint declared. A nutzap carries the cryptographic proof of payment inline (the P2PK-locked proofs themselves), so any verifier with the mint&amp;rsquo;s public keys can confirm the proofs are valid without round-tripping to a third party. The tradeoff is that nutzap verification requires understanding the mint&amp;rsquo;s keysets, while NIP-57 verification only requires standard LNURL infrastructure.&lt;/p>
&lt;p>The two zap formats coexist as complements. NIP-57 zaps stay the right choice for receivers with Lightning routing in place and senders who want denominate-in-sats with Lightning settlement semantics. NIP-61 zaps become the right choice for offline receivers, micropayment-heavy flows where Lightning fees swamp the value transferred, and clients targeting users without Lightning infrastructure.&lt;/p>
&lt;p>Example nutzap event:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;a5f87fe2d4c8b9a0e3f1c4d5e6a7b8c9d0e1f2a3b4c5d6e7f8091a2b3c4d5e6f&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1750162800&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">9321&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;proof&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;{\&amp;#34;amount\&amp;#34;:21,\&amp;#34;secret\&amp;#34;:\&amp;#34;...\&amp;#34;,\&amp;#34;C\&amp;#34;:\&amp;#34;...\&amp;#34;,\&amp;#34;id\&amp;#34;:\&amp;#34;...\&amp;#34;}&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;u&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;https://mint.example.com&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;e&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;8b39f4e5d6c7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;c5d8a4e3b2a1f0e9d8c7b6a5949382716050403020100ffeeddccbbaa99887766&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Great post!&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;f1e2d3c4b5a6978869504132c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f80192a3b4c5d6e7f80192a3b4c5d6e7f80192a3b4c5d6e7f80192a3b4c5d6e7f80192a3b4c5&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.12.0">Amethyst v1.12.0&lt;/a> ships first-class NIP-61 nutzap rendering this week alongside its NIP-60 wallet surface (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3075">PR #3075&lt;/a>), making Amethyst the first dominant Android client to render received nutzaps in the timeline and surface per-mint balance views in the wallet.&lt;/p></content:encoded></item><item><title>Nostr Compass #26</title><link>https://nostrcompass.org/en/newsletters/2026-06-10-newsletter/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-06-10-newsletter/</guid><description>&lt;p>The Marmot Protocol organization opens three new repos for a v2 protocol draft and a native client lineage: a Rust workspace named &lt;code>darkmatter&lt;/code>, a SwiftUI iOS app &lt;code>darkmatter-ios&lt;/code>, and a Kotlin/Compose Android app &lt;code>darkmatter-android&lt;/code>. The original Flutter Whitenoise is archived. Chama compresses seventeen releases into one week and crosses the standalone-app line at v3.0.0 before landing a full trade-room UI redraw and per-seller storefronts in v3.1.0, on top of holder-only Shamir shares, arbiter substitution, full-world community routing, and end-to-end trade notifications. Coracle launches a paid hosted-relay service backed by the open-source Caravel and zooid stack, with deep Flotilla integration planned. Angor flips to mainnet by default in v0.2.30 and lands a 3-user UAT funding test in v0.2.29. Amethyst lands 41 unreleased PRs continuing the NIP-32 / NIP-F4 / Tor work from last week. NIP-67 (EOSE completeness hint) and NIP-50 autocomplete merge, closing two long-standing correctness gaps in the core relay protocol. NIP-GART proposes a privacy-preserving wire format for emergency alerts, and NIP-46 picks up a logout method.&lt;/p></description><content:encoded>&lt;p>The Marmot Protocol organization opens three new repos for a v2 protocol draft and a native client lineage: a Rust workspace named &lt;code>darkmatter&lt;/code>, a SwiftUI iOS app &lt;code>darkmatter-ios&lt;/code>, and a Kotlin/Compose Android app &lt;code>darkmatter-android&lt;/code>. The original Flutter Whitenoise is archived. Chama compresses seventeen releases into one week and crosses the standalone-app line at v3.0.0 before landing a full trade-room UI redraw and per-seller storefronts in v3.1.0, on top of holder-only Shamir shares, arbiter substitution, full-world community routing, and end-to-end trade notifications. Coracle launches a paid hosted-relay service backed by the open-source Caravel and zooid stack, with deep Flotilla integration planned. Angor flips to mainnet by default in v0.2.30 and lands a 3-user UAT funding test in v0.2.29. Amethyst lands 41 unreleased PRs continuing the NIP-32 / NIP-F4 / Tor work from last week. NIP-67 (EOSE completeness hint) and NIP-50 autocomplete merge, closing two long-standing correctness gaps in the core relay protocol. NIP-GART proposes a privacy-preserving wire format for emergency alerts, and NIP-46 picks up a logout method.&lt;/p>
&lt;h2 id="top-stories">Top stories&lt;/h2>
&lt;h3 id="marmot-v2-dark-matter-protocol-redraft-native-clients-archived-flutter-app">Marmot v2 (Dark Matter): protocol redraft, native clients, archived Flutter app&lt;/h3>
&lt;p>Three new repos surfaced under the &lt;a href="https://github.com/marmot-protocol">marmot-protocol&lt;/a> GitHub organization this week, together forming the early-progress shape of a Marmot v2 protocol draft and a native-client lineage that replaces the Flutter app line. &lt;a href="https://github.com/marmot-protocol/darkmatter">&lt;code>darkmatter&lt;/code>&lt;/a> (Rust, created May 13, thirty-four commits in the past seven days) holds the v2 protocol draft in &lt;code>spec/&lt;/code>, an OpenMLS-backed CGKA engine in &lt;code>crates/cgka-engine&lt;/code>, a conformance simulator with property tests, and a Tamarin formal model for convergence proofs. &lt;a href="https://github.com/marmot-protocol/darkmatter-ios">&lt;code>darkmatter-ios&lt;/code>&lt;/a> (Swift, created May 25) is a SwiftUI client backed by a vendored &lt;code>MarmotKit&lt;/code> UniFFI xcframework generated out of the Rust workspace. &lt;a href="https://github.com/marmot-protocol/darkmatter-android">&lt;code>darkmatter-android&lt;/code>&lt;/a> (Kotlin/Jetpack Compose, created May 25) sits on the same Rust bindings. The original Flutter Whitenoise has been marked &lt;a href="https://github.com/marmot-protocol/whitenoise-archive">&lt;code>whitenoise-archive&lt;/code>&lt;/a> (&amp;ldquo;ARCHIVED: This was the original White Noise Flutter app&amp;rdquo;); a new &lt;a href="https://github.com/marmot-protocol/whitenoise">&lt;code>whitenoise&lt;/code>&lt;/a> Dart repo carries the active Flutter line in parallel.&lt;/p>
&lt;p>Read this as early progress toward a more reliable Marmot, not a finished pivot. The darkmatter README labels itself &amp;ldquo;Candidate Marmot v2 protocol draft, CGKA engine, and conformance workspace&amp;rdquo; and says directly: &amp;ldquo;MDK remains the deployed Rust protocol implementation until this draft and engine are adopted.&amp;rdquo; Inside the workspace, the cgka-engine crate is tagged &lt;code>0.1.0&lt;/code>, &amp;ldquo;single internal consumer, not semver-stable.&amp;rdquo; Every spec page carries &amp;ldquo;Status: draft for internal review&amp;rdquo;. Three stars on the workspace repo and zero on the iOS and Android apps confirm the work is pre-announce. Direction, scope, and discipline are the signal here; production readiness is not the claim.&lt;/p>
&lt;p>The protocol draft makes the v1-to-v2 deltas concrete. MIP-01&amp;rsquo;s monolithic &lt;code>marmot_group_data&lt;/code> MLS extension, which has carried group name, description, admin pubkeys, Nostr group routing id, relay list, group image data, and disappearing-message settings under one umbrella since the start of Marmot, gets &lt;a href="https://github.com/marmot-protocol/darkmatter/blob/master/spec/mip-coverage.md">split into versioned app components&lt;/a>: &lt;code>marmot.group.profile.v1&lt;/code> for name and description, &lt;code>marmot.group.admin-policy.v1&lt;/code> for admin pubkeys, &lt;code>marmot.transport.nostr.routing.v1&lt;/code> for the random &lt;code>nostr_group_id&lt;/code> and the canonical relay list, &lt;code>marmot.group.blossom.image.v1&lt;/code> for image hash, encryption key, nonce, and upload key, and &lt;code>marmot.group.message-retention.v1&lt;/code> for disappearing-message seconds. Each component owns its exact bytes and its own versioning path, so a future feature can rev one component without forcing the rest of the group state to retread MLS extension consensus. MIP-00 credentials also gain a new foundation document &lt;code>account-identity-proof-v1.md&lt;/code>, called out as &amp;ldquo;new in v2 and breaking&amp;rdquo;. The identity proof now lives on its own surface, separate from KeyPackage construction.&lt;/p>
&lt;p>The library deltas back the spec rework. &lt;code>cgka-engine&lt;/code> is the new local group state machine: it wraps OpenMLS, owns the &lt;code>Stable&lt;/code>, &lt;code>PendingPublish&lt;/code>, &lt;code>Merging&lt;/code>, and &lt;code>Recovering&lt;/code> epoch states, translates intents into MLS commits, returns typed &lt;code>IngestOutcome&lt;/code> and &lt;code>GroupEvent&lt;/code> values for every inbound transport envelope, and explicitly ships no transport and no persistence. A &lt;code>TransportPeeler&lt;/code> trait separates Nostr from the engine, and a &lt;code>StorageProvider&lt;/code> trait separates SQLite (via &lt;code>storage-sqlite&lt;/code>, SQLCipher-backed) from the engine. Today&amp;rsquo;s MDK packs all of this together; splitting the layers lets one engine sit under a Nostr-relay transport now and the also-shipped &lt;a href="https://github.com/marmot-protocol/darkmatter/blob/master/docs/quic-broker-deployment.md">QUIC stream and broker transports&lt;/a> later, with no rewrite of the convergence model. Convergence itself is documented as &lt;code>distributed-convergence.md&lt;/code> and proved in a Tamarin model that covers deterministic branch selection, policy-gated eligibility, retained-anchor replay, stale-branch rejection, delivery reordering, duplication, app-output invalidation, welcome/commit handoff, proposal consumption, and outbound gating while syncing. Rust property tests then check that the engine follows the same rules with real OpenMLS objects and the simulator harness. Formal-methods reliability work of this scope is absent from the current Marmot stack.&lt;/p>
&lt;p>Both native clients drop Flutter for platform-native UI toolkits. &lt;a href="https://github.com/marmot-protocol/darkmatter-ios">&lt;code>darkmatter-ios&lt;/code>&lt;/a> is pure SwiftUI with a Notification Service Extension that decrypts MIP-05 push wakes on device, vendors a generated &lt;code>MarmotKit&lt;/code> Swift package built from the Rust workspace, and registers under the &lt;code>dev.ipf.darkmatter&lt;/code> bundle ID and app group. &lt;a href="https://github.com/marmot-protocol/darkmatter-android">&lt;code>darkmatter-android&lt;/code>&lt;/a> is Kotlin and Jetpack Compose, with a &lt;code>just&lt;/code>-driven build that produces a signed &lt;code>arm64-v8a&lt;/code> APK and reads telemetry endpoints from &lt;code>local.properties&lt;/code>. The Android README states the architectural principle directly: &amp;ldquo;Dark Matter owns protocol data and stores it in SQLite. The Android app should render that data, manage Android platform behavior, and keep UI lifecycle state. The Android app should not become a second database for Dark Matter data.&amp;rdquo; That mirrors the boundary discipline the cgka-engine README enforces in the Rust layer, applied to the UI layer.&lt;/p>
&lt;p>Native clients matter for Marmot because the protocol&amp;rsquo;s most-cited weakness has been mobile reliability under uneven delivery conditions: missed-deadline notification wakes, MLS commit races during network flaps, background-fetch limits that strand epoch advances. SwiftUI and Compose give the clients direct access to platform background-processing primitives that Flutter reaches through a plugin bridge, and the UniFFI binding path keeps protocol logic in one Rust workspace shipped as a static library on both platforms. The Flutter Whitenoise line continues in the unarchived &lt;a href="https://github.com/marmot-protocol/whitenoise">&lt;code>whitenoise&lt;/code>&lt;/a> repo, so the announcement is additive: a new native-client lineage runs alongside the Flutter app while the v2 spec converges. Production cutover from MDK or the current Whitenoise app waits on the draft, engine, and clients reaching production-ready releases.&lt;/p>
&lt;h3 id="chama-v200-through-v310-standalone-p2p-escrow-in-one-week">Chama v2.0.0 through v3.1.0: standalone P2P escrow in one week&lt;/h3>
&lt;p>The Nostr-native P2P escrow client introduced in Newsletter #25 at v1.3.0 shipped seventeen tagged releases over the past seven days, ending at &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v3.1.0">v3.1.0&lt;/a> on June 9 with a trade-room UI redraw and per-seller storefronts. The version trail tells the story: &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v2.0.0">v2.0.0&lt;/a> is the BREAKING base, then &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v2.0.1">v2.0.1&lt;/a>, &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v2.0.2">v2.0.2&lt;/a>, and &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v2.0.3">v2.0.3&lt;/a> close Fedi WebView funding-rail gaps; &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v2.1.0">v2.1.0&lt;/a>, &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v2.2.0">v2.2.0&lt;/a>, &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v2.3.0">v2.3.0&lt;/a>, and &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v2.3.1">v2.3.1&lt;/a> harden the arbiter layer; &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v2.4.0">v2.4.0&lt;/a>, &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v2.5.0">v2.5.0&lt;/a>, and &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v2.6.0">v2.6.0&lt;/a> add self-custody surfaces and world-wide community routing; &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v2.7.0">v2.7.0&lt;/a>, &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v2.8.0">v2.8.0&lt;/a>, &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v2.9.0">v2.9.0&lt;/a>, and &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v2.10.0">v2.10.0&lt;/a> layer in plain-English key copy, group applications, dispute-deadline arbitration, and reputation. &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v3.0.0">v3.0.0&lt;/a> ties the package together with end-to-end trade notifications, and &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v3.1.0">v3.1.0&lt;/a> on June 9 redraws the trade screen around a Reserved → Locked → Settled progress spine, role-colored action cards, and a per-seller storefront listing class (curated swaps, loanbooks, and bills) that ships sats commerce without BTCPay or Zaprite.&lt;/p>
&lt;p>The architectural pivot lives in v2.0.0. The escrow LOCK format changed so each share of a 2-of-3 Shamir split is encrypted only to its holder (sharePolicy &lt;code>holder-only-v1&lt;/code>). The federation&amp;rsquo;s bearer ecash no longer reconstructs from a single participant alone, closing a path where a malicious party with both their own share and a federation-held share could complete the trade without consent. Pre-2.0 clients fail loudly with &amp;ldquo;can&amp;rsquo;t find your share&amp;rdquo;; the trade cannot complete on a stale client, and no funds are lost in the process. A v2.0 lock requires every party on v2.x to settle. v2.0.0 also added multi-unit storefronts and a sats-only Market view.&lt;/p>
&lt;p>v2.1.0 introduced arbiter substitution: the arbiter share at Shamir index 2 is now encrypted to a deterministic priority order over the community arbiter pool, so an absent arbiter can be replaced without stranding the trade. v2.2.0 proved the substitution worked in the wild on a ₿121 trade and added healing-substitution backups. v2.3.0 closed the last arbiter front-running gap by checking listing-arbiter community membership at lock time, and v2.3.1 closed the sibling race where an auto-assigned arbiter slot was a preview until the lock seated them.&lt;/p>
&lt;p>The self-custody surfaces arrived in v2.4.0 (BIP-39 recovery phrase for the Fedimint ecash wallet, stored encrypted on Nostr) and v2.5.0 (master nsec backup that owns the Nostr identity and the wallet seed). v2.6.0 reworked onboarding around a global community picker so users in countries without a local Chama get routed to the closest federation; earlier builds bounced the user with no fallback. v2.7.0 rewrote the recovery-key screen in plain English (&amp;ldquo;the only key to your account and the money in it; Chama never sees it and can&amp;rsquo;t reset it; if you lose it, no one can get your account back&amp;rdquo;). v2.8.0 added group applications, dark/light theming, and added two new event kinds (38120 roster, 38121 application). v2.9.0 changed dispute resolution at deadline: contested trades that hit their expiry now resolve by arbiter ruling; previous behavior auto-refunded. The release is marked COORDINATED so all parties in a dispute must update. v2.10.0 added per-trade thumb-up/thumb-down ratings as a new event kind 38123.&lt;/p>
&lt;p>v3.0.0 is the milestone where the app stops needing a coordinating community to operate. End-to-end trade notifications ping the user only on actionable state transitions: counterparty locked the sats, payout ready to claim, dispute requires the user&amp;rsquo;s ruling as arbiter, or trade settled or expired. One toggle in the Me screen turns notifications on or off, and the permission prompt fires only when the toggle is enabled. The fire-once dedup keeps a state reload from triggering an alert storm. A wrong-chama guardrail bug was also closed in &lt;a href="https://github.com/jesuspirate/chama/pull/103">PR #103&lt;/a>, where earlier versions could stamp a listing with one chama&amp;rsquo;s label but another chama&amp;rsquo;s federation. Windows and Linux desktop bundles ship with the release; the macOS dmg is held back until signing and notarization land.&lt;/p>
&lt;p>Chama now joins Mostro and Shopstr as a Nostr-native marketplace, distinguished by serverless architecture, Fedimint-backed 2-of-3 Shamir escrow, holder-only share encryption, and the only one of the three that ships a self-contained desktop and mobile client without a coordinating community.&lt;/p>
&lt;h3 id="coracle-hosting-paid-relay-service-plus-open-source-caravel-stack">Coracle Hosting: paid relay service plus open-source Caravel stack&lt;/h3>
&lt;p>On June 3 Hodlbod &lt;a href="https://nos.lol/e/f8586160cd12df479c261397353c99e6f3e4d870b616382e1b4338bad3ab498a">announced Coracle Hosting&lt;/a> at &lt;a href="https://hosting.coracle.social">hosting.coracle.social&lt;/a>, a hosted community-relay service that accepts recurring lightning payments over NWC or card. The service is powered by &lt;a href="https://gitea.coracle.social/coracle/caravel">Caravel&lt;/a>, Coracle&amp;rsquo;s billing and provisioning frontend, and &lt;a href="https://gitea.coracle.social/coracle/zooid">zooid&lt;/a>, a relay runtime that hosts many virtual relays on a single machine. Both are open source on Coracle&amp;rsquo;s self-hosted gitea. Caravel ships with optional &lt;a href="https://livekit.io">livekit&lt;/a> and &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> integration that operators can toggle per relay. A free tier with member-count limits lets operators evaluate the service before committing payment details.&lt;/p>
&lt;p>Hodlbod is candid about the business model: monetize open source by selling a hosted version of a stack that anyone else can also run. The competitive moat is the &lt;a href="https://flotilla.social">Flotilla&lt;/a> integration, which is the next planned step. Flotilla owns the user surface, so the hosted option served from inside Flotilla becomes the default path for any user who prefers managed infrastructure. Hodlbod offered to add other Caravel operators to Flotilla&amp;rsquo;s alternative-hosting picker if they reach out, keeping the door open to a federated hosting market.&lt;/p>
&lt;p>Caravel joins &lt;a href="https://relay.tools">relay.tools&lt;/a> as a public Nostr relay-provisioning platform with paid member tiers. relay.tools predates Caravel and ships as the dominant relay-creator service today, with its own directory of community relays and paid-member or moderator join flows. Caravel&amp;rsquo;s distinguishing feature is the coordinated stack: the relay runtime (zooid), the billing and provisioning frontend (Caravel itself), and the client-side picker (Flotilla integration, still in flight) ship as one design. The other distinguishing feature is zooid&amp;rsquo;s many-relays-per-process density, where customer relays share a single host process so the operator amortizes hosting costs across many small communities. This is the same density argument that made shared web hosting viable in the early 2000s, applied to Nostr&amp;rsquo;s relay layer.&lt;/p>
&lt;h2 id="releases">Releases&lt;/h2>
&lt;h3 id="angor-v0229-and-v0230-mainnet-default-and-3-user-uat-funding-test">Angor v0.2.29 and v0.2.30: mainnet default and 3-user UAT funding test&lt;/h3>
&lt;p>&lt;a href="https://github.com/block-core/angor/releases/tag/v0.2.29">Angor v0.2.29&lt;/a> on June 4 and &lt;a href="https://github.com/block-core/angor/releases/tag/v0.2.30">v0.2.30&lt;/a> on June 8 are the two releases this week for the decentralized Bitcoin-and-Nostr funding protocol. v0.2.30&amp;rsquo;s headline change is &lt;a href="https://github.com/block-core/angor/pull/893">PR #893&lt;/a>, which flips the default network to mainnet. Angor still ships as an unstable alpha release, but the default-mainnet switch signals the protocol is past the testnet-only phase for the desktop and mobile clients. v0.2.30 also lands a single-tap mobile create-project flow with image upload and scroll reset (&lt;a href="https://github.com/block-core/angor/pull/889">PR #889&lt;/a>) and resolves a race condition where the lightning invoice spinner could hang (&lt;a href="https://github.com/block-core/angor/pull/890">PR #890&lt;/a>).&lt;/p>
&lt;p>v0.2.29 added an end-to-end UAT test in &lt;a href="https://github.com/block-core/angor/pull/881">PR #881&lt;/a> covering 3-user send funds over 10 rounds with unconfirmed spends, the first multi-user funding-flow test in the Angor test suite. The release also added an implementation plan for an Angor CLI and MCP server (&lt;a href="https://github.com/block-core/angor/pull/792">PR #792&lt;/a>), with CLI improvements for MCP testing workflow in &lt;a href="https://github.com/block-core/angor/pull/880">PR #880&lt;/a>. &lt;a href="https://github.com/block-core/angor/pull/885">PR #885&lt;/a> by DavidGershony fixed a Boltz lightning invoice that used the wrong network after a runtime network switch, a bug that would have surfaced in production after the v0.2.30 mainnet default. Settings now offer an optional recovery-wallet file purge during data wipe (&lt;a href="https://github.com/block-core/angor/pull/883">PR #883&lt;/a>).&lt;/p>
&lt;h3 id="sprout-v0315-ephemeral-channel-ttl-refresh-and-acp-slash-commands">Sprout v0.3.15: ephemeral channel TTL refresh and ACP slash commands&lt;/h3>
&lt;p>&lt;a href="https://github.com/block/sprout/releases/tag/v0.3.15">Sprout v0.3.15&lt;/a>, released June 10, is the eighth release in a run that started with v0.3.7 on June 2. Newsletter #25 covered the v0.3.1 through v0.3.6 run with the mesh-llm integration and channel sections work; v0.3.7 through v0.3.15 are downstream of that, focused on polish and a few user-facing additions. The most user-visible change is a TTL refresh for ephemeral channels in &lt;a href="https://github.com/block/sprout/pull/902">PR #902&lt;/a>: when a user unarchives an ephemeral channel, Sprout extends the channel&amp;rsquo;s time-to-live so the unarchive does not immediately re-archive under the original expiry timer. Mobile custom emojis arrive in &lt;a href="https://github.com/block/sprout/pull/906">PR #906&lt;/a> alongside a settings redesign, and reaction counts now animate on change (&lt;a href="https://github.com/block/sprout/pull/904">PR #904&lt;/a>).&lt;/p>
&lt;p>&lt;a href="https://github.com/block/sprout/pull/905">PR #905&lt;/a> fixes a long-standing gap where multi-word display names broke and &lt;a href="https://github.com/nostr-protocol/nips/blob/master/27.md">NIP-27&lt;/a> &lt;code>nostr:npub&lt;/code> mention extraction silently dropped. A directory-backed team UI for desktop ships in &lt;a href="https://github.com/block/sprout/pull/912">PR #912&lt;/a> with install, sync, and reveal commands. Slash commands now pass through to &lt;a href="https://agentclientprotocol.com">ACP&lt;/a> connectors in &lt;a href="https://github.com/block/sprout/pull/919">PR #919&lt;/a>, letting Sprout forward &lt;code>/help&lt;/code>-style commands directly to agent runtimes while the Sprout UI stays out of the path.&lt;/p>
&lt;h3 id="wisp-v111-spark-wallet-integration-and-nsec-paste-guard">Wisp v1.1.1: Spark wallet integration and nsec paste guard&lt;/h3>
&lt;p>&lt;a href="https://github.com/barrydeen/wisp/releases/tag/v1.1.1">Wisp v1.1.1&lt;/a>, released June 5, lands a two-tier wallet Connect screen with &lt;a href="https://www.spark.money">Spark&lt;/a> sub-screen in &lt;a href="https://github.com/barrydeen/wisp/pull/548">PR #548&lt;/a> and dashboard parity with the iOS wallet UI in &lt;a href="https://github.com/barrydeen/wisp/pull/549">PR #549&lt;/a>. The release includes a system-wide &lt;a href="https://github.com/barrydeen/wisp/pull/553">nsec paste guard&lt;/a> that detects an &lt;code>nsec1&lt;/code>-prefixed paste anywhere in the app and blocks the field from accepting it, closing one of the most-cited footguns in Nostr UX. QR-scan login plus a watch-only mode for &lt;code>npub&lt;/code> and &lt;code>nprofile&lt;/code> ships in &lt;a href="https://github.com/barrydeen/wisp/pull/552">PR #552&lt;/a>, letting a user browse a profile read-only. Zap messages now render as mini-posts in the engagement drawer (&lt;a href="https://github.com/barrydeen/wisp/pull/559">PR #559&lt;/a>) so zap notes carry their text alongside the sat amount. A web-of-trust filter on thread replies lands in &lt;a href="https://github.com/barrydeen/wisp/pull/583">PR #583&lt;/a>, letting users hide reply spam from accounts outside their follow graph.&lt;/p>
&lt;h3 id="nostria-v3146-and-nospeak-113-notification-rework-and-ice-restart">Nostria v3.1.46 and nospeak 1.1.3: notification rework and ICE restart&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostria-app/nostria/releases/tag/v3.1.46">Nostria v3.1.46&lt;/a> on June 7 ends a three-release run that reworked the notification counter to count only new notifications since the last view, eliminating a long-standing inflation where loading older notifications by scrolling bumped the badge count. &lt;a href="https://github.com/nostria-app/nostria/releases/tag/v3.1.45">Nostria v3.1.45&lt;/a> fixed a split-payment bug affecting lightning and QR-code payments and dropped a previously planned translucent UI as unviable on Android&amp;rsquo;s compositor.&lt;/p>
&lt;p>&lt;a href="https://github.com/psic4t/nospeak/releases/tag/v1.1.3">nospeak v1.1.3&lt;/a> on June 4 adds ICE restart on FAILED state for 1-on-1 voice calls. Standard WebRTC behavior drops a call when ICE candidates time out without an alternative path; the ICE-restart path renegotiates candidates so the call recovers from transient NAT or network changes. Android calls now keep the screen on during video calls.&lt;/p>
&lt;h2 id="unreleased-changes">Unreleased changes&lt;/h2>
&lt;h3 id="amethyst-41-prs-continuing-the-nip-32--nip-f4--tor-track">Amethyst: 41 PRs continuing the NIP-32 / NIP-F4 / Tor track&lt;/h3>
&lt;p>Amethyst merged 41 PRs this week without cutting a release tag, on top of last week&amp;rsquo;s 52 PRs and the &lt;a href="https://nostrcompass.org/en/topics/nip-32/">NIP-32&lt;/a> hashtag labeling and &lt;a href="https://nostrcompass.org/en/topics/nip-f4/">NIP-F4&lt;/a> podcast work covered in Newsletter #25. The active branch continues to accumulate features for the next tagged release, layering polish onto last week&amp;rsquo;s headline additions: hashtag labeler discovery, podcast screen, music tracks and playlists, Tor self-heal watchdog, ephemeral signers for anonymous uploads, and onchain zaps with NIP-05 filtering. Amethyst&amp;rsquo;s PR throughput remains the highest of any Nostr client, and the unreleased queue is the de-facto roadmap for what other Android Nostr clients will need to match.&lt;/p>
&lt;h3 id="damus-relay-tracking-from-ok-messages-and-v117-changelog">Damus: relay tracking from OK messages and v1.17 changelog&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/damus/pull/3786">Damus PR #3786&lt;/a>, merged June 3, adds successful &lt;code>OK&lt;/code> messages from a relay to the post-relay list. Earlier Damus builds populated the seen-relays list only when receiving a generic message from the relay, which meant a relay that acknowledged the post but delivered no events back was invisible to the user. The change matters for users who want to confirm their post landed on their preferred outbox relay. &lt;a href="https://github.com/damus-io/damus/pull/3796">PR #3796&lt;/a> fixes an &lt;code>AttributeGraph&lt;/code> cycle on Profile View, and &lt;a href="https://github.com/damus-io/damus/pull/3725">PR #3725&lt;/a> lands the v1.17 changelog ahead of the next tagged release.&lt;/p>
&lt;h3 id="shopstr-nip-34-dual-publishing">Shopstr: NIP-34 dual-publishing&lt;/h3>
&lt;p>Shopstr&amp;rsquo;s &lt;a href="https://relay.ngit.dev/npub1u350hpq840naxzkkle4gmdtvzanfxmjd9m9tytn5355aua7jh2cqgfuw39/shopstr.git">shopstr repo on ngit&lt;/a> was announced on Nostr this week as a &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> git repo, joining ngit&amp;rsquo;s tracked repos. The shop client&amp;rsquo;s GitHub repo remains the primary development surface; the NIP-34 announcement makes a parallel git-over-Nostr collaboration path available. This is the second major Nostr marketplace project to dual-publish to NIP-34 after &lt;a href="https://relay.ngit.dev/">Mostro&lt;/a>, and continues the gradual migration of project metadata onto Nostr&amp;rsquo;s git transport.&lt;/p>
&lt;h3 id="hermes-marmot-ai-agent-gateway-over-mls">Hermes-Marmot: AI agent gateway over MLS&lt;/h3>
&lt;p>&lt;a href="https://github.com/notmandatory/hermes-marmot">hermes-marmot&lt;/a>, a plugin for the &lt;a href="https://github.com/NousResearch/hermes-agent">Hermes Agent&lt;/a>, connects an AI agent&amp;rsquo;s messaging surface to &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> (MLS-over-Nostr) groups using &lt;a href="https://github.com/marmot-protocol/mdk-python">mdk-python&lt;/a>, the Python bindings to the Rust Marmot Development Kit. The plugin lets a user DM an AI agent from any Nostr client that speaks kind 445 MLS messages, including &lt;a href="https://whitenoise.chat">Whitenoise&lt;/a>. Inbound DMs use &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> gift-wrap unwrapping via &lt;a href="https://github.com/rust-nostr/nostr">nostr-sdk&lt;/a> Python bindings, and inbound welcomes flow through &lt;code>UnwrappedGift.from_gift_wrap&lt;/code> to &lt;code>mdk.process_welcome&lt;/code> and &lt;code>mdk.accept_welcome&lt;/code>. Access control runs through &lt;code>MARMOT_ALLOWED_USERS&lt;/code> (a comma-separated npub allowlist) or &lt;code>MARMOT_ALLOW_ALL_USERS=true&lt;/code> for open dev access.&lt;/p>
&lt;p>The repo is new (last updated May 27) and small. Its significance is architectural: it is the first public bridge between an LLM agent runtime and an MLS-encrypted Nostr messaging channel, and the first production use of mdk-python beyond Whitenoise itself. The pattern points toward agent-to-agent communication where both endpoints hold MLS keys and the relay sees only ciphertext.&lt;/p>
&lt;h2 id="nip-updates-and-protocol-spec-work">NIP updates and protocol spec work&lt;/h2>
&lt;h3 id="nip-67-eose-completeness-hint-pr-2317-merged">NIP-67 EOSE completeness hint (PR #2317) merged&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2317">PR #2317&lt;/a> by mattn merged on June 6, adding &lt;a href="https://nostrcompass.org/en/topics/nip-67/">NIP-67&lt;/a> to the protocol. The NIP extends the &lt;code>EOSE&lt;/code> relay message with an optional third element: &lt;code>[&amp;quot;EOSE&amp;quot;, &amp;lt;subscription_id&amp;gt;, &amp;quot;finish&amp;quot;]&lt;/code> signals that every stored event matching the filter has been delivered, while a bare &lt;code>[&amp;quot;EOSE&amp;quot;, &amp;lt;subscription_id&amp;gt;]&lt;/code> carries no completeness claim. A relay that omits the hint is telling the client there may be more; a relay that omits the NIP-67 advertisement in NIP-11 keeps today&amp;rsquo;s behavior under the existing legacy heuristic. The change is backward compatible in both directions: legacy clients ignore the trailing array element, and legacy relays omit it.&lt;/p>
&lt;p>The motivation in the merged spec is two-fold. First, silent data loss: a client asks for the last 500 notes against a relay with a 300-event internal cap, the relay returns 300 events, and the client (using the standard &lt;code>received &amp;lt; limit&lt;/code> heuristic) concludes the result is complete. The 201st through Nth oldest matching notes stay on the relay unread, with the client blind to that fact. Second, mandatory wasted round trips: when a relay caps responses at 300 events, any subscription that exhausts the cap requires a second &lt;code>REQ&lt;/code> with &lt;code>until=&amp;lt;oldest_created_at&amp;gt;&lt;/code> purely to confirm completion, even when the filter happens to match exactly 300 events. Both failure modes are paid by every client on every cap-exhausted subscription. The &lt;code>&amp;quot;finish&amp;quot;&lt;/code> hint is one optional string on one existing message and eliminates both costs.&lt;/p>
&lt;h3 id="nip-50-autocomplete-extension-pr-2357-merged">NIP-50 autocomplete extension (PR #2357) merged&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2357">PR #2357&lt;/a> by Alex Gleason merged on June 6, adding an &lt;code>autocomplete:true/false&lt;/code> token to &lt;a href="https://nostrcompass.org/en/topics/nip-50/">NIP-50&lt;/a> search. The extension lets a client mark a query as a typeahead lookup so the relay uses prefix matching, with full-text search as the default for queries without the token. Ditto&amp;rsquo;s relay implements it for follow packs, lists, and any event with a &lt;code>title&lt;/code> tag, returning matches against the title prefix; the default search path runs full-text scoring. Without this token, autocomplete-style UIs had no way to communicate the prefix-search intent and relays had to guess from query shape. The token is a per-search hint, not a relay-wide capability, so a relay can implement it for one event class (titles) without claiming general autocomplete support.&lt;/p>
&lt;h3 id="nip-gart-emergency-alerts-and-location-broadcasts-pr-2374">NIP-GART emergency alerts and location broadcasts (PR #2374)&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2374">PR #2374&lt;/a> by disinqa, opened June 9, defines a privacy-preserving wire format on Nostr for emergency alerts and location broadcasts addressed to a group of trusted recipients. The stated design goal is hiding sender identity, group membership, and payload from relay operators while keeping the events replay-safe and signature-verifiable end to end. NIP number is still TBD, proposal is early-draft. Use case is the standard emergency-alert pattern: a user under threat broadcasts a location ping that only a pre-shared group of trusted contacts can decrypt, with the relay blind to sender, recipient set, and payload. Wire-format details live in the PR and will likely evolve as maintainers review.&lt;/p>
&lt;h3 id="nip-46-logout-method-pr-2373">NIP-46 logout method (PR #2373)&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2373">PR #2373&lt;/a> by hzrd149, opened June 8, adds a &lt;code>logout&lt;/code> method to &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> so a client can tell a bunker explicitly that the session is ended. Until now, the only way to end a bunker session was to wait for the session timeout or stop using the connection, both of which leave the bunker holding session state for a client that is gone. The proposal is short (one new method) and is the kind of housekeeping change that makes long-lived bunker integrations cleaner.&lt;/p>
&lt;h3 id="nip-95-hybrid-relay-p2p-proposal-circulated-as-long-form">NIP-95 hybrid relay-P2P proposal circulated as long-form&lt;/h3>
&lt;p>A long-form &lt;a href="https://github.com/nostr-protocol/nips">NIP-95 specification&lt;/a> circulated as a &lt;code>kind:30023&lt;/code> post from npub &lt;code>91bea5cd9361504c409aaf459516988f68a2fcd482762fd969a7cdc71df4451c&lt;/code> on June 4 under the title &lt;em>Protocolo Híbrido Relay-P2P via WebRTC&lt;/em>. The Portuguese-language document defines a hybrid peer-to-peer relay protocol where Nostr clients connect to each other directly via WebRTC for live messaging while continuing to use relays for stored-event retrieval and offline delivery. The author explicitly framed the spec as &amp;ldquo;LLM-ready,&amp;rdquo; providing message definitions, logical flows, data schemas, and state rules at a level of detail that lets an AI model generate working client or server code. The proposal has not yet landed as a NIP PR; circulation via &lt;code>kind:30023&lt;/code> is the customary precursor to a formal nostr-protocol/nips pull request.&lt;/p>
&lt;h3 id="nip-44-v3-picks-up-a-second-signer-clave-ports-the-spec">NIP-44 v3 picks up a second signer: Clave ports the spec&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/newsletters/2026-06-03-newsletter/#nip-44-v3-amber-implementation-ahead-of-spec">Amber&amp;rsquo;s v6.2.0 NIP-44 v3 rollout from last week&lt;/a> shipped ahead of any merged NIPs PR, leaving v3 as an Amber-specific extension that other clients had to mirror to interop. That single-implementation framing changed this week. &lt;a href="https://github.com/DocNR/clave">Clave&lt;/a>, the push-based iOS NIP-46 remote signer, landed an independent NIP-44 v3 port on June 3 and 4 across eight commits. Cryptographic primitives ship in three commits: &lt;a href="https://github.com/DocNR/clave/commit/99ca5a5aacb501d1666c489fcdea30187c7853fa">HKDF + ECDH keys layer&lt;/a>, &lt;a href="https://github.com/DocNR/clave/commit/8808cdca54d32b4ae57856bd4b07ed73a45e8e5c">the v3 padding algorithm&lt;/a>, and a &lt;a href="https://github.com/DocNR/clave/commit/ae1f506a53cb2c8aa16523540dbe790876c1839e">top-level public API plus encryption Context&lt;/a>. On top of those, the NIP-46 surface follows in &lt;a href="https://github.com/DocNR/clave/commit/f37aa1afc8368862fc3ebac533408442349bfc38">RPC dispatch wiring inside LightSigner&lt;/a> and a &lt;a href="https://github.com/DocNR/clave/commit/e51bcb49fc61cfa89b6030d61b203e046aeddb0a">PendingRequest schema that carries the v3 context (kind plus scope)&lt;/a>, so the signer can record which event kind and use case the v3 payload was approved for.&lt;/p>
&lt;p>Clave diverges from Amber on the user-facing surface. A &lt;a href="https://github.com/DocNR/clave/commit/0a8b7de63c1f2994a80a66bf139ec519fab12877">permission grant schema with sensitivity tiers&lt;/a> lets users grant v3 encryption for a particular event kind and scope at a chosen sensitivity level. On first encounter, &lt;a href="https://github.com/DocNR/clave/commit/2cf563cb15b0406f5e8aaa0b4e34b887ff1896a1">v3-context-aware approval prompts with a one-time explainer card&lt;/a> introduce v3 to users. The work is in main and is &lt;a href="https://github.com/DocNR/clave/commit/4bd0c26d7cf308386ef15e5d96ee5673d6db2d4a">wired into the Xcode project&lt;/a> but is unreleased; the most recent tagged build is &lt;a href="https://github.com/DocNR/clave/releases/tag/v0.2.0-build79">v0.2.0-build79&lt;/a> from May 12.&lt;/p>
&lt;p>Two independent implementations land NIP-44 v3 in production paths before the NIPs PR merges, which strengthens the case for the underlying wire format the protocol PR will formalize. Cross-implementation interop testing now becomes the path to spec convergence, with Amber&amp;rsquo;s Android approval surface and Clave&amp;rsquo;s iOS sensitivity-tier model as the two reference points. Other remote signers wiring v3 (nsec.app&amp;rsquo;s noauth has been dormant since May 2025, and other bunkers have not announced v3 work) would tighten the consensus further.&lt;/p>
&lt;h3 id="nip-34-activity-iris-adopts-the-stack-with-a-new-hashtree-transport">NIP-34 activity: Iris adopts the stack with a new hashtree transport&lt;/h3>
&lt;p>Iris published NIP-34 repo announcements for &lt;a href="https://njump.me/nevent1qqs8kmy7a9dn5awurlp9q26lsaetl7dc4wauzdl8ww68dzmn09e074gpzfmhxue69uhhgetdwqhxjunfwvh8gmc850du0">&lt;code>hashtree&lt;/code>&lt;/a> on June 8 and &lt;a href="https://njump.me/nevent1qqsq4grx000f6p0r8hdv4lqhcgn7707vmktv2j528kn0ldps4y9g49qpzfmhxue69uhhgetdwqhxjunfwvh8gmcmq47as">&lt;code>iris-apps&lt;/code>&lt;/a>, &lt;a href="https://njump.me/nevent1qqsyj5r0tyqvpp9v7qnras90u6kzqtpqx6ktntwym66m8qyngvf59vqpzfmhxue69uhhgetdwqhxjunfwvh8gmcpts6pf">&lt;code>iris-drive&lt;/code>&lt;/a>, and &lt;a href="https://njump.me/nevent1qqs0x98hpsv8vmrxvwm2rs9exxttrue5qv5p2n2sqjeylz2kgdmd7tgpzfmhxue69uhhgetdwqhxjunfwvh8gmca8783s">&lt;code>iris-chat-rs&lt;/code>&lt;/a> on June 9, advertising clone URLs under a new &lt;code>htree://&lt;/code> scheme served from &lt;code>wss://temp.iris.to&lt;/code>. The hashtree transport is a content-addressed alternative to GRASP-routed clones, and these four announcements are its first public uses. The repos carry empty descriptions and the architectural details are still emerging, but the choice to publish via NIP-34 announcement (over a custom Iris-internal manifest) signals Iris is committing to the broader NIP-34 git-over-Nostr stack.&lt;/p>
&lt;h2 id="nip-deep-dive-nip-67-eose-completeness-hint">NIP deep dive: NIP-67 (EOSE Completeness Hint)&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-67/">NIP-67&lt;/a> closes one of the longest-standing correctness gaps in &lt;a href="https://nostrcompass.org/en/topics/nip-01/">NIP-01&lt;/a>. The original spec defines &lt;code>EOSE&lt;/code> as the boundary between stored events and live subscription events for a &lt;code>REQ&lt;/code>, but it never specified whether the relay had finished delivering all stored matches or had stopped partway because of an internal cap. Every relay enforces a per-subscription cap (commonly 300 to 1000 events) independent of the client&amp;rsquo;s &lt;code>limit&lt;/code>, and clients have had no way to observe that cap.&lt;/p>
&lt;p>The standard workaround was to compare the received count against the requested &lt;code>limit&lt;/code>. If &lt;code>received &amp;lt; limit&lt;/code>, treat the result as complete; otherwise paginate with &lt;code>until=&amp;lt;oldest_created_at&amp;gt;&lt;/code>. Both branches are broken. The &lt;code>received &amp;lt; limit&lt;/code> branch silently truncates: a client asking for 500 notes against a relay capped at 300 sees 300 events, concludes the result is complete because &lt;code>300 &amp;lt; 500&lt;/code>, and never fetches the rest. Held events on the relay cannot signal &amp;ldquo;more available&amp;rdquo; through any existing message. Pagination as the second branch is wasteful: a filter that matches exactly the cap requires a second &lt;code>REQ&lt;/code> to confirm completeness, returning zero events while consuming a full filter scan on the relay.&lt;/p>
&lt;p>NIP-67&amp;rsquo;s fix is one optional string on the &lt;code>EOSE&lt;/code> message:&lt;/p>
&lt;pre tabindex="0">&lt;code>[&amp;#34;EOSE&amp;#34;, &amp;#34;&amp;lt;sub_id&amp;gt;&amp;#34;, &amp;#34;finish&amp;#34;] // explicit: all stored events delivered
[&amp;#34;EOSE&amp;#34;, &amp;#34;&amp;lt;sub_id&amp;gt;&amp;#34;] // no completeness claim
&lt;/code>&lt;/pre>&lt;p>A relay that advertises NIP-67 in &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> &lt;code>supported_nips&lt;/code> and emits a bare &lt;code>EOSE&lt;/code> is telling the client there is more. A relay that omits the advertisement keeps today&amp;rsquo;s behavior, and the client falls back to the existing heuristic. Legacy clients ignore the trailing array element. Backward compatibility holds in both directions, with no new verbs or event kinds.&lt;/p>
&lt;p>What makes NIP-67 worth examining is the scope it deliberately restricts. The spec defines no cursor or pagination token, so &lt;code>until&lt;/code>-based pagination remains the mechanism. Relay caps stay where they are, and the NIP requires no exposure of them. NIP-67 preserves the meaning of &lt;code>EOSE&lt;/code> as the stored-to-live boundary and only adds a yes-or-no signal at the boundary: &amp;ldquo;I have more for you&amp;rdquo; versus &amp;ldquo;that&amp;rsquo;s everything.&amp;rdquo; This minimal surface is why the PR merged after a relatively short review period for a NIP-01 extension, and why mattn explicitly notes in the PR that AI translation was used for the English text. The change is small enough that the translation uncertainty does not matter.&lt;/p>
&lt;p>Example NIP-67-aware exchange between a client and a cap-enforcing relay. NIP-11 advertisement from the relay:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;a5f87fe2d4c8b9a0e3f1c4d5e6a7b8c9d0e1f2a3b4c5d6e7f8091a2b3c4d5e6f&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1781136000&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">11&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;{\&amp;#34;supported_nips\&amp;#34;:[1,11,50,67]}&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;f1e2d3c4b5a6978869504132c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f80192a3b4c5d6e7f80192a3b4c5d6e7f80192a3b4c5d6e7f80192a3b4c5d6e7f80192a3b4c5&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The wire-level exchange that follows:&lt;/p>
&lt;pre tabindex="0">&lt;code>→ [&amp;#34;REQ&amp;#34;, &amp;#34;abc&amp;#34;, {&amp;#34;kinds&amp;#34;:[1],&amp;#34;limit&amp;#34;:500}]
← [...300 EVENT messages...]
← [&amp;#34;EOSE&amp;#34;, &amp;#34;abc&amp;#34;] // no &amp;#34;finish&amp;#34;: cap hit, more available
→ [&amp;#34;REQ&amp;#34;, &amp;#34;def&amp;#34;, {&amp;#34;kinds&amp;#34;:[1],&amp;#34;limit&amp;#34;:300,&amp;#34;until&amp;#34;:1780900000}]
← [...178 EVENT messages...]
← [&amp;#34;EOSE&amp;#34;, &amp;#34;def&amp;#34;, &amp;#34;finish&amp;#34;] // explicit complete
&lt;/code>&lt;/pre>&lt;p>The 178-event response would previously have triggered a third &lt;code>REQ&lt;/code> to confirm completion. With NIP-67 the client stops there.&lt;/p>
&lt;p>NIP-67 is also notable as a NIP-01 amendment landing with rare consensus. Most NIP-01 changes attract long debate threads because the protocol&amp;rsquo;s tiny surface is load-bearing for every implementation. NIP-67 merged after an extended review period (roughly seven weeks from open to merge), suggesting that when a NIP-01 change is small enough and the failure mode is concrete enough (silent data loss, mandatory wasted round trip), the protocol&amp;rsquo;s maintainers are willing to extend the core message vocabulary.&lt;/p>
&lt;h2 id="nip-deep-dive-nip-50-search">NIP deep dive: NIP-50 (Search)&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-50/">NIP-50&lt;/a> defines the &lt;code>search&lt;/code> filter field in &lt;code>REQ&lt;/code> messages, letting clients ask a relay to filter events by full-text match against a query string. The merged base spec is deliberately minimal: the &lt;code>search&lt;/code> field is a string, each relay decides its own search semantics (which fields are indexed, how scoring works, whether stemming applies), and relays advertise NIP-50 support in their NIP-11 document. Clients control the search algorithm only through the query string itself.&lt;/p>
&lt;p>This minimalism is both NIP-50&amp;rsquo;s strength and its constraint. The strength is that any relay can implement search at any quality level: a basic substring scan satisfies the spec, and a relay running Elasticsearch or Meilisearch satisfies it equally. The constraint is that clients lack a way to express search intent. A profile-mention typeahead UI wants prefix matching against display names; a full-text content search wants tokenized full-text scoring across the note body. The same &lt;code>search&lt;/code> field carries both, and the relay must guess from query shape.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2357">PR #2357&lt;/a> adds the first NIP-50 extension token: &lt;code>autocomplete:true&lt;/code> or &lt;code>autocomplete:false&lt;/code> embedded in the search query signals which mode the client wants. Ditto&amp;rsquo;s relay implements the token for follow packs, lists, and any event with a &lt;code>title&lt;/code> tag, switching to prefix matching when &lt;code>autocomplete:true&lt;/code> is present. The token lives inline in the query (separate filter fields stay untouched), so it travels with the search string and requires no wire-protocol bump:&lt;/p>
&lt;pre tabindex="0">&lt;code>search: &amp;#34;fiat autocomplete:true&amp;#34;
&lt;/code>&lt;/pre>&lt;p>Token-shaped hints like this are how NIP-50 has always handled relay-specific dialects. Relays already supported tokens like &lt;code>language:en&lt;/code> and &lt;code>domain:example.com&lt;/code>. Each remains relay-specific, with each relay documenting its own dialect. NIP-50&amp;rsquo;s PR #2357 elevates &lt;code>autocomplete&lt;/code> from a relay-private token to a spec-blessed one, paving the way for typeahead-aware search across relays.&lt;/p>
&lt;p>Example NIP-50 &lt;code>REQ&lt;/code> with the autocomplete token, targeting a relay that indexes kind 0 profile titles:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;b7c9d0e1f2a3b4c5d6e7f8091a2b3c4d5e6f7081a2b3c4d5e6f70819a2b3c4d5&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1781136000&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;client&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;example-mention-picker&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Sent search: kinds=[0], search=\&amp;#34;fiat autocomplete:true\&amp;#34;, limit=10&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;12d3e4f5061728394a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8091a2b3c4d5e6f7081a2b3c4d5e6f70819a2b3c4d5e6f7081a2b3c4d5e6f708192&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The actual wire-level REQ:&lt;/p>
&lt;pre tabindex="0">&lt;code>[&amp;#34;REQ&amp;#34;, &amp;#34;mention-picker&amp;#34;, {&amp;#34;kinds&amp;#34;:[0],&amp;#34;search&amp;#34;:&amp;#34;fiat autocomplete:true&amp;#34;,&amp;#34;limit&amp;#34;:10}]
&lt;/code>&lt;/pre>&lt;p>A relay that does not recognize the token treats &lt;code>autocomplete:true&lt;/code> as part of the literal search string and falls back to full-text matching, returning correct (if differently ranked) results. The graceful degradation makes the token safe to include unconditionally for clients that prefer prefix matching when available.&lt;/p>
&lt;p>The next likely NIP-50 extension is per-kind ranking control: a hint that says &amp;ldquo;rank by &lt;code>created_at&lt;/code> descending&amp;rdquo; versus the default relevance score. Several relays already accept &lt;code>sort:newest&lt;/code> as a relay-private token, and the same elevation path that brought &lt;code>autocomplete&lt;/code> into the spec applies. Search remains one of the few Nostr primitives where relays compete on result quality; reliability of delivery is the same across all conforming relays. Incremental tokens let clients exploit that quality competition without forcing relays to ship a heavyweight new spec.&lt;/p></content:encoded></item><item><title>Nostr Compass #25</title><link>https://nostrcompass.org/en/newsletters/2026-06-03-newsletter/</link><pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-06-03-newsletter/</guid><description>&lt;p>Amber 6.2.0 ships NIP-44 v3 encryption ahead of the spec. Mostro lands the foundation for Cashu-settled escrow across eight PRs, wrapping the existing Cashu Development Kit as a second settlement backend alongside Lightning. NIP-F4 podcasts merges after 27 months of debate. fiatjaf opens a contested NIP-17 key-decoupling proposal that re-opens the bunker-versus-Marmot architectural argument. Amethyst lands NIP-32 hashtag labeling, a dedicated podcast screen, and onchain zaps across 52 unreleased PRs.&lt;/p></description><content:encoded>&lt;p>Amber 6.2.0 ships NIP-44 v3 encryption ahead of the spec. Mostro lands the foundation for Cashu-settled escrow across eight PRs, wrapping the existing Cashu Development Kit as a second settlement backend alongside Lightning. NIP-F4 podcasts merges after 27 months of debate. fiatjaf opens a contested NIP-17 key-decoupling proposal that re-opens the bunker-versus-Marmot architectural argument. Amethyst lands NIP-32 hashtag labeling, a dedicated podcast screen, and onchain zaps across 52 unreleased PRs.&lt;/p>
&lt;h2 id="top-stories">Top stories&lt;/h2>
&lt;h3 id="amber-620-nip-44-v3-encryption-shipped">Amber 6.2.0: NIP-44 v3 encryption shipped&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.2.0">Amber v6.2.0&lt;/a>, released June 1, adds &lt;a href="https://github.com/greenart7c3/Amber/pull/448">NIP-44 v3 encryption support&lt;/a> with a dedicated approval screen, intent preview, bunker preview, history logging, and auto-reject for invalid requests. The release also registers &lt;a href="https://github.com/greenart7c3/Amber/commit/8b93340">NIP-44 v3 ContentProvider authorities&lt;/a> so other Android apps can request v3 encryption alongside the existing v2 path. NIP-44 itself is the versioned encrypted payload spec used by &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> private DMs, NIP-46 bunker traffic, and other Nostr primitives; v3 in Amber is an opt-in alongside v2, signaled by a separate signer method so receiver-side clients can negotiate the algorithm explicitly. The corresponding NIPs PR has yet to land, so Amber is rolling out v3 ahead of the protocol consensus, with the wire format and ContentProvider authority registered for downstream client integration.&lt;/p>
&lt;p>NIP-46 sessions now auto-accept ping requests on connect, removing the prompt on the first round trip after pairing. The &lt;code>sign_message&lt;/code> signer method was removed entirely after being deprecated and unused.&lt;/p>
&lt;p>Because Amber is the dominant Android signer, every downstream client that wants v3 has to target Amber&amp;rsquo;s wire format until the NIPs PR lands. That gives Amber implicit say over the final v3 spec until the protocol catches up. The trade is real: v3 in production lets Amber gather implementation feedback for the eventual NIP, at the cost of a temporary single-implementation reference point that other clients now have to match.&lt;/p>
&lt;h3 id="mostro-cashu-escrow-integration-via-cdk">Mostro: Cashu escrow integration via CDK&lt;/h3>
&lt;p>grunch landed eight PRs across MostroP2P this week integrating Cashu&amp;rsquo;s existing P2PK multisig primitives (NUT-10 and NUT-11) as a second settlement backend alongside Lightning on the Nostr-coordinated P2P Bitcoin exchange. The cryptographic primitives are Cashu&amp;rsquo;s; the work is integration scaffolding and a new escrow backend trait. &lt;a href="https://github.com/MostroP2P/mostro-core/releases/tag/v0.12.0">Mostro core v0.12.0&lt;/a>, released May 30, adds the &lt;a href="https://github.com/MostroP2P/mostro-core/pull/150">protocol types for 2-of-3 multisig escrow&lt;/a>, per-proof P_M signatures, and allows escrow events through response validation. The architecture is documented in &lt;a href="https://github.com/MostroP2P/mostro/pull/756">PR #756&lt;/a> and uses per-order trade keys clarified in &lt;a href="https://github.com/MostroP2P/mostro/pull/757">PR #757&lt;/a>.&lt;/p>
&lt;p>The implementation rolled out across six follow-up PRs over a single day. &lt;a href="https://github.com/MostroP2P/mostro/pull/758">F2 (PR #758)&lt;/a> added the config, escrow mode, and conditional boot. The next slice, &lt;a href="https://github.com/MostroP2P/mostro/pull/760">F3 (PR #760)&lt;/a>, defined an &lt;code>EscrowBackend&lt;/code> trait with a Lightning implementation and a Cashu stub, letting Mostro switch settlement backends without changing the order state machine. &lt;a href="https://github.com/MostroP2P/mostro/pull/759">F4 (PR #759)&lt;/a> wrapped &lt;a href="https://github.com/cashubtc/cdk">CDK&lt;/a> (the Cashu Development Kit) for mint and wallet operations. Database work in &lt;a href="https://github.com/MostroP2P/mostro/pull/761">F5 (PR #761)&lt;/a> added compare-and-swap escrow locks and active-locked queries. &lt;a href="https://github.com/MostroP2P/mostro/pull/762">F6 (PR #762)&lt;/a> built a containerized mint in a dedicated CI job for end-to-end escrow testing. The Mostro flow already uses NIP-59 gift-wrapped DMs for order coordination over the relay, so Cashu escrow slots in as a second settlement option alongside Lightning without touching the wire protocol.&lt;/p>
&lt;h2 id="releases">Releases&lt;/h2>
&lt;h3 id="ngit-v250-grasp-fallback-and-lazy-git-fetches">ngit v2.5.0: GRASP fallback and lazy git fetches&lt;/h3>
&lt;p>&lt;a href="https://github.com/DanConwayDev/ngit-cli/releases/tag/v2.5.0">ngit v2.5.0&lt;/a> changes the default behavior of &lt;code>git push pr/&amp;lt;branch&amp;gt;&lt;/code> and &lt;code>ngit send&lt;/code> to produce a PR kind for new proposals when the repository has at least one GRASP server registered. Previously this only triggered for oversized commits over 60 KB or commits containing submodules. When a PR cannot be pushed to the repository&amp;rsquo;s GRASP servers, ngit now falls back to GRASP-06 routing through the declared servers. The &lt;code>ngit send --git-server&lt;/code> flag or &lt;code>git push -o git-server=&amp;lt;url&amp;gt;&lt;/code> lets contributors target a custom git URL or GRASP server explicitly.&lt;/p>
&lt;p>&lt;code>ngit init&lt;/code> republishes now preserve unknown tags from existing announcements, so tags added by a future ngit version or third-party tool survive republish. A yellow warning lists the carried-over tags, and &lt;code>--clean&lt;/code> removes them on demand. &lt;code>ngit pr apply&lt;/code>, &lt;code>ngit pr checkout&lt;/code>, and &lt;code>ngit pr list&lt;/code> consult git servers lazily and share a single fetch helper, so checkout no longer fetches unconditionally when the commit is already local. &lt;code>ngit pr checkout&lt;/code> also tries submitter-supplied clone URLs from the PR event as a fallback when the repo&amp;rsquo;s declared git servers don&amp;rsquo;t carry the PR tip, matching the existing behaviour in &lt;code>ngit pr apply&lt;/code>. ngit is the reference &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> implementation for git collaboration over Nostr, and v2.5.0 makes GRASP the first-class path for new contributors.&lt;/p>
&lt;h3 id="jumble-v2657-exif-stripping-and-validated-zap-counts">Jumble v26.5.7: EXIF stripping and validated zap counts&lt;/h3>
&lt;p>&lt;a href="https://github.com/CodyTseng/jumble/releases/tag/v26.5.7">Jumble v26.5.7&lt;/a> adds two changes that affect user privacy and data integrity directly. EXIF location and camera identifiers are now stripped from image uploads before they leave the client, closing a long-standing metadata-leak surface that affected every image posted from Jumble. Zap counts are now computed only from cryptographically validated receipts, fixing inflated counts from malformed zap events that had let attackers exaggerate zap totals on notes. The release also adds sender-identity verification for &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> DMs, closing a spoofing surface where a sender could forge their &lt;code>pubkey&lt;/code> in the seal.&lt;/p>
&lt;h3 id="nostr-calendar-v160-rsvp-and-duplicate-participant-handling">nostr-calendar v1.6.0: RSVP and duplicate participant handling&lt;/h3>
&lt;p>&lt;a href="https://github.com/formstr-hq/nostr-calendar/releases/tag/v1.6.0">nostr-calendar v1.6.0&lt;/a> lands Formstr&amp;rsquo;s RSVP flow (&lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/169">PR #169&lt;/a>) and prevents duplicate participants in event invites (&lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/168">PR #168&lt;/a>). The &lt;code>waitForAll&lt;/code> option in the publish function now defaults to false so the UI does not block on slow relays (&lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/170">PR #170&lt;/a>). &lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/157">PR #157&lt;/a> shipped Formstr&amp;rsquo;s two NIP proposal drafts for appointment scheduling and reservations.&lt;/p>
&lt;h3 id="sprout-036-sprout--mesh-llm-and-channel-sections">Sprout 0.3.6: Sprout × mesh-llm and channel sections&lt;/h3>
&lt;p>&lt;a href="https://github.com/block/sprout/releases/tag/v0.3.6">Sprout v0.3.6&lt;/a> is the headline of a six-release run from v0.3.1 through v0.3.6 this week. In-process Sprout × mesh-llm integration lands in &lt;a href="https://github.com/block/sprout/pull/798">PR #798&lt;/a>, letting Sprout serve and consume mesh-llm nodes through relay admission. User-defined channel sections sync across devices via Nostr in &lt;a href="https://github.com/block/sprout/pull/792">PR #792&lt;/a>, and channel sections come to mobile with relay sync in &lt;a href="https://github.com/block/sprout/pull/800">PR #800&lt;/a>. Thread-aware notifications with mutable follow and mute controls arrive in &lt;a href="https://github.com/block/sprout/pull/761">PR #761&lt;/a>.&lt;/p>
&lt;p>Arbitrary file-type attachments with download cards arrived in &lt;a href="https://github.com/block/sprout/pull/810">PR #810&lt;/a>, expanding Sprout beyond image-only attachments. Mobile gained a Pulse social feed tab (&lt;a href="https://github.com/block/sprout/pull/772">PR #772&lt;/a>) and Pulse polish across feed, compose, and filter surfaces (&lt;a href="https://github.com/block/sprout/pull/796">PR #796&lt;/a>).&lt;/p>
&lt;h3 id="nostrbotkit-v050-marmot-group-chat-in-a-rust-bot-framework">NostrBotKit v0.5.0: Marmot group chat in a Rust bot framework&lt;/h3>
&lt;p>&lt;a href="https://codeberg.org/Tuxor/NostrBotKit/src/branch/main/CHANGELOG.md">NostrBotKit v0.5.0&lt;/a>, released May 24 on Codeberg, adds &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> (MLS-over-Nostr, &lt;a href="https://github.com/nostr-protocol/nips/pull/2014">NIP-104&lt;/a>) support to the self-hosted Rust bot framework. When &lt;code>marmot: true&lt;/code> is set, the bot publishes its MLS key packages (kind 443, 30443, 10051), accepts group invitations automatically, and listens for messages in joined groups. Two new command types, &lt;code>dm_marmot&lt;/code> and &lt;code>dm_marmot_npub&lt;/code>, let bots send messages into named Marmot groups or 1:1 Marmot chats via cron jobs or webhooks. To prevent feedback loops with other bots, NostrBotKit bots only respond to messages explicitly addressed to them via &lt;code>/command&lt;/code> or &lt;code>@botname/command&lt;/code>. Encrypted attachments using MIP-04 are auto-decrypted and re-uploaded via Blossom or NIP-96, and the MLS state database is encrypted with a key derived from the bot&amp;rsquo;s private key. NostrBotKit is the first Rust framework to ship NIP-104 bot support, opening Marmot-encrypted bot deployment to a different operator profile than the existing TypeScript path.&lt;/p>
&lt;h3 id="noscrypt-v0114-signed-cryptography-library-release">noscrypt v0.1.14: signed cryptography library release&lt;/h3>
&lt;p>&lt;a href="https://github.com/vnuge/noscrypt/releases/tag/v0.1.14">noscrypt v0.1.14&lt;/a> is a security release of the C cryptography library used by several Nostr clients for secp256k1, NIP-04, and NIP-44 primitives. The release ships with &lt;a href="https://www.vaughnnugent.com/resources/software/modules/noscrypt">PGP-signed downloads&lt;/a> verifiable against the maintainer&amp;rsquo;s public key. Downstream clients that bundle noscrypt should validate the signature before integrating.&lt;/p>
&lt;h3 id="chama-v130-new-nostr-native-p2p-escrow-with-fedimint">Chama v1.3.0: new Nostr-native P2P escrow with Fedimint&lt;/h3>
&lt;p>&lt;a href="https://github.com/jesuspirate/chama/releases/tag/v1.3.0">Chama v1.3.0&lt;/a>, released June 1, is the headline of a four-release run for a new Nostr-native P2P escrow client that uses Fedimint ecash and 2-of-3 Shamir secret sharing for settlement. The project ships at &lt;a href="https://getchama.app">getchama.app&lt;/a> and runs without a server. v1.3.0 introduces &amp;ldquo;heal that sticks&amp;rdquo; (successful re-broadcast and trade healing that survives session restarts) and pay-rail matching, where US-leaning Chamas surface US payment rails first. Multi-unit storefront groundwork landed across &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v1.2.11">v1.2.11&lt;/a> (multi-unit schema) and &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v1.2.12">v1.2.12&lt;/a> (storefront stock accountant + native Fedimint bridge recovery hardening). Chama joins Mostro and Shopstr in the Nostr marketplace category, distinguished by its serverless architecture and Fedimint-based escrow settlement.&lt;/p>
&lt;h2 id="unreleased-changes">Unreleased changes&lt;/h2>
&lt;h3 id="amethyst-nip-32-hashtag-labeling-podcast-screen-music-tracks">Amethyst: NIP-32 hashtag labeling, podcast screen, music tracks&lt;/h3>
&lt;p>Amethyst merged 52 PRs and 411 commits this week without cutting a release tag. The largest functional addition is &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3111">PR #3111&lt;/a>, which implements &lt;a href="https://nostrcompass.org/en/topics/nip-32/">NIP-32&lt;/a> hashtag labeling and a label-based hashtag feed using kind 1985 events with &lt;code>L&lt;/code> namespace and &lt;code>l&lt;/code> label tags. This replaces the brittle text-match &lt;code>#tag&lt;/code> mechanism with a labeler-based discovery model where users can follow specific labeler npubs the way they follow content creators. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3105">PR #3105&lt;/a> adds a dedicated podcast screen with episode list and inline player, landing within days of the &lt;a href="https://nostrcompass.org/en/topics/nip-f4/">NIP-F4&lt;/a> podcast spec merge. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3071">PR #3071&lt;/a> adds a Software Apps feed with follow-list filtering, and &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3067">PR #3067&lt;/a> adds music tracks and playlists support via &lt;a href="https://nostrcompass.org/en/topics/nip-51/">NIP-51&lt;/a> sets.&lt;/p>
&lt;p>Ephemeral signers for anonymous post uploads land in &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3123">PR #3123&lt;/a>, letting users post anonymously without exposing their identity key to upload services. A Tor self-heal watchdog with integration tests against Arti v2.3.0 arrives in &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3053">PR #3053&lt;/a>, strengthening Amethyst&amp;rsquo;s Tor routing during transient network outages. Onchain zaps and a NIP-05 filter for returning users from Gemini land in &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3052">PR #3052&lt;/a>, broadening the zap surface beyond Lightning to onchain Bitcoin payments.&lt;/p>
&lt;h3 id="shopstr-opengraph-preview-url-validation">Shopstr: OpenGraph preview URL validation&lt;/h3>
&lt;p>&lt;a href="https://github.com/shopstr-eng/shopstr/pull/504">PR #504&lt;/a> validates OpenGraph preview URLs before rendering them in marketplace listings, closing a potential XSS surface where malicious sellers could embed scripted content via crafted OG metadata. Shopstr-hosted shops display OG previews for external links, and unvalidated URLs let an attacker inject arbitrary content into the shop UI.&lt;/p>
&lt;h2 id="nip-updates-and-protocol-spec-work">NIP updates and protocol spec work&lt;/h2>
&lt;h3 id="nip-f4-podcasts-merged-after-two-years">NIP-F4 (Podcasts) merged after two years&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/1093">PR #1093&lt;/a> merged on May 28, two years and three months after fiatjaf opened the original draft. NIP-F4 defines podcast episodes as kind 54 events with &lt;code>imeta&lt;/code> tags for audio file metadata (URL, mime type, language ISO code, fallback URLs, NIP-96 service flag, bitrate, duration), a &lt;code>title&lt;/code> tag, optional &lt;code>image&lt;/code> and &lt;code>description&lt;/code> tags, and &lt;code>t&lt;/code> tags for topic labels. The spec deliberately keeps RSS as the source of truth: episodes can carry an &lt;code>i&lt;/code> tag referencing the RSS podcast GUID, letting Nostr clients link to existing podcast feeds without duplicating audio hosting. The long debate in the PR thread (with podcast-namespace co-author Dave Jones, Alex Gleason, and Mike Terenzio) settled on a coexistence model where Nostr provides the social layer on top of RSS while RSS keeps the distribution layer. Amethyst&amp;rsquo;s &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3105">PR #3105&lt;/a> podcast screen lands within days of the spec merge, and Jumble&amp;rsquo;s GIF picker work also includes early podcast-attachment scaffolding.&lt;/p>
&lt;h3 id="nip-17-key-decoupling-pr-2361">NIP-17 key decoupling (PR #2361)&lt;/h3>
&lt;p>fiatjaf opened &lt;a href="https://github.com/nostr-protocol/nips/pull/2361">PR #2361&lt;/a> on June 1, proposing that NIP-17 separate the identity key from the encryption key. Recipients advertise their encryption key in a new kind 10044 event, and senders use that advertised key (when present) for the gift-wrap inner seal, falling back to the recipient&amp;rsquo;s identity key only when the advertisement is absent. The PR also adds an &lt;code>n&lt;/code> tag to the seal carrying the sender&amp;rsquo;s encryption pubkey, so receivers can derive the correct conversation key without trial-decryption against every retired key. The stated motivation is bunker UX: under the current design, a bunker user must round-trip every received DM through the signer to decrypt, since the encryption key is the signer-held identity key. Decoupling lets the client hold the encryption key locally while keeping the identity key in the bunker for signatures.&lt;/p>
&lt;p>The proposal drew the week&amp;rsquo;s most contentious review. Cody Tseng (Jumble) supports it as the easiest path to cross-client DM interop. Vitor Pamplona (Amethyst) objects on two grounds: it adds a new long-lived decryption secret outside the bunker, and clients that don&amp;rsquo;t ship it will silently fail to decrypt messages from clients that do, with no degradation path because the break is at the seal layer. Pamplona argues the problem is already solved correctly by &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a>&amp;rsquo;s key packages and epoch rotation, and that retrofitting key separation into the base NIP-17 spec creates the kind of interop failure that Marmot took two years to engineer around. fiatjaf&amp;rsquo;s counter has three parts: decoupling is optional per-recipient, the n-tag fix addresses the trial-decryption concern, and the alternative is keeping bunker UX broken while Telegram eats the messaging use case. The thread remains open without a merge decision and is the most-watched NIP discussion of the quarter.&lt;/p>
&lt;h3 id="nip-silent-payments-payment-flow-pr-2362">NIP-Silent Payments payment flow (PR #2362)&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2362">silentius-satoshi opened PR #2362&lt;/a> on June 1 as a companion to the broader &lt;a href="https://github.com/nostr-protocol/nips/pull/2355">Nostr Silent Payments NIP draft (PR #2355)&lt;/a>. The payment-flow NIP defines kind 8352 for silent payment receipt notifications (delivered via &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> gift wrap so the receipt link is not publicly observable) and kind 10353 for an encrypted UTXO cache that syncs across devices for the same Silent Payments wallet. The pair together let a payer signal a payment to a Silent Payments address using Nostr-native primitives without exposing the on-chain link on the open relay layer.&lt;/p>
&lt;h3 id="nip-pip-perfect-ip-packets-pr-2364">NIP-PIP Perfect IP Packets (PR #2364)&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2364">RandyMcMillan opened PR #2364&lt;/a> on June 1 as a draft. It introduces a packet-tree transport with three new addressable kinds: 39078 carries the manifest, 39079 carries individual slices, and 39080 carries repair requests. The spec defines a wire format where large files are broken into addressable slices, with manifests describing the slice tree and repair requests letting receivers ask for missing slices. Early-draft status applies, and the proposal has not yet attracted maintainer review.&lt;/p>
&lt;h3 id="nip-29-audiovideo-live-spaces-pr-2238">NIP-29 audio/video live spaces (PR #2238)&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2238">PR #2238&lt;/a> merged on May 28, extending &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> relay-based groups with audio and video live-space support. Groups can now reference an active live-space session, letting &lt;a href="https://nostrcompass.org/en/topics/nip-53/">NIP-53&lt;/a>-style live activity events anchor in a NIP-29 group context.&lt;/p>
&lt;h3 id="nip-71-video-multiple-audio-tracks-pr-2255">NIP-71 video multiple audio tracks (PR #2255)&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2255">PR #2255&lt;/a> merged on May 28, adding audio-track &lt;code>imeta&lt;/code> tags to NIP-71 video events. The new format carries URL, hash, mime type, language tag (with ISO-639-1 plus original-version flag), fallback URLs, NIP-96 service signal, bitrate, and duration. This enables audio-only streaming (video podcasts), resolution switching with stable audio, multiple language tracks, and reduced storage when servers don&amp;rsquo;t embed audio directly into video files. Clients should check for audio-track availability before assuming single-track behavior.&lt;/p>
&lt;h3 id="nip-59-ephemeral-gift-wrap-pr-2245">NIP-59 ephemeral gift wrap (PR #2245)&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2245">PR #2245&lt;/a> merged on May 28, adding kind 21059 as an ephemeral counterpart to the existing kind 1059 gift wrap. The semantics match the standard NIP-59 wrap but follow ephemeral event rules per NIP-01 (relays drop them after broadcast and do not persist them). This lets apps choose persistence based on requirements: typing indicators and presence pings benefit from ephemeral, while DM history needs persistence.&lt;/p>
&lt;h3 id="nip-78-application-specific-kind-pr-2292">NIP-78 application-specific kind (PR #2292)&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2292">PR #2292&lt;/a> merged on May 28, reclassifying NIP-78 application-specific data as a normal addressable kind, dropping the previous separate range. This simplifies replaceability semantics and aligns NIP-78 with the addressable event model used by other application-state NIPs.&lt;/p>
&lt;h3 id="nip-85-clarifications-pr-2304">NIP-85 clarifications (PR #2304)&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2304">PR #2304&lt;/a> merged on May 28 with small improvements to the language around multiple keys and relays per service provider in &lt;a href="https://nostrcompass.org/en/topics/nip-85/">NIP-85&lt;/a> Trusted Assertions, clarifying the operator-key-rotation path for relay assertion services.&lt;/p>
&lt;h3 id="nip-01-relay-connection-management-one-liner-pr-2307">NIP-01 relay connection management one-liner (PR #2307)&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2307">PR #2307&lt;/a> merged on May 28, adding a single sentence to NIP-01 about how clients should handle relay connection lifetimes. The fix addresses a long-running gap where clients differed on whether to keep WebSocket connections open after fetching, leading to silent message loss on relays that drop idle connections.&lt;/p>
&lt;h3 id="nip-c7-kind-9-chat-constraint-pr-2310">NIP-C7 kind 9 chat constraint (PR #2310)&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2310">PR #2310&lt;/a> merged on May 28, restricting NIP-C7 chat views to kind 9 messages only. This separates ephemeral chat from kind 1 timeline posts in clients that implement NIP-C7-style chat surfaces.&lt;/p>
&lt;h3 id="nip-55-simplification-pr-2363">NIP-55 simplification (PR #2363)&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2363">PR #2363&lt;/a> by greenart7c3, opened June 1, simplifies the Android signer application spec. Vitor Pamplona signed off as &amp;ldquo;Looks good&amp;rdquo; and fiatjaf asked whether it&amp;rsquo;s ready to merge. The change paves the way for the NIP-44 v3 ContentProvider authority registration that Amber shipped this week.&lt;/p>
&lt;h3 id="nip-44-v3-amber-implementation-ahead-of-spec">NIP-44 v3 (Amber implementation ahead of spec)&lt;/h3>
&lt;p>Amber shipped NIP-44 v3 in v6.2.0 with eight commits implementing the encryption upgrade and ContentProvider authority registration, but the NIPs-repo spec PR has yet to land. NIP-44 itself defines a versioned encrypted payload format used inside signed events; the existing v2 (in production since 2024) uses secp256k1 ECDH, HKDF, padding, ChaCha20, HMAC-SHA256, and base64. The v3 wire format adds a new version byte (0x03) ahead of the nonce, allowing receiver clients to negotiate the algorithm explicitly. Amber&amp;rsquo;s implementation includes auto-reject for invalid v3 requests, a dedicated approval screen distinct from v2 approvals, and per-direction plaintext logging for the history. Until the NIPs PR merges, v3 stands as an Amber-specific extension. Treat it as a forward-looking signal, not a stable protocol-wide signaling.&lt;/p>
&lt;h2 id="nip-deep-dive-nip-32-labeling">NIP deep dive: NIP-32 (Labeling)&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-32/">NIP-32&lt;/a> defines a structured way for any Nostr actor to label events, pubkeys, relays, URLs, or topics using addressable kind 1985 events with a namespaced label vocabulary. The spec introduces two new tags: &lt;code>L&lt;/code> denotes a label namespace, and &lt;code>l&lt;/code> denotes a label within that namespace. Label-target tags (&lt;code>e&lt;/code>, &lt;code>p&lt;/code>, &lt;code>a&lt;/code>, &lt;code>r&lt;/code>, or &lt;code>t&lt;/code>) specify what is being labeled. The namespace requirement keeps multiple label systems from colliding: a &lt;code>spam&lt;/code> label in &lt;code>nip28.moderation&lt;/code> carries different semantics from a &lt;code>spam&lt;/code> label in &lt;code>relay-report&lt;/code>.&lt;/p>
&lt;p>The design choice that makes NIP-32 useful beyond moderation is that labels are assertions, not protocol-level truth. A kind 1985 event says only that a particular pubkey labeled a particular target in a particular namespace. The trust model is delegated to the client: each client picks which labelers to honor, which namespaces to read, and what UI affordance to give each label. The same primitive carries content warnings, license assignment, ISO-639-1 language tags on kind 1 notes, ISO-3166-2 geographic tags, content classification, distributed moderation suggestions, and reputation scores.&lt;/p>
&lt;p>Amethyst&amp;rsquo;s &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3111">PR #3111&lt;/a> this week is the largest deployment so far. It adds hashtag labeling through NIP-32 and a label-based hashtag feed, letting users browse by labels assigned by trusted labelers. The earlier &lt;code>#tag&lt;/code> text-match mechanism that originally drove hashtag discovery on Nostr remains as a fallback for un-labeled notes. The hashtag-as-label model means the same note can be discoverable under multiple labels assigned by different labelers, and users can mute or boost specific labelers without affecting the underlying notes.&lt;/p>
&lt;p>Self-labeling is also supported. An author can attach &lt;code>L&lt;/code> and &lt;code>l&lt;/code> tags directly to their own kind 1 notes to declare language, location, and topic. A note tagged &lt;code>[&amp;quot;L&amp;quot;, &amp;quot;ISO-639-1&amp;quot;], [&amp;quot;l&amp;quot;, &amp;quot;en&amp;quot;, &amp;quot;ISO-639-1&amp;quot;]&lt;/code> self-identifies as English and can be filtered by language-aware clients without third-party labeling infrastructure.&lt;/p>
&lt;p>Example NIP-32 label event tagging a kind 1 note as English and assigning it a moderation tag:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;a5f87fe2d4c8b9a0e3f1c4d5e6a7b8c9d0e1f2a3b4c5d6e7f8091a2b3c4d5e6f&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1748908800&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1985&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;L&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;ISO-639-1&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;l&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;en&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;ISO-639-1&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;L&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;nip28.moderation&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;l&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;approve&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;nip28.moderation&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;e&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;8b39f4e5d6c7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.example.com&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Labeled as English-language content approved for NIP-28 chat moderation&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;f1e2d3c4b5a6978869504132c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f80192a3b4c5d6e7f80192a3b4c5d6e7f80192a3b4c5d6e7f80192a3b4c5d6e7f80192a3b4c5&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The Amethyst rollout combined with the recent Trusted Relay Assertions work suggests NIP-32 is becoming the standard substrate for any &amp;ldquo;user-driven assertion about a target&amp;rdquo; pattern on Nostr. The next test is whether labelers themselves develop trust hierarchies: whether users will follow specific labeler npubs the way they follow content creators.&lt;/p>
&lt;h2 id="nip-deep-dive-nip-f4-podcasts">NIP deep dive: NIP-F4 (Podcasts)&lt;/h2>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/F4.md">NIP-F4&lt;/a> merged this week, two years and three months after fiatjaf opened the original draft (PR #1093). The F prefix is plain hex numbering: NIP-F0 through NIP-FF use the same 1-byte hex space as NIP-0A through NIP-0D, with the upper hex range serving as overflow now that the 01–99 decimal range is filling up. NIP-F4 defines how podcasts publish episodes and metadata as Nostr events while keeping RSS as a complementary layer for the audio file itself.&lt;/p>
&lt;p>The core architectural choice is that each podcast is its own Nostr keypair. The spec opens with this directly: &amp;ldquo;each podcast is its own Nostr keypair&amp;rdquo;. This lets podcasts combine their podcasting presence with a normal kind 0 / kind 1 microblogging presence, and lets a podcast change ownership over time through key handover or MuSig2-style shared signing. Four event kinds carry the publishing layer:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>kind:10154&lt;/code>&lt;/strong>: replaceable podcast metadata. Carries &lt;code>title&lt;/code>, &lt;code>image&lt;/code>, &lt;code>description&lt;/code>, optional &lt;code>website&lt;/code> tags, and optional &lt;code>p&lt;/code> tags marking authors with a &lt;code>role&lt;/code> of &lt;code>host&lt;/code>, &lt;code>cohost&lt;/code>, or &lt;code>editor&lt;/code>.&lt;/li>
&lt;li>&lt;strong>&lt;code>kind:10164&lt;/code>&lt;/strong>: author counter-claim. The example in the spec uses kind &lt;code>10064&lt;/code> (a typo open for correction), but the heading and surrounding text identify it as &lt;code>kind:10164&lt;/code>. Users list the podcast pubkeys they author, so that clients can verify the &lt;code>p&lt;/code> tags in &lt;code>kind:10154&lt;/code> against an equivalent claim from the supposed author. Without this, a podcast could falsely tag anyone as a host.&lt;/li>
&lt;li>&lt;strong>&lt;code>kind:54&lt;/code>&lt;/strong>: episode events authored by the podcast pubkey directly. Tags include &lt;code>title&lt;/code>, optional &lt;code>image&lt;/code>, &lt;code>description&lt;/code>, and one or more &lt;code>audio&lt;/code> tags. Each &lt;code>audio&lt;/code> tag is &lt;code>[&amp;quot;audio&amp;quot;, &amp;quot;&amp;lt;audio-url&amp;gt;&amp;quot;, &amp;quot;&amp;lt;optional_media_type&amp;gt;&amp;quot;]&lt;/code>. The spec notes &amp;ldquo;other important fields to be specified here later after further discovery&amp;rdquo;, and the merged form is deliberately minimal.&lt;/li>
&lt;li>&lt;strong>&lt;code>kind:10054&lt;/code>&lt;/strong>: a &lt;a href="https://nostrcompass.org/en/topics/nip-51/">NIP-51&lt;/a>-style favorite-podcasts list, letting users mark which podcasts they follow.&lt;/li>
&lt;/ul>
&lt;p>The thread debate around the merge involved Podcasting 2.0 co-author &lt;a href="https://github.com/daveajones">Dave Jones&lt;/a>, &lt;a href="https://github.com/alexgleason">Alex Gleason&lt;/a>, &lt;a href="https://github.com/mterenzio">Mike Terenzio&lt;/a>, &lt;a href="https://github.com/pablof7z">Pablo F7z&lt;/a>, and &lt;a href="https://github.com/staab">staab&lt;/a>. Jones argued strongly against any attempt to replace RSS: &amp;ldquo;It&amp;rsquo;s been tried many times and always fails&amp;rdquo;, citing JSONfeed, XMPP, AMP, Twitter&amp;rsquo;s API, and Spotify&amp;rsquo;s failed migration. Terenzio reframed the proposal as a social layer on top of RSS, keeping RSS itself as the distribution layer. fiatjaf agreed to step back and let the proposal mature: &amp;ldquo;I agree with everything you said but I still think we can pull it off, let&amp;rsquo;s stop here for a while&amp;rdquo;. Two years later, the merged spec lands closer to coexistence than replacement.&lt;/p>
&lt;p>Three design questions remain explicit in the merged spec:&lt;/p>
&lt;ul>
&lt;li>The &lt;code>kind:10164&lt;/code> typo (example shows &lt;code>10064&lt;/code>) needs reconciling before clients can interoperate safely.&lt;/li>
&lt;li>Episode-level discovery without RSS GUID linking is left open. The merged spec has no &lt;code>i&lt;/code> tag, no &lt;code>podcast:item:guid&lt;/code> format, and no RSS bridging mechanism. Clients that want to bridge an existing RSS catalog into kind 54 events must define the bridge convention themselves.&lt;/li>
&lt;li>The &amp;ldquo;other important fields&amp;rdquo; stub on the &lt;code>kind:54&lt;/code> definition leaves bitrate, duration, language, transcript pointers, chapters, and per-segment metadata as open territory for follow-up proposals.&lt;/li>
&lt;/ul>
&lt;p>Amethyst&amp;rsquo;s &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3105">PR #3105&lt;/a> lands a dedicated podcast screen with episode list and inline player within days of the merge, the first major client implementation. Jumble shipped early podcast attachment scaffolding alongside its GIF picker. Wavlake remains the largest Nostr-native podcast platform and will need to decide whether to align its existing kind 31337 music track events with NIP-F4&amp;rsquo;s kind 54 episode model.&lt;/p>
&lt;p>Example NIP-F4 kind 54 episode event, matching the merged spec&amp;rsquo;s minimal tag set:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;55807e7d5cd90d0303d7dce7397f996fdbaed8697903f326c7cf8ad999b9de3d&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1748995200&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">54&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;title&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Episode 42: Why RSS Won&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;image&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;https://podcast.example.com/ep42-cover.jpg&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;description&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Dave Jones and fiatjaf on protocol coexistence and the social layer.&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;audio&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;https://podcast.example.com/audio/ep42.mp3&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;audio/mpeg&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;In this episode we discuss the two-year journey of NIP-F4 from draft to merge, and why coexistence with RSS turned out to be the right architectural choice.&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;abc123def456789012345678901234567890abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>PR #1093 was open for 27 months, well above the median open duration for merged NIPs PRs. The next test for NIP-F4 is whether the kind 10164 typo gets reconciled, whether episode-discovery and RSS-bridge conventions emerge from the implementers, and whether the major podcast hosts publish under per-podcast keypairs as the spec recommends.&lt;/p></content:encoded></item><item><title>Nostr Compass #24</title><link>https://nostrcompass.org/en/newsletters/2026-05-28-newsletter/</link><pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-05-28-newsletter/</guid><description>&lt;p>Amethyst v1.11.0 lands a full NIP-52 calendar implementation with reminders, on-chain Bitcoin zap splits, and Marmot group reply support. White Noise v2026.5.22 ships iOS push notifications through a Notification Service Extension, alongside block UX and an add-members button. Vector v0.4.0 lands a ground-up vector-core rewrite, one-click Tor with bridges, NIP-46 remote signers, full-negentropy MLS group sync, and a 21-tool MCP server for AI agents. Applesauce v6.1.0 introduces NIP-51 lookup relay lists (kind 10086) and a complete NIP-34 git-cast factory set. MDK adds NIP-40 disappearing messages across iOS and Android through a unified UniFFI surface, and Mostro v0.17.4 closes the anti-abuse bond loop with Phase 3 slashed-bond payouts to the winner. Notedeck merges full NIP-77 negentropy reconciliation for giftwraps and thread backfill, Cordn surfaces as a coordinator-mediated MLS messenger that trades a single-point availability dependency for tighter epoch ordering and a simpler operational model, a NIP-B0 reference implementation called deepmarks ships a curator-monetized bookmark client, and the Formstr team opens four coordinated calendar NIP proposals covering participant self-removal, private events, recurrence, and decentralized appointment scheduling.&lt;/p></description><content:encoded>&lt;p>Amethyst v1.11.0 lands a full NIP-52 calendar implementation with reminders, on-chain Bitcoin zap splits, and Marmot group reply support. White Noise v2026.5.22 ships iOS push notifications through a Notification Service Extension, alongside block UX and an add-members button. Vector v0.4.0 lands a ground-up vector-core rewrite, one-click Tor with bridges, NIP-46 remote signers, full-negentropy MLS group sync, and a 21-tool MCP server for AI agents. Applesauce v6.1.0 introduces NIP-51 lookup relay lists (kind 10086) and a complete NIP-34 git-cast factory set. MDK adds NIP-40 disappearing messages across iOS and Android through a unified UniFFI surface, and Mostro v0.17.4 closes the anti-abuse bond loop with Phase 3 slashed-bond payouts to the winner. Notedeck merges full NIP-77 negentropy reconciliation for giftwraps and thread backfill, Cordn surfaces as a coordinator-mediated MLS messenger that trades a single-point availability dependency for tighter epoch ordering and a simpler operational model, a NIP-B0 reference implementation called deepmarks ships a curator-monetized bookmark client, and the Formstr team opens four coordinated calendar NIP proposals covering participant self-removal, private events, recurrence, and decentralized appointment scheduling.&lt;/p>
&lt;h2 id="top-stories">Top stories&lt;/h2>
&lt;h3 id="amethyst-v1110-calendars-on-chain-zap-splits-and-marmot-replies">Amethyst v1.11.0: calendars, on-chain zap splits, and Marmot replies&lt;/h3>
&lt;p>Amethyst, the Nostr client for Android maintained by Vitor Pamplona, shipped &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.11.0">v1.11.0&lt;/a>. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2994">PR #2994&lt;/a> adds a &lt;a href="https://nostrcompass.org/en/topics/nip-52/">NIP-52&lt;/a> calendar event implementation with a dedicated UI and a reminder system, so calendar events now render in their own timeline category, separate from the generic kind-30023 long-form view. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3018">PR #3018&lt;/a> extends on-chain Bitcoin zaps with split support, distributing a single Bitcoin transaction across multiple recipients per the existing zap-split tag, so an on-chain payment behaves the same as a Lightning split. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2974">PR #2974&lt;/a> adds a paginated on-chain transaction history screen that surfaces each settled zap with block confirmation status.&lt;/p>
&lt;p>Group messaging gains parity with one-to-one chat: &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2995">PR #2995&lt;/a> adds reply support for &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a>/MLS group messages, so threads inside encrypted groups now render with the same parent-reference UI as public notes. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2984">PR #2984&lt;/a> hardens &lt;a href="https://nostrcompass.org/en/topics/nip-57/">NIP-57&lt;/a> zap-receipt validation by checking the LNURL provider matches the recipient&amp;rsquo;s stated lud16, closing a class of forgery where a third-party LNURL could mint a receipt for a payment that never landed. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2968">PR #2968&lt;/a> accepts floating-point dimensions in &lt;a href="https://nostrcompass.org/en/topics/nip-92/">NIP-92&lt;/a> &lt;code>imeta&lt;/code> tags, aligning Amethyst with clients that publish fractional pixel-density values from devices like the iPhone Retina display. The release also wires up Payment Targets, a new replaceable-event multi-rail tip jar covered in the protocol section below.&lt;/p>
&lt;h3 id="white-noise-v2026522-ios-push-block-ux-and-add-members">White Noise v2026.5.22: iOS push, block UX, and add members&lt;/h3>
&lt;p>White Noise, the Marmot-protocol group messenger, shipped &lt;a href="https://github.com/marmot-protocol/whitenoise/releases/tag/v2026.5.22%2B25">v2026.5.22&lt;/a> with iOS push notifications as the headline feature. &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/673">PR #673&lt;/a> implements an iOS Notification Service Extension (NSE) that decrypts MLS messages inside the extension process and surfaces them as system notifications, so iPhone users no longer need the app foregrounded to receive messages. Android push-token plumbing routes through the same backend pipeline, with the per-platform NSE keeping ciphertext out of the broker.&lt;/p>
&lt;p>&lt;a href="https://github.com/marmot-protocol/whitenoise/pull/676">PR #676&lt;/a> adds a full block and unblock UX with confirmation flows and contact-list filtering. &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/679">PR #679&lt;/a> adds the long-requested &amp;ldquo;Add members&amp;rdquo; button to the group-info screen, closing a UX gap where group admins had to fall back to share links. &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/688">PR #688&lt;/a> introduces a dedicated iOS notification-settings screen, and &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/687">PR #687&lt;/a> wires up share-via-long-press for media and messages.&lt;/p>
&lt;h3 id="mdk-adds-nip-40-disappearing-messages-across-platforms">MDK adds NIP-40 disappearing messages across platforms&lt;/h3>
&lt;p>The Marmot Development Kit, the shared Rust core used by White Noise iOS, White Noise Android, and any future Marmot client, merged &lt;a href="https://github.com/marmot-protocol/mdk/pull/306">PR #306&lt;/a> to expose disappearing-message validation and &lt;a href="https://nostrcompass.org/en/topics/nip-40/">NIP-40&lt;/a> expiration handling through the UniFFI bridge. The PR is the second of a three-part series. iOS and Android now share one Rust implementation of the expiration logic; the timing rules live in a single audited code path consumed by both platforms via UniFFI. &lt;a href="https://github.com/marmot-protocol/mdk/pull/307">PR #307&lt;/a> caps the stored length of welcome failure reasons and sanitizes them before persistence, a separate hardening pass that complements the welcome-event handling shipped last week.&lt;/p>
&lt;p>Disappearing messages in MLS are not just a UI affordance. The expiration tag is published with the encrypted message envelope, so a recipient who never opens the message still has the underlying ciphertext expire at the relay layer alongside any cached copy in the receiving client. With MDK owning the validation path, behavior stays consistent across clients: any conformant Marmot implementation enforces the same expiration semantics, so one client honoring expiration while another caches forever stops being a portability hazard.&lt;/p>
&lt;h3 id="mostro-v0174-phase-3-closes-the-slashed-bond-loop">Mostro v0.17.4: Phase 3 closes the slashed-bond loop&lt;/h3>
&lt;p>&lt;a href="https://github.com/MostroP2P/mostro">Mostro&lt;/a>, the peer-to-peer Bitcoin exchange protocol built on Nostr, shipped Phase 3 of its anti-abuse bond rollout in &lt;a href="https://github.com/MostroP2P/mostro/releases/tag/v0.17.4">v0.17.4&lt;/a>. &lt;a href="https://github.com/MostroP2P/mostro/pull/738">PR #738&lt;/a> lands the payout flow for slashed bonds, taking the loser&amp;rsquo;s forfeited collateral and disbursing it to the dispute winner. &lt;a href="https://github.com/MostroP2P/mostro/pull/743">PR #743&lt;/a> adds Phase 3.5, an explicit payout-confirmation message to the winner so they know the slashed sats have settled, with the confirmation event arriving on the same Nostr session as the dispute resolution. Phase 2, covered last week, introduced slashing as an admin action; Phase 3 is the difference between threatening a penalty and enforcing one.&lt;/p>
&lt;p>&lt;a href="https://github.com/MostroP2P/mostro/pull/746">PR #746&lt;/a> lets the daemon finalize disputes that lack a solver row, an edge case that previously stalled resolution on legacy disputes. &lt;a href="https://github.com/MostroP2P/mostro/pull/748">PR #748&lt;/a> tolerates null rates in Yadio&amp;rsquo;s &lt;code>/exrates/BTC&lt;/code> response so a brief Yadio outage no longer breaks Mostro&amp;rsquo;s fiat-conversion path. &lt;a href="https://github.com/MostroP2P/mostro/pull/745">PR #745&lt;/a> documents the spec for multi-source price providers, the groundwork for removing Yadio as a single point of failure. The Mostro mobile client wired the matching Phase 3 claim path in &lt;a href="https://github.com/MostroP2P/mobile/pull/596">PR #596&lt;/a>.&lt;/p>
&lt;h3 id="applesauce-v610-lookup-relays-and-nip-34-git-casts">Applesauce v6.1.0: lookup relays and NIP-34 git casts&lt;/h3>
&lt;p>&lt;a href="https://github.com/hzrd149/applesauce">Applesauce&lt;/a>, the modular Nostr toolkit that powers Coracle, noStrudel, and Pablo F7z&amp;rsquo;s stack, released &lt;a href="https://github.com/hzrd149/applesauce/releases/tag/applesauce-actions%406.1.0">v6.1.0&lt;/a> across its packages. The release adds first-class &lt;a href="https://nostrcompass.org/en/topics/nip-51/">NIP-51&lt;/a> lookup-relay list support: kind 10086 events let a user signal &amp;ldquo;ask these relays if you want to find me,&amp;rdquo; sitting alongside &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> outbox lists as a discovery primitive. Applications built on &lt;code>applesauce-core&lt;/code> get a reactive &lt;code>User.lookupRelays$&lt;/code> observable and a matching loader in &lt;code>applesauce-relay&lt;/code>.&lt;/p>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> git-cast factories arrive in &lt;code>applesauce-factory&lt;/code>, giving every Applesauce-built client a one-line path to publishing repo announcements (kind 30617), patches (kind 1617), and issues (kind 1621). &lt;code>User.favoriteGitRepos$&lt;/code>, &lt;code>User.gitAuthors$&lt;/code>, and &lt;code>User.graspServers$&lt;/code> reactive properties let applications list a user&amp;rsquo;s followed repos, repo maintainers, and configured GRASP servers directly from the same User object. The release also fixes pool manual methods that silently dropped offline relays in &lt;a href="https://github.com/hzrd149/applesauce/pull/73">PR #73&lt;/a>.&lt;/p>
&lt;h3 id="notedeck-merges-nip-77-negentropy-for-giftwraps-and-thread-backfill">Notedeck merges NIP-77 negentropy for giftwraps and thread backfill&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/notedeck">Notedeck&lt;/a>, Damus&amp;rsquo;s native multi-column desktop client, merged &lt;a href="https://github.com/damus-io/notedeck/pull/1459">PR #1459&lt;/a> on May 25 to wire full &lt;a href="https://nostrcompass.org/en/topics/nip-77/">NIP-77&lt;/a> negentropy reconciliation into the shared outbox path. The PR adds NIP-77 client and relay frames, relay-local negentropy sessions, and an outbox full-history tracker that drives local-set reconciliation and missing-event fetches. Messages giftwraps get negentropy reconciliation so private-message envelopes can be recovered from the selected account&amp;rsquo;s read relays. Thread views are no longer capped by the live-subscription reply limit. Dave PNS replaces its Dave-local negentropy implementation with the shared outbox path while preserving its existing bounded-history behavior.&lt;/p>
&lt;p>Live subscriptions and negentropy now use separate filters. A flow can keep a small live request while issuing a broader negentropy filter to reconcile what the relay already has. The PR intentionally does not enable broad negentropy sync for home or profile timelines, which would change cold-start cost characteristics. Test coverage was added for reconciliation, giftwrap delivery, thread backfill, Dave PNS restore, account switching, relay retargeting, fetch retries, and NIP-77 relay behavior.&lt;/p>
&lt;h3 id="vector-v040-vector-core-rewrite-tor-nip-46-full-negentropy-mls-and-an-mcp-agent-surface">Vector v0.4.0: vector-core rewrite, Tor, NIP-46, full-negentropy MLS, and an MCP agent surface&lt;/h3>
&lt;p>&lt;a href="https://github.com/VectorPrivacy/Vector">Vector&lt;/a>, the privacy-focused cross-platform messenger built on NIP-17 DMs and Marmot groups, shipped &lt;a href="https://github.com/VectorPrivacy/Vector/releases/tag/v0.4.0">v0.4.0&lt;/a> as its biggest release to date. The headline is a ground-up engine rewrite: all of Vector&amp;rsquo;s logic now lives in a single decoupled crate, &lt;code>vector-core&lt;/code>, shared across the desktop, Android, and any future client, with 440+ tests in the core itself and the application shell stripped of thousands of lines. The rewrite is groundwork for a Vector CLI, bots, and SDKs that drive the same protocol code as the GUI.&lt;/p>
&lt;p>Tor integration ships with one-click traffic routing and bridge support for censorship circumvention. Multi-account support lands with an in-app switcher. Remote-signer login arrives via &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> with bunker pairing by QR or pasted URI, so users can log in without ever exposing their nsec. Delete-for-everyone works in both &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> DMs and &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> group chats, with Vector keeping the ephemeral signing key as a deliberate spec divergence the release notes call out explicitly: &amp;ldquo;a diversion from the traditional NIP-17/Marmot specs for enhanced user privacy controls.&amp;rdquo; The retained ephemeral key gives Vector clients local proof that a deletion was sanctioned by the original sender, but it also means any other Vector-touching client sees a different deletion-verifiability surface than baseline NIP-17/Marmot clients.&lt;/p>
&lt;p>MLS group sync is now fully reconciled over &lt;a href="https://nostrcompass.org/en/topics/nip-77/">NIP-77&lt;/a> negentropy, the same direction Notedeck took for giftwraps and threads this week. The Blossom uploader fails over across multiple servers, learns each server&amp;rsquo;s capabilities, and syncs the server list across devices. Custom emoji packs are user-creatable, shareable, and cross-compatible with other Nostr clients. SQLite memory dropped from roughly 308MB to 5MB. The emoji panel opens from disk cache and Discord-style shortcodes (&lt;code>:smile:&lt;/code>) plus Unicode frequency ranking surface the right glyph first.&lt;/p>
&lt;p>The most novel addition is &lt;code>vector-agent&lt;/code>, an MCP (Model Context Protocol) server that exposes 21 tools so AI agents can drive Vector: sending DMs, managing groups, uploading files, editing profiles. This is the second Nostr project this week (alongside Shopstr) to ship an MCP surface, and the first messenger-class application to do so. Coupled with AgentNoise (covered last week), the pattern of agent-controlled Nostr clients is moving from one-off experiments to a deliberate platform direction.&lt;/p>
&lt;h3 id="cordn-surfaces-as-a-coordinator-mediated-mls-messenger">Cordn surfaces as a coordinator-mediated MLS messenger&lt;/h3>
&lt;p>&lt;a href="https://cordn.net">Cordn&lt;/a> (web client at &lt;a href="https://cordn.net">cordn.net&lt;/a>, repos at &lt;a href="https://github.com/Cordn-msg/cordn">Cordn-msg/cordn&lt;/a> and &lt;a href="https://github.com/Cordn-msg/cordn-web">Cordn-msg/cordn-web&lt;/a>) is a new MLS messenger that takes a different architectural tack from Marmot. Where &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> is fully relay-based with no privileged coordinator (every group member writes directly to relays and any conforming relay can carry the traffic), Cordn introduces a per-group coordinator role implemented as a &lt;a href="https://nostrcompass.org/en/topics/contextvm/">ContextVM&lt;/a> service. The coordinator orders MLS commits and handles welcome distribution.&lt;/p>
&lt;p>The Cordn argument, stated on its &lt;a href="https://cordn.net/why">/why&lt;/a> page, is that MLS as deployed in production messengers is &amp;ldquo;not coordination-free&amp;rdquo; and that &amp;ldquo;weakly ordered public dissemination&amp;rdquo; makes group-state convergence &amp;ldquo;much harder&amp;rdquo; without a strong coordination point. A coordinator-mediated design provides predictable epoch advancement and simpler concurrent-commit resolution. Participants connect to the coordinator using ephemeral keys, so the coordinator learns the group ID and the timing of commit traffic but not which long-term pubkeys are members. Any party querying relays for a Marmot group can already see the same surface: group activity by group ID, with timing inferable from event arrival. Cordn also acknowledges that &amp;ldquo;availability trust remains&amp;rdquo; with self-hosting: a self-hosted coordinator avoids the operator-layer centralization concern but introduces a single point of failure for group liveness. Marmot avoids that single point by leaving ordering to MLS itself (epochs and Commit messages handle ordering inside the protocol) and distributing Welcome events via &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> gift wrap, at the cost of admin-side discipline: admins must wait for relay acknowledgment of a Commit before sending the matching Welcome, and clients must reconcile concurrent commits when relay delivery races a state transition.&lt;/p>
&lt;p>The contrast is worth pulling on for any team picking a private-messaging stack. Marmot trades some implementation complexity for a relay-agnostic deployment with no privileged actor in the path. Cordn trades a single-point availability dependency for tighter ordering and a simpler operational model. Both projects build on &lt;a href="https://nostrcompass.org/en/topics/mls/">MLS&lt;/a> and use Nostr as the identity and transport layer. The disagreement is over where the coordination cost lives. The cordn-msg repos show steady commit cadence with the coordinator service implemented over ContextVM and the MLS layer built on &lt;code>ts-mls&lt;/code>.&lt;/p>
&lt;h3 id="deepmarks-nip-b0-bookmarks-with-curator-monetized-publishing">deepmarks: NIP-B0 bookmarks with curator-monetized publishing&lt;/h3>
&lt;p>&lt;a href="https://github.com/ostermayer/deepmarks-public">deepmarks-public&lt;/a> is a reference client for the proposed &lt;a href="https://nostrcompass.org/en/topics/nip-b0/">NIP-B0&lt;/a> bookmark spec (kind 39701), with a three-box architecture (curator, indexer, viewer) and a tier system funded by direct-to-curator &lt;a href="https://nostrcompass.org/en/topics/nip-57/">NIP-57&lt;/a> zaps. The client implements NIP-B0, &lt;a href="https://nostrcompass.org/en/topics/nip-07/">NIP-07&lt;/a>, &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a>, NIP-57, &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a>, &lt;a href="https://nostrcompass.org/en/topics/nip-98/">NIP-98&lt;/a>, &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a>, and Blossom BUD-01 and BUD-04 for file storage. A 21,000-sat lifetime tier converts paying readers into recurring zap recipients for the curator. The curator publishes bookmark events, the indexer enriches them with machine-readable metadata, and the viewer renders the feed; each role is a separate deployable service.&lt;/p>
&lt;h2 id="releases">Releases&lt;/h2>
&lt;h3 id="amber-v610-ga-encrypted-per-account-backup">Amber v6.1.0 GA: encrypted per-account backup&lt;/h3>
&lt;p>&lt;strong>Amber&lt;/strong> moved from &lt;code>v6.1.0-pre3&lt;/code> to GA &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.1.0">v6.1.0&lt;/a> this week. &lt;a href="https://github.com/greenart7c3/Amber/pull/444">PR #444&lt;/a> ships encrypted backup and restore for the application permission database, and &lt;a href="https://github.com/greenart7c3/Amber/pull/446">PR #446&lt;/a> splits the backup per-account, so users with multiple Nostr identities can back up and restore each set of app grants independently. The PSBT signing work covered last week is in the GA cut.&lt;/p>
&lt;h3 id="citrine-per-relay-subscriptions-and-onion-url-leak-prevention">Citrine: per-relay subscriptions and onion-URL leak prevention&lt;/h3>
&lt;p>&lt;strong>Citrine&lt;/strong>, the on-device personal relay that ships with Amethyst, shipped two fixes this cycle. &lt;a href="https://github.com/greenart7c3/Citrine/pull/157">PR #157&lt;/a> switches from a single global subscription to per-relay tagged subscriptions, so two source relays sharing a &lt;code>kinds: [1]&lt;/code> filter no longer collide on the aggregator side. &lt;a href="https://github.com/greenart7c3/Citrine/pull/162">PR #162&lt;/a> filters onion relay URLs when the outbound Tor proxy is disabled, preventing onion addresses from leaking onto the clearnet routing path.&lt;/p>
&lt;h3 id="angor-v0227-and-v0228-relay-reliability-and-boltz-reconnect">Angor v0.2.27 and v0.2.28: relay reliability and Boltz reconnect&lt;/h3>
&lt;p>&lt;strong>Angor&lt;/strong> shipped &lt;a href="https://github.com/block-core/angor/releases/tag/v0.2.27">v0.2.27&lt;/a> and &lt;a href="https://github.com/block-core/angor/releases/tag/v0.2.28">v0.2.28&lt;/a>. &lt;a href="https://github.com/block-core/angor/pull/874">PR #874&lt;/a> fixes a relay-dedup bug where only one relay was connected at a time, a regression that silently degraded reliability for projects with multiple relay endpoints. &lt;a href="https://github.com/block-core/angor/pull/876">PR #876&lt;/a> adds WebSocket reconnect logic for Boltz submarine-swap monitoring, so a brief disconnect no longer leaves a swap in unknown state.&lt;/p>
&lt;h3 id="nostrord-v110-nip-57-zaps-and-nip-29-role-distinction">Nostrord v1.1.0: NIP-57 zaps and NIP-29 role distinction&lt;/h3>
&lt;p>&lt;strong>Nostrord&lt;/strong> released &lt;a href="https://github.com/nostrord/nostrord/releases/tag/v1.1.0">v1.1.0&lt;/a> with &lt;a href="https://nostrcompass.org/en/topics/nip-57/">NIP-57&lt;/a> Lightning zap support for messages and profiles (&lt;a href="https://github.com/nostrord/nostrord/pull/98">PR #98&lt;/a>) and a proper distinction in the activity feed between &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> role changes and member adds (&lt;a href="https://github.com/nostrord/nostrord/pull/92">PR #92&lt;/a>), which used to render identically and obscured who had been promoted versus who had been invited.&lt;/p>
&lt;h3 id="ぬるぬる-v15x-sqlcipher-mls-keystore-and-epoch-catch-up">ぬるぬる v1.5.x: SQLCipher MLS keystore and epoch catch-up&lt;/h3>
&lt;p>&lt;strong>ぬるぬる&lt;/strong> (nurunuru, by tami1A84), a Japanese-language Nostr client that implements MLS group messaging (kind 443) alongside NIP-44, NIP-50 advanced search, NIP-55, and NIP-70, shipped five releases this week. &lt;a href="https://github.com/tami1A84/null--nostr/pull/184">PR #184&lt;/a> introduces SQLCipher encryption for the MLS keystore in the rust-engine layer. &lt;a href="https://github.com/tami1A84/null--nostr/pull/187">PR #187&lt;/a> and &lt;a href="https://github.com/tami1A84/null--nostr/pull/188">PR #188&lt;/a> extend SQLCipher to Android and iOS respectively, with a legacy-plaintext purge step and CI guards. &lt;a href="https://github.com/tami1A84/null--nostr/pull/189">PR #189&lt;/a> and &lt;a href="https://github.com/tami1A84/null--nostr/pull/191">PR #191&lt;/a> add MLS peer-epoch catch-up with a replay cache and a recovery banner on both platforms, so a client that falls behind on group commits can recover without losing the conversation. ぬるぬる is a Marmot client built on &lt;code>mdk-core&lt;/code>, &lt;code>mdk-sqlite-storage&lt;/code>, and &lt;code>mdk-storage-traits&lt;/code> from &lt;code>marmot-protocol/mdk&lt;/code>, so the SQLCipher and epoch catch-up work lands inside the same MDK runtime that White Noise uses.&lt;/p>
&lt;h3 id="bitcredit-core-v0510-nostr-rooted-block-propagation-fix">Bitcredit Core v0.5.10: Nostr-rooted block propagation fix&lt;/h3>
&lt;p>&lt;strong>Bitcredit Core&lt;/strong> released &lt;a href="https://github.com/BitcreditProtocol/Bitcredit-Core/releases/tag/v0.5.10">v0.5.10&lt;/a> with a fix for a missing Nostr-node-id field during block propagation, which was breaking company-creation flows that included identity upload. Bitcredit is an e-bill protocol that uses Nostr identities as the root of trust for company and bill propagation events.&lt;/p>
&lt;h2 id="unreleased-changes">Unreleased changes&lt;/h2>
&lt;p>&lt;strong>Jumble&lt;/strong> opened &lt;a href="https://github.com/CodyTseng/jumble/pull/797">PR #797&lt;/a> for Google login via the Pomegranate threshold signer, letting a user split their Nostr key across multiple parties so no single signer holds the full secret. This is a meaningful step beyond bunker or nsec-import flows: a user can recover their account even if one signer party is compromised, without that party ever holding the complete private key.&lt;/p>
&lt;p>&lt;strong>Shopstr&lt;/strong> opened &lt;a href="https://github.com/shopstr-eng/shopstr/pull/492">PR #492&lt;/a> initializing an MCP (Model Context Protocol) server, with &lt;a href="https://github.com/shopstr-eng/shopstr/pull/494">PR #494&lt;/a> building the supporting infrastructure (relay fetch, parsers, validation, errors, dedup, audit logging) and &lt;a href="https://github.com/shopstr-eng/shopstr/pull/472">PR #472&lt;/a> adding a relay allowlist for the MCP relay manager. This makes Shopstr the first Nostr marketplace to expose itself as an MCP server, so AI agents can browse and act on NIP-99 listings as a structured tool.&lt;/p>
&lt;p>&lt;strong>Keydex&lt;/strong>, the Shamir-secret-sharing vault, opened a substantial migration in &lt;a href="https://github.com/mplorentz/keydex/pull/226">PR #226&lt;/a> moving custom kinds 1337-1345 to the 713-721 range, alongside &lt;a href="https://github.com/mplorentz/keydex/pull/239">PR #239&lt;/a> adding AEAD over Shamir shares and &lt;a href="https://github.com/mplorentz/keydex/pull/234">PR #234&lt;/a> migrating to GF256 arithmetic. The kind-range migration aligns Keydex with the way the NIPs repo allocates custom kinds, moving away from a self-claimed range.&lt;/p>
&lt;p>&lt;strong>Mill&lt;/strong> (&lt;a href="https://github.com/0ceanSlim/nostr-mill">nostr-mill&lt;/a>) is a new drop-in Nostr signer UI from &lt;a href="https://github.com/0ceanSlim">OceanSlim&lt;/a> (maintainer of the &lt;a href="https://github.com/0ceanSlim/grain">grain&lt;/a> Go relay), shipping as a single-script-tag Web Component on &lt;a href="https://www.npmjs.com/package/nostr-mill">npm&lt;/a> and &lt;a href="https://cdn.jsdelivr.net/npm/nostr-mill/dist/mill.umd.js">jsDelivr&lt;/a>. One &lt;code>&amp;lt;script&amp;gt;&lt;/code> tag gives a web app all six common signer entry points behind a unified UI: &lt;a href="https://nostrcompass.org/en/topics/nip-07/">NIP-07&lt;/a> browser extension, &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> bunker (URL paste or QR pairing with user-specifiable relays, unusual among in-page bunker integrations), &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> Amber via Android intents, encrypted nsec stored in &lt;code>sessionStorage&lt;/code> via AES-256-GCM with PBKDF2, read-only &lt;code>npub&lt;/code>, and in-browser keypair generation. The component is themeable through 29 CSS custom properties scoped to the Shadow DOM and exposes a small SemVer-tracked API (&lt;code>MILL.open&lt;/code>, &lt;code>mill:connected&lt;/code> / &lt;code>mill:disconnected&lt;/code> events, named theme exports). The maintainer&amp;rsquo;s motivation is that bunker login flows have been reimplemented one web app at a time across Nostr. Consolidating onto a shared component lets clients converge on how signer UX should behave, and turns optional flows (like delegated-key login through threshold signers, mirroring Wisp&amp;rsquo;s Pomegranate-based Google login covered above) into a reusable surface that any app can drop in. Mill is at npm v1.5.0, single-maintainer, alpha-stage, with grain as the planned first integrator.&lt;/p>
&lt;p>&lt;strong>moStard&lt;/strong>, a Monero-first fork of &lt;a href="https://github.com/hzrd149/nostrudel">noStrudel&lt;/a> by &lt;a href="https://github.com/roguehashrate">roguehashrate&lt;/a>, reached &lt;a href="https://github.com/roguehashrate/moStard/releases">v1.0.1&lt;/a> this week with a stripped-down feature set and a Monero-themed identity layered on the same Applesauce + worker-relay stack. This week&amp;rsquo;s work landed rendering for Zapstore&amp;rsquo;s kind 32267 software-application events (embed cards in the timeline showing app name, icon, screenshots, platform, license, and a launch link to &lt;code>zapstore.dev/apps/&amp;lt;d-tag&amp;gt;&lt;/code>), polls via kind 20 and kind 21, NIP-A3 Payment Targets-based tipping with per-method QR codes, markdown rendering in notes, GIF picker support for external GIF keyboards, and Amber signer pairing fixes. Monero framing extends to the tip flow: NIP-A3 &lt;code>payto&lt;/code> entries for &lt;code>monero&lt;/code> addresses get first-class buttons in the same UI alongside &lt;code>lightning&lt;/code> and &lt;code>bitcoin&lt;/code>. The client is single-maintainer and alpha-stage, but the May 27 work shows a builder pulling NIP-A3 from this week&amp;rsquo;s protocol-spec announcements straight into a shipping fork within days.&lt;/p>
&lt;h2 id="nip-updates-and-protocol-spec-work">NIP updates and protocol spec work&lt;/h2>
&lt;h3 id="calendar-nip-stack-four-proposals-from-the-formstr-team">Calendar NIP stack: four proposals from the Formstr team&lt;/h3>
&lt;p>Ix2 (&lt;a href="https://github.com/geralt-debugs">@geralt-debugs&lt;/a>) opened four coordinated NIP PRs on May 17, all referencing the &lt;a href="https://calendar.formstr.app">calendar.formstr.app&lt;/a> implementation already shipping under the same author. &lt;a href="https://github.com/nostr-protocol/nips/pull/2350">PR #2350&lt;/a> proposes kind 84 as a generalized &amp;ldquo;participant self-removal&amp;rdquo; event: a tagged participant on any event can publish a kind 84 referencing the original via &lt;code>e&lt;/code>, &lt;code>a&lt;/code>, and &lt;code>k&lt;/code> tags to signal opt-out. Relays must validate that the kind 84 signer appears in a &lt;code>p&lt;/code> tag of the referenced event before honoring removal, and a kind 5 deletion always takes precedence. The PR generalizes a pattern that was previously only described inside the NIP-52 calendar context, so kind 84 becomes the standard way for non-authors to withdraw from any participant event.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2351">PR #2351&lt;/a> is the foundation of the calendar stack: NIP-52E for private calendar events (kinds 32678 time-based, 32681 day-event, 32123 private calendar list, 31926 busy list, 1052 gift wrap, 52 rumor) and NIP-52R for recurring events. At the architectural core is the view-key pattern: a randomly generated keypair encrypts event content with NIP-44, and the secret half (bech32-encoded as &lt;code>nsec&lt;/code>) is gift-wrapped to each participant. The signer holds only the public &lt;code>d&lt;/code> tag; everything else lives in encrypted &lt;code>content&lt;/code>. Decoupling content encryption from identity this way means editing an event does not require re-keying recipients. NIP-52R defines two optional tags on existing kinds 31923 and 31922 to declare recurrence using bare RFC 5545 RRULE values, with &lt;code>D&lt;/code> day-index becoming optional when RRULE is present. Forward secrecy is explicitly absent: a leaked view key reveals all past and future versions of the event under the same &lt;code>d&lt;/code> tag.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2352">PR #2352&lt;/a> builds on NIP-52E with a decentralized appointment-scheduling spec the PR description calls &amp;ldquo;a drop-in alternative to Calendly/Cal.com with no central intermediary.&amp;rdquo; Kind 31927 advertises a scheduling page with encrypted availability windows; kind 32680 is a host-side self-encrypted recovery record for the view key; kinds 1057 and 1058 are the gift-wrapped booking request and response. The clever mechanic: the booker generates both the &lt;code>d&lt;/code> tag and the view key for the future private event before sending the request, so the booker can add the appointment to their own calendar immediately with the correct key, and the host never has to round-trip a key back. Booking responses carry an unencrypted &lt;code>status&lt;/code> tag on the outer wrap so relays can filter without decrypting.&lt;/p>
&lt;p>A reference implementation is already live at &lt;a href="https://calendar.formstr.app">calendar.formstr.app&lt;/a> and as the Calendar Android app on Zapstore. &lt;a href="https://github.com/nostr-protocol/nips/pull/2351">PR #2351&lt;/a> closes &lt;a href="https://github.com/nostr-protocol/nips/pull/2027">PR #2027&lt;/a> in its favor, consolidating an earlier private-calendar proposal that had been open since the start of the year.&lt;/p>
&lt;h3 id="payment-targets-and-silent-payments">Payment Targets and Silent Payments&lt;/h3>
&lt;p>Two more NIP proposals circulated this week in &lt;code>kind:30023&lt;/code> long-form documents.&lt;/p>
&lt;p>A &lt;strong>Payment Targets&lt;/strong> proposal (NIP-A3 / payto) defines a replaceable kind 10133 event carrying one or more &lt;code>[&amp;quot;payto&amp;quot;, &amp;quot;&amp;lt;type&amp;gt;&amp;quot;, &amp;quot;&amp;lt;authority&amp;gt;&amp;quot;]&lt;/code> tags that map to RFC 8905 &lt;code>payto:&lt;/code> URIs. Supported types include bitcoin, lightning, ethereum, monero, nano, cashme, revolut, and venmo. The intent is to standardize a multi-rail tip jar that complements (not replaces) lud16-based NIP-57 zaps. Amethyst v1.11.0 is the first implementer; merged PRs &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2953">#2953&lt;/a> and &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3009">#3009&lt;/a> ship the subscription and observation surface, and &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3011">PR #3011&lt;/a> wires the UI for &lt;code>PaymentTargetsEvent&lt;/code>.&lt;/p>
&lt;p>Two competing Silent Payments proposals dropped from different authors. The first variant derives BIP-352 silent-payment scan and spend keys from &lt;code>nsec&lt;/code> via public additive tweaks, so any sender can construct an &lt;code>sp1q...&lt;/code> address from an &lt;code>npub&lt;/code> without setup. Author warning is explicit in the spec: &amp;ldquo;bscan and bspend MUST be treated with exactly the same care as nsec,&amp;rdquo; because the scan key reveals the nsec. A second variant takes the inverse approach, adding an &lt;code>sp_address&lt;/code> field to kind 0 profile metadata containing a standard BIP-352 silent-payment address whose keys are kept independent of the Nostr identity. Variant two is structurally safer. Both proposals attracted a thoughtful review thread; erskingardner (Marmot lead) posted a detailed &lt;a href="https://gist.github.com/trbouma/77648ebe1005b181b67d1c4b42c7f31d?permalink_comment_id=6167489#gistcomment-6167489">comment&lt;/a> on the trbouma gist tracking the proposal. His central concern is that variant 1 derives the scan private key from &lt;code>nsec&lt;/code> plus a publicly computable tweak, which means anyone holding the scan key (including a third-party scanning service the user has to delegate to in practice) can recover the full &lt;code>nsec&lt;/code> by subtracting that tweak. The same key that lets a remote service scan inbound payments for you also lets that service steal your identity and any funds derived from it.&lt;/p>
&lt;p>On the NIP-34 git-over-Nostr side, hzrd149 published 2 patches to &lt;a href="https://gitworkshop.dev/npub1zafcms4xya5ap9zr7xxr0jlrtrattwlesytn2s42030lzu0dwlzqpd26k5/relay.ngit.dev/schemata">schemata&lt;/a>. &lt;a href="https://gitworkshop.dev/">gitworkshop.dev&lt;/a> itself drew two issue reports: one flagging that login sessions are lost on page refresh when using a NIP-46 remote signer, the other asking for distinct link styling in README previews.&lt;/p>
&lt;h2 id="six-years-of-nostr-mays">Six Years of Nostr Mays&lt;/h2>
&lt;p>The last newsletter of May 2026 steps back from the week&amp;rsquo;s releases to walk the month of May across Nostr&amp;rsquo;s history. Each year had a different center of gravity: 2021 was a single commit, 2022 was the formation of the NIPs repo itself, 2023 was the protocol-spec explosion, 2024 was the consolidation cycle, 2025 was when negentropy merged and Damus&amp;rsquo;s Notedeck graduated to Beta, and 2026 is the month covered in this and the three previous issues.&lt;/p>
&lt;h3 id="may-2021">May 2021&lt;/h3>
&lt;p>Nostr was six months old. The only Nostr code lived in &lt;a href="https://github.com/fiatjaf/nostr">fiatjaf/nostr&lt;/a> and the entire month produced exactly one commit, but that commit became one of the most-used parts of the protocol. On May 22, fiatjaf &lt;a href="https://github.com/fiatjaf/nostr/commit/9ee3a02">repurposed NIP-02&lt;/a> as the contact list NIP. The commit message reads: &amp;ldquo;repurpose NIP-02 and add NIP authorship,&amp;rdquo; and the explicit credit is to &lt;a href="https://github.com/nostr-protocol/nostr/pull/16">PR #16&lt;/a> by arcbtc (Ben Arc of LNbits), opened on February 9 and closed the day before fiatjaf folded the idea into NIP-02. arcbtc&amp;rsquo;s pitch was small: a kind for &amp;ldquo;sending follower list to relays&amp;rdquo; that would be &amp;ldquo;useful for restoring accounts and recommending public keys to follow.&amp;rdquo; fiatjaf generalized it into a single &lt;code>kind:3&lt;/code> event whose tags serve three purposes at once. They are a follow list (the social graph), a petname store (local nicknames for friends), and a relay recommendation source (which relays a follow uses). The same event, replaceable per author, became the canonical answer to &amp;ldquo;who does this person follow,&amp;rdquo; &amp;ldquo;what do they call them,&amp;rdquo; and &amp;ldquo;where do they read.&amp;rdquo; Every client built in the next five years reads &lt;code>kind:3&lt;/code>. The convention added in the same commit, that each NIP names its author, is the reason every spec now has bylines.&lt;/p>
&lt;h3 id="may-2022">May 2022&lt;/h3>
&lt;p>The month the NIPs repo became a community project. On May 1, fiatjaf &lt;a href="https://github.com/nostr-protocol/nips/commit/f25c7e6">migrated the specs&lt;/a> from &lt;code>fiatjaf/nostr&lt;/code> into a dedicated &lt;a href="https://github.com/nostr-protocol/nips">&lt;code>nostr-protocol/nips&lt;/code>&lt;/a> repo and on May 2 added &lt;a href="https://github.com/nostr-protocol/nips/commit/c053670">formal acceptance criteria&lt;/a>. Two days later, Robert C. Martin (Uncle Bob) opened &lt;a href="https://github.com/nostr-protocol/nips/pull/1">PR #1&lt;/a>, the first external pull request, proposing threading conventions for &lt;code>e&lt;/code> and &lt;code>p&lt;/code> tags. The PR was originally numbered NIP-13, then &lt;a href="https://github.com/nostr-protocol/nips/commit/bd4a81a">renamed to NIP-10&lt;/a> to make room for proof-of-work. Three of the first six NIPs are Uncle Bob&amp;rsquo;s: NIP-10 (threading markers), NIP-14 (&lt;a href="https://github.com/nostr-protocol/nips/commit/ebacbcc">the Subject tag&lt;/a>), and the May 21 commit that nailed down &lt;a href="https://github.com/nostr-protocol/nips/commit/e22ea1a">&lt;code>kind:1&lt;/code> as the canonical short text-note kind&lt;/a>. On May 5, William Casarin made his first NIP commits: &lt;a href="https://github.com/nostr-protocol/nips/commit/d7a4aad">NIP-13 Proof of Work&lt;/a> and the &lt;a href="https://github.com/nostr-protocol/nips/commit/ad1eb96">kind:2 recommend-relay event&lt;/a>. The next day, fiatjaf published &lt;a href="https://github.com/nostr-protocol/nips/commit/37eb53e">NIP-07 &lt;code>window.nostr&lt;/code>&lt;/a>, twenty lines of markdown that defined the browser-extension signer interface still used today. NIP-05&amp;rsquo;s &lt;a href="https://github.com/nostr-protocol/nips/commit/57b86d2">CORS warning&lt;/a> by David A. Harding and NIP-01&amp;rsquo;s &lt;a href="https://github.com/nostr-protocol/nips/commit/a4aea53">&lt;code>filter.limit&lt;/code>&lt;/a> landed the same week. nostr-tools shipped its &lt;a href="https://github.com/nbd-wtf/nostr-tools/commit/dc489bf">first browser-importable ESM build&lt;/a> on May 8. Semisol drafted &lt;a href="https://github.com/nostr-protocol/nips/commit/a787093">NIP-15 (End Of Stored Events)&lt;/a> and &lt;a href="https://github.com/nostr-protocol/nips/commit/62fde6c">NIP-16 (event kind ranges)&lt;/a> at month-end, the documents that still govern relay sync semantics and the regular-vs-replaceable-vs-ephemeral classification.&lt;/p>
&lt;h3 id="may-2023">May 2023&lt;/h3>
&lt;p>The protocol-spec explosion. Sixty-four NIP PRs were opened that month, with several of the proposals that defined Nostr&amp;rsquo;s surface area for the next two years all landing in 31 days, and the largest funding announcement Nostr had ever received landed on May 4 with the OpenSats &lt;a href="https://opensats.org/blog/opensats-receives-additional-funding-of-dollar10m-from-startsmall">$10 million grant from Jack Dorsey&amp;rsquo;s #startsmall&lt;/a>, the money that underwrote every Nostr grant wave since. NIP-47 (Nostr Wallet Connect) was &lt;a href="https://github.com/nostr-protocol/nips/pull/406">merged on May 2&lt;/a>, bringing Alby&amp;rsquo;s wallet-connect spec into the main protocol. Two days later Vitor Pamplona &lt;a href="https://github.com/nostr-protocol/nips/pull/498">proposed NIP-53 Live Activities&lt;/a> with &lt;code>kind:30311&lt;/code> rooms and &lt;code>kind:1311&lt;/code> chat messages, the foundation for every Nostr livestreaming surface that followed. Pablo Fernandez opened &lt;a href="https://github.com/nostr-protocol/nips/pull/501">NIP-84 Highlights&lt;/a> on May 5 and &lt;a href="https://github.com/nostr-protocol/nips/pull/530">NIP-89 Recommended Application Handlers&lt;/a> on May 14. v0l (Kieran Babich, Snort author) proposed &lt;a href="https://github.com/nostr-protocol/nips/commit/29f26e7">NIP-98 HTTP Auth&lt;/a> on May 8, the authentication primitive that NIP-96 and Blossom both later depended on. Jonathan Staab proposed &lt;a href="https://github.com/nostr-protocol/nips/pull/532">NIP-32 Labels&lt;/a> on May 15, and &lt;a href="https://github.com/nostr-protocol/nips/pull/484">NIP-30 Custom Emoji&lt;/a> merged the same day. Arthur Franca proposed &lt;a href="https://github.com/nostr-protocol/nips/pull/547">NIP-96 HTTP File Storage Integration&lt;/a> on May 21. Two days later, Vitor added &lt;a href="https://github.com/nostr-protocol/nips/commit/e4937be">zap splits to NIP-57&lt;/a> and verbiricha added &lt;a href="https://github.com/nostr-protocol/nips/commit/0495931">&lt;code>kind:30024&lt;/code> long-form drafts to NIP-23&lt;/a>, the spec that became the foundation for modern Nostr long-form authoring workflows in Habla, YakiHonne, and Highlighter. fiatjaf proposed &lt;a href="https://github.com/nostr-protocol/nips/pull/566">NIP-29 Simple Groups&lt;/a> on May 28, the first relay-managed group spec covering &lt;code>kind:9000&lt;/code> through &lt;code>kind:9020&lt;/code> moderation events. The month closed with Paul Miller opening &lt;a href="https://github.com/nostr-protocol/nips/pull/574">the NIP-44 conversation&lt;/a> on May 31, an XChaCha20-based encrypted DM design intended to replace NIP-04. The client side moved as fast: Damus shipped NWC, zap pool, and Pending Zaps across &lt;a href="https://github.com/damus-io/damus/commits/master/?since=2023-05-10&amp;amp;until=2023-05-15">May 10 through May 15&lt;/a>; Snort launched &lt;a href="https://github.com/v0l/snort/commit/6cbc3ae">zap pool&lt;/a> and &lt;a href="https://github.com/v0l/snort/commit/d5032d6">L402 paywalled media&lt;/a>; &lt;a href="https://github.com/vitorpamplona/amethyst/releases">Amethyst&lt;/a> shipped roughly thirty versioned releases through the month, from v0.40.1 on May 1 through the v0.55.x range at month-end, with zap splits in v0.45.0 and NIP-32 labels in v0.46.0; the &lt;a href="https://github.com/PrimalHQ/primal-android-app/commit/6654cf9">Primal Android repo&lt;/a> was created on May 16; &lt;a href="https://github.com/rust-nostr/nostr/releases/tag/v0.22.0">rust-nostr v0.22.0&lt;/a> added NIP-47 and NIP-58. On May 1, &lt;a href="https://github.com/hoytech/strfry/commit/de475c5">strfry shipped its negentropy integration&lt;/a>, the first relay implementation of Doug Hoyte&amp;rsquo;s set-reconciliation protocol that would later become NIP-77. The month closed with &lt;a href="https://www.forbes.com/sites/digital-assets/2023/05/30/bitcoin-social-network-nostr-creator-fiatjaf-/">Forbes publishing a long-form profile of fiatjaf on May 30&lt;/a>, one of the first mainstream-press deep dives on Nostr&amp;rsquo;s anonymous founder.&lt;/p>
&lt;h3 id="may-2024">May 2024&lt;/h3>
&lt;p>The consolidation cycle. Fewer flashy proposals, more shipping. &lt;a href="https://github.com/nostr-protocol/nips/pull/787">NIP-54 Decentralized Wikis&lt;/a> merged on May 2 with &lt;code>kind:30818&lt;/code> articles and case-normalized &lt;code>d&lt;/code> tags. Three days later, &lt;a href="https://github.com/nostr-protocol/nips/pull/1213">NIP-56&lt;/a> was extended so abuse reports could flag digital threats (malware, phishing) alongside content-only categories. On May 6, &lt;a href="https://github.com/nostr-protocol/nips/pull/1221">NIP-25 reactions were simplified&lt;/a> to stop including the entire reply thread as &lt;code>e&lt;/code>-tags. Arthur Franca &lt;a href="https://github.com/nostr-protocol/nips/pull/1233">proposed NIP-22 Comment&lt;/a> on May 12, introducing &lt;code>kind:1111&lt;/code> so replies to non-&lt;code>kind:1&lt;/code> events (articles, files, products) get a structured way to thread. On May 19, fiatjaf &lt;a href="https://github.com/nostr-protocol/nips/pull/1248">overhauled NIP-46&lt;/a> to abandon NIP-04 entirely and switch all bunker traffic to NIP-44 encryption, the deprecation move that shaped every bunker implementation since. On May 20, &lt;a href="https://github.com/nostr-protocol/nips/pull/923">NIP-71 Video Events&lt;/a> merged with &lt;code>kind:21&lt;/code> and &lt;code>kind:22&lt;/code>, and &lt;a href="https://github.com/nostr-protocol/nips/pull/1171">NIP-10&lt;/a> added the optional pubkey argument on &lt;code>e&lt;/code> tags so clients can resolve thread authors without first fetching the referenced event. Kieran Walsh&amp;rsquo;s &lt;a href="https://github.com/nostr-protocol/nips/pull/1175">NIP-35 Torrents&lt;/a> merged on May 22, and on May 24 the NIPs README first referenced &lt;a href="https://github.com/nostr-protocol/nips/pull/1251">CIP-01&lt;/a> as an off-repo proposal, signaling the start of the &amp;ldquo;NIPs as one of several proposal venues&amp;rdquo; pattern. On May 25, a &lt;a href="https://github.com/nostr-protocol/nips/pull/1254">cleanup PR&lt;/a> removed the &lt;code>aes-256-gcm&lt;/code> tag from NIP-71 before downstream implementations froze it. NIP-96 added &lt;a href="https://github.com/nostr-protocol/nips/pull/1262">&lt;code>list files&lt;/code> and dropped the transform requirement&lt;/a> on May 27. On May 28, Jonathan Staab proposed &lt;a href="https://github.com/nostr-protocol/nips/pull/1264">raising the NIP acceptance bar&lt;/a> to require at least two interoperating implementations before a draft can graduate. Client-side: Damus tagged &lt;a href="https://github.com/damus-io/damus/releases/tag/v1.7.2">v1.7.2&lt;/a> and &lt;a href="https://github.com/damus-io/damus/releases/tag/v1.8">v1.8&lt;/a> plus a &lt;a href="https://github.com/damus-io/damus/commits/v1.9">v1.9 with full NIP-10 marker handling&lt;/a> on May 9–10, landed &lt;a href="https://github.com/damus-io/damus/commit/8feb228">NIP-98 authentication on push notifications&lt;/a>, and shipped full &lt;a href="https://github.com/damus-io/damus/commit/52aefc8">NIP-10 marker support&lt;/a>. Amethyst made &lt;a href="https://github.com/vitorpamplona/amethyst/commit/1f45a63">NIP-17 the default DM mode&lt;/a> on May 14, built out &lt;a href="https://github.com/vitorpamplona/amethyst/commit/aa97c7e">NIP-65 outbox-model relay management&lt;/a>, added &lt;a href="https://github.com/vitorpamplona/amethyst/commit/ff94f45">NIP-96 server selection&lt;/a>, and shipped &lt;a href="https://github.com/vitorpamplona/amethyst/commit/04c4490">NIP-06 BIP-32/BIP-39 key derivation&lt;/a>. Primal Android &lt;a href="https://github.com/PrimalHQ/primal-android-app/releases/tag/0.99.2">0.99.2&lt;/a> on May 10 added user tagging and external-wallet NWC, followed by &lt;a href="https://github.com/PrimalHQ/primal-android-app/releases/tag/0.99.4">0.99.4&lt;/a>. Pablo Fernandez landed an &lt;a href="https://github.com/nostr-dev-kit/ndk/commits/master/?since=2024-05-01&amp;amp;until=2024-06-01">NDK optimistic-update cluster&lt;/a> across May 24–31. Snort added &lt;a href="https://github.com/v0l/snort/commit/5763d91">NIP-96 server selection&lt;/a>, and cashu-ts &lt;a href="https://github.com/cashubtc/cashu-ts/commit/3e20f45">separated its crypto primitives&lt;/a> into &lt;code>@cashu/crypto&lt;/code>.&lt;/p>
&lt;h3 id="may-2025">May 2025&lt;/h3>
&lt;p>The month &lt;a href="https://github.com/nostr-protocol/nips/pull/1494">NIP-77 (Negentropy Syncing)&lt;/a> merged on May 27, fiatjaf and Doug Hoyte&amp;rsquo;s spec for the wire protocol that replaces brute-force REQ filters with logarithmic-cost difference computation. This was the same negentropy that strfry had shipped two years earlier as a relay-side feature, now formalized as a client-relay protocol, and &lt;a href="https://github.com/nostr-protocol/nips/pull/1939">the README entry&lt;/a> landed the same day. The week before, &lt;a href="https://github.com/nostr-protocol/nips/pull/1897">NIP-23 long-form&lt;/a> defined how HTML documents associate themselves with Nostr entities through a &lt;code>&amp;lt;link&amp;gt;&lt;/code> tag on May 24, the canonical-web-copy primitive. NIP-25 added &lt;a href="https://github.com/nostr-protocol/nips/pull/1702">reaction-target relay hints&lt;/a> on May 22 and &lt;a href="https://github.com/nostr-protocol/nips/pull/1486">dropped the emoji-to-like/dislike recommendation&lt;/a>, treating emojis as distinct semantic units. NIP-52 was &lt;a href="https://github.com/nostr-protocol/nips/pull/1922">simplified&lt;/a> on May 14 to focus on the kinds clients were shipping in production, the trim that made the Formstr calendar extensions from a year later cleaner to graft on. On May 9, &lt;a href="https://github.com/nostr-protocol/nips/commit/873afc5fb823f58c3b7f29c5090f9c56172623f2">Follow Packs&lt;/a> (kind 39089 curated follow lists) and &lt;a href="https://github.com/nostr-protocol/nips/pull/1848">Favorite Relays&lt;/a> (a new replaceable list under NIP-51) entered the README on the same day. The Marmot Protocol arc had not yet begun: only the &lt;a href="https://github.com/marmot-protocol/whitenoise-rs">whitenoise-rs&lt;/a> repo existed (first commit September 9, 2024), and May 2025 was its Svelte+Tauri prototype phase, with the &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/commit/b8e6754">May 14 commit&lt;/a> removing Tauri-specific code as the project pivoted to its current architecture. The dedicated MDK Rust core (September 12, 2025), the Marmot spec repo (September 19, 2025), and the Flutter UI (December 2, 2025) all came later in the year. On the client side, Damus&amp;rsquo;s &lt;a href="https://github.com/damus-io/notedeck/releases/tag/v0.4.0">Notedeck v0.4.0&lt;/a> shipped on May 5 as the first Beta, graduating from Alpha with full-text search, the Dave AI assistant, zaps over NWC, GIFs, user tagging, and mute lists. Two days later, hodlbod&amp;rsquo;s &lt;a href="https://github.com/coracle-social/flotilla/releases/tag/1.0.0">Flotilla 1.0.0&lt;/a> crossed the public-launch boundary as a NIP-29-based group-chat client, alongside &lt;a href="https://github.com/coracle-social/coracle/releases/tag/0.6.12">Coracle 0.6.12&lt;/a>, the first of six Coracle releases that ran through &lt;a href="https://github.com/coracle-social/coracle/releases/tag/0.6.17">0.6.17 on May 14&lt;/a>. &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v3.4.0">Amber v3.4.0&lt;/a> on May 12 moved off deprecated Android Autofill and ClipboardManager APIs and migrated from encrypted shared preferences to DataStore. Primal Android &lt;a href="https://github.com/PrimalHQ/primal-android-app/releases/tag/2.2.20">2.2.20&lt;/a> on May 20 added the Redeem Code flow for Primal Premium and a redesigned image gallery. &lt;a href="https://github.com/fiatjaf/nak/releases/tag/v0.14.0">nak v0.14.0&lt;/a> on May 21 cut a minor of the canonical CLI in the same week as the Coracle, Flotilla, and Notedeck releases. OpenSats received its largest non-Bitcoin-treasury donation to date when &lt;a href="https://opensats.org/blog/opensats-receives-two-million-donation-from-the-reynolds-foundation">the Reynolds Foundation gave $2 million&lt;/a> on May 22.&lt;/p>
&lt;h3 id="may-2026">May 2026&lt;/h3>
&lt;p>The month covered in &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/">Newsletter #21&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/">#22&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-21-newsletter/">#23&lt;/a>, and this issue. The defining thread is MLS-on-Nostr reaching multi-client production: &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.8.0">MDK 0.8.0&lt;/a> shipped MIP-05 leaf-index primitives and addressable key packages, followed by &lt;a href="https://github.com/marmot-protocol/mdk/pull/306">PR #306&lt;/a> adding NIP-40 disappearing-message validation across iOS and Android through a shared UniFFI surface. &lt;a href="https://github.com/marmot-protocol/whitenoise/releases/tag/v2026.5.22%2B25">White Noise v2026.5.22+25&lt;/a> shipped iOS push through a Notification Service Extension that decrypts MLS ciphertext inside the extension process so the broker never sees plaintext, and two new Marmot clients appeared: &lt;a href="https://github.com/DavidGershony/Scramble">Scramble&lt;/a> (a .NET/Avalonia desktop and Android client with multi-device KeyPackage slots) and &lt;a href="https://cordn.net">Cordn&lt;/a> (an alternative MLS architecture using a per-group coordinator over ContextVM). Angor migrated its encrypted messaging from NIP-04 to NIP-44 in &lt;a href="https://github.com/block-core/angor/pull/860">PR #860&lt;/a>, closing the deprecation arc that opened with &lt;a href="https://github.com/nostr-protocol/nips/pull/574">Paul Miller&amp;rsquo;s NIP-44 proposal in May 2023&lt;/a>. The Formstr team opened the largest coordinated NIP submission in recent memory on May 17, with &lt;a href="https://github.com/nostr-protocol/nips/pull/2350">PR #2350&lt;/a> for participant self-removal, &lt;a href="https://github.com/nostr-protocol/nips/pull/2351">PR #2351&lt;/a> for private calendar events and recurrence (NIP-52E and NIP-52R), and &lt;a href="https://github.com/nostr-protocol/nips/pull/2352">PR #2352&lt;/a> for decentralized appointment scheduling, all with &lt;a href="https://calendar.formstr.app">calendar.formstr.app&lt;/a> already shipping the reference implementation. &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.11.0">Amethyst v1.11.0&lt;/a> rendered NIP-52 calendars as a first-class timeline category and extended on-chain Bitcoin zaps to split distributions. A year after &lt;a href="https://github.com/nostr-protocol/nips/pull/1494">NIP-77 merged in May 2025&lt;/a>, three independent implementations shipped negentropy adoption in the same window: &lt;a href="https://github.com/damus-io/notedeck/pull/1459">Notedeck PR #1459&lt;/a> wired it into Damus&amp;rsquo;s desktop client for giftwrap and thread backfill, &lt;a href="https://github.com/VectorPrivacy/Vector/releases/tag/v0.4.0">Vector v0.4.0&lt;/a> used full-negentropy MLS sync as part of its ground-up &lt;code>vector-core&lt;/code> rewrite alongside one-click Tor and a 21-tool MCP agent surface, and &lt;a href="https://github.com/greenart7c3/Citrine/releases/tag/v3.0.0-pre1">Citrine v3.0.0-pre1&lt;/a> added it to the Android-native relay alongside built-in Tor and multi-relay aggregation. &lt;a href="https://github.com/MostroP2P/mostro/releases/tag/v0.17.4">Mostro v0.17.4&lt;/a> closed the anti-abuse bond loop with Phase 3 slashed-bond payouts in &lt;a href="https://github.com/MostroP2P/mostro/pull/738">PR #738&lt;/a>, enforcing what the protocol previously only threatened. Three years from &amp;ldquo;shall we replace NIP-04&amp;rdquo; to &amp;ldquo;shall we replace NIP-44 with full MLS group state.&amp;rdquo;&lt;/p>
&lt;hr>
&lt;p>If you want to discuss, DM us on Nostr.&lt;/p></content:encoded></item><item><title>Nostr Compass #23</title><link>https://nostrcompass.org/en/newsletters/2026-05-21-newsletter/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-05-21-newsletter/</guid><description>&lt;p>Primal 3.5 ships a rebuilt Android shell, Amethyst adds onchain Bitcoin zaps, White Noise gains markdown rendering and deep links, Keycast passes a security audit, and AgentNoise lets you control local AI coding agents over Marmot-encrypted chat. Hostr launches a P2P rental accommodation platform on Nostr with four draft NIPs covering listings, reservations, and EVM-based escrow. Angor migrates encrypted messaging from NIP-04 to NIP-44, Dart NDK adds NIP-77 and a web signer, Alby js-sdk v8 ships native NWC multi-relay reconnect, and KeyChat patches a forward secrecy gap in Signal one-time prekey deletion. On the protocol side, Mostro&amp;rsquo;s anti-abuse bond reaches Phase 2, Wisp ships private replies and gift-wrapped reactions, and a Namecoin NIP-05 implementation wave touches half a dozen clients in a single week.&lt;/p></description><content:encoded>&lt;p>Primal 3.5 ships a rebuilt Android shell, Amethyst adds onchain Bitcoin zaps, White Noise gains markdown rendering and deep links, Keycast passes a security audit, and AgentNoise lets you control local AI coding agents over Marmot-encrypted chat. Hostr launches a P2P rental accommodation platform on Nostr with four draft NIPs covering listings, reservations, and EVM-based escrow. Angor migrates encrypted messaging from NIP-04 to NIP-44, Dart NDK adds NIP-77 and a web signer, Alby js-sdk v8 ships native NWC multi-relay reconnect, and KeyChat patches a forward secrecy gap in Signal one-time prekey deletion. On the protocol side, Mostro&amp;rsquo;s anti-abuse bond reaches Phase 2, Wisp ships private replies and gift-wrapped reactions, and a Namecoin NIP-05 implementation wave touches half a dozen clients in a single week.&lt;/p>
&lt;h2 id="top-stories">Top Stories&lt;/h2>
&lt;h3 id="primal-35-for-android">Primal 3.5 for Android&lt;/h3>
&lt;p>Primal, the social client backed by its own caching relay infrastructure, shipped &lt;a href="https://github.com/PrimalHQ/primal-android-app/releases/tag/3.5.9">3.5.9&lt;/a> this week with a rebuilt application shell. The redesign replaces the previous navigation structure with an updated layout and a new Explore screen, giving the main discovery surface its own dedicated home. The release adds audio playback for link previews, so audio files embedded in notes play inline without leaving the feed. NIP-05 verification badges now display inline on profiles, surfacing identity confirmation at a glance. Notification filtering received an overhaul, letting users narrow which event types reach their notification list. The editor gained better event-link handling, and the underlying database layer received stability fixes.&lt;/p>
&lt;h3 id="white-noise-markdown-deep-links-and-audio-metadata">White Noise: markdown, deep links, and audio metadata&lt;/h3>
&lt;p>White Noise, the Marmot-encrypted group messaging app built on Nostr and MLS (&lt;a href="https://www.rfc-editor.org/rfc/rfc9420">RFC 9420&lt;/a>), had one of its busiest weeks yet across the frontend and backend repositories.&lt;/p>
&lt;p>On the frontend, &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/665">PR #665&lt;/a> adds full markdown rendering for chat messages, so bold, italic, code blocks, and links now render natively in the message view. &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/675">PR #675&lt;/a> enables the leave-group flow that was previously blocked for non-last admins, and &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/661">PR #661&lt;/a> adds native deep link support for &lt;code>whitenoise://&lt;/code> and &lt;code>whitenoise-staging://&lt;/code> URIs covering users, chats, and settings, without requiring any HTTP redirect infrastructure.&lt;/p>
&lt;p>On the backend in whitenoise-rs, &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/835">PR #835&lt;/a> makes key package rotation work properly by reusing the &lt;code>d_tag&lt;/code> slot for kind:30443 publishes, enabling NIP-33 replaceable event semantics so successive key package rotations replace the previous event on relays, keeping only the current key package. &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/833">PR #833&lt;/a> extends &lt;code>FileMetadata&lt;/code> with optional &lt;code>duration_ms&lt;/code> and &lt;code>waveform&lt;/code> fields for audio attachments, coordinated with MDK&amp;rsquo;s &lt;a href="https://github.com/marmot-protocol/mdk/pull/300">PR #300&lt;/a> which adds the same fields to MIP-04 media tags. A new &lt;code>whitenoise-markdown&lt;/code> crate (&lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/836">PR #836&lt;/a>) replaces the previous nostr-sdk token parser with a dedicated markdown rendering library.&lt;/p>
&lt;p>The Marmot protocol spec itself received a security fix in &lt;a href="https://github.com/marmot-protocol/marmot/pull/68">PR #68&lt;/a>, which closes a security issue by explicitly specifying HKDF-SHA256 for image key derivations in MIP-01, removing ambiguity that could lead to implementation divergence. In MDK, &lt;a href="https://github.com/marmot-protocol/mdk/pull/307">PR #307&lt;/a> sanitizes welcome failure reasons and caps stored length, closing a separate security finding.&lt;/p>
&lt;h3 id="amethyst-v1100-onchain-bitcoin-zaps">Amethyst v1.10.0: Onchain Bitcoin Zaps&lt;/h3>
&lt;p>Amethyst shipped four releases this week, with &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.10.0">v1.10.0&lt;/a> as the headline. The release adds support for NIP-BC onchain Bitcoin zaps, enabling users to send, receive, and display zaps settled directly onchain via Bitcoin transactions. Earlier releases in the run fixed Blossom blob detection to reject non-compliant filenames (&lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.09.2">v1.09.2&lt;/a>), patched ProGuard rules for desktop builds, and merged pull request &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2977">#2977&lt;/a> to show onchain Bitcoin zappers as a dedicated ₿ row in the expanded reactions gallery. An in-progress on-chain transaction history screen with pagination landed in &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2974">PR #2974&lt;/a>.&lt;/p>
&lt;h3 id="agentnoise-control-coding-agents-over-white-noise">AgentNoise: control coding agents over White Noise&lt;/h3>
&lt;p>&lt;a href="https://github.com/nvk/agentnoise">AgentNoise&lt;/a> by nvk is a Rust-native desktop helper that lets you use a phone running White Noise as the control surface for local Codex and Claude coding agent sessions. The tool listens to one or more White Noise chats, authenticates senders through a first-pairing PIN flow, and launches local coding agents through the configured launcher. Sending &lt;code>/claude &amp;lt;prompt&amp;gt;&lt;/code> from your phone opens a new White Noise work session named after the machine hostname and a short prompt summary, then streams progress updates and final output back to that chat. It is intentionally Rust-first and keeps Node out of the trusted bridge path. The project reached &lt;a href="https://github.com/nvk/agentnoise/releases/tag/v0.1.24">v0.1.24&lt;/a> this week, adding shorter phone-readable replies, job references by short unique prefix, and an opt-in local session watcher. AgentNoise drives the &lt;code>wn&lt;/code> and &lt;code>wnd&lt;/code> CLIs from &lt;code>marmot-protocol/whitenoise-rs&lt;/code> as subprocesses, so it shares its Nostr transport with the White Noise client itself.&lt;/p>
&lt;h3 id="keycast-security-audit-complete">Keycast security audit complete&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/keycast">Keycast&lt;/a>, the team-oriented NIP-46 remote signing server that stores Nostr private keys encrypted at rest in SQLite, completed a security audit in May 2026. The hardening pass addressed auth, permission, data integrity, and dependency issues, and the results are documented in &lt;a href="https://github.com/marmot-protocol/keycast/blob/master/AUDIT.md">AUDIT.md&lt;/a>. Changes include: NIP-98 HTTP auth now requires exactly one &lt;code>u&lt;/code> tag and one &lt;code>method&lt;/code> tag, rejects stale timestamps, and validates &lt;code>payload&lt;/code> hashes; the &lt;code>ALLOWED_PUBKEYS&lt;/code> allowlist is parsed exactly and enforced server-side; empty policies now default-deny sign/encrypt/decrypt requests; foreign-key enforcement is enabled on SQLite connections; and nested app routes such as &lt;code>/teams/:id&lt;/code> are protected server-side. A SQL migration normalizes old allowed-kinds permission JSON on startup. The project is still early-stage and the audit notes residual items before trusting it with real team keys.&lt;/p>
&lt;h3 id="scramble-marmot-client-for-desktop-and-android">Scramble: Marmot client for desktop and Android&lt;/h3>
&lt;p>&lt;a href="https://github.com/DavidGershony/Scramble">Scramble&lt;/a> (formerly OpenChat) is a .NET/Avalonia desktop and Android client for the &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot Protocol&lt;/a>, implementing MIPs 00-04: KeyPackage publishing (kind:30443), group metadata with the NostrGroupData MLS extension, NIP-59 gift-wrapped welcome events (kind:444), ChaCha20-Poly1305 encrypted messages (kind:445), and Blossom encrypted media attachments. It is fully interoperable with White Noise and any other Marmot-compatible client.&lt;/p>
&lt;p>The project shipped 13 releases this week, with multi-device support as the main feature. Each device generates a unique KeyPackage slot (a &lt;code>d&lt;/code>-tag on kind:30443). On startup, Scramble fetches the user&amp;rsquo;s own KeyPackages from relays, detects peer device slot IDs, and automatically adds them to existing MLS groups using the staged commit flow. Auto-add is restricted to groups where the current user is admin; non-admin groups are skipped with guidance to ask the group admin. A forward-secrecy disclosure banner informs newly-linked devices that old messages are unavailable. A slot ID reconciliation pass (&lt;code>TryReconcileSlotId&lt;/code>) handles devices migrated from pre-multi-device versions by matching relay KeyPackage bytes against local key material to adopt the correct &lt;code>d&lt;/code>-tag. External signer reconnect for Amber and NIP-46 users was also fixed: the &lt;code>IsConnected&lt;/code> guard that blocked &lt;code>ExternalSignerService&lt;/code>&amp;rsquo;s built-in auto-reconnect was removed at all nine call sites in &lt;code>NostrService&lt;/code>.&lt;/p>
&lt;h3 id="hostr-p2p-rental-accommodation-on-nostr">Hostr: P2P rental accommodation on Nostr&lt;/h3>
&lt;p>&lt;a href="https://hostr.network">Hostr&lt;/a> (&lt;a href="https://github.com/sudonym-btc/hostr">source&lt;/a>) is a peer-to-peer rental accommodation platform built entirely on Nostr. It covers the full Airbnb-style flow (searching and listing properties, negotiating reservations, and settling payments) using four draft NIPs the project is developing in parallel with the application.&lt;/p>
&lt;p>The accommodation NIP extends &lt;a href="https://github.com/nostr-protocol/nips/blob/master/99.md">NIP-99&lt;/a> classified listings (kind:30402 active, kind:30403 draft) with accommodation-specific tags for type (&lt;code>room&lt;/code>, &lt;code>house&lt;/code>, &lt;code>apartment&lt;/code>, &lt;code>villa&lt;/code>, &lt;code>hotel&lt;/code>, &lt;code>hostel&lt;/code>, &lt;code>resort&lt;/code>), check-in/check-out times, minimum stay, and H3 geospatial cell indexes for location-based search at configurable precision. The reservation NIP defines a full negotiation and lifecycle protocol: kind:32122 replaceable reservation events carry a &lt;code>d&lt;/code> trade ID, a listing anchor &lt;code>a&lt;/code> tag, and participant &lt;code>p&lt;/code> tags with roles (&lt;code>buyer&lt;/code>, &lt;code>seller&lt;/code>, &lt;code>escrow&lt;/code>); kind:1327 structured message rumors deliver private negotiate-stage counteroffers via NIP-59 gift wraps so the negotiation stays off public relays; kind:1326 append-only transition events create a public audit trail once a reservation commits. Buyer privacy is preserved through per-trade temporary Nostr keys bound to the buyer&amp;rsquo;s real identity via encrypted &lt;code>participant_proof&lt;/code> tags. The escrow NIP defines kind:30303 escrow service advertisements and kind:17388 user trust declarations; the reference implementation uses EVM smart contracts on Rootstock, with &lt;code>contractBytecodeHash&lt;/code> allowing clients to verify the deployed contract matches a known audited implementation. The marketplace listing NIP defines generic tags shared across all NIP-99 marketplace profiles, including &lt;code>instantBook&lt;/code>, &lt;code>negotiable&lt;/code>, &lt;code>quantity&lt;/code>, &lt;code>securityDeposit&lt;/code>, &lt;code>cancellationPolicy&lt;/code>, and &lt;code>maxDisputePeriod&lt;/code>. This week the project prepared its app store submission and merged MCP client identity support for agent-facing automation.&lt;/p>
&lt;p>Two new entries appeared on the Shakespeare MiniApps platform this week: &lt;a href="https://inkpress.shakespeare.wtf">InkPress&lt;/a>, an AI magazine generator that publishes structured magazine-style content as Nostr events, and &lt;a href="https://pressstr.shakespeare.wtf">PressStr&lt;/a>, a writing and publishing platform for the Soapbox stack.&lt;/p>
&lt;h2 id="shipping-this-week">Shipping this week&lt;/h2>
&lt;h3 id="ngit-v244">ngit v2.4.4&lt;/h3>
&lt;p>&lt;strong>ngit&lt;/strong> shipped &lt;a href="https://github.com/DanConwayDev/ngit-cli/releases/tag/v2.4.4">v2.4.4&lt;/a>, adding &lt;code>ngit sync --trust-server&lt;/code> (&lt;code>-t&lt;/code>) for cases where a git server is fast-forward ahead of Nostr state. When this situation is detected, sync reports the affected refs and requires the flag to sign and publish an updated state event; a &lt;code>nostr.trust-server-domains&lt;/code> git config setting provides a semicolon-separated allowlist for servers that should be trusted automatically without the flag.&lt;/p>
&lt;h3 id="amber-v610-pre3-adds-psbt-signing">Amber v6.1.0-pre3 adds PSBT signing&lt;/h3>
&lt;p>&lt;strong>Amber&lt;/strong> released &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.1.0-pre3">v6.1.0-pre3&lt;/a> with improved layout for new app connections, crash fixes, and a select/deselect all option on the permissions screen. &lt;a href="https://github.com/greenart7c3/Amber/pull/438">PR #438&lt;/a> adds PSBT signing support through both the Intent-based and NIP-46 relay-based paths, allowing Amber to sign Partially Signed Bitcoin Transactions without exposing the nsec to the requesting app.&lt;/p>
&lt;h3 id="wisp-v110-ships-private-replies-and-drops-amber-support">Wisp v1.1.0 ships private replies and drops Amber support&lt;/h3>
&lt;p>&lt;strong>Wisp&lt;/strong> released &lt;a href="https://github.com/barrydeen/wisp/releases/tag/v1.1.0">v1.1.0&lt;/a> with private replies via NIP-17 gift wrap (&lt;a href="https://github.com/barrydeen/wisp/pull/540">PR #540&lt;/a>), gift-wrapped reactions and DIP-03 zaps on private replies (&lt;a href="https://github.com/barrydeen/wisp/pull/543">PR #543&lt;/a>), auto-translate for notes (&lt;a href="https://github.com/barrydeen/wisp/pull/523">PR #523&lt;/a>), and a register-style fiat input on the zap dialog. &lt;a href="https://github.com/barrydeen/wisp/pull/541">PR #541&lt;/a> migrates private zaps from a homegrown DM-relay plaintext scheme to DIP-03 with proper DM-relay routing. The same release cycle removed NIP-55 remote signer support (&lt;a href="https://github.com/barrydeen/wisp/pull/531">PR #531&lt;/a>), dropping Amber and other external signer integrations, and removed the bundled local relay (&lt;a href="https://github.com/barrydeen/wisp/pull/533">PR #533&lt;/a>). Wisp is a Nostr social client for Android.&lt;/p>
&lt;h3 id="calendar-by-formstr-v154-fixes-gift-wrap-for-new-participants">Calendar by Formstr v1.5.4 fixes gift wrap for new participants&lt;/h3>
&lt;p>&lt;strong>Calendar by Formstr&lt;/strong> shipped &lt;a href="https://github.com/formstr-hq/nostr-calendar/releases/tag/v1.5.4">v1.5.4&lt;/a> (the latest in a v1.5.2 → v1.5.4 sequence). &lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/160">PR #160&lt;/a> fixes a bug where editing a private calendar event with new participants published the updated event with the new pubkeys in &lt;code>p&lt;/code> tags but never created or delivered gift wrap invitations to those participants, breaking the invite flow for last-minute additions. &lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/156">PR #156&lt;/a> adds error handling around private event decryption so clients no longer throw on undecryptable events, and &lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/138">PR #138&lt;/a> corrects recurring event times that were drifting across timezones.&lt;/p>
&lt;h3 id="applesauce-v610-adds-nip-34-git-casts-and-nip-51-lookup-relays">Applesauce v6.1.0 adds NIP-34 git casts and NIP-51 lookup relays&lt;/h3>
&lt;p>&lt;strong>Applesauce&lt;/strong> released &lt;a href="https://github.com/hzrd149/applesauce/releases/tag/applesauce-core%406.1.0">v6.1.0&lt;/a> across its packages with significant NIP-34 (git-over-Nostr) support: applesauce-common adds new &lt;code>GitRepository&lt;/code>, &lt;code>GitGraspList&lt;/code>, and &lt;code>FavoriteGitRepos&lt;/code> casts plus matching factories, and exposes &lt;code>User.favoriteGitRepos$&lt;/code>, &lt;code>User.gitAuthors$&lt;/code>, and &lt;code>User.graspServers$&lt;/code> reactive properties so applications can list a user&amp;rsquo;s followed git repos, repo maintainers, and configured GRASP servers directly from the same User object. The same release adds support for NIP-51 kind 10086 lookup relay lists, a recent addition to the relay-list family used to discover where to find specific data. applesauce-core gains &lt;code>replaceableAddress&lt;/code> on &lt;code>EventCast&lt;/code> for NIP-01 replaceable address lookup, plus &lt;code>pointer&lt;/code>, &lt;code>kind&lt;/code>, and a &lt;code>getReplaceableAddressForEvent&lt;/code> helper, and adds a &lt;code>timeline$()&lt;/code> method on the base &lt;code>User&lt;/code> cast. &lt;a href="https://github.com/hzrd149/applesauce/pull/73">PR #73&lt;/a> fixes pool manual methods silently dropping offline relays.&lt;/p>
&lt;h3 id="sprout-v0016-ships-sprig-binary-and-huddle-protocol-v2">Sprout v0.0.16 ships Sprig binary and huddle protocol v2&lt;/h3>
&lt;p>&lt;strong>Sprout&lt;/strong> by Block, a self-hosted Nostr-relay-based team workspace where humans and AI agents share the same rooms and event log, shipped &lt;a href="https://github.com/block/sprout/releases/tag/v0.0.16">v0.0.16&lt;/a> of the desktop app alongside rolling builds of the new Sprig all-in-one binary (&lt;a href="https://github.com/block/sprout/pull/605">PR #605&lt;/a>), which bundles the ACP harness, agent, and developer MCP into a single busybox-style binary for easy deployment. The &lt;code>--no-memory&lt;/code> flag added in &lt;a href="https://github.com/block/sprout/pull/611">PR #611&lt;/a> lets operators disable NIP-AE core memory injection for the ACP harness. On the realtime side, &lt;a href="https://github.com/block/sprout/pull/609">PR #609&lt;/a> extends the huddle voice protocol to a v2 frame header supporting up to 10 simultaneous peers.&lt;/p>
&lt;h3 id="nostrord-v103-adds-os-keychain-and-multi-account">Nostrord v1.0.3 adds OS keychain and multi-account&lt;/h3>
&lt;p>&lt;strong>Nostrord&lt;/strong> released &lt;a href="https://github.com/nostrord/nostrord/releases/tag/v1.0.3">v1.0.3&lt;/a> with local key storage hardened using OS keychain and passphrase fallback, multi-account support, and a tappable bunker QR code that opens the signer app on Android.&lt;/p>
&lt;h3 id="angor-migrates-to-nip-44-and-ships-security-hardening">Angor migrates to NIP-44 and ships security hardening&lt;/h3>
&lt;p>&lt;strong>Angor&lt;/strong>, the Bitcoin crowdfunding app built on Nostr and Taproot, shipped three unstable releases this week (&lt;a href="https://github.com/block-core/angor/releases/tag/v0.2.24">v0.2.24&lt;/a>, &lt;a href="https://github.com/block-core/angor/releases/tag/v0.2.25">v0.2.25&lt;/a>, and &lt;a href="https://github.com/block-core/angor/releases/tag/v0.2.26">v0.2.26&lt;/a>) with a set of security hardening and Nostr integration changes. &lt;a href="https://github.com/block-core/angor/pull/860">PR #860&lt;/a> migrates Nostr encrypted messaging from NIP-04 to NIP-44, replacing the deprecated XOR-based scheme with ChaCha20-Poly1305 encryption. &lt;a href="https://github.com/block-core/angor/pull/861">PR #861&lt;/a> allows Blossom media uploads without a selected wallet by using an ephemeral Nostr auth key, unblocking uploads for users who have not yet connected a wallet. The security series addressed several hardened categories: &lt;a href="https://github.com/block-core/angor/pull/854">PR #854&lt;/a> adds type safety for AngorKey and mnemonic memory protection, &lt;a href="https://github.com/block-core/angor/pull/856">PR #856&lt;/a> enforces protocol-level validation for timelocks, fee rates, dust thresholds, and penalty rules, and &lt;a href="https://github.com/block-core/angor/pull/851">PR #851&lt;/a> applies non-breaking hardening across eight medium and low severity categories. &lt;a href="https://github.com/block-core/angor/pull/859">PR #859&lt;/a> fixes GrapheneOS compatibility by enabling AOT compilation and removing runtime code generation, and &lt;a href="https://github.com/block-core/angor/pull/855">PR #855&lt;/a> prevents wallet loss on Android swipe-kill by persisting wallet state before the OS terminates the process.&lt;/p>
&lt;h3 id="alby-js-sdk-v80-ships-nwc-multi-relay-reconnect">Alby js-sdk v8.0 ships NWC multi-relay reconnect&lt;/h3>
&lt;p>&lt;strong>Alby js-sdk&lt;/strong> released the v8.0 line (&lt;a href="https://github.com/getAlby/js-sdk/releases/tag/v8.0.1">v8.0.1&lt;/a> through &lt;a href="https://github.com/getAlby/js-sdk/releases/tag/v8.0.3">v8.0.3&lt;/a>) with NWC multi-relay subscription support. &lt;a href="https://github.com/getAlby/js-sdk/pull/516">PR #516&lt;/a> updates the nostr-tools dependency and enables native auto-reconnect across multiple relays, replacing the previous polling approach with relay-native reconnection logic. &lt;a href="https://github.com/getAlby/js-sdk/pull/542">PR #542&lt;/a> replaces all &lt;code>console.debug&lt;/code> calls with an injectable logger interface so application developers can route SDK diagnostics through their own logging infrastructure. The release drops the WebSocket polyfill, requiring Node.js 22 or higher for server-side consumers. v8.0.2 added a fix for a utils crypto import bug that broke certain bundlers.&lt;/p>
&lt;h3 id="keychat-v1411-fixes-forward-secrecy">KeyChat v1.41.1 fixes forward secrecy&lt;/h3>
&lt;p>&lt;strong>KeyChat&lt;/strong>, a messaging app that combines the Signal protocol with Nostr relay transport, released &lt;a href="https://github.com/keychat-io/keychat-app/releases/tag/v1.41.1&amp;#43;6513">v1.41.1+6513&lt;/a>. The headline fix enforces forward secrecy by deleting Signal one-time prekeys immediately after a successful decryption, closing a gap where a retained prekey could be used to decrypt past messages if the device was later compromised. The release also adds URL preview for messages consisting of a single link, centralizes media auto-download under a new &lt;code>FileDownloadManager&lt;/code> with a 20 MB automatic threshold, and refactors NIP-11 relay info fetching to force refresh on cold start so paid relay fee configurations always load correctly.&lt;/p>
&lt;h2 id="in-development">In Development&lt;/h2>
&lt;p>&lt;strong>Citrine&lt;/strong> merged &lt;a href="https://github.com/greenart7c3/Citrine/pull/151">PR #151&lt;/a> implementing NIP-70 enforcement: the Android relay now blocks reposts that embed protected event content, as the spec requires. &lt;a href="https://github.com/greenart7c3/Citrine/pull/149">PR #149&lt;/a> adds display and copy actions for multiple connection addresses, localhost, local Wi-Fi, and Tor, from the relay settings screen. &lt;a href="https://github.com/greenart7c3/Citrine/pull/141">PR #141&lt;/a> adds NIP-42 AUTH challenge handling through external signer integration with Amber.&lt;/p>
&lt;p>&lt;strong>Mostro&lt;/strong> reached Phase 2 of its anti-abuse bond rollout. &lt;a href="https://github.com/MostroP2P/mostro/pull/737">PR #737&lt;/a> lands solver-directed dispute slash logic: admin handlers now consume the &lt;code>BondResolution&lt;/code> payload from mostro-core, allowing an admin to slash either party&amp;rsquo;s bond when resolving a dispute. Phase 1.5, merged in &lt;a href="https://github.com/MostroP2P/mostro/pull/736">PR #736&lt;/a>, introduced a dedicated &lt;code>PayBondInvoice&lt;/code> action and &lt;code>WaitingTakerBond&lt;/code> status, separating the taker&amp;rsquo;s anti-abuse bond payment from the buyer&amp;rsquo;s trade payout. The mobile client added the full Phase 1.5 UX in &lt;a href="https://github.com/MostroP2P/mobile/pull/592">PR #592&lt;/a>. Mostro is a peer-to-peer Bitcoin exchange protocol built on Nostr.&lt;/p>
&lt;p>&lt;strong>Damus&lt;/strong> merged &lt;a href="https://github.com/damus-io/damus/pull/3773">PR #3773&lt;/a> restoring the relay signal indicator, and &lt;a href="https://github.com/damus-io/damus/pull/3775">PR #3775&lt;/a> fixes relays that refused to reconnect after an initial connection failure.&lt;/p>
&lt;p>&lt;strong>rust-nostr&lt;/strong> merged &lt;a href="https://github.com/rust-nostr/nostr/pull/1358">PR #1358&lt;/a> adding event finalization traits and NIP-specific event builders, making it easier to construct correctly-typed events for specific protocol functions. &lt;a href="https://github.com/rust-nostr/nostr/pull/1363">PR #1363&lt;/a> backports a fix ensuring the NIP-46 signer subscribes to notifications before sending the connect response, closing a race condition where client messages arriving immediately after connect could be missed.&lt;/p>
&lt;p>&lt;strong>dart-nostr&lt;/strong> merged &lt;a href="https://github.com/ethicnology/dart-nostr/pull/44">PR #44&lt;/a> adding a Namecoin &lt;code>.bit&lt;/code> relay resolver and TLSA pin records, enabling Flutter applications to resolve &lt;code>wss://example.bit/&lt;/code> relay URLs through Namecoin DNS to their actual WebSocket addresses.&lt;/p>
&lt;p>&lt;strong>Dart NDK&lt;/strong> (the Dart/Flutter Nostr development kit, now at &lt;code>relaystr/ndk&lt;/code>) merged &lt;a href="https://github.com/relaystr/ndk/pull/464">PR #464&lt;/a> implementing NIP-77, the offline event signing protocol. On the signer side, &lt;a href="https://github.com/relaystr/ndk/pull/602">PR #602&lt;/a> and &lt;a href="https://github.com/relaystr/ndk/pull/601">PR #601&lt;/a> add a web-specific event signer and a &lt;code>PlatformEventVerifier&lt;/code> abstraction, letting Flutter web apps use the platform signer without a separate code path; &lt;a href="https://github.com/relaystr/ndk/pull/604">PR #604&lt;/a> introduces an event signer factory for runtime signer selection. &lt;a href="https://github.com/relaystr/ndk/pull/608">PR #608&lt;/a> adds &lt;code>getDmRelays()&lt;/code> to fetch a user&amp;rsquo;s NIP-17 DM relay list (kind:10050), and &lt;a href="https://github.com/relaystr/ndk/pull/600">PR #600&lt;/a> fixes NIP-46 signed field preservation so remote signers do not lose fields on round-trip.&lt;/p>
&lt;p>&lt;strong>Pages by Form*&lt;/strong> (&lt;a href="https://github.com/formstr-hq/nostr-docs">repo&lt;/a>), Formstr&amp;rsquo;s Nostr-native collaborative document app hosted at &lt;a href="https://pages.formstr.app">pages.formstr.app&lt;/a>, merged four PRs this week tightening the encrypted-attachment and document-management flows. &lt;a href="https://github.com/formstr-hq/nostr-docs/pull/37">PR #37&lt;/a> fixes missing images in DOCX, HTML, and PDF exports by inlining encrypted attachments: it fetches &lt;code>&amp;lt;encrypted-file&amp;gt;&lt;/code> blobs from Blossom servers, decrypts them with AES-GCM 256-bit using the stored key and nonce, validates the image MIME type, and converts them to base64 data URLs so exports preserve images that only exist on Blossom in encrypted form. &lt;a href="https://github.com/formstr-hq/nostr-docs/pull/39">PR #39&lt;/a> adds a local document search mechanism, &lt;a href="https://github.com/formstr-hq/nostr-docs/pull/38">PR #38&lt;/a> cleans up the rename flow, and &lt;a href="https://github.com/formstr-hq/nostr-docs/pull/40">PR #40&lt;/a> fixes shared backup handling.&lt;/p>
&lt;p>&lt;strong>Zap Cooking&lt;/strong> merged &lt;a href="https://github.com/zapcooking/frontend/pull/396">PR #396&lt;/a>, the first phase of a feed overhaul that lays down feed-rendering primitives without any user-visible change yet. The PR introduces a NIP-92 &lt;code>imeta&lt;/code> tag parser that reads the &lt;code>url&lt;/code>, &lt;code>m&lt;/code> (MIME), &lt;code>dim&lt;/code> (dimensions), &lt;code>blurhash&lt;/code>, &lt;code>alt&lt;/code>, &lt;code>x&lt;/code> (file hash), and &lt;code>fallback&lt;/code> slots, plus a hand-ported canonical blurhash decoder (~200 LOC) that produces PNG data URLs via canvas with an SSR-safe null fallback. When &lt;code>imeta&lt;/code> tags are absent the parser falls back to extracting raw image and video URLs from the event content using the same heuristics the current feed already uses.&lt;/p>
&lt;p>&lt;strong>Nurunuru&lt;/strong> (ぬるぬる, &lt;code>tami1A84/null--nostr&lt;/code>), a Nostr client with native Android, iOS, and Web variants sharing a Rust FFI engine, merged its v1.5.0 Native → Web sync in &lt;a href="https://github.com/tami1A84/null--nostr/pull/176">PR #176&lt;/a>. The sync brings several feature additions to the Web build that already shipped on Android v1.4.9 and iOS 1.0.4: the &lt;a href="https://github.com/tami1A84/null--nostr/pull/176">NotificationModal&lt;/a> now surfaces birthday notifications, mutual-follow zap detection, and custom-emoji reaction notifications; the reaction picker drops the Unicode default-reactions quick-row and centers the UX on custom emoji; the recommendation engine in &lt;code>lib/recommendation.js&lt;/code> filters out users without icons or display names and prioritizes Following entries with Recommended loading in the background. Voice input is the one feature going the other direction: the Web build already uses ElevenLabs Scribe streaming, and v1.5.0 partial-syncs the Native side to the OS-standard &lt;code>SpeechRecognizer&lt;/code> (Android) and &lt;code>SFSpeechRecognizer&lt;/code> + &lt;code>AVAudioEngine&lt;/code> (iOS) while the full Native Scribe integration is deferred to v1.6.&lt;/p>
&lt;h2 id="protocol-and-spec-work">Protocol and spec work&lt;/h2>
&lt;p>&lt;strong>PR &lt;a href="https://github.com/nostr-protocol/nips/pull/2251">#2251&lt;/a>&lt;/strong> tightens the NIP-70 protected events spec: it now explicitly states that reposts embedding the full content of a protected event must be rejected by relays. NIP-70 defines the &lt;code>-&lt;/code> tag that signals a note author does not consent to having their note republished. The original spec covered relay filtering behavior, but left the repost case ambiguous. This PR closes that gap. Citrine&amp;rsquo;s &lt;a href="https://github.com/greenart7c3/Citrine/pull/151">PR #151&lt;/a> implements the enforcement on the relay side this same week.&lt;/p>
&lt;p>&lt;strong>PR &lt;a href="https://github.com/nostr-protocol/nips/pull/1653">#1653&lt;/a>&lt;/strong> proposes a Drafts NIP for saving and syncing private draft events. The proposal uses replaceable events with a &lt;code>draft&lt;/code> status and NIP-44 encryption to the author&amp;rsquo;s own key, letting clients save works in progress to relays without those events being visible to anyone else. The draft event carries the full intended-publication event as encrypted content, including its eventual kind and tags.&lt;/p>
&lt;p>&lt;strong>Snapshots (&lt;a href="https://github.com/nostr-protocol/nips/pull/2279">PR #2279&lt;/a>)&lt;/strong> is an open proposal to define an immutable snapshot event for preserving one exact version of a replaceable Nostr event. The snapshot event carries the full content of the replaceable event at a given point in time, with an &lt;code>a&lt;/code> tag linking it back to the replaceable event&amp;rsquo;s address so all historical versions are queryable together. This makes it possible for observers to inspect historical state even after relays stop retaining old versions.&lt;/p>
&lt;p>&lt;strong>Namecoin NIP-05 wave:&lt;/strong> This week saw a coordinated push to add &lt;code>.bit&lt;/code> NIP-05 resolution to Nostr clients. The NIP discussion feed captured open-source PRs against Aegis (&lt;a href="https://github.com/ZharlieW/Aegis/pull/14">#14&lt;/a>, which adds sign-time verification at the signer), nostter (&lt;a href="https://github.com/SnowCait/nostter/pull/2128">#2128&lt;/a>), and dart-nostr (&lt;a href="https://github.com/ethicnology/dart-nostr/pull/44">#44&lt;/a>), alongside an upstream NIP draft (&lt;a href="https://github.com/nostr-protocol/nips/pull/2349">PR #2349&lt;/a>). The Aegis PR is notable for placing verification on the producer side: the signer checks the Namecoin chain before signing any kind:0 event that claims a &lt;code>.bit&lt;/code> identity and warns the user on mismatch, catching the problem before the event reaches any relay.&lt;/p>
&lt;h2 id="nip-deep-dive-nip-07-windownostr-for-web-browsers">NIP Deep Dive: NIP-07 (window.nostr for Web Browsers)&lt;/h2>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/07.md">NIP-07&lt;/a> defines the &lt;code>window.nostr&lt;/code> interface that browser extensions expose to web applications. It is the most widely deployed signer interface on the web, implemented by extensions including Alby, nos2x, Flamingo, and horse.&lt;/p>
&lt;p>The interface has two required methods and several optional ones. &lt;code>window.nostr.getPublicKey()&lt;/code> returns the user&amp;rsquo;s public key as a hex string without ever exposing the private key to the calling page. &lt;code>window.nostr.signEvent(event)&lt;/code> takes a partial event with &lt;code>created_at&lt;/code>, &lt;code>kind&lt;/code>, &lt;code>tags&lt;/code>, and &lt;code>content&lt;/code>, and returns the complete signed event with &lt;code>id&lt;/code>, &lt;code>pubkey&lt;/code>, and &lt;code>sig&lt;/code> added. The key point is that the private key never leaves the extension&amp;rsquo;s isolated context; the web application submits an unsigned event and receives back a signed one.&lt;/p>
&lt;p>The optional methods cover encryption: &lt;code>window.nostr.nip04.encrypt&lt;/code> and &lt;code>window.nostr.nip04.decrypt&lt;/code> for the older NIP-04 scheme (now deprecated), and &lt;code>window.nostr.nip44.encrypt&lt;/code> and &lt;code>window.nostr.nip44.decrypt&lt;/code> for the current NIP-44 scheme. Extensions that support NIP-44 can therefore handle both direct message encryption and any other application that needs pubkey-keyed encryption without the calling page seeing the nsec.&lt;/p>
&lt;p>The spec also includes a recommendation to extension authors: load scripts with &lt;code>&amp;quot;run_at&amp;quot;: &amp;quot;document_end&amp;quot;&lt;/code> in the extension manifest so &lt;code>window.nostr&lt;/code> is available synchronously when the page loads, avoiding race conditions where a client checks &lt;code>window.nostr&lt;/code> before the extension has injected it.&lt;/p>
&lt;p>A key example of NIP-07 in action is the Keycast project covered above. The Keycast web frontend uses NIP-07 to sign NIP-98 HTTP auth events: the SvelteKit app never handles the user&amp;rsquo;s nsec directly. It calls &lt;code>window.nostr.signEvent&lt;/code> to produce the auth header, then sends that header to the Keycast API. This architecture means the key material stays in the browser extension throughout the entire team key management flow.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;7f8e9d0c1b2a3e4f5d6c7b8a9f0e1d2c3b4a5f6e7d8c9b0a1f2e3d4c5b6a7f8a&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1747785600&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Hello from a NIP-07 signed event&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2cdd&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="nip-deep-dive-nip-39-external-identities-in-profiles">NIP Deep Dive: NIP-39 (external identities in profiles)&lt;/h2>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/39.md">NIP-39&lt;/a> defines how a Nostr user can declare control over external platform identities in their profile. Each declaration uses an &lt;code>i&lt;/code> tag inside a kind:10011 event, asserting ownership of a specific account on another platform together with a proof that can be independently verified.&lt;/p>
&lt;p>Each tag follows the format &lt;code>[&amp;quot;i&amp;quot;, &amp;quot;platform:identity&amp;quot;, &amp;quot;proof&amp;quot;]&lt;/code>, where &lt;code>platform:identity&lt;/code> combines the platform name and username with a colon separator (&lt;code>github:semisol&lt;/code>, &lt;code>twitter:semisol_public&lt;/code>). &lt;code>proof&lt;/code> points to a verifiable artifact on the platform itself.&lt;/p>
&lt;p>For GitHub, the proof is a Gist ID. The user creates a public Gist from their GitHub account containing the text &lt;code>Verifying that I control the following Nostr public key: npub1...&lt;/code>. A client verifying the claim fetches &lt;code>https://gist.github.com/&amp;lt;identity&amp;gt;/&amp;lt;proof&amp;gt;&lt;/code> and checks that the Gist was authored by the claimed GitHub username and contains the expected pubkey. For Twitter the proof is a tweet ID, for Mastodon a post ID, and for Telegram a message reference in a public group.&lt;/p>
&lt;p>The identity provider name must contain only &lt;code>a-z&lt;/code>, &lt;code>0-9&lt;/code>, and the characters &lt;code>._-/&lt;/code>, and must not contain &lt;code>:&lt;/code>. Identity names should be normalized to lowercase, with the primary alias used when multiple exist.&lt;/p>
&lt;p>The Namecoin &lt;code>.bit&lt;/code> NIP-05 discussion happening this week shows NIP-39&amp;rsquo;s role in the broader identity stack: it provides a standardized, relay-agnostic way to cross-reference a Nostr key with an established identity elsewhere, without requiring any central verification authority. A client can independently verify the proof by fetching a public artifact on the named platform, and the proof is bound to the specific Nostr pubkey in the Gist or tweet text, not a generic platform credential.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;7f8e9d0c1b2a3e4f5d6c7b8a9f0e1d2c3b4a5f6e7d8c9b0a1f2e3d4c5b6a7f8a&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1747785600&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">10011&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;i&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;github:semisol&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;9721ce4ee4fceb91c9711ca2a6c9a5ab&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;i&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;twitter:semisol_public&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;1619358434134196225&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;i&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;mastodon:bitcoinhackers.org/@semisol&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;109775066355589974&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3eff&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;p>That&amp;rsquo;s it for this week. If you&amp;rsquo;re building something or have news to share, DM us on Nostr or find us at &lt;a href="https://nostrcompass.org">nostrcompass.org&lt;/a>.&lt;/p></content:encoded></item><item><title>Nostr Compass #22</title><link>https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/</link><pubDate>Wed, 13 May 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr protocol development.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/mmalmi/nostr-vpn">Nostr VPN&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#nostr-vpn-ships-eight-releases-culminating-in-v4010">eight releases in seven days&lt;/a> from a redesigned device-pairing flow through a FIPS AEAD swap that roughly doubles TCP throughput. &lt;a href="https://github.com/marmot-protocol">Marmot Protocol&lt;/a> (the foundation for &lt;a href="https://github.com/marmot-protocol/whitenoise">White Noise&lt;/a>) ships a &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#marmot-white-noise-ships-blocking-complete-frontend-and-31-merged-prs-across-mdk-and-backend">frontend release completing the user-blocking feature&lt;/a> and 31 merged PRs across MDK and backend. &lt;a href="https://github.com/0ceanSlim/grain">Grain&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#grain-v060-adds-nip-40-nip-50-nip-70-and-nip-45">v0.6.0&lt;/a> with four new NIP implementations in one milestone. &lt;a href="https://github.com/greenart7c3/Citrine">Citrine&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#citrine-v300-pre1-lands-built-in-tor-and-relay-aggregation">v3.0.0-pre1&lt;/a> with built-in Tor and relay aggregation. &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#amber-v610-pre2-improves-new-app-connection-flow">v6.1.0-pre2&lt;/a> with connection-flow and signing improvements. &lt;a href="https://github.com/getAlby/hub">Alby Hub&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#alby-hub-v1222-adds-ai-and-agents-page-and-core-lightning-support">v1.22.2&lt;/a> with an AI and Agents page and Core Lightning integration. &lt;a href="https://github.com/MostroP2P/mostro">Mostro&lt;/a> ships concurrent taker bonds and &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#mostro-ships-concurrent-taker-bonds-and-mostro-core-v0110">mostro-core v0.11.0&lt;/a>. &lt;a href="https://github.com/CodyTseng/jumble">Jumble&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#jumble-ships-five-releases-with-recent-search-and-account-persistence">five releases&lt;/a> with recent search history and account-data persistence fixes. &lt;a href="https://github.com/nostrord/nostrord">Nostrord&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#nostrord-ships-group-share-modals-media-upload-and-arch-linux-packages">three releases&lt;/a> with group share modals and Arch Linux packages. &lt;a href="https://flotilla.social">Flotilla&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#flotilla-180-ships-video-calls-email-rendering-and-room-mentions">1.8.0&lt;/a> with video calls, email rendering, and room mentions. &lt;a href="https://calendar.formstr.app">Calendar by Formstr&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#calendar-by-formstr-ships-v150-with-appointment-scheduling-and-android-calendar-sync">v1.5.0&lt;/a> with appointment scheduling and Android calendar sync. &lt;a href="https://github.com/jmcorgan/fips">FIPS&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#fips-v030-ships-cross-platform-reach-nostr-peer-discovery-and-a-gateway-for-unmodified-lans">v0.3.0&lt;/a> going cross-platform with Nostr-mediated peer discovery, NAT hole-punching via NIP-59 gift-wrap, and a new gateway binary for unmodified LAN hosts. &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> merges &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#amethyst-adds-scheduled-posts-nip-9a-community-rules-and-a-desktop-local-relay">scheduled posts, NIP-9A community rule enforcement, and an embedded desktop relay&lt;/a> across 78 PRs. &lt;a href="https://github.com/block/sprout">Sprout&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#sprout-ships-v0010-and-v0011">v0.0.10 and v0.0.11&lt;/a> with image handling and agent error fixes. &lt;a href="https://github.com/DocNR/clave">Clave&lt;/a> &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#clave-continues-multi-account-nostrconnect-rollout">continues its multi-account NostrConnect rollout&lt;/a> with a unified Connect tab and a bunker connection-cap security fix. &lt;a href="https://github.com/Negr087/tamagostrich">Tamagostrich&lt;/a> &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#tamagostrich-launches-a-decentralized-nip-78-tamagotchi-with-sats-rewards">launches&lt;/a> as a decentralized NIP-78 Tamagotchi where your pet&amp;rsquo;s state lives on Nostr and milestones pay out sats via NIP-47. The NIP discussions surface &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#protocol-and-spec-work">five new proposals&lt;/a> including Reservations, Escrow Services, Accommodation Listings, Onchain Zaps, and verifiable community rules. Two NIP deep dives cover &lt;a href="https://nostrcompass.org/en/topics/nip-78/">NIP-78&lt;/a> (app-specific data) and &lt;a href="https://nostrcompass.org/en/topics/nip-98/">NIP-98&lt;/a> (HTTP Auth).&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr protocol development.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/mmalmi/nostr-vpn">Nostr VPN&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#nostr-vpn-ships-eight-releases-culminating-in-v4010">eight releases in seven days&lt;/a> from a redesigned device-pairing flow through a FIPS AEAD swap that roughly doubles TCP throughput. &lt;a href="https://github.com/marmot-protocol">Marmot Protocol&lt;/a> (the foundation for &lt;a href="https://github.com/marmot-protocol/whitenoise">White Noise&lt;/a>) ships a &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#marmot-white-noise-ships-blocking-complete-frontend-and-31-merged-prs-across-mdk-and-backend">frontend release completing the user-blocking feature&lt;/a> and 31 merged PRs across MDK and backend. &lt;a href="https://github.com/0ceanSlim/grain">Grain&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#grain-v060-adds-nip-40-nip-50-nip-70-and-nip-45">v0.6.0&lt;/a> with four new NIP implementations in one milestone. &lt;a href="https://github.com/greenart7c3/Citrine">Citrine&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#citrine-v300-pre1-lands-built-in-tor-and-relay-aggregation">v3.0.0-pre1&lt;/a> with built-in Tor and relay aggregation. &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#amber-v610-pre2-improves-new-app-connection-flow">v6.1.0-pre2&lt;/a> with connection-flow and signing improvements. &lt;a href="https://github.com/getAlby/hub">Alby Hub&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#alby-hub-v1222-adds-ai-and-agents-page-and-core-lightning-support">v1.22.2&lt;/a> with an AI and Agents page and Core Lightning integration. &lt;a href="https://github.com/MostroP2P/mostro">Mostro&lt;/a> ships concurrent taker bonds and &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#mostro-ships-concurrent-taker-bonds-and-mostro-core-v0110">mostro-core v0.11.0&lt;/a>. &lt;a href="https://github.com/CodyTseng/jumble">Jumble&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#jumble-ships-five-releases-with-recent-search-and-account-persistence">five releases&lt;/a> with recent search history and account-data persistence fixes. &lt;a href="https://github.com/nostrord/nostrord">Nostrord&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#nostrord-ships-group-share-modals-media-upload-and-arch-linux-packages">three releases&lt;/a> with group share modals and Arch Linux packages. &lt;a href="https://flotilla.social">Flotilla&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#flotilla-180-ships-video-calls-email-rendering-and-room-mentions">1.8.0&lt;/a> with video calls, email rendering, and room mentions. &lt;a href="https://calendar.formstr.app">Calendar by Formstr&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#calendar-by-formstr-ships-v150-with-appointment-scheduling-and-android-calendar-sync">v1.5.0&lt;/a> with appointment scheduling and Android calendar sync. &lt;a href="https://github.com/jmcorgan/fips">FIPS&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#fips-v030-ships-cross-platform-reach-nostr-peer-discovery-and-a-gateway-for-unmodified-lans">v0.3.0&lt;/a> going cross-platform with Nostr-mediated peer discovery, NAT hole-punching via NIP-59 gift-wrap, and a new gateway binary for unmodified LAN hosts. &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> merges &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#amethyst-adds-scheduled-posts-nip-9a-community-rules-and-a-desktop-local-relay">scheduled posts, NIP-9A community rule enforcement, and an embedded desktop relay&lt;/a> across 78 PRs. &lt;a href="https://github.com/block/sprout">Sprout&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#sprout-ships-v0010-and-v0011">v0.0.10 and v0.0.11&lt;/a> with image handling and agent error fixes. &lt;a href="https://github.com/DocNR/clave">Clave&lt;/a> &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#clave-continues-multi-account-nostrconnect-rollout">continues its multi-account NostrConnect rollout&lt;/a> with a unified Connect tab and a bunker connection-cap security fix. &lt;a href="https://github.com/Negr087/tamagostrich">Tamagostrich&lt;/a> &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#tamagostrich-launches-a-decentralized-nip-78-tamagotchi-with-sats-rewards">launches&lt;/a> as a decentralized NIP-78 Tamagotchi where your pet&amp;rsquo;s state lives on Nostr and milestones pay out sats via NIP-47. The NIP discussions surface &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-13-newsletter/#protocol-and-spec-work">five new proposals&lt;/a> including Reservations, Escrow Services, Accommodation Listings, Onchain Zaps, and verifiable community rules. Two NIP deep dives cover &lt;a href="https://nostrcompass.org/en/topics/nip-78/">NIP-78&lt;/a> (app-specific data) and &lt;a href="https://nostrcompass.org/en/topics/nip-98/">NIP-98&lt;/a> (HTTP Auth).&lt;/p>
&lt;h2 id="top-stories">Top Stories&lt;/h2>
&lt;h3 id="nostr-vpn-ships-eight-releases-culminating-in-v4010">Nostr VPN ships eight releases culminating in v4.0.10&lt;/h3>
&lt;p>&lt;a href="https://github.com/mmalmi/nostr-vpn">Nostr VPN&lt;/a>, the Rust-based decentralized mesh VPN using Nostr for peer discovery and a FIPS-backed noise protocol for the data plane, shipped eight releases from &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v4.0.1">v4.0.1&lt;/a> to &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v4.0.10">v4.0.10&lt;/a> across macOS, Linux, Windows, and Android this week.&lt;/p>
&lt;p>The headline change is in &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v4.0.8">v4.0.8&lt;/a>: the AEAD was swapped from the RustCrypto &lt;code>chacha20poly1305&lt;/code> soft backend to BoringSSL&amp;rsquo;s ChaCha20-Poly1305 in &lt;code>ring&lt;/code> 0.17, which uses hand-tuned NEON on aarch64 and AVX2/AVX-512 on x86_64. Docker benchmarks on identical hardware showed 2-node direct TCP throughput jumping from 437 to 1097 Mbps. The wire format is unchanged.&lt;/p>
&lt;p>Earlier in the week, &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v4.0.1">v4.0.1&lt;/a> rebuilt the device-pairing flow with exit-node leak protection, a unified WireGuard config block under Exit Nodes, and signed/notarized macOS artifacts. &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v4.0.2">v4.0.2&lt;/a> improved LAN discovery with reusable multicast sockets so same-LAN peers prefer direct underlay paths. &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v4.0.6">v4.0.6&lt;/a> fixed a NAT traversal regression where a tunnel MTU bump caused full-sized datagrams to drop silently on adopted UDP transports. &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v4.0.9">v4.0.9&lt;/a> added &lt;code>sendmmsg(2)&lt;/code> batching on the UDP send path, amortising per-packet &lt;code>sendto&lt;/code> syscalls across 8-packet batches and pushing TCP single-stream from 1066 to 1548 Mbps (1.45×). &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v4.0.10">v4.0.10&lt;/a> shipped a full UX overhaul for device pairing: Invite Devices and Join Network are now separate cards, auto-import fires on paste of an &lt;code>nvpn://invite/&lt;/code> string, scan/paste/from-file buttons gained text labels, and nearby pairing split into two independent 15-minute toggles. Windows multicast now joins every non-loopback interface so same-LAN peers are reliably discovered on multi-NIC hosts. A userspace WireGuard upstream runtime (boringtun-based) lands for macOS, enabling Mullvad/Proton-style exit routing without a kernel WG implementation.&lt;/p>
&lt;h3 id="marmot--white-noise-ships-frontend-release-completing-user-blocking-and-31-merged-prs-across-mdk-and-backend">Marmot / White Noise ships frontend release completing user-blocking and 31 merged PRs across MDK and backend&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/whitenoise">White Noise&lt;/a>, the private group messaging app built on the &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> MLS-based protocol, shipped &lt;a href="https://github.com/marmot-protocol/whitenoise/releases/tag/v2026.5.7&amp;#43;24">v2026.5.7+24&lt;/a> on May 7 as the frontend release that completes the blocking feature set. The previous release shipped mute, search, and archive; this one finishes blocking. A blocked user is now hidden from invites, chat previews, message timelines, search results, and notifications, and their messages no longer count toward unread badges. Video attachments work end to end across devices. The offline notice now covers every screen.&lt;/p>
&lt;p>The supporting work spans 31 merged PRs across MDK and the backend. MDK landed &lt;a href="https://github.com/marmot-protocol/mdk/pull/258">PR #258&lt;/a> with the extension v3 wire format and &lt;code>disappearing_message_secs&lt;/code> schema, laying the groundwork for disappearing messages.&lt;/p>
&lt;p>Frontend work includes &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/653">PR #653&lt;/a> fixing archived chat summaries by switching to a point query so archived chats render correctly, &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/644">PR #644&lt;/a> exposing a &lt;code>subscribe_to_group_state&lt;/code> stream to Dart for reactive UI updates, and &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/635">PR #635&lt;/a> fixing Android external signer notification recovery when the signer app is cold-started.&lt;/p>
&lt;h3 id="grain-v060-adds-nip-40-nip-50-nip-70-and-nip-45">Grain v0.6.0 adds NIP-40, NIP-50, NIP-70, and NIP-45&lt;/h3>
&lt;p>&lt;a href="https://github.com/0ceanSlim/grain">Grain&lt;/a>, the Go-based Nostr relay and client library, shipped &lt;a href="https://github.com/0ceanSlim/grain/releases/tag/v0.6.0">v0.6.0&lt;/a> on May 6 with four new NIP implementations and a production-hardening pass. The v0.6 milestone adds &lt;a href="https://github.com/nostr-protocol/nips/blob/master/40.md">NIP-40&lt;/a> event expiration, &lt;a href="https://github.com/nostr-protocol/nips/blob/master/50.md">NIP-50&lt;/a> full-text search, &lt;a href="https://github.com/nostr-protocol/nips/blob/master/70.md">NIP-70&lt;/a> protected events, and &lt;a href="https://github.com/nostr-protocol/nips/blob/master/45.md">NIP-45&lt;/a> event counts.&lt;/p>
&lt;p>Event expiration via &lt;a href="https://github.com/nostr-protocol/nips/blob/master/40.md">NIP-40&lt;/a> lets publishers set an expiry timestamp so the relay discards events after they expire, used in practice for ephemeral presence events and time-limited announcements. &lt;a href="https://github.com/nostr-protocol/nips/blob/master/50.md">NIP-50&lt;/a> full-text search lets clients issue &lt;code>search&lt;/code> filters in REQ messages and let the relay do the matching work. Protected events via &lt;a href="https://github.com/nostr-protocol/nips/blob/master/70.md">NIP-70&lt;/a> prevent relays from resharing events without the author&amp;rsquo;s explicit permission. &lt;a href="https://github.com/nostr-protocol/nips/blob/master/45.md">NIP-45&lt;/a> count queries let clients ask a relay to return a count of matching events, reducing bandwidth for &amp;ldquo;how many notes does this user have&amp;rdquo; style queries.&lt;/p>
&lt;p>The release also ships production hardening: safer default configurations, corrected NIP-01 rejection responses, and better backpressure for slow consumers.&lt;/p>
&lt;h2 id="shipping-this-week">Shipping this week&lt;/h2>
&lt;h3 id="citrine-v300-pre1-lands-built-in-tor-and-relay-aggregation">Citrine v3.0.0-pre1 lands built-in Tor and relay aggregation&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Citrine">Citrine&lt;/a>, the Android app that turns a phone into a Nostr relay node, shipped &lt;a href="https://github.com/greenart7c3/Citrine/releases/tag/v3.0.0-pre1">v3.0.0-pre1&lt;/a> as a pre-release this week. The headline additions are built-in Tor support for privacy-preserving relay access and relay aggregation, where Citrine can pull events from multiple upstream relays and serve them to local clients. &lt;a href="https://github.com/greenart7c3/Citrine/pull/139">PR #139&lt;/a> adds &lt;a href="https://nostrcompass.org/en/topics/nip-77/">NIP-77 (Negentropy Reconciliation)&lt;/a> support for efficient set-reconciliation-based event sync. &lt;a href="https://github.com/greenart7c3/Citrine/pull/137">PR #137&lt;/a> routes all URLs through the Tor proxy, &lt;a href="https://github.com/greenart7c3/Citrine/pull/133">PR #133&lt;/a> relieves UI thread pressure on the event-receive path, and &lt;a href="https://github.com/greenart7c3/Citrine/pull/132">PR #132&lt;/a> reduces battery drain from the relay aggregator. The release also adds an event analytics view with a pie chart breaking down stored events by kind.&lt;/p>
&lt;h3 id="amber-v610-pre2-improves-new-app-connection-flow">Amber v6.1.0-pre2 improves new-app connection flow&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a>, the Android signer app for &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55 (Android Signer Application)&lt;/a> and &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a>, shipped &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.1.0-pre2">v6.1.0-pre2&lt;/a>. The main fixes: the signer dialog now closes correctly after accepting a bunker request, malformed bunker requests show an invalid-request screen, and rate limiting is added for intent-based signing requests. &lt;a href="https://github.com/greenart7c3/Amber/pull/430">PR #430&lt;/a> fixes memory leaks and hot-path inefficiencies in the signing flow.&lt;/p>
&lt;h3 id="alby-hub-v1222-adds-ai-and-agents-page-and-core-lightning-support">Alby Hub v1.22.2 adds AI and Agents page and Core Lightning support&lt;/h3>
&lt;p>&lt;a href="https://github.com/getAlby/hub">Alby Hub&lt;/a>, the self-custodial Lightning node and Nostr Wallet Connect server, shipped &lt;a href="https://github.com/getAlby/hub/releases/tag/v1.22.2">v1.22.2&lt;/a> with several major additions. The new AI and Agents page exposes Alby Hub&amp;rsquo;s Lightning and NWC capabilities to AI agents and MCP-compatible tools. An integrated on-chain wallet mode lets users receive and send on-chain Bitcoin directly from Alby Hub. Custom user labels for transactions improve bookkeeping. Settings pages were redesigned for clarity, and budget selection was improved when creating app connections. The most-requested feature since launch shipped: Core Lightning (CLN) is now a supported backend alongside LND and LDK.&lt;/p>
&lt;h3 id="mostro-ships-concurrent-taker-bonds-and-mostro-core-v0110">Mostro ships concurrent taker bonds and mostro-core v0.11.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/MostroP2P/mostro">Mostro&lt;/a>, the peer-to-peer Bitcoin trading protocol on Nostr, merged 11 PRs this week advancing the taker bond feature that prevents griefing by requiring both parties to lock funds before a trade proceeds. &lt;a href="https://github.com/MostroP2P/mostro/pull/733">PR #733&lt;/a> implements concurrent taker bonds where multiple takers can submit bond invoices simultaneously and the first to lock wins, discarding the others. &lt;a href="https://github.com/MostroP2P/mostro/pull/735">PR #735&lt;/a> aligns the bond invoice memo with spec section 6.1, and &lt;a href="https://github.com/MostroP2P/mostro/pull/730">PR #730&lt;/a> documents &lt;code>cancel_action&lt;/code> handling for the &lt;code>WaitingTakerBond&lt;/code> status.&lt;/p>
&lt;p>&lt;a href="https://github.com/MostroP2P/mostro-core">mostro-core&lt;/a> shipped &lt;a href="https://github.com/MostroP2P/mostro-core/releases/tag/v0.11.0">v0.11.0&lt;/a> with the matching library additions: &lt;a href="https://github.com/MostroP2P/mostro-core/pull/144">PR #144&lt;/a> adds &lt;code>Action::PayBondInvoice&lt;/code> and &lt;code>Status::WaitingTakerBond&lt;/code>, and &lt;a href="https://github.com/MostroP2P/mostro-core/pull/143">PR #143&lt;/a> adds the &lt;code>BondResolution&lt;/code> payload for admin settle and cancel actions. &lt;a href="https://github.com/MostroP2P/mostro-cli">mostro-cli&lt;/a> shipped &lt;a href="https://github.com/MostroP2P/mostro-cli/releases/tag/v0.15.0">v0.15.0&lt;/a> updating to mostro-core 0.11.0 and handling the anti-abuse bond flow.&lt;/p>
&lt;h3 id="jumble-ships-five-releases-with-recent-search-and-account-persistence">Jumble ships five releases with recent search and account persistence&lt;/h3>
&lt;p>&lt;a href="https://github.com/CodyTseng/jumble">Jumble&lt;/a>, the relay-centric Nostr client available as both a web app and Electron desktop app, shipped five releases this week: &lt;a href="https://github.com/CodyTseng/jumble/releases/tag/v26.5.2">v26.5.2&lt;/a> through &lt;a href="https://github.com/CodyTseng/jumble/releases/tag/v26.5.6">v26.5.6&lt;/a>. &lt;a href="https://github.com/CodyTseng/jumble/releases/tag/v26.5.2">v26.5.2&lt;/a> groups notifications by Today / This week / This month / Earlier with sticky date headers and replaces the third-party pull-to-refresh library with a native component. &lt;a href="https://github.com/CodyTseng/jumble/releases/tag/v26.5.3">v26.5.3&lt;/a> ships a macOS &lt;code>.zip&lt;/code> alongside the &lt;code>.dmg&lt;/code> so the Electron desktop build can apply in-place auto-updates (electron-updater cannot install from a &lt;code>.dmg&lt;/code>). &lt;a href="https://github.com/CodyTseng/jumble/releases/tag/v26.5.4">v26.5.4&lt;/a> adds a self-implemented emoji picker with emoji-pack tabs. &lt;a href="https://github.com/CodyTseng/jumble/releases/tag/v26.5.5">v26.5.5&lt;/a> adds recent search history. A critical persistence bug is fixed in &lt;a href="https://github.com/CodyTseng/jumble/releases/tag/v26.5.6">v26.5.6&lt;/a>: accounts and cached data now survive a full app restart after the renderer was moved to a stable &lt;code>app://&lt;/code> origin.&lt;/p>
&lt;h3 id="nostrord-ships-group-share-modals-media-upload-and-arch-linux-packages">Nostrord ships group share modals, media upload, and Arch Linux packages&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostrord/nostrord">Nostrord&lt;/a>, a Nostr client targeting NIP-29 relay-based groups, shipped &lt;a href="https://github.com/nostrord/nostrord/releases/tag/v1.0.0">v1.0.0&lt;/a>, &lt;a href="https://github.com/nostrord/nostrord/releases/tag/v1.0.1">v1.0.1&lt;/a>, and &lt;a href="https://github.com/nostrord/nostrord/releases/tag/v1.0.2">v1.0.2&lt;/a> this week. &lt;a href="https://github.com/nostrord/nostrord/releases/tag/v1.0.1">v1.0.1&lt;/a> ships Arch Linux packages via AUR as &lt;code>nostrord-bin&lt;/code> with PGP-signed &lt;code>.pkg.tar.zst&lt;/code> artifacts (&lt;a href="https://github.com/nostrord/nostrord/pull/44">PR #44&lt;/a>), a jump-to-latest button when scrolled up in a busy channel (&lt;a href="https://github.com/nostrord/nostrord/pull/45">PR #45&lt;/a>), and image and media pasting directly in the chat input (&lt;a href="https://github.com/nostrord/nostrord/pull/46">PR #46&lt;/a>). &lt;a href="https://github.com/nostrord/nostrord/releases/tag/v1.0.2">v1.0.2&lt;/a> adds group sharing via &lt;a href="https://github.com/nostrord/nostrord/pull/49">PR #49&lt;/a> with a share modal that generates both a &lt;code>nostr:naddr&lt;/code> URI (kind 39000, NIP-19 + NIP-21) and a web-friendly &lt;code>nostrord.com/open/&lt;/code> link so groups can be shared across clients and platforms.&lt;/p>
&lt;h3 id="fips-v030-ships-cross-platform-reach-nostr-peer-discovery-and-a-gateway-for-unmodified-lans">FIPS v0.3.0 ships cross-platform reach, Nostr peer discovery, and a gateway for unmodified LANs&lt;/h3>
&lt;p>&lt;a href="https://github.com/jmcorgan/fips">FIPS&lt;/a> (Free Internetworking Peering System), the Nostr-native mesh networking project covered in &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#fips-adds-nostr-based-udpnat-bootstrap">#20&lt;/a>, shipped &lt;a href="https://github.com/jmcorgan/fips/releases/tag/v0.3.0">v0.3.0&lt;/a> this week, a major milestone that widens the project from Linux-only to Linux, macOS, Windows, and OpenWrt.&lt;/p>
&lt;p>The headline addition is Nostr-mediated peer discovery with STUN-assisted UDP NAT traversal. Nodes now publish signed overlay adverts as kind:37195 parameterized replaceable events (the digits spell FIPS: 7=F, 1=I, 9=P, 5=S) on public Nostr relays. When both peers are behind NAT, the daemon coordinates a hole punch using &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59 (Gift Wrap)&lt;/a> signaling for the offer/answer exchange. Previously, nodes could only peer if they already knew each other&amp;rsquo;s address.&lt;/p>
&lt;p>A new &lt;code>fips-gateway&lt;/code> binary lets unmodified LAN hosts reach mesh destinations without running the FIPS daemon. DNS lookups for &lt;code>.fips&lt;/code> names get virtual IPs from a &lt;code>fd01::/112&lt;/code> pool; &lt;code>gateway.port_forwards&lt;/code> config exposes LAN services to mesh peers. The gateway is enabled by default in the OpenWrt build, targeting consumer-grade router deployments.&lt;/p>
&lt;p>The same ring 0.17 ChaCha20-Poly1305 swap that powered the Nostr VPN throughput jump this week also lands in FIPS v0.3.0, contributed by &lt;a href="https://github.com/mmalmi">@mmalmi&lt;/a>, the Nostr VPN maintainer. Benchmarks on aarch64 show two-node TCP single-stream going from 437 to 1097 Mbps and three-node relay-path ping latency dropping from 7.68 ms average to 0.72 ms. Peer ACL via &lt;code>/etc/fips/peers.allow&lt;/code> and &lt;code>/etc/fips/peers.deny&lt;/code> files and an opt-in default-deny nftables baseline for the mesh interface also ship in this release.&lt;/p>
&lt;h3 id="camelus-v1101-ships-desktop-builds">Camelus v1.10.1 ships desktop builds&lt;/h3>
&lt;p>&lt;a href="https://github.com/leo-lox/camelus">Camelus&lt;/a>, the Nostr client for Android and desktop, shipped &lt;a href="https://github.com/leo-lox/camelus/releases/tag/v1.10.1">v1.10.1&lt;/a> with Windows and Linux desktop builds, expanding from mobile-only distribution.&lt;/p>
&lt;h3 id="flotilla-180-ships-video-calls-email-rendering-and-room-mentions">Flotilla 1.8.0 ships video calls, email rendering, and room mentions&lt;/h3>
&lt;p>&lt;a href="https://flotilla.social">Flotilla&lt;/a>, the &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> relay-based group chat app from hodlbod, shipped &lt;a href="https://gitea.coracle.social/coracle/flotilla/src/tag/1.8.0">1.8.0&lt;/a> this week with several notable additions. Voice rooms now support video: participants can turn on cameras or share their screen mid-call, with a grid layout that switches to a pinnable single-feed view for screen sharing. Email rendering arrives via an update to the welshman library: Flotilla can now receive messages that embed HTML email content, such as forwards from email bridges or email-to-Nostr gateways, and renders the HTML inline with formatting, images, and links intact. Interoperability projects routing email into NIP-29 group spaces can now deliver readable, formatted messages to Flotilla users without stripping HTML. Room mentions let users reference other rooms and relays with clickable inline links. Space search now includes message content and local matches alongside channel names. The native share sheet on iOS and Android now works for space invite links. Calendar events embedded in chat always show the date.&lt;/p>
&lt;h3 id="calendar-by-formstr-ships-v151-with-appointment-scheduling-and-android-calendar-sync">Calendar by Formstr ships v1.5.1 with appointment scheduling and Android calendar sync&lt;/h3>
&lt;p>&lt;a href="https://calendar.formstr.app">Calendar by Formstr&lt;/a> (&lt;a href="https://github.com/formstr-hq/nostr-calendar">github.com/formstr-hq/nostr-calendar&lt;/a>), a Nostr-native calendar app for public and private events, shipped &lt;a href="https://github.com/formstr-hq/nostr-calendar/releases/tag/v1.5.0">v1.5.0&lt;/a> on May 10 and &lt;a href="https://github.com/formstr-hq/nostr-calendar/releases/tag/v1.5.1">v1.5.1&lt;/a> on May 11. Appointment scheduling arrives in &lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/89">PR #89&lt;/a>, letting users create bookable time slots on their calendar. Read-only Android calendar integration in &lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/123">PR #123&lt;/a> syncs Nostr events to the device calendar so they appear alongside other calendar apps. Event notifications ship in &lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/130">PR #130&lt;/a>. Users can now add or remove events from their busy list via &lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/134">PR #134&lt;/a>, and relay publish progress feedback in &lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/118">PR #118&lt;/a> shows which relays accepted an event save. &lt;a href="https://github.com/formstr-hq/nostr-calendar/releases/tag/v1.5.1">v1.5.1&lt;/a> follows with a URL bug fix and ZSP metadata update.&lt;/p>
&lt;h2 id="in-development">In Development&lt;/h2>
&lt;h3 id="amethyst-adds-scheduled-posts-nip-9a-community-rules-and-a-desktop-local-relay">Amethyst adds scheduled posts, NIP-9A community rules, and a desktop local relay&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a>, the feature-rich Android client, merged 78 PRs this week across several significant feature areas.&lt;/p>
&lt;p>Scheduled posts land on Android in &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2765">PR #2765&lt;/a>: users can compose a note and set a future publish time, with the queue managed locally on device. A desktop build gains an embedded local relay with SQLite event persistence in &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2841">PR #2841&lt;/a>, allowing the desktop client to serve as its own relay node and handle high connection counts without an external relay.&lt;/p>
&lt;p>Three PRs implement NIP-9A community rules directly in the client: &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2798">PR #2798&lt;/a> validates posts against community rules in the composer before sending, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2799">PR #2799&lt;/a> adds a structured NIP-9A rules editor to the new-community flow, and &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2800">PR #2800&lt;/a> adds an opt-in NIP-9A feed filter so community members can hide posts that violate the published rules. This is the first client-side implementation of the NIP-9A draft proposed in the NIPs repo this week.&lt;/p>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst/pull/2812">PR #2812&lt;/a> redacts secrets and sensitive payloads from debug logs across both Quartz and Amethyst, a security fix for users who share crash reports. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2842">PR #2842&lt;/a> adds LAN video casting via Chromecast in the Google Play build. Two-stage zap progress shows in &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2831">PR #2831&lt;/a> so users can see when a zap is pending vs confirmed. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2855">PR #2855&lt;/a> splits the notifications tab into &amp;ldquo;Following&amp;rdquo; and &amp;ldquo;Everyone&amp;rdquo; views. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2821">PR #2821&lt;/a> adds rich &lt;a href="https://nostrcompass.org/en/topics/nip-92/">NIP-92 (imeta)&lt;/a> tags to every published HLS event and auto-publishes a kind:1 sibling note so live streams appear in standard feeds and are discoverable by clients that do not support &lt;a href="https://nostrcompass.org/en/topics/nip-53/">NIP-53 (Live Activities)&lt;/a>.&lt;/p>
&lt;h3 id="shopstr-adds-mcp-audit-logging-and-session-security">Shopstr adds MCP audit logging and session security&lt;/h3>
&lt;p>&lt;a href="https://github.com/shopstr-eng/shopstr">Shopstr&lt;/a>, the decentralized marketplace on Nostr, merged five PRs this week. Audit logging for the MCP tool layer lands in &lt;a href="https://github.com/shopstr-eng/shopstr/pull/456">PR #456&lt;/a> so marketplace operators can trace agent actions. Session security tightens in &lt;a href="https://github.com/shopstr-eng/shopstr/pull/477">PR #477&lt;/a>, which pins MCP sessions to their originating API key and adds TTL eviction to prevent session hijacking. Missing app routes were added to &lt;code>RESERVED_SLUGS&lt;/code> in &lt;a href="https://github.com/shopstr-eng/shopstr/pull/476">PR #476&lt;/a> so short usernames that match route paths cannot be registered as shop handles.&lt;/p>
&lt;h3 id="dart-ndk-adds-web-support-and-seal-signature-verification">Dart NDK adds web support and seal signature verification&lt;/h3>
&lt;p>&lt;a href="https://github.com/relaystr/dart_ndk">Dart NDK&lt;/a>, the Dart library for Nostr protocol development used in Flutter apps, merged six PRs this week. Web support arrives in &lt;code>SembastCacheManager&lt;/code> via &lt;a href="https://github.com/relaystr/dart_ndk/pull/571">PR #571&lt;/a> so web builds can persist cached events to browser storage. Seal signature verification lands in &lt;a href="https://github.com/relaystr/dart_ndk/pull/595">PR #595&lt;/a> for the &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59 (Gift Wrap)&lt;/a> flow so clients can confirm the inner seal was created by the expected sender. A tag-parsing fix in &lt;a href="https://github.com/relaystr/dart_ndk/pull/597">PR #597&lt;/a> corrects handling of public tags on private lists where tags appear in both encrypted and unencrypted portions of a list event.&lt;/p>
&lt;h3 id="rust-nostr-refactors-tags-and-proxy-connection">rust-nostr refactors tags and proxy connection&lt;/h3>
&lt;p>&lt;a href="https://github.com/rust-nostr/nostr">rust-nostr&lt;/a>, the Rust SDK with bindings for Python, Kotlin, Swift, and JavaScript, merged three PRs this week. &lt;a href="https://github.com/rust-nostr/nostr/pull/1347">PR #1347&lt;/a> is a large tags rework that normalizes tag access across the SDK. &lt;a href="https://github.com/rust-nostr/nostr/pull/1351">PR #1351&lt;/a> replaces the &lt;code>Connection&lt;/code> type with &lt;code>Proxy&lt;/code> in the SDK layer for cleaner proxy configuration, and &lt;a href="https://github.com/rust-nostr/nostr/pull/1349">PR #1349&lt;/a> fixes subscription verification for multi-filter REQs where a subscription with multiple filters was not correctly matched against incoming events.&lt;/p>
&lt;h3 id="sprout-ships-v0010-and-v0011">Sprout ships v0.0.10 and v0.0.11&lt;/h3>
&lt;p>&lt;a href="https://github.com/block/sprout">Sprout&lt;/a>, Block&amp;rsquo;s Nostr client and relay covered in &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#sprout-ships-desktop-v004-and-v005-alongside-nip-oa-agent-authentication-and-the-pair-relay-sidecar">#21&lt;/a>, shipped &lt;a href="https://github.com/block/sprout/releases/tag/v0.0.10">v0.0.10&lt;/a> and &lt;a href="https://github.com/block/sprout/releases/tag/v0.0.11">v0.0.11&lt;/a> with mention autocomplete improvements, image download support, and agent error-handling fixes.&lt;/p>
&lt;h3 id="clave-continues-multi-account-nostrconnect-rollout">Clave continues multi-account NostrConnect rollout&lt;/h3>
&lt;p>&lt;a href="https://github.com/DocNR/clave">Clave&lt;/a>, the iOS NIP-46 remote signer covered in &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#clave-v020-launches-multi-account-on-ios-with-nip-46-nostr-connect-signing">#21&lt;/a>, shipped further builds this week advancing its multi-account NostrConnect work. &lt;a href="https://github.com/DocNR/clave/pull/52">PR #52&lt;/a> promotes Connect from a sheet presented from the home view to a top-level cross-account tab, with all account-binding for pairing flows going through a unified picker. A security fix in build 71 closes a per-account 5-connection cap bypass that existed due to a timing bug in the bunker flow, now enforced at three layers: the entry gate, the in-sheet rotation gate, and the NSE-side check.&lt;/p>
&lt;h2 id="new-projects">New Projects&lt;/h2>
&lt;h3 id="tamagostrich-launches-a-decentralized-nip-78-tamagotchi-with-sats-rewards">Tamagostrich launches a decentralized NIP-78 Tamagotchi with sats rewards&lt;/h3>
&lt;p>&lt;a href="https://github.com/Negr087/tamagostrich">Tamagostrich&lt;/a> is a browser-based virtual pet game launched at IDENTITY Hackathon 2026 where a baby ostrich, Nori, evolves through your Nostr social activity. Pet state lives in a &lt;a href="https://nostrcompass.org/en/topics/nip-78/">NIP-78&lt;/a> kind:30078 event so it syncs across every device sharing the same keypair. Zaps, reactions, reposts, and new followers grant XP; without activity, happiness and energy decay 100 points per 24 hours. Milestone rewards pay out in sats automatically via &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47 (Nostr Wallet Connect)&lt;/a>: 50 sats at level 5, 210 sats at level 10, and 420 sats at the maximum level 21, sent to the user&amp;rsquo;s &lt;code>lud16&lt;/code> address with claim state recorded in the NIP-78 event to prevent double payment.&lt;/p>
&lt;h2 id="protocol-and-spec-work">Protocol and spec work&lt;/h2>
&lt;p>The NIPs repository merged &lt;a href="https://github.com/nostr-protocol/nips/pull/2338">PR #2338&lt;/a> fixing README reference links for Marmot event kinds and the geocaching kind 37516. Five new proposals opened this week:&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2331">PR #2331&lt;/a> proposes &lt;strong>NIP-9A: Verifiable Community Rules&lt;/strong>, introducing kind:34551, a parameterized replaceable event that lets a community owner publish a machine-readable, cryptographically signed rules document. Clients fetch the rules before the user submits a post and reject the draft locally if it violates any rule, surfacing the violation before send. This addresses a gap in NIP-72 (Reddit-style communities), where the community definition event (kind:34550) already carries a freeform &lt;code>rules&lt;/code> tag for human readers but has no machine-readable counterpart. The companion &lt;a href="https://github.com/nostr-protocol/nips/pull/2337">PR #2337&lt;/a> adds an optional &lt;code>nip9a&lt;/code> field to NIP-11 relay information documents, carrying an addressable event coordinate so clients can discover which kind:34551 rules document a relay enforces for relay-wide write policies independent of any community page.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2335">PR #2335&lt;/a> proposes &lt;strong>Reservation Events for Nostr Marketplaces&lt;/strong>, defining kind:32122 (parameterized replaceable reservation events), kind:1326 (append-only transition audit records), and kind:32124 (post-trade reviews). Negotiation is private: draft proposals are sent as NIP-59 gift-wrapped structured-message child events between buyer and seller, so they never hit public relays. Once both parties agree, a commit-stage kind:32122 event goes public and affects listing availability. A per-trade temporary key lets buyers participate without exposing their long-lived pubkey publicly; a &lt;code>participant_proof&lt;/code> tag binds the temp key to the real identity for escrow and review verification. Calendar by Formstr shipped appointment scheduling this week using an app-specific flow; a standard kind:32122 would let any calendar app, marketplace, or scheduling service interoperate on bookings.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2334">PR #2334&lt;/a> proposes &lt;strong>Escrow Services for Nostr Marketplaces&lt;/strong>, using kind:30303 (parameterized replaceable service advertisements) for escrow operators to declare their EVM contract address, bytecode hash (for client-side contract verification), supported chain (e.g. Rootstock chainId 30), fee schedule, and accepted tokens. Buyers and sellers publish kind:17388 replaceable events declaring their trusted escrow providers and accepted payment forms; clients use these to match compatible parties to an escrow before a trade begins. Mostro ships concurrent taker bonds this week for Lightning P2P trades; this NIP extends similar trustless settlement mechanics to Shopstr-style EVM-settled goods markets.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2333">PR #2333&lt;/a> proposes &lt;strong>Accommodation Listing Profiles for NIP-99 Marketplace Listings&lt;/strong>, extending NIP-99 classified listings with H3 geospatial index &lt;code>g&lt;/code> tags and accommodation-specific promoted fields for short-term rental listings. H3 tags allow clients to query listings by geographic cell without a centralized mapping service. Generic marketplace fields like instant-book and negotiability stay in the NIP-99 base; only accommodation-specific tags go in this profile. Combined with the Reservations and Escrow proposals this week, the three drafts form an interlocking stack: list a property (2333), receive and negotiate a booking (2335), and settle payment with dispute resolution (2334).&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2332">PR #2332&lt;/a> proposes &lt;strong>NIP-BC: Onchain Zaps (kind 8333)&lt;/strong>, exploiting a direct identity between Nostr keys and Bitcoin Taproot addresses: a Nostr pubkey is a 32-byte x-only secp256k1 key, and so is a BIP-341 P2TR internal key, meaning any Nostr user already has a deterministic mainnet Bitcoin address derivable from their pubkey alone — no LNURL, custodian, or Lightning address required. The kind number mirrors NIP-57&amp;rsquo;s convention: 9735 is the Lightning P2P port; 8333 is Bitcoin mainnet&amp;rsquo;s P2P port. A &lt;code>kind:8333&lt;/code> event contains the txid in an &lt;code>i&lt;/code> tag (using NIP-73 external content identifiers), the recipient pubkey in a &lt;code>p&lt;/code> tag, a self-reported &lt;code>amount&lt;/code> in satoshis, and an optional &lt;code>e&lt;/code> or &lt;code>a&lt;/code> tag for the zapped event. Because the amount is self-reported, clients must verify the event by fetching the transaction and summing outputs that pay the derived Taproot address. Senders can optionally include an inline SPV proof via &lt;code>block&lt;/code> and &lt;code>proof&lt;/code> tags so verifiers with only the 75 MB block header chain can validate without a remote API call. The spec also extends NIP-07 and NIP-46 with a &lt;code>signPsbt&lt;/code> method so browser signers and remote signers can sign the underlying Bitcoin transaction using the same key. The proposal draws on an existing Ditto implementation and clients should present verified onchain zaps alongside NIP-57 Lightning zap receipts and NIP-61 Nutzaps in aggregate zap totals.&lt;/p>
&lt;h2 id="nip-deep-dive-nip-78-app-specific-data">NIP deep dive: NIP-78 (App-specific data)&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-78/">NIP-78&lt;/a> defines a standard way for applications to store arbitrary private or public data on behalf of a user using Nostr events. The core event kind is 30078, a parameterized replaceable event where the &lt;code>d&lt;/code> tag is an application-defined identifier string. An application gives its storage slot a unique &lt;code>d&lt;/code> tag (for example &lt;code>tamagostrich-pet-state&lt;/code> or &lt;code>amethyst-settings&lt;/code>) and publishes a 30078 event with whatever JSON or text content it needs to persist. Because 30078 is replaceable and scoped by &lt;code>d&lt;/code> tag, the application can update the stored state by publishing a new event with the same &lt;code>d&lt;/code> tag, and the relay retains only the latest version.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;64-char hex&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;64-char hex&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1747180800&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">30078&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;tamagostrich-pet-state&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;{\&amp;#34;level\&amp;#34;:7,\&amp;#34;xp\&amp;#34;:1420,\&amp;#34;happiness\&amp;#34;:82,\&amp;#34;energy\&amp;#34;:61}&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;128-char hex&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The primary motivation is cross-device synchronization without a centralized server. Any client that knows a user&amp;rsquo;s public key and the application&amp;rsquo;s &lt;code>d&lt;/code> tag can fetch the current state from the user&amp;rsquo;s relay set and reconstruct the application state on any device. The user owns the data because it lives in events signed by their keypair, and they can choose which relays to publish to based on their relay list from &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65 (Relay List Metadata)&lt;/a>.&lt;/p>
&lt;p>For private application data, NIP-78 events can encrypt the content field using &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44 (Versioned Encryption)&lt;/a> or the older &lt;a href="https://nostrcompass.org/en/topics/nip-04/">NIP-04&lt;/a> before publishing, so the relay stores ciphertext that only the key holder can decrypt. Public application data, like Tamagostrich&amp;rsquo;s achievement badges displayed on the user&amp;rsquo;s profile, can be stored unencrypted so other clients can read and display it.&lt;/p>
&lt;p>The spec deliberately leaves the content format open. Applications choose their own schema; NIP-78 only standardizes the event kind and the &lt;code>d&lt;/code>-tag scoping mechanism. This means different apps using NIP-78 do not interfere with each other as long as they choose distinct &lt;code>d&lt;/code> tag prefixes. The common convention is to prefix &lt;code>d&lt;/code> tags with the application name to reduce collision risk.&lt;/p>
&lt;p>Current users of NIP-78 include Tamagostrich (pet state sync), Wisp (kind:30078 wallet backup and cross-device security settings sync), NosPress (CMS orchestration state), and several Nostr client settings sync implementations.&lt;/p>
&lt;hr>
&lt;p>&lt;strong>Primary sources:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/78.md">NIP-78 Specification&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/Negr087/tamagostrich">Tamagostrich&lt;/a>: production implementation this week&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>See also:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://nostrcompass.org/en/topics/nip-51/">NIP-51: Lists&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65: Relay List Metadata&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="nip-deep-dive-nip-98-http-auth">NIP deep dive: NIP-98 (HTTP Auth)&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-98/">NIP-98&lt;/a> defines an HTTP authentication scheme that lets Nostr keypairs authorize requests to HTTP servers, eliminating the need for usernames, passwords, or OAuth tokens for server-side API access. A client constructs a short-lived Nostr event of kind 27235, signs it with their private key, base64-encodes the JSON, and sends it in an &lt;code>Authorization: Nostr &amp;lt;base64&amp;gt;&lt;/code> HTTP header.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;64-char hex&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;64-char hex&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1747180800&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">27235&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;u&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;https://files.example.com/upload&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;method&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;POST&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;payload&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;lt;sha256-hash-of-request-body&amp;gt;&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;128-char hex&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The kind 27235 event includes the HTTP method in a &lt;code>method&lt;/code> tag, the full request URL in a &lt;code>u&lt;/code> tag, and a &lt;code>created_at&lt;/code> timestamp. The server validates the signature, checks that the method and URL match the actual request, and verifies that the timestamp is recent (within a few minutes) to prevent replay attacks. If validation passes, the server treats the requesting pubkey as the authenticated identity.&lt;/p>
&lt;p>The design means any server that implements NIP-98 can authenticate Nostr users without any prior registration, account creation, or shared secret. From the user&amp;rsquo;s perspective, authentication is transparent: their Nostr signing key is also their API credential. From the server&amp;rsquo;s perspective, a valid NIP-98 header is a cryptographic proof that the holder of a specific keypair intentionally made this request at this time to this URL.&lt;/p>
&lt;p>NIP-98 is used in Blossom (&lt;a href="https://github.com/hzrd149/blossom/blob/master/buds/01.md">BUD-01&lt;/a>) for authenticating blob uploads and downloads. Routstr uses it for per-request HTTP API access control with npub-level RBAC. Sprout uses it for git transport auth and REST relay access, replacing Bearer token auth entirely in a recent refactor. Clave uses it for proxy pairing calls. Alby Hub uses NIP-98-derived authentication for its admin API, and Nostr.build uses it for upload authorization.&lt;/p>
&lt;p>The spec defines one optional extension: a &lt;code>payload&lt;/code> tag containing the SHA-256 hash of the request body, which lets the server verify that the signed event and the request body were created together, preventing a MITM from substituting a different body after the client signed the auth event.&lt;/p>
&lt;hr>
&lt;p>&lt;strong>Primary sources:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/98.md">NIP-98 Specification&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/hzrd149/blossom/blob/master/buds/01.md">BUD-01: Blossom upload auth&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>See also:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://nostrcompass.org/en/topics/nip-96/">NIP-96: HTTP File Storage Integration&lt;/a>&lt;/li>
&lt;/ul></content:encoded></item><item><title>Nostr Compass #21</title><link>https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/marmot-protocol">Marmot Protocol&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#mdk-080-adds-mip-05-notification-primitives-and-addressable-key-packages">MDK 0.8.0&lt;/a> with the first MIP-05 notification primitives, addressable &lt;a href="https://nostrcompass.org/en/topics/nip-51/">NIP-51 (Lists)&lt;/a> key packages, and a tightened security review pass. &lt;a href="https://github.com/lawalletio/lawallet-nwc">LaWallet NWC&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#lawallet-nwc-v0100-ships-the-full-monorepo-and-end-user-wallet">v0.10.0&lt;/a> as the biggest release since OpenSats funding, bringing a full admin dashboard, end-user Wallet, end-to-end activity log, and a new &lt;code>LightningAddress 1→N&lt;/code> and &lt;code>NWCConnection&lt;/code> schema that unlocks per-address &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47 (Nostr Wallet Connect)&lt;/a> routing. &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> lands a &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#amethyst-stabilizes-nests-with-keep-alive-jwt-resilience-and-lifecycle-subscriptions">Nests stability sprint&lt;/a> with audio gap elimination during JWT refresh, lifecycle-aware key data subscriptions, relay keep-alive reconnection, and an animated speaking-participant indicator. &lt;a href="https://github.com/DanConwayDev/ngit-cli">ngit&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#ngit-v242-and-v243-fix-grasp-server-detection-and-multi-remote-state-events">v2.4.2&lt;/a> and &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#ngit-v242-and-v243-fix-grasp-server-detection-and-multi-remote-state-events">v2.4.3&lt;/a> fixing GRASP server detection for PR submissions and multi-remote state-event filtering. &lt;a href="https://github.com/0ceanSlim/grain">GRAIN&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#grain-v054-lands-production-hardening-and-a-silent-data-loss-fix">v0.5.4&lt;/a> with production hardening and a silent data-loss fix in the Docker quick-start. &lt;a href="https://github.com/MostroP2P/mostro-core">Mostro Core&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#mostro-core-v0101-adds-pgp-signed-release-artifacts">v0.10.1&lt;/a> with PGP-signed release artifacts as a follow-up to last week&amp;rsquo;s v0.10.0 P2P chat protocol module. &lt;a href="https://github.com/clave-mobile">Clave&lt;/a> launches &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#clave-v020-launches-multi-account-on-ios-with-nip-46-nostr-connect-signing">v0.2.0&lt;/a> with multi-account support on iOS. &lt;a href="https://github.com/Cameri/nostream">nostream&lt;/a> merges &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#nostream-adds-marmot-relay-support-and-nip-25-reactions">Marmot relay support and NIP-25 (Reactions)&lt;/a>. &lt;a href="https://github.com/block/sprout">Sprout&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#sprout-ships-desktop-v004-and-v005-alongside-nip-oa-agent-authentication-and-the-pair-relay-sidecar">Desktop v0.0.4 and v0.0.5 alongside NIP-OA (Owner Attestation) agent auth, NIP-43 (Relay Access Metadata and Requests) membership, and a NIP-AB (Device Pairing) sidecar&lt;/a>. &lt;a href="https://github.com/routstr/routstrd">Routstrd&lt;/a> &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#routstrd-integrates-hermes-for-daemon-clients-and-remote-mode">integrates Hermes for daemon clients&lt;/a>. The NIP discussions surface a brokerless &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#protocol-discussions">hashrate market draft&lt;/a>, a &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#protocol-discussions">Curated Feeds proposal&lt;/a> as a simpler alternative to DVM feeds, a &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#protocol-discussions">Profile Colors NIP&lt;/a>, and a &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#protocol-discussions">Namecoin-anchored identity track&lt;/a>. Two NIP deep dives cover &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> (git stuff) and &lt;a href="https://nostrcompass.org/en/topics/nip-53/">NIP-53&lt;/a> (Live Activities).&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/marmot-protocol">Marmot Protocol&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#mdk-080-adds-mip-05-notification-primitives-and-addressable-key-packages">MDK 0.8.0&lt;/a> with the first MIP-05 notification primitives, addressable &lt;a href="https://nostrcompass.org/en/topics/nip-51/">NIP-51 (Lists)&lt;/a> key packages, and a tightened security review pass. &lt;a href="https://github.com/lawalletio/lawallet-nwc">LaWallet NWC&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#lawallet-nwc-v0100-ships-the-full-monorepo-and-end-user-wallet">v0.10.0&lt;/a> as the biggest release since OpenSats funding, bringing a full admin dashboard, end-user Wallet, end-to-end activity log, and a new &lt;code>LightningAddress 1→N&lt;/code> and &lt;code>NWCConnection&lt;/code> schema that unlocks per-address &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47 (Nostr Wallet Connect)&lt;/a> routing. &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> lands a &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#amethyst-stabilizes-nests-with-keep-alive-jwt-resilience-and-lifecycle-subscriptions">Nests stability sprint&lt;/a> with audio gap elimination during JWT refresh, lifecycle-aware key data subscriptions, relay keep-alive reconnection, and an animated speaking-participant indicator. &lt;a href="https://github.com/DanConwayDev/ngit-cli">ngit&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#ngit-v242-and-v243-fix-grasp-server-detection-and-multi-remote-state-events">v2.4.2&lt;/a> and &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#ngit-v242-and-v243-fix-grasp-server-detection-and-multi-remote-state-events">v2.4.3&lt;/a> fixing GRASP server detection for PR submissions and multi-remote state-event filtering. &lt;a href="https://github.com/0ceanSlim/grain">GRAIN&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#grain-v054-lands-production-hardening-and-a-silent-data-loss-fix">v0.5.4&lt;/a> with production hardening and a silent data-loss fix in the Docker quick-start. &lt;a href="https://github.com/MostroP2P/mostro-core">Mostro Core&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#mostro-core-v0101-adds-pgp-signed-release-artifacts">v0.10.1&lt;/a> with PGP-signed release artifacts as a follow-up to last week&amp;rsquo;s v0.10.0 P2P chat protocol module. &lt;a href="https://github.com/clave-mobile">Clave&lt;/a> launches &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#clave-v020-launches-multi-account-on-ios-with-nip-46-nostr-connect-signing">v0.2.0&lt;/a> with multi-account support on iOS. &lt;a href="https://github.com/Cameri/nostream">nostream&lt;/a> merges &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#nostream-adds-marmot-relay-support-and-nip-25-reactions">Marmot relay support and NIP-25 (Reactions)&lt;/a>. &lt;a href="https://github.com/block/sprout">Sprout&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#sprout-ships-desktop-v004-and-v005-alongside-nip-oa-agent-authentication-and-the-pair-relay-sidecar">Desktop v0.0.4 and v0.0.5 alongside NIP-OA (Owner Attestation) agent auth, NIP-43 (Relay Access Metadata and Requests) membership, and a NIP-AB (Device Pairing) sidecar&lt;/a>. &lt;a href="https://github.com/routstr/routstrd">Routstrd&lt;/a> &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#routstrd-integrates-hermes-for-daemon-clients-and-remote-mode">integrates Hermes for daemon clients&lt;/a>. The NIP discussions surface a brokerless &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#protocol-discussions">hashrate market draft&lt;/a>, a &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#protocol-discussions">Curated Feeds proposal&lt;/a> as a simpler alternative to DVM feeds, a &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#protocol-discussions">Profile Colors NIP&lt;/a>, and a &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#protocol-discussions">Namecoin-anchored identity track&lt;/a>. Two NIP deep dives cover &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> (git stuff) and &lt;a href="https://nostrcompass.org/en/topics/nip-53/">NIP-53&lt;/a> (Live Activities).&lt;/p>
&lt;h2 id="lead-stories">Lead stories&lt;/h2>
&lt;h3 id="mdk-080-adds-mip-05-notification-primitives-and-addressable-key-packages">MDK 0.8.0 adds MIP-05 notification primitives and addressable key packages&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/mdk">MDK&lt;/a>, the Rust core library for the &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> protocol, shipped &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.8.0">v0.8.0&lt;/a> on May 4. This release ships the first MIP-05 notification building blocks, moves MIP-00 key packages to addressable events so a user&amp;rsquo;s key package can be replaced in place, improves mixed-version group compatibility, expands UniFFI coverage for mobile bindings, and tightens validation paths around admin actions, commits, storage, encryption bounds, and replay handling. MIP-05 primitives include leaf-index helpers added in &lt;a href="https://github.com/marmot-protocol/mdk/pull/235">PR #235&lt;/a>, which give downstream clients enough information to deliver per-recipient push notifications without leaking group structure. Operational fixes also land: &lt;a href="https://github.com/marmot-protocol/mdk/pull/273">PR #273&lt;/a> restores mdk-core crates.io publishing, and &lt;a href="https://github.com/marmot-protocol/mdk/pull/269">PR #269&lt;/a> exposes the test_util module behind a &lt;code>test-utils&lt;/code> Cargo feature so external client suites can share Marmot&amp;rsquo;s test harness. For client teams, the headline practical change is the addressable key package: a user&amp;rsquo;s MIP-00 announcement is now a kind that replaces in place, so rotating to a fresh key package no longer leaves stale events scattered across relays.&lt;/p>
&lt;h3 id="lawallet-nwc-v0100-ships-the-full-monorepo-and-end-user-wallet">LaWallet NWC v0.10.0 ships the full monorepo and end-user Wallet&lt;/h3>
&lt;p>&lt;a href="https://github.com/lawalletio/lawallet-nwc">LaWallet NWC&lt;/a>, the LaWallet team&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> Nostr Wallet Connect implementation, shipped &lt;a href="https://github.com/lawalletio/lawallet-nwc/releases/tag/v0.10.0">v0.10.0&lt;/a> on April 30. This is the biggest release since the project was OpenSats-funded. It ships the full monorepo, the complete admin dashboard, an end-user Wallet, an end-to-end Activity Log, dynamic branding, and the new &lt;code>LightningAddress 1→N&lt;/code> and &lt;code>NWCConnection&lt;/code> schema that unlocks per-address NWC routing, where one Lightning address can fan out to multiple NWC connections under different RBAC roles. The user-facing Wallet shipped in &lt;a href="https://github.com/lawalletio/lawallet-nwc/pull/191">PR #191&lt;/a> covers onboarding, home, send/receive, scan, currencies, an activity feed, and an offline cache. &lt;a href="https://github.com/lawalletio/lawallet-nwc/pull/192">PR #192&lt;/a> wires the first-run flow with confirm-root, community auto-import, and setup-now CTAs. &lt;a href="https://github.com/lawalletio/lawallet-nwc/pull/196">PR #196&lt;/a> adds a live OpenAPI 3.1 reference rendered through Scalar with role-based access control documentation, and &lt;a href="https://github.com/lawalletio/lawallet-nwc/pull/193">PR #193&lt;/a> brings full JSDoc coverage to the public &lt;code>lib/&lt;/code> surface so editor tooltips show the wallet API correctly during integration work.&lt;/p>
&lt;h3 id="amethyst-stabilizes-nests-with-keep-alive-jwt-resilience-and-lifecycle-subscriptions">Amethyst stabilizes Nests with keep-alive, JWT resilience, and lifecycle subscriptions&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a>, the feature-rich Android client, continued the &lt;a href="https://nostrcompass.org/en/topics/nip-53/">NIP-53&lt;/a> Nests audio-room work covered in newsletter &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#amethyst-advances-nests-audio-rooms-with-moq-interop-testing">#20&lt;/a> with a stability sprint focused on the failure modes that broke calls in production. The audio-gap fix in &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2733">PR #2733&lt;/a> overlaps new credential acquisition with the active stream during JWT refresh, so the listener does not hear a dropout when the token rotates. A new keep-alive mechanism in &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2730">PR #2730&lt;/a> reconnects disconnected relays without requiring a manual user action, and &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2728">PR #2728&lt;/a> replaces the legacy &lt;code>KeyDataSourceSubscription&lt;/code> with &lt;code>LifecycleAwareKeyDataSourceSubscription&lt;/code>, which ties the subscription lifetime to the Android Activity lifecycle so background tabs do not leak open subscriptions. Android 12+&amp;rsquo;s &lt;code>ForegroundServiceStartNotAllowedException&lt;/code> is now handled gracefully via &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2727">PR #2727&lt;/a>, and &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2726">PR #2726&lt;/a> adds a grace period to the lifecycle-aware subscriptions so a brief screen-off does not tear the call down. Listeners get a new visual cue from &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2724">PR #2724&lt;/a>, an animated outer-ring indicator that highlights the speaking participant in multi-speaker sessions. Debug coverage improved with &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2731">PR #2731&lt;/a>, which wires &lt;code>NestRx&lt;/code> and &lt;code>NestTx&lt;/code> logs across the listener and speaker paths so the next regression has a clean trail to follow, and &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2732">PR #2732&lt;/a> refactors the settings screen UI with a card-based layout to make the Nests-related toggles easier to find.&lt;/p>
&lt;h3 id="ngit-v242-and-v243-fix-grasp-server-detection-and-multi-remote-state-events">ngit v2.4.2 and v2.4.3 fix GRASP server detection and multi-remote state events&lt;/h3>
&lt;p>&lt;a href="https://github.com/DanConwayDev/ngit-cli">ngit&lt;/a>, the command-line tool and &lt;code>git&lt;/code> plugin for &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> collaboration, shipped &lt;a href="https://github.com/DanConwayDev/ngit-cli/releases/tag/v2.4.2">v2.4.2&lt;/a> on April 28 and &lt;a href="https://github.com/DanConwayDev/ngit-cli/releases/tag/v2.4.3">v2.4.3&lt;/a> on May 1. v2.4.2 fixes a URL-normalization mismatch where &lt;code>repo_grasps&lt;/code> held normalized hostnames but the comparison was made against full clone URLs. The empty candidate-server list meant every PR submission silently fell through to the fork-creation path on a personal GRASP server, when the correct path was a direct push to the repository&amp;rsquo;s own GRASP server. v2.4.3 fixes a state-event ambiguity that surfaced when a repository has multiple &lt;code>nostr://&lt;/code> remotes sharing the same identifier: relays could return state events authored by maintainers of the &lt;em>other&lt;/em> remote, and without filtering, the newest event won regardless of author and pointed refs at the wrong commits. State event candidates in &lt;code>run_list&lt;/code> are now filtered to maintainers of the current remote&amp;rsquo;s repo announcement so the right state wins. Both fixes are exactly the kind of correctness work the &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#gitworkshop-ships-in-browser-pr-merge-repository-following-and-a-bandwidth-efficient-git-explorer">GitWorkshop v2 release&lt;/a> shipped last week pushes ngit to harden, since the in-browser PR merge button assumes the underlying GRASP push targets the right server.&lt;/p>
&lt;h3 id="grain-v054-lands-production-hardening-and-a-silent-data-loss-fix">GRAIN v0.5.4 lands production hardening and a silent data loss fix&lt;/h3>
&lt;p>&lt;a href="https://github.com/0ceanSlim/grain">GRAIN&lt;/a>, the Go-based Nostr relay and client library, shipped &lt;a href="https://github.com/0ceanSlim/grain/releases/tag/v0.5.4">v0.5.4&lt;/a> on April 30. The release rolls up six accumulated fixes since v0.5.3, including a silent data-loss bug in the Docker quick-start that previously dropped events when the container restarted, a storage-layer correctness bug in addressable event reads where incorrect tag handling broke event reads after restart, and two connection-tracking bugs uncovered while debugging the v0.5.0-to-v0.5.3 lockup chain. The production-hardening pair that v0.5.3 had originally targeted is now in place: a per-IP rate limit and an IP blacklist, both configurable.&lt;/p>
&lt;h3 id="mostro-core-v0101-adds-pgp-signed-release-artifacts">Mostro Core v0.10.1 adds PGP-signed release artifacts&lt;/h3>
&lt;p>&lt;a href="https://github.com/MostroP2P/mostro-core">Mostro Core&lt;/a>, the Rust library that provides peer-to-peer functionality for the Mostro daemon and other downstream applications, shipped &lt;a href="https://github.com/MostroP2P/mostro-core/releases/tag/v0.10.1">v0.10.1&lt;/a> on April 28 as a follow-up to &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#mostro-core-v0100-and-mostro-mobile-v125-adopt-nip-59-dual-key-gift-wrap">last week&amp;rsquo;s v0.10.0 P2P chat protocol module&lt;/a>. The new release adds PGP-signed release artifacts and a &lt;code>verify-release&lt;/code> flow so downstream packagers can confirm artifact provenance before vending the library.&lt;/p>
&lt;h2 id="tagged-releases">Tagged releases&lt;/h2>
&lt;h3 id="clave-v020-launches-multi-account-on-ios-with-nip-46-nostr-connect-signing">Clave v0.2.0 launches multi-account on iOS with NIP-46 (Nostr Connect) signing&lt;/h3>
&lt;p>&lt;a href="https://github.com/clave-mobile">Clave&lt;/a>, the iOS &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote-signing app that uses APNs for push delivery (covered in &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#clave-brings-nip-46-remote-signing-to-ios-via-apns">#20&lt;/a>), shipped &lt;a href="https://github.com/clave-mobile/clave/releases">v0.2.0&lt;/a> on May 5. The biggest update yet introduces multi-account support: Clave can now hold up to four accounts on one device, with a one-tap switcher and per-account isolation. The iOS plumbing and developer menu for multi-account land in &lt;a href="https://github.com/clave-mobile/clave/pull/23">PR #23&lt;/a>, and &lt;a href="https://github.com/clave-mobile/clave/pull/22">PR #22&lt;/a> adds a &lt;code>signer_pubkey&lt;/code> field to the APNs payload so the device knows which account a remote signing request belongs to before it surfaces the prompt. Activity detail now describes what was signed and links to &lt;code>njump&lt;/code> (&lt;a href="https://github.com/clave-mobile/clave/pull/19">PR #19&lt;/a>), so users can audit the chain of signing events without leaving the app. The cold-start delivery bug, where the APNs token was registered but the iOS Notification Center had stale empty slots that prevented delivery, is fixed in &lt;a href="https://github.com/clave-mobile/clave/pull/16">PR #16&lt;/a> through register-retry on cellular failure and an aggressive blank-NC sweep. Documentation gets a boost too: &lt;a href="https://github.com/clave-mobile/clave/pull/18">PR #18&lt;/a> ships a NIP-46 client compatibility doc, and &lt;a href="https://github.com/clave-mobile/clave/pull/21">PR #21&lt;/a> adds Nip46Lab as a neutral reference client for triage.&lt;/p>
&lt;h3 id="wisp-ships-v103--v105-stability-work">Wisp ships v1.0.3 → v1.0.5 stability work&lt;/h3>
&lt;p>&lt;a href="https://github.com/barrydeen/wisp">Wisp&lt;/a>, the Android client that &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#wisp-v100-graduates-from-beta">graduated from beta in #20&lt;/a>, shipped &lt;a href="https://github.com/barrydeen/wisp/releases/tag/v1.0.3">v1.0.3&lt;/a>, &lt;a href="https://github.com/barrydeen/wisp/releases/tag/v1.0.4">v1.0.4&lt;/a>, and &lt;a href="https://github.com/barrydeen/wisp/releases/tag/v1.0.5">v1.0.5&lt;/a> on May 4 with stability work. &lt;a href="https://github.com/barrydeen/wisp/pull/506">PR #506&lt;/a> adds Thumbhash for blurred image previews while full media loads, and &lt;a href="https://github.com/barrydeen/wisp/pull/514">PR #514&lt;/a> reduces bottom-tab switching jank. &lt;a href="https://github.com/barrydeen/wisp/pull/515">PR #515&lt;/a> reduces startup and feed-rendering work, and &lt;a href="https://github.com/barrydeen/wisp/pull/516">PR #516&lt;/a> stops the app from restoring stale tab back stacks on bottom-nav switch, fixing a navigation bug where a previously-visited screen would briefly flash when the user changed tabs.&lt;/p>
&lt;h3 id="amber-610-pre1-ships-layout-and-stability-fixes">Amber 6.1.0-pre1 ships layout and stability fixes&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a>, the Android signer app for &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55 (Android Signer Application)&lt;/a> and &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a>, shipped &lt;a href="https://github.com/greenart7c3/Amber/releases">v6.1.0-pre1&lt;/a> with a layout pass on the new-app connection flow and several reported-crash fixes. &lt;a href="https://github.com/greenart7c3/Amber/pull/416">PR #416&lt;/a> fixes &lt;code>ActivityStatsBar&lt;/code> layout and text overflow issues, &lt;a href="https://github.com/greenart7c3/Amber/pull/412">PR #412&lt;/a> improves notification-permission handling and error resilience, and &lt;a href="https://github.com/greenart7c3/Amber/pull/411">PR #411&lt;/a> ensures &lt;code>SignerActivity&lt;/code> always closes after handling a request so the app does not retain a stale signing screen. &lt;a href="https://github.com/greenart7c3/Amber/pull/409">PR #409&lt;/a> adds select/deselect-all functionality to the permissions list, and &lt;a href="https://github.com/greenart7c3/Amber/pull/410">PR #410&lt;/a> shortens the displayed npub in the account-selection supporting text so multi-account device users can scan the list at a glance.&lt;/p>
&lt;h3 id="routstr-core-v043-improves-payment-refund-and-usage-reporting">Routstr Core v0.4.3 improves payment, refund, and usage reporting&lt;/h3>
&lt;p>&lt;a href="https://github.com/Routstr/routstr-core">Routstr Core&lt;/a>, the decentralized inference layer that combines Nostr for service discovery with &lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu (Chaumian e-cash on Nostr)&lt;/a> micropayments for private usage billing, shipped &lt;a href="https://github.com/Routstr/routstr-core/releases">v0.4.3&lt;/a> as a pre-release on May 1. The release improves payment and refund handling, sharpens cost tracking and usage reporting, and ships several fixes around API key display, message handling, and model validation.&lt;/p>
&lt;h3 id="nostria-v3137-through-v3141-add-web-bookmarks-and-an-auto-theme">Nostria v3.1.37 through v3.1.41 add Web Bookmarks and an Auto theme&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostria-app/nostria">Nostria&lt;/a>, the multi-platform Nostr client, shipped &lt;a href="https://github.com/nostria-app/nostria/releases">v3.1.37 through v3.1.41&lt;/a> on April 30 and May 4. The releases add &lt;a href="https://nostrcompass.org/en/topics/nip-b0/">NIP-B0 (Web Bookmarks)&lt;/a> support, an &amp;ldquo;Auto&amp;rdquo; theme that follows device settings, in-app PDF viewing, layout fixes for the media player in fullscreen, and an improved article and note editor.&lt;/p>
&lt;h3 id="noornote-v089-fixes-desktop-first-launch-empty-screen">NoorNote v0.8.9 fixes desktop first-launch empty screen&lt;/h3>
&lt;p>&lt;a href="https://github.com/77elements/noornote">NoorNote&lt;/a>, the cross-platform Nostr client, shipped &lt;a href="https://github.com/77elements/noornote/releases/tag/v0.8.9">v0.8.9&lt;/a> on April 28 fixing an empty-screen bug on the desktop app&amp;rsquo;s first launch where the welcome and login screen failed to render.&lt;/p>
&lt;h3 id="kubo-v034-through-v041-ship-a-child-safe-nostr-video-platform-with-parent-controls-and-web-of-trust-feed-curation">Kubo v0.3.4 through v0.4.1 ship a child-safe Nostr video platform with parent controls and Web of Trust feed curation&lt;/h3>
&lt;p>&lt;a href="https://github.com/JeroenOnNostr/kubo">Kubo&lt;/a>, a child-safe video platform on Nostr that lets parents curate their child&amp;rsquo;s content world through Web of Trust filters, shipped &lt;a href="https://github.com/JeroenOnNostr/kubo/releases/tag/kubo-v0.3.4">v0.3.4&lt;/a>, &lt;a href="https://github.com/JeroenOnNostr/kubo/releases/tag/kubo-v0.3.5">v0.3.5&lt;/a>, &lt;a href="https://github.com/JeroenOnNostr/kubo/releases/tag/kubo-v0.4.0">v0.4.0&lt;/a>, and &lt;a href="https://github.com/JeroenOnNostr/kubo/releases/tag/kubo-v0.4.1">v0.4.1&lt;/a> across May 4 and May 5. The platform is a soft fork of &lt;a href="https://github.com/soapbox-pub/ditto">Ditto&lt;/a> rebranded for the family-and-kids use case. Each child gets a separate Nostr keypair and a video-first feed where parents control time limits (15 to 180 minutes daily), allowed time windows, post action visibility (reply, repost, reactions, zaps), view-only mode, and an optional scroll cap that replaces infinite scroll with a &amp;ldquo;Next post&amp;rdquo; button. Trust assignments come in three levels (View, Interact, Extend), so parents can grant individual profiles or &lt;a href="https://github.com/nostr-protocol/nips/blob/master/72.md">NIP-72 (Moderated Communities)&lt;/a> entire communities the right to contribute, interact with, or extend their child&amp;rsquo;s feed. Feed sources include relays, communities, follow packs, and individual profiles, with a feed preview before content goes live. Recent work covers a &lt;a href="https://github.com/JeroenOnNostr/kubo/commit/63739eca57">first-run parent tour&lt;/a>, a &lt;a href="https://github.com/JeroenOnNostr/kubo/commit/37bf2e5ac1">seed kid-friendly Follow pack on every new kid&lt;/a>, &lt;a href="https://github.com/JeroenOnNostr/kubo/commit/66e6b296f9">NIP-66 relay discovery with collapsible Browse-all and search-hide flags&lt;/a>, &lt;a href="https://github.com/JeroenOnNostr/kubo/commit/bbb8d26da9">kind 34236 vine play recording into kid watch history&lt;/a>, kid &amp;ldquo;Request to interact&amp;rdquo; routing through to a parent Alerts inbox, and an Android wrapper bumped from versionCode 6 to 8 so each tagged release ships a native Android build alongside the web app at &lt;a href="https://kubo.watch">kubo.watch&lt;/a>.&lt;/p>
&lt;h2 id="unreleased-changes">Unreleased changes&lt;/h2>
&lt;h3 id="sprout-ships-desktop-v004-and-v005-alongside-nip-oa-agent-authentication-and-the-pair-relay-sidecar">Sprout ships Desktop v0.0.4 and v0.0.5 alongside NIP-OA agent authentication and the pair-relay sidecar&lt;/h3>
&lt;p>&lt;a href="https://github.com/block/sprout">Sprout&lt;/a>, Block&amp;rsquo;s Nostr client with a built-in relay, shipped &lt;a href="https://github.com/block/sprout/releases">Sprout Desktop v0.0.4&lt;/a> on May 5 and &lt;a href="https://github.com/block/sprout/releases">v0.0.5&lt;/a> on May 6, alongside roughly 80 merged PRs covering a major NIP-OA, NIP-43, and NIP-AB pairing pass. The flagship change in &lt;a href="https://github.com/block/sprout/pull/471">PR #471&lt;/a> wires NIP-OA agent authentication into the relay&amp;rsquo;s NIP-43 membership flow across WebSocket, REST, and git transports, so an autonomous agent can prove a specific human pubkey authorized its actions before the relay grants access. &lt;a href="https://github.com/block/sprout/pull/490">PR #490&lt;/a> follows up by unifying NIP-OA relay membership enforcement across all ingress paths so the WebSocket, REST, and git surfaces share one code path, and &lt;a href="https://github.com/block/sprout/pull/491">PR #491&lt;/a> materializes the &lt;code>agent_owner_pubkey&lt;/code> on NIP-OA auth so downstream consumers can tell which human authorized a given agent action. A new ephemeral sidecar relay for NIP-AB device pairing arrives in &lt;a href="https://github.com/block/sprout/pull/467">PR #467&lt;/a> as &lt;code>sprout-pair-relay&lt;/code>, and &lt;a href="https://github.com/block/sprout/pull/470">PR #470&lt;/a> makes the desktop client auto-detect the NIP-43 relay and route the target to a &lt;code>/pair&lt;/code> sidecar. Repository structure gets a pass via &lt;a href="https://github.com/block/sprout/pull/476">PR #476&lt;/a>, which reorganizes the repository as a pnpm workspace, adds deep links, and scaffolds the new web client repos page, while &lt;a href="https://github.com/block/sprout/pull/474">PR #474&lt;/a> scaffolds the browser-based web client itself, and &lt;a href="https://github.com/block/sprout/pull/479">PR #479&lt;/a> wires the relay to serve the web UI directly with a redesigned repos page. The web client expands further with &lt;a href="https://github.com/block/sprout/pull/485">PR #485&lt;/a>, which adds a repo detail page and clickable repo names. Desktop polish covers relay-access settings in &lt;a href="https://github.com/block/sprout/pull/458">PR #458&lt;/a>, an onboarding flow that supports membership checks and bring-your-own-key in &lt;a href="https://github.com/block/sprout/pull/457">PR #457&lt;/a>, a signed-and-notarized macOS build via &lt;a href="https://github.com/block/sprout/pull/472">PR #472&lt;/a> so the desktop binary clears Gatekeeper without manual override, a &amp;ldquo;keep awake while agents are active&amp;rdquo; setting in &lt;a href="https://github.com/block/sprout/pull/484">PR #484&lt;/a>, and a prevent-sleep spawn convention with expiry badge in &lt;a href="https://github.com/block/sprout/pull/487">PR #487&lt;/a>. Operational fixes include &lt;a href="https://github.com/block/sprout/pull/486">PR #486&lt;/a> raising &lt;code>MAX_HISTORICAL_LIMIT&lt;/code> from 500 to 10,000 to support deeper backfill queries, &lt;a href="https://github.com/block/sprout/pull/482">PR #482&lt;/a> including &lt;code>p&lt;/code> tags in kind:39000 events for DM channels, and &lt;a href="https://github.com/block/sprout/pull/480">PR #480&lt;/a> sweeping a long tail of profile, mention, deep link, channel link, and doctor page bugs.&lt;/p>
&lt;h3 id="nostream-adds-marmot-relay-support-and-nip-25-reactions">nostream adds Marmot relay support and NIP-25 reactions&lt;/h3>
&lt;p>&lt;a href="https://github.com/Cameri/nostream">nostream&lt;/a>, the Node.js relay implementation, merged a productive week of protocol additions. Marmot Protocol relay support covering MIPs 00 through 03 lands in &lt;a href="https://github.com/Cameri/nostream/pull/602">PR #602&lt;/a>, which gives the relay first-class storage and forwarding for Marmot-encrypted messaging events. The smaller protocol additions: &lt;a href="https://nostrcompass.org/en/topics/nip-25/">NIP-25&lt;/a> reactions support in &lt;a href="https://github.com/Cameri/nostream/pull/589">PR #589&lt;/a>, geohash prefix matching for &lt;code>#g&lt;/code> filters in &lt;a href="https://github.com/Cameri/nostream/pull/586">PR #586&lt;/a> so location-based queries can match parent regions, and a tightened &lt;code>maxlimit&lt;/code> check on subscription event requests in &lt;a href="https://github.com/Cameri/nostream/pull/600">PR #600&lt;/a> to prevent malformed REQ messages from triggering unbounded queries. On the test and dependency side, &lt;a href="https://github.com/Cameri/nostream/pull/556">PR #556&lt;/a> adds k6-based connection and message-rate-limit tests, &lt;a href="https://github.com/Cameri/nostream/pull/592">PR #592&lt;/a> updates &lt;code>serialize-javascript&lt;/code> to v7.0.3 closing a known dependency vulnerability, and &lt;a href="https://github.com/Cameri/nostream/pull/545">PR #545&lt;/a> skips Redis auth when credentials are unset to make local development workflows quieter.&lt;/p>
&lt;h3 id="strfry-adds-per-connection-observability-and-reduces-nofiles-ceiling">strfry adds per-connection observability and reduces nofiles ceiling&lt;/h3>
&lt;p>&lt;a href="https://github.com/hoytech/strfry">strfry&lt;/a>, the C++ Nostr relay, merged 14 PRs targeting observability and operational hygiene. The headline change is &lt;a href="https://github.com/hoytech/strfry/pull/218">PR #218&lt;/a>, which adds per-connection pending outbound observability and a configurable back-pressure cap, letting an operator see exactly which connection is queuing up writes and apply a connection-level limit before the relay&amp;rsquo;s overall send queue degrades. On the performance side, &lt;a href="https://github.com/hoytech/strfry/pull/224">PR #224&lt;/a> removes &lt;code>std::function&lt;/code> heap allocations from the per-event monitor fanout and switches to direct &lt;code>map.find()&lt;/code> lookups, cutting allocator pressure on busy relays. Metrics correctness improves with &lt;a href="https://github.com/hoytech/strfry/pull/225">PR #225&lt;/a>, which fires the &lt;code>nostr_events_total&lt;/code> Prometheus counter on successful database writes (the previous behavior counted at ingress, which double-counted events that fail validation). Operational hygiene rounds out the release: &lt;a href="https://github.com/hoytech/strfry/pull/219">PR #219&lt;/a> adds index bounds checks to the negentropy ingester, &lt;a href="https://github.com/hoytech/strfry/pull/235">PR #235&lt;/a> reduces the &lt;code>nofiles&lt;/code> ceiling from 1,000,000 to 524,288 to fit the kernel default range, and &lt;a href="https://github.com/hoytech/strfry/pull/238">PR #238&lt;/a> removes a long-standing IP-header workaround that the modern proxy stack no longer needs.&lt;/p>
&lt;h3 id="damus-replaces-tenor-gifs-with-a-purple-proxy-and-ships-compaction-ux">Damus replaces Tenor GIFs with a Purple proxy and ships compaction UX&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/damus">Damus&lt;/a>, the iOS Nostr client, merged &lt;a href="https://github.com/damus-io/damus/pull/3737">PR #3737&lt;/a> replacing the Tenor GIF integration with a &lt;a href="https://damus.io/purple/">Damus Purple&lt;/a> proxy, where Damus&amp;rsquo;s hosted subscription service relays GIF requests on behalf of the client so individual users do not directly query Tenor&amp;rsquo;s servers (a privacy improvement that also keeps Damus&amp;rsquo;s Apple-store posture clean). &lt;a href="https://github.com/damus-io/damus/pull/3733">PR #3733&lt;/a> improves large-database compaction UX with progress feedback for users running compaction on multi-gigabyte nostrdb stores, and &lt;a href="https://github.com/damus-io/damus/pull/3732">PR #3732&lt;/a> refines the compaction progress reporting and overall UI.&lt;/p>
&lt;h3 id="primal-android-polishes-explore-alerts-and-the-nip-05-verified-badge">Primal Android polishes Explore, alerts, and the NIP-05 verified badge&lt;/h3>
&lt;p>&lt;a href="https://github.com/PrimalHQ/primal-android-app">Primal Android&lt;/a> merged &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/1043">PR #1043&lt;/a> fixing a flickering &lt;a href="https://nostrcompass.org/en/topics/nip-05/">NIP-05 (Domain Verification)&lt;/a> verified badge for users with &lt;code>_@domain&lt;/code> identifiers, &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/1042">PR #1042&lt;/a> adding paste handling for any event link in the note editor, &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/1041">PR #1041&lt;/a> implementing an Explore landing tab with recent users and recent searches, &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/1045">PR #1045&lt;/a> implementing alerts filters, and &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/1038">PR #1038&lt;/a> adding a video duration badge in feeds.&lt;/p>
&lt;h3 id="alby-hub-adds-nwc-payments-from-app-connections">Alby Hub adds NWC payments from app connections&lt;/h3>
&lt;p>&lt;a href="https://github.com/getAlby/hub">Alby Hub&lt;/a> merged &lt;a href="https://github.com/getAlby/hub/pull/2267">PR #2267&lt;/a> allowing payments from app connections and &lt;a href="https://github.com/getAlby/hub/pull/2268">PR #2268&lt;/a> simplifying the onchain receive routing logic, both shipped through Alby Hub&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47 (Nostr Wallet Connect)&lt;/a> surface.&lt;/p>
&lt;h3 id="routstrd-auth-a-dockerized-routstrd-for-teams-with-nip-98-auth-and-npub-rbac">routstrd-auth: a Dockerized Routstrd for teams with NIP-98 auth and npub RBAC&lt;/h3>
&lt;p>&lt;a href="https://github.com/Routstr/routstrd-auth">routstrd-auth&lt;/a>, created on April 27 by the Routstr team, is a Dockerized variant of Routstrd designed for multi-user team deployments where individual operators do not each run their own daemon. Activity in the period covers v0.1.6 through v0.1.15 across nearly 25 commits. The headline change is a granular npub-based role-based access control system (&lt;a href="https://github.com/Routstr/routstrd-auth/commit/8d0fd30cf4">commit 8d0fd30&lt;/a>) with &lt;code>admin&lt;/code> and &lt;code>user&lt;/code> roles, a bootstrap role for first-run setup, and a &lt;a href="https://github.com/Routstr/routstrd-auth/commit/dda1408ca1">PATCH /npubs endpoint&lt;/a> for changing an npub&amp;rsquo;s role at runtime. Client endpoints adopt &lt;a href="https://github.com/nostr-protocol/nips/blob/master/98.md">NIP-98&lt;/a> HTTP authentication with ownership tracking (&lt;a href="https://github.com/Routstr/routstrd-auth/commit/63da856b6a">commit 63da856&lt;/a>), so a Nostr-signed HTTP request authenticates the caller and confirms the client belongs to that npub. A &lt;code>/usage&lt;/code> endpoint reads directly from SQLite for fast accounting (&lt;a href="https://github.com/Routstr/routstrd-auth/commit/5badb4fcbf">commit 5badb4f&lt;/a>), node cooldown drops from 5 minutes to 42 seconds, and Cloudron setup instructions (&lt;a href="https://github.com/Routstr/routstrd-auth/commit/cef44d6911">commit cef44d6&lt;/a>) target operators who want a one-click deployment for their team. The project pairs with &lt;a href="https://github.com/routstr/routstrd">Routstrd&lt;/a> (covered above) to extend Routstr from a single-operator daemon into team infrastructure.&lt;/p>
&lt;h3 id="routstrd-integrates-hermes-for-daemon-clients-and-remote-mode">Routstrd integrates Hermes for daemon clients and remote mode&lt;/h3>
&lt;p>&lt;a href="https://github.com/routstr/routstrd">Routstrd&lt;/a>, the local daemon that orchestrates Routstr inference clients, merged &lt;a href="https://github.com/routstr/routstrd/pull/22">PR #22&lt;/a> adding integration with &lt;a href="https://github.com/NousResearch/hermes-agent">Hermes Agent&lt;/a> (Nous Research&amp;rsquo;s open-source AI agent), so the agent&amp;rsquo;s config file gets populated with the model providers and API keys that Routstrd discovers over Nostr. The integration writes &lt;code>~/.hermes/config.yaml&lt;/code> with a base model block and a &lt;code>custom_providers&lt;/code> block, removing the need for the user to hand-configure Routstr providers in their AI agent. &lt;a href="https://github.com/routstr/routstrd/pull/21">PR #21&lt;/a> refactors the clients module, &lt;a href="https://github.com/routstr/routstrd/pull/20">PR #20&lt;/a> adds a remote command, &lt;a href="https://github.com/routstr/routstrd/pull/19">PR #19&lt;/a> fixes the remote-mode clients list, and &lt;a href="https://github.com/routstr/routstrd/pull/16">PR #16&lt;/a> makes the client ID required in the &lt;code>/clients/add&lt;/code> endpoint to prevent ambiguous registrations.&lt;/p>
&lt;h3 id="divine-ships-nip-07-web-sign-in-and-16-locale-key-parity">diVine ships NIP-07 web sign-in and 16-locale key parity&lt;/h3>
&lt;p>&lt;a href="https://github.com/divinevideo/divine-mobile">diVine&lt;/a>, the video client, shipped two iOS releases this week alongside 139 merged PRs covering feed pull-to-refresh, notification grouping, and a back-camera default for new users. &lt;a href="https://github.com/divinevideo/divine-mobile/pull/3994">PR #3994&lt;/a> adds &lt;a href="https://nostrcompass.org/en/topics/nip-07/">NIP-07 (Browser Extension Signer)&lt;/a> sign-in for the web build, &lt;a href="https://github.com/divinevideo/divine-mobile/pull/3992">PR #3992&lt;/a> translates 16 non-English locales to full key parity, and &lt;a href="https://github.com/divinevideo/divine-mobile/pull/3944">PR #3944&lt;/a> groups notifications by video and shows thumbnails while fixing a realtime flicker.&lt;/p>
&lt;h3 id="openchat-ships-18-iterative-ui-improvements">OpenChat ships 18 iterative UI improvements&lt;/h3>
&lt;p>&lt;a href="https://github.com/DavidGershony/Scramble">OpenChat&lt;/a> shipped 18 releases in the v0.6.50 through v0.6.55 range covering iterative UI improvements.&lt;/p>
&lt;h3 id="whitenoise-rs-ships-per-account-database-isolation-and-proposal-upgrades">whitenoise-rs ships per-account database isolation and proposal upgrades&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/whitenoise-rs">whitenoise-rs&lt;/a>, the Rust core library for the White Noise messenger, merged &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/796">PR #796&lt;/a> (&amp;ldquo;Phase 18e&amp;rdquo;) moving message projection tables into per-account databases, and &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/792">PR #792&lt;/a> doing the same for membership and push tables. &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/791">PR #791&lt;/a> adds proposal upgrades so groups can extend their functionality with new proposal types when all members support them, and &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/794">PR #794&lt;/a> fixes the Android keyring migration build alongside an MDK revision bump.&lt;/p>
&lt;h3 id="whitenoise-flutter-ui-adds-leave-group-terminology-consistency-and-fastlane-release-scaffolding">whitenoise Flutter UI adds leave-group, terminology consistency, and Fastlane release scaffolding&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/whitenoise">whitenoise&lt;/a>, the Flutter mobile UI for the White Noise messenger, merged &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/604">PR #604&lt;/a> adding a leave-group action from the chat list UI, &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/595">PR #595&lt;/a> renaming contact actions to Follow and Unfollow across all locales for terminology consistency, and &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/601">PR #601&lt;/a> adding Fastlane release scaffolding for the mobile build pipeline.&lt;/p>
&lt;h3 id="angor-0221-ships-compact-app-flows-alongside-key-provider-and-network-switch-hardening">Angor 0.2.21 ships compact app flows alongside key provider and network-switch hardening&lt;/h3>
&lt;p>&lt;a href="https://github.com/block-core/angor">Angor&lt;/a>, the Bitcoin crowdfunding platform with Nostr-published founder profiles and project announcements, shipped &lt;a href="https://github.com/block-core/angor/releases">Angor 0.2.21&lt;/a> on May 6 rolling up a week of mobile and integration work. &lt;a href="https://github.com/block-core/angor/pull/802">PR #802&lt;/a> and &lt;a href="https://github.com/block-core/angor/pull/810">PR #810&lt;/a> improve mobile design performance and controls with deferred heavy loads, lazy-mounted founder views, polished mobile founder and investor flows, and tighter network and theme switching responsiveness on Android. &lt;a href="https://github.com/block-core/angor/pull/819">PR #819&lt;/a> polishes the compact app flows, and &lt;a href="https://github.com/block-core/angor/pull/822">PR #822&lt;/a> adds a project-search-by-ID surface in Find Projects so investors can resolve a project from its identifier alone. &lt;a href="https://github.com/block-core/angor/pull/804">PR #804&lt;/a> adds a secure key provider, &lt;a href="https://github.com/block-core/angor/pull/807">PR #807&lt;/a> fixes relay investment storage to use a network-specific derivation path, &lt;a href="https://github.com/block-core/angor/pull/805">PR #805&lt;/a> corrects an inverted testnet/mainnet cache key in the MempoolSpaceIndexerApi, and &lt;a href="https://github.com/block-core/angor/pull/806">PR #806&lt;/a> ensures a network switch properly clears all cached data and resets the UI state. &lt;a href="https://github.com/block-core/angor/pull/820">PR #820&lt;/a> corrects integration test assertions for &lt;code>PaymentFlow.Reset&lt;/code> and stale profile data, and &lt;a href="https://github.com/block-core/angor/pull/823">PR #823&lt;/a> converts &lt;code>FindProjectsViewModel.cs&lt;/code> from UTF-16 to UTF-8 so the source file matches the rest of the codebase.&lt;/p>
&lt;h3 id="keydex-polishes-data-layer-recovery-flow-and-steward-owner-name-display">Keydex polishes data layer, recovery flow, and steward owner-name display&lt;/h3>
&lt;p>&lt;a href="https://github.com/keydex-app/keydex">Keydex&lt;/a>, the social-recovery app for Nostr keys, merged &lt;a href="https://github.com/keydex-app/keydex/pull/126">PR #126&lt;/a> introducing a data-layer refactor plan, &lt;a href="https://github.com/keydex-app/keydex/pull/122">PR #122&lt;/a> fixing a black screen after the import-key, vault-backup, and save-recovery-plan sequence, and &lt;a href="https://github.com/keydex-app/keydex/pull/121">PR #121&lt;/a> correcting an owner-name display where the owner showed as &amp;ldquo;You&amp;rdquo; on steward devices, where the owner&amp;rsquo;s actual name should appear.&lt;/p>
&lt;h2 id="newly-tracked-and-discovered">Newly tracked and discovered&lt;/h2>
&lt;h3 id="bitmacro-signer-a-self-hostable-nip-46-bunker-with-client-side-key-encryption">BitMacro Signer: a self-hostable NIP-46 bunker with client-side key encryption&lt;/h3>
&lt;p>&lt;a href="https://github.com/bitmacro/bitmacro-signer">BitMacro Signer&lt;/a> is a self-hostable Nostr signing tool that manages private keys using the &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> bunker model. The signer encrypts keys on the client before storage so the server side never holds plaintext, and signs events through a relay using a lightweight daemon. The Docker-ready packaging targets users and operators who want a privacy-focused alternative to running a custom Amber-style mobile signer.&lt;/p>
&lt;p>This week&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> repo discovery surfaced 26 new repository announcements, of which four stand out.&lt;/p>
&lt;h3 id="gnostr-a-git-implementation-built-directly-on-nostr">gnostr: a git implementation built directly on Nostr&lt;/h3>
&lt;p>&lt;a href="https://github.com/gnostr-org/gnostr">gnostr&lt;/a> is a git implementation built directly on Nostr, distinct from &lt;code>git-remote-nostr&lt;/code> in that it ships its own working-tree commands as a from-scratch Nostr-native version-control client.&lt;/p>
&lt;h3 id="nostr-archive-a-content-addressed-archive-spec-on-nostr-and-blossom">nostr-archive: a content-addressed archive spec on Nostr and Blossom&lt;/h3>
&lt;p>&lt;a href="https://gitworkshop.dev/nostr-archive/nostr-archive">nostr-archive&lt;/a> is a draft specification and reference implementation for content-addressed archives on Nostr and Blossom, hosted as a NIP-34 repository so the spec discussion happens in the same place the reference code lives.&lt;/p>
&lt;h3 id="flower-cache-a-local-blossom-cache-server">flower-cache: a local Blossom cache server&lt;/h3>
&lt;p>&lt;a href="https://gitworkshop.dev/flower-cache/flower-cache">flower-cache&lt;/a> is a local Blossom cache server, useful for clients that want a hot local mirror of a remote Blossom server&amp;rsquo;s blob set without round-tripping the upstream on every blob fetch.&lt;/p>
&lt;h3 id="routstrd-the-routstr-daemons-nip-34-mirror">routstrd: the routstr daemon&amp;rsquo;s NIP-34 mirror&lt;/h3>
&lt;p>&lt;a href="https://gitworkshop.dev/routstrd/routstrd">routstrd&lt;/a> is the routstr daemon&amp;rsquo;s NIP-34 mirror, complementing the GitHub repository covered above.&lt;/p>
&lt;h3 id="micro-vpn-ansible-ansible-playbooks-for-vpn-deployment-over-nip-34">micro-vpn-ansible: Ansible playbooks for VPN deployment over NIP-34&lt;/h3>
&lt;p>&lt;a href="https://gitworkshop.dev/npub1mu9fsh42uh48trncevdpju8cyv3mxmj9qj3rdjqc46zc324c6hys9ctsnc/relay.ngit.dev/micro-vpn-ansible">micro-vpn-ansible&lt;/a> is a small Ansible playbook collection for deploying a micro VPN, hosted as a NIP-34 repository on &lt;code>relay.ngit.dev&lt;/code> and mirrored on &lt;code>gitnostr.com&lt;/code>. The repo&amp;rsquo;s canonical announcement carries three maintainers, making it a small example of how multi-maintainer collaboration is expressed in NIP-34 today.&lt;/p>
&lt;h2 id="protocol-work">Protocol work&lt;/h2>
&lt;h3 id="nip-updates">NIP updates&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>A brokerless hashrate market over Nostr&lt;/strong> (&lt;a href="https://njump.me/nevent1qqsqd2478wqugjh9ur9lenw9la0wd987h6jcc0tma4kkuat4xceymvszypxxmj0zcqtwqm34f48gzulrg99daaczllhtqun7xsldkh8neua2jhr32rf">draft proposal&lt;/a>): Anonymous draft NIP from a Nostr long-form post arguing the current hashrate-market players (Braiins, Nicehash, Mining Rig Rentals) are all custodial brokers that KYC users and can be censored. The proposal sketches a peer-to-peer hashrate market where Stratum endpoints, hashrate listings, and contract escrow ride on Nostr events, with no broker-controlled web app in the path. Open for criticism and not yet posted as a PR against &lt;code>nostr-protocol/nips&lt;/code>, the draft leaves the economic design pieces (escrow custody, contract settlement, dispute resolution) as the load-bearing part still under debate.&lt;/li>
&lt;li>&lt;strong>Curated Feeds: a simpler alternative to DVM feeds&lt;/strong> (&lt;a href="https://njump.me/nevent1qqsqj55kvu28uyq2jr6nfwx20mv7c0vkm0vxkgx0zzrnanfp4wwv8nczyzm7669svt0xkjsju50a22zurc0qa589z2xd4yatzx6p2z64a5e0cyxz3e3">draft proposal&lt;/a>): A draft argues that &lt;a href="https://nostrcompass.org/en/topics/nip-90/">NIP-90&lt;/a> Data Vending Machines were designed as a general-purpose compute marketplace, and the request/response model is heavier than necessary when all a client wants is an addressable list of event IDs. The proposal suggests publishing curated feeds as a thin addressable event whose content is just an ordered list of event references, no DVM round-trip required. The pitch is that simpler primitives win adoption, and DVMs can stay focused on workloads where the compute is genuinely dynamic.&lt;/li>
&lt;li>&lt;strong>Profile Colors: deterministic visual identity&lt;/strong> (&lt;a href="https://njump.me/nevent1qqsy3tj7mn3r7wczmc52aknf5ym43lj3rrhd3sfprzvc6qydsq62wrgzyzjk8j56zmt5fwv088l5y84hqq4gags3grvuznlu4zmyt54w34cccyxenp3">draft proposal&lt;/a>): A new draft NIP for deriving deterministic, readable colors from a Nostr pubkey so user avatars, mention chips, and other UI surfaces look identical across clients. The draft is positioned as a UI-only NIP that requires no relay or signer changes; clients implement the color hash function consistently and the visual identity follows.&lt;/li>
&lt;li>&lt;strong>Namecoin-Track NIPs: anchoring identity, relays, TLS, and reputation&lt;/strong> (&lt;a href="https://njump.me/nevent1qqsydpjnaj2netmv0h5mlm2j6zpk8u50yvc9pqth3ly8pzuwy22720szypp3shk7edn43y5zfvdr0ftl8eq8l00zaknjqx3c9xuv7ja8ck60q7uupzs">draft cluster&lt;/a>): A separable cluster of draft NIPs that move pieces of the existing Nostr stack into Namecoin-anchored records. Each NIP in the cluster targets a single concern: identity, relay metadata, TLS certificate pinning, and reputation assertions. The cluster is ambitious and not yet a PR; the discussion thread is still working through whether Namecoin-style anchoring is worth the operational cost.&lt;/li>
&lt;/ul>
&lt;h2 id="nip-deep-dive-nip-34-git-stuff">NIP Deep Dive: NIP-34 (git stuff)&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> defines event kinds for hosting git repositories, patches, pull requests, issues, and merge status on Nostr relays. It is the standard that turns Nostr into a coordination layer for code collaboration: the repository data still lives on a git server (GitHub, a self-hosted forge, or a GRASP server), while announcement events, patches, PRs, issues, and status updates ride on relays.&lt;/p>
&lt;p>A repository is announced as a kind &lt;code>30617&lt;/code> addressable event whose &lt;code>d&lt;/code> tag is a kebab-case identifier (typically the project name) and whose body includes &lt;code>name&lt;/code>, &lt;code>description&lt;/code>, one or more &lt;code>clone&lt;/code> URLs, optional &lt;code>web&lt;/code> URLs, a &lt;code>relays&lt;/code> tag listing relays the maintainer monitors, and a &lt;code>maintainers&lt;/code> tag with additional pubkeys allowed to manage the project. An &lt;code>r&lt;/code> tag annotated with the &lt;code>euc&lt;/code> (&amp;ldquo;earliest unique commit&amp;rdquo;) marker carries the commit ID of the first commit unique to this repository, which lets clients group mirrors and forks of the same project across different hosts. Repository State announcements (kind &lt;code>30618&lt;/code>) are an optional canonical pointer to current branch and tag heads, with &lt;code>refs/heads/&amp;lt;branch&amp;gt;&lt;/code> and &lt;code>refs/tags/&amp;lt;tag&amp;gt;&lt;/code> tag pairs and a &lt;code>HEAD&lt;/code> tag for the default branch.&lt;/p>
&lt;p>The canonical ngit repository announcement, signed by maintainer &lt;code>npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr&lt;/code>, looks like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;08bb929a05fd9bbb5e1b227a3850269f2f9615e9e830bd34e664b72df14dead6&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1758124128&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">30617&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;ngit&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;r&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;26689f97810fc656c7134c76e2a37d33b2e40ce7&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;euc&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;name&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;ngit&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;description&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;cli and git plugin for code collaboration over nostr&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;clone&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;https://codeberg.org/DanConwayDev/ngit-cli.git&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;https://relay.ngit.dev/npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr/ngit.git&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;web&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;https://gitworkshop.dev/danconwaydev.com/ngit&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;relays&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.damus.io&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://nos.lol&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.nostr.band&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;maintainers&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;a008def15796fba9a0d6fab04e8fd57089285d9fd505da5a83fe8aad57a3564d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;alt&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;git repository: ngit&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;ad571d2ec44fcdb5d684281deb8aea3862b6660d73e66f1c921f381f2fec6869f4b9444414b4ffdafccd414f3489502af193401b35edcebd8f50dcebbbc0b37a&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Patches use kind &lt;code>1617&lt;/code> and carry &lt;code>git format-patch&lt;/code> output in the content body, referencing the target repository through an &lt;code>a&lt;/code> tag of the form &lt;code>30617:&amp;lt;maintainer-pubkey&amp;gt;:&amp;lt;d-tag&amp;gt;&lt;/code>. Patch series chain through &lt;a href="https://nostrcompass.org/en/topics/nip-10/">NIP-10 (Text Note Threading)&lt;/a> &lt;code>e&lt;/code> reply tags. Pull requests use kind &lt;code>1618&lt;/code> and are intended for changesets larger than 60 KB; a PR points to a branch tip with a &lt;code>c&lt;/code> tag (current commit ID), one or more &lt;code>clone&lt;/code> tags listing where the commit can be fetched, and an optional &lt;code>merge-base&lt;/code> tag. Before signing the PR event, clients SHOULD push the branch tip to &lt;code>refs/nostr/&amp;lt;event-id&amp;gt;&lt;/code> on every clone URL the user can write to, and if they have no write access, fall back to a &lt;code>personal-fork&lt;/code> repository announcement that lists alternative GRASP servers. Updates to the branch tip are published as kind &lt;code>1619&lt;/code> PR Update events that reference the original PR through capital-letter &lt;code>E&lt;/code> and &lt;code>P&lt;/code> tags. Issues use kind &lt;code>1621&lt;/code> with markdown content, and replies to any NIP-34 thread (issues, patches, PRs alike) follow standard &lt;a href="https://nostrcompass.org/en/topics/nip-22/">NIP-22 (Comments)&lt;/a> comment threading. Status events move a thread between Open (&lt;code>1630&lt;/code>), Applied/Merged or Resolved (&lt;code>1631&lt;/code>), Closed (&lt;code>1632&lt;/code>), and Draft (&lt;code>1633&lt;/code>); a &lt;code>1631&lt;/code> can include &lt;code>merge-commit&lt;/code> and &lt;code>applied-as-commits&lt;/code> tags so clients render merge state without an external API call.&lt;/p>
&lt;p>This week&amp;rsquo;s data shows where NIP-34 is being used in production. &lt;a href="https://gitworkshop.dev">GitWorkshop.dev&lt;/a> saw two new issues (one on file search, one on Nostr Connect sending wrong permissions). &lt;a href="https://gitworkshop.dev/ngit-indexer/ngit-indexer">ngit-indexer&lt;/a>, the relay implementation that discovers and syncs repository announcements across the network, saw two patches and an issue noting it was not advertising &lt;a href="https://nostrcompass.org/en/topics/nip-45/">NIP-45 (Event Counting)&lt;/a> in &lt;code>supported_nips&lt;/code>.&lt;/p>
&lt;p>The wider &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> story is the same as last week&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#gitworkshop-ships-in-browser-pr-merge-repository-following-and-a-bandwidth-efficient-git-explorer">GitWorkshop v2 launch&lt;/a>: the in-browser PR merge button works because GRASP servers, ngit, and the &lt;code>nostr://&lt;/code> clone URL scheme together close the loop on a fully decentralized forge. The full implementation roster, primary sources, and event-kind reference are on the &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34 topic page&lt;/a>.&lt;/p>
&lt;h2 id="nip-deep-dive-nip-53-live-activities">NIP Deep Dive: NIP-53 (Live Activities)&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-53/">NIP-53&lt;/a> defines the standard event surface for live activities on Nostr: live streams, persistent meeting spaces, scheduled conference events, listener presence, and the live chat channel that ties chat messages to a specific live activity record. Five event kinds work together to advertise what is happening live, who is participating, and where the audio or video is being served. Because every live activity is described as a Nostr event, any client can discover an activity, link to it from outside chat, and publish into its chat channel without a forge-specific API.&lt;/p>
&lt;p>A live stream is announced as a kind &lt;code>30311&lt;/code> addressable event. Its &lt;code>d&lt;/code> tag is the stable identifier, the &lt;code>streaming&lt;/code> tag points at the playback URL, and the &lt;code>status&lt;/code> tag carries one of &lt;code>planned&lt;/code>, &lt;code>live&lt;/code>, or &lt;code>ended&lt;/code>. Each &lt;code>p&lt;/code> tag carries a pubkey, a relay hint, a displayable role marker (&lt;code>Host&lt;/code>, &lt;code>Speaker&lt;/code>, &lt;code>Participant&lt;/code>), and an optional fifth term: a SHA-256 of the activity&amp;rsquo;s full &lt;code>a&lt;/code> tag signed by the participant&amp;rsquo;s private key. Without that proof, clients MAY display the participant as &amp;ldquo;invited&amp;rdquo; only, which prevents malicious event owners from listing well-known accounts to lure followers into a fake event. Hosts can pin one or more chat messages by listing their event IDs in &lt;code>pinned&lt;/code> tags, and providers SHOULD keep the published participant list small (under 1000 users), treating the list as a sample, not a full roster.&lt;/p>
&lt;p>A representative Nests-style audio room announcement looks like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;8c1e6d7b3f2e9a4d5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1746540000&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">30311&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;nests-room-2026-05-05-protocol-discussion&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;title&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Protocol discussion: NIP-34 git workflows&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;summary&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Open call for ngit, GitWorkshop, and joinmarket-ng maintainers&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;streaming&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;https://moq.amethyst.social/rooms/protocol-discussion-2026-05-05&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;starts&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;1746543600&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;status&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;live&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;current_participants&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;12&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;service&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://nests.amethyst.social/&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.damus.io&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Host&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;f1e0d7a8b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;266815e0c9210dfa324c6cba3573b14bee49da4209a9456f9484e5106cd408a5&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://nos.lol&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Speaker&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;0057059046164d2238bbdbdf45fa2e106f59188289f6842d6bf362218ef4a58c&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Participant&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;relays&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.damus.io&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://nos.lol&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;t&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;nostr&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;t&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;nip-34&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;5a3e8b7c1d2f4a6b9e8d7c6b5a4f3e2d1c0b9a8f7e6d5c4b3a2f1e0d9c8b7a6f5e4d3c2b1a0f9e8d7c6b5a4f3e2d1c0b9a8f7e6d5c4b3a2f1e0d9c8b7a6f5e4d3&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The first &lt;code>p&lt;/code> tag includes a fifth-term signed proof, so clients render that participant as a confirmed Host. The other two &lt;code>p&lt;/code> tags lack proofs, so they display as invited participants until they sign in.&lt;/p>
&lt;p>NIP-53 separates the persistent room from the scheduled event held inside it. A kind &lt;code>30312&lt;/code> Meeting Space defines a room with a &lt;code>d&lt;/code> identifier, human-readable &lt;code>room&lt;/code> name, summary, optional image, status (&lt;code>open&lt;/code>, &lt;code>private&lt;/code>, or &lt;code>closed&lt;/code>), a &lt;code>service&lt;/code> URL, optional API endpoint, hashtag &lt;code>t&lt;/code> tags, and one or more provider &lt;code>p&lt;/code> tags. A kind &lt;code>30313&lt;/code> Conference Event represents a scheduled or ongoing meeting inside that room, referenced through an &lt;code>a&lt;/code> tag pointing at &lt;code>30312:pubkey:room-id&lt;/code> with an optional relay hint. The room/event split is what gives NIP-53 conference-grade scheduling: a single room hosts many &lt;code>30313&lt;/code> events over time, each with its own start, end, and roster, while the room&amp;rsquo;s hosts and providers stay stable. Listener presence is a separate kind &lt;code>10312&lt;/code> regular replaceable event, with an &lt;code>a&lt;/code> tag pointing at the activity and an optional &lt;code>hand&lt;/code> tag for raised-hand signaling. Live chat uses kind &lt;code>1311&lt;/code>, where each chat message MUST include an &lt;code>a&lt;/code> tag pointing at the activity record so chat is bound to one specific live activity.&lt;/p>
&lt;p>The Nostr live-activity surface is intentionally thin: NIP-53 advertises the activity, while other NIPs handle adjacent concerns. Zaps to live streams use &lt;a href="https://nostrcompass.org/en/topics/nip-57/">NIP-57 (Zaps)&lt;/a> zap receipts (kind &lt;code>9735&lt;/code>) bound to the stream&amp;rsquo;s &lt;code>30311&lt;/code> event, fundraising goals attached to a stream use &lt;a href="https://nostrcompass.org/en/topics/nip-75/">NIP-75 (Zap Goals)&lt;/a> zap goals, video recordings can be republished as &lt;a href="https://nostrcompass.org/en/topics/nip-71/">NIP-71 (Video Events)&lt;/a> video events, and remote signing for participation can use &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> so a streamer never pastes an nsec into a streaming client.&lt;/p>
&lt;p>This week&amp;rsquo;s signal lines up with the broader live-activity story. The &lt;a href="https://nostrcompass.org/en/newsletters/2026-05-06-newsletter/#amethyst-stabilizes-nests-with-keep-alive-jwt-resilience-and-lifecycle-subscriptions">Amethyst Nests stability sprint&lt;/a> covered above is exactly the failure-mode hardening a NIP-53 implementation needs once it reaches production scale: JWT refresh without audio gaps, lifecycle-aware subscriptions, relay keep-alive, and a visible speaking-participant indicator. &lt;a href="https://zap.stream/">Zap.stream&lt;/a> remains the longest-running NIP-53 client in production, &lt;a href="https://github.com/r0d8lsh0p/shosho-releases">Shosho&lt;/a> shipped the v0.11 through v0.15 progression covered in newsletters &lt;a href="https://nostrcompass.org/en/newsletters/2026-01-13-newsletter/">#5&lt;/a> through &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/">#17&lt;/a> adding VOD, room presence, threaded chat, MP4 replays, and OBS-connected Shows, &lt;a href="https://hivetalk.org">HiveTalk&lt;/a> covers the video-conferencing case with Lightning zaps, &lt;a href="https://cornychat.com">Corny Chat&lt;/a> and &lt;a href="https://nostrnests.com">nostrnests&lt;/a> cover the Clubhouse-style audio room case, and &lt;a href="https://github.com/zeSchlausKwab/wavefunc">WaveFunc&lt;/a> uses kind &lt;code>1311&lt;/code> for internet radio station chat. The full implementation roster, the proof-of-agreement gating recommendation, and the room/event split rationale are on the &lt;a href="https://nostrcompass.org/en/topics/nip-53/">NIP-53 topic page&lt;/a>.&lt;/p>
&lt;hr>
&lt;p>That&amp;rsquo;s it for this week. If you&amp;rsquo;re building something or have news to share, DM us on Nostr or find us at &lt;a href="https://nostrcompass.org">nostrcompass.org&lt;/a>.&lt;/p></content:encoded></item><item><title>Nostr Compass #20</title><link>https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/</link><pubDate>Wed, 29 Apr 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#gitworkshop-ships-in-browser-pr-merge-repository-following-and-a-bandwidth-efficient-git-explorer">GitWorkshop&lt;/a> turns git-over-Nostr into a fuller code-review surface with an in-browser PR merge button, Stars and repository following, a bandwidth-efficient git explorer, kind &lt;code>1111&lt;/code> inline review comments, and encrypted multi-device notification state. &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#routstrd-launches-a-local-router-for-inference-over-nostr">Routstrd&lt;/a> launches a local daemon that discovers model providers via Nostr kind &lt;code>38421&lt;/code> announcements and pays them with Cashu. Tagged releases include &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#ngit-v242-fixes-grasp-relay-detection-for-pr-submissions">ngit v2.4.2&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#wisp-v100-graduates-from-beta">Wisp v1.0.0&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#grain-v052-fixes-websocket-lockup-v053-continues-polish">grain v0.5.2 and v0.5.3&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#mostro-core-v0100-and-mostro-mobile-v125-adopt-nip-59-dual-key-gift-wrap">Mostro Core v0.10.0 and Mostro Mobile v1.2.5&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#marmot-ts-v050-ships-addressable-keypackages">marmot-ts v0.5.0&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#cruxcoach-v013-ships-encrypted-climbing-data-backup-with-nostr-and-blossom">CruxCoach v0.1.3&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#meiso-v130-adds-subtasks-blossom-attachments-and-nip-89-tagging">Meiso v1.3.0&lt;/a>, NoorNote, Nostria, Nostr Calendar, nos2x-fox, applesauce, nostr-double-ratchet, and more. Unreleased changes cover &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#amethyst-advances-nests-audio-rooms-with-moq-interop-testing">Amethyst Nests&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#nostream-adds-nip-65-relay-list-support-and-nwc-payments">nostream NIP-65 and NWC&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#fips-adds-nostr-based-udpnat-bootstrap">FIPS Nostr-based udp:nat bootstrap&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#strfry-adds-per-connection-observability">strfry observability&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#sprout-adds-owner-attestation-and-multi-workspace-support">Sprout owner attestations&lt;/a>, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#zap-cooking-adds-recipe-packs-delete-requests-and-bunker-login">Zap Cooking recipe packs&lt;/a>. Newly tracked projects include &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#nostrord-a-nip-29-client-built-with-kotlin-multiplatform-and-wasm">Nostrord&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#clave-brings-nip-46-remote-signing-to-ios-via-apns">Clave&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#treasures-decentralized-geocaching-on-nostr">Treasures&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#smesh-v051-self-hosted-nostr-relay-client-and-signer-in-one-stack">smesh&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#surveil-a-magic-the-gathering-deck-builder-on-nostr">Surveil&lt;/a>, Fundstr, Nod City, deploy-nsite-to-pages, and null&amp;ndash;nostr. Since this is the last Compass of April, the issue closes with &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#six-nostr-aprils">Six Nostr Aprils&lt;/a>, a retrospective from 2021 through 2026.&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#gitworkshop-ships-in-browser-pr-merge-repository-following-and-a-bandwidth-efficient-git-explorer">GitWorkshop&lt;/a> turns git-over-Nostr into a fuller code-review surface with an in-browser PR merge button, Stars and repository following, a bandwidth-efficient git explorer, kind &lt;code>1111&lt;/code> inline review comments, and encrypted multi-device notification state. &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#routstrd-launches-a-local-router-for-inference-over-nostr">Routstrd&lt;/a> launches a local daemon that discovers model providers via Nostr kind &lt;code>38421&lt;/code> announcements and pays them with Cashu. Tagged releases include &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#ngit-v242-fixes-grasp-relay-detection-for-pr-submissions">ngit v2.4.2&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#wisp-v100-graduates-from-beta">Wisp v1.0.0&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#grain-v052-fixes-websocket-lockup-v053-continues-polish">grain v0.5.2 and v0.5.3&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#mostro-core-v0100-and-mostro-mobile-v125-adopt-nip-59-dual-key-gift-wrap">Mostro Core v0.10.0 and Mostro Mobile v1.2.5&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#marmot-ts-v050-ships-addressable-keypackages">marmot-ts v0.5.0&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#cruxcoach-v013-ships-encrypted-climbing-data-backup-with-nostr-and-blossom">CruxCoach v0.1.3&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#meiso-v130-adds-subtasks-blossom-attachments-and-nip-89-tagging">Meiso v1.3.0&lt;/a>, NoorNote, Nostria, Nostr Calendar, nos2x-fox, applesauce, nostr-double-ratchet, and more. Unreleased changes cover &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#amethyst-advances-nests-audio-rooms-with-moq-interop-testing">Amethyst Nests&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#nostream-adds-nip-65-relay-list-support-and-nwc-payments">nostream NIP-65 and NWC&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#fips-adds-nostr-based-udpnat-bootstrap">FIPS Nostr-based udp:nat bootstrap&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#strfry-adds-per-connection-observability">strfry observability&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#sprout-adds-owner-attestation-and-multi-workspace-support">Sprout owner attestations&lt;/a>, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#zap-cooking-adds-recipe-packs-delete-requests-and-bunker-login">Zap Cooking recipe packs&lt;/a>. Newly tracked projects include &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#nostrord-a-nip-29-client-built-with-kotlin-multiplatform-and-wasm">Nostrord&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#clave-brings-nip-46-remote-signing-to-ios-via-apns">Clave&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#treasures-decentralized-geocaching-on-nostr">Treasures&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#smesh-v051-self-hosted-nostr-relay-client-and-signer-in-one-stack">smesh&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#surveil-a-magic-the-gathering-deck-builder-on-nostr">Surveil&lt;/a>, Fundstr, Nod City, deploy-nsite-to-pages, and null&amp;ndash;nostr. Since this is the last Compass of April, the issue closes with &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#six-nostr-aprils">Six Nostr Aprils&lt;/a>, a retrospective from 2021 through 2026.&lt;/p>
&lt;h2 id="lead-stories">Lead stories&lt;/h2>
&lt;h3 id="gitworkshop-ships-in-browser-pr-merge-repository-following-and-a-bandwidth-efficient-git-explorer">GitWorkshop ships in-browser PR merge, repository following, and a bandwidth-efficient git explorer&lt;/h3>
&lt;p>&lt;a href="https://gitworkshop.dev">GitWorkshop&lt;/a>, Dan Conway&amp;rsquo;s web-based collaboration layer for &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> git-over-Nostr, shipped a major release this week that brings the workflow much closer to what developers expect from GitHub or GitLab, while keeping comments, repository lists, and notifications inside signed Nostr events.&lt;/p>
&lt;p>The headline addition is a long-awaited in-browser PR merge button for repositories using GRASP relays. The release also adds Stars and repository following built on reactions and &lt;a href="https://nostrcompass.org/en/topics/nip-51/">NIP-51&lt;/a> lists, with pinned repository sets published as kind &lt;code>10617&lt;/code> events that point at kind &lt;code>30617&lt;/code> repo announcements via ordered &lt;code>a&lt;/code> tags. Profile pages can now feature a portable list of repositories.&lt;/p>
&lt;p>A bandwidth-efficient git explorer replaces the previous in-browser shallow clone. The new explorer leans on the underlying git client/server protocol that GRASP builds on, so it can handle large repositories without forcing the browser to fetch a full pack. Search now covers usernames and repository metadata, powered by &lt;a href="https://github.com/nostr-protocol/nips/blob/master/50.md">NIP-50&lt;/a> and an &lt;code>ngit-indexer&lt;/code> relay implementation that discovers and syncs repository announcements across the network. An in-browser repository creation workflow rounds out the discovery and onboarding path.&lt;/p>
&lt;p>Review tooling is rebuilt around a Files Changed tab, a per-patch diff viewer, and a set of experimental new primitives. Inline code review comments use kind &lt;code>1111&lt;/code>, built on &lt;a href="https://github.com/nostr-protocol/nips/blob/master/22.md">NIP-22&lt;/a>: each comment points to a file path (&lt;code>f&lt;/code> tag), a commit SHA (&lt;code>c&lt;/code> tag), and a selected line range (&lt;code>line&lt;/code> tag) so a client can render the comment at the correct position in a diff. A second tier of experimental primitives is permissioned by author and repo maintainers and uses &lt;a href="https://github.com/nostr-protocol/nips/blob/master/32.md">NIP-32&lt;/a> labels: rename an Issue or PR subject after submission, add hashtags after submission, pin a version-controlled CoverNote to the top of a PR or Issue for an editable summary, and mark inline code discussion subthreads as resolved. Verdict events and &lt;code>suggestion&lt;/code> blocks remain in draft and have not yet shipped.&lt;/p>
&lt;p>Notification state across devices is also synced through Nostr, but with a privacy-preserving twist. GitWorkshop generates a dedicated notifications keypair, encrypts that nsec, and stores it inside a kind &lt;code>30078&lt;/code> event. The notifications nsec then signs the actual notification state events. The indirection prevents the user&amp;rsquo;s main signer from being spammed with frequent encrypt and decrypt requests for every read or archive action, and it stops outside observers from easily seeing when a user touches their notification state. A user can sync read and archive state across devices; relays only see encrypted blobs.&lt;/p>
&lt;h3 id="routstrd-launches-a-local-router-for-inference-over-nostr">Routstrd launches a local router for inference over Nostr&lt;/h3>
&lt;p>&lt;a href="https://github.com/routstr/routstrd">Routstrd&lt;/a> is a new TypeScript daemon that gives local tools an OpenAI-compatible endpoint and routes each request to a competing &lt;a href="https://routstr.com">Routstr&lt;/a> provider. The daemon discovers providers through Nostr kind &lt;code>38421&lt;/code> announcements defined in Routstr&amp;rsquo;s RIP-02 spec. It then scores providers by price, trust, and recent performance under RIP-06 and sends each request to the current best option.&lt;/p>
&lt;p>Payment runs through a local Cashu wallet managed by cocod and funded with Lightning. That gives the client a sats-denominated settlement path while keeping provider discovery public and permissionless through Nostr relays. If a provider fails during a session, Routstrd can fall back to the next-ranked node. The install path is &lt;code>bun install -g routstrd&lt;/code>, followed by &lt;code>routstrd onboard&lt;/code> for wallet and relay setup.&lt;/p>
&lt;p>The broader &lt;a href="https://github.com/routstr">Routstr org&lt;/a> maintains the daemon, the Python node software (&lt;code>routstr-core&lt;/code>), a chat UI, and protocol specs. For users, the local port becomes the stable interface: existing OpenAI-compatible tools point at Routstrd, while the daemon handles provider discovery, routing, and payment.&lt;/p>
&lt;h2 id="tagged-releases">Tagged releases&lt;/h2>
&lt;h3 id="ngit-v242-fixes-grasp-server-detection-for-pr-submissions">ngit v2.4.2 fixes GRASP server detection for PR submissions&lt;/h3>
&lt;p>&lt;a href="https://codeberg.org/DanConwayDev/ngit-cli">ngit&lt;/a> shipped &lt;a href="https://github.com/DanConwayDev/ngit-cli/releases/tag/v2.4.2">v2.4.2&lt;/a> with a fix for repository GRASP server detection, keeping PR submission on the happy path when a proposal uses the PR kind. Note that ngit currently defaults to the &lt;code>Patch&lt;/code> kind for most changes unless they are large; the maintainer is working toward changing the default. &lt;a href="https://github.com/DanConwayDev/ngit-cli/releases/tag/v2.4.1">v2.4.1&lt;/a>, shipped earlier in the week, fixed &lt;code>fatal&lt;/code> errors during clone and fetch when an open PR&amp;rsquo;s git data was unavailable on the repository&amp;rsquo;s specified git servers.&lt;/p>
&lt;h3 id="wisp-v100-graduates-from-beta">Wisp v1.0.0 graduates from beta&lt;/h3>
&lt;p>&lt;a href="https://github.com/barrydeen/wisp">Wisp&lt;/a>, a Kotlin and Jetpack Compose Android client focused on relay routing, privacy, and a small native UI, shipped &lt;a href="https://github.com/barrydeen/wisp/releases/tag/v1.0.0">v1.0.0&lt;/a> and followed with &lt;a href="https://github.com/barrydeen/wisp/releases/tag/v1.0.2">v1.0.2&lt;/a>. The 1.0.0 milestone gathers the Normie Mode fiat-denomination toggle, the For You feed, &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> relay-based group configuration, and &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> relay-list broadcasting covered in &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-22-newsletter/#wisp-v0180-beta-adds-normie-mode-for-you-feed-and-nip-29-group-config">Newsletter #19&lt;/a>. v1.0.2 adds Android 15 16 KB page-size support, a QR scan tab in the drawer sheet, a download button for inline video controls, and notification-list performance fixes.&lt;/p>
&lt;h3 id="grain-v052-fixes-websocket-lockup-v053-continues-polish">grain v0.5.2 fixes WebSocket lockup, v0.5.3 continues polish&lt;/h3>
&lt;p>&lt;a href="https://github.com/0ceanSlim/grain">grain&lt;/a>, the Go relay from 0ceanSlim, cut &lt;a href="https://github.com/0ceanSlim/grain/releases/tag/v0.5.2">v0.5.2&lt;/a> as a critical hotfix for a WebSocket lockup introduced in v0.5.0, then followed with &lt;a href="https://github.com/0ceanSlim/grain/releases/tag/v0.5.3">v0.5.3&lt;/a>. The lockup caused connections to hang under some filter and WebSocket paths, so operators on v0.5.1 or v0.5.0 should upgrade. grain tracks all major Nostr event categories, exposes NIP-11 relay information, supports whitelist/blacklist access control, per-kind rate limits, a web dashboard, and a Go client library added in the v0.5.x line.&lt;/p>
&lt;h3 id="mostro-core-v0100-and-mostro-mobile-v125-adopt-nip-59-dual-key-gift-wrap">Mostro Core v0.10.0 and Mostro Mobile v1.2.5 adopt NIP-59 dual-key gift wrap&lt;/h3>
&lt;p>&lt;a href="https://github.com/MostroP2P/mostro-core/releases/tag/v0.10.0">Mostro Core v0.10.0&lt;/a> adds the new &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> gift-wrap module with split identity and trade keys. Earlier transport code used a single identity key for both trade identity and gift wrapping. v0.10.0 separates the stable trade identity from the ephemeral wrapping key, so each trade can use a fresh transport key while preserving the identity needed for the trade protocol. Daemon integration lands through &lt;a href="https://github.com/MostroP2P/mostro/pull/718">Mostro PR #718&lt;/a>, and &lt;a href="https://github.com/MostroP2P/mostro-cli/pull/165">mostro-cli PR #165&lt;/a> brings the same migration to the command-line client.&lt;/p>
&lt;p>&lt;a href="https://github.com/MostroP2P/mobile/releases/tag/v1.2.5">Mostro Mobile v1.2.5&lt;/a> ships alongside the protocol work. &lt;a href="https://github.com/MostroP2P/mobile/pull/581">PR #581&lt;/a> lets takers filter offers by the maker&amp;rsquo;s account age, giving users a way to avoid newly created maker accounts in the order book. &lt;a href="https://github.com/MostroP2P/mobile/pull/580">PR #580&lt;/a> fixes role labels on canceled order details, and &lt;a href="https://github.com/MostroP2P/mobile/pull/576">PR #576&lt;/a> cleans up cooperative-cancellation buttons.&lt;/p>
&lt;h3 id="marmot-ts-v050-ships-addressable-keypackages">marmot-ts v0.5.0 ships addressable KeyPackages&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/marmot-ts">marmot-ts&lt;/a> cut &lt;a href="https://github.com/marmot-protocol/marmot-ts/releases/tag/%40internet-privacy%2Fmarmot-ts%400.5.0">@internet-privacy/marmot-ts@0.5.0&lt;/a>, the first planned breaking-change release for the TypeScript &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> client. &lt;a href="https://github.com/marmot-protocol/marmot-ts/pull/68">PR #68&lt;/a> adds addressable KeyPackage support: &lt;code>KeyPackageManager&lt;/code> can now handle both legacy kind &lt;code>443&lt;/code> and new kind &lt;code>30443&lt;/code> KeyPackage events. The release removes &lt;code>KeyPackageStore&lt;/code> and the group-state storage classes, replacing them with generic key-value stores passed into &lt;code>KeyPackageManager&lt;/code> and &lt;code>MarmotGroup&lt;/code>. It also moves invite and group management onto &lt;code>MarmotClient.invites&lt;/code> and &lt;code>MarmotClient.groups&lt;/code>, so direct embedders need constructor and storage changes before upgrading.&lt;/p>
&lt;h3 id="cruxcoach-v013-ships-encrypted-climbing-data-backup-with-nostr-and-blossom">CruxCoach v0.1.3 ships encrypted climbing data backup with Nostr and Blossom&lt;/h3>
&lt;p>&lt;a href="https://codeberg.org/CruxCoach/CruxCoach">CruxCoach&lt;/a> is a new open-source Android app for Kilter Board climbers. The Kilter Board is an interactive training wall whose holds light up over Bluetooth to display routes. The app launched April 14 and reached &lt;a href="https://codeberg.org/CruxCoach/CruxCoach/releases/tag/v0.1.3">v0.1.3&lt;/a> on April 26.&lt;/p>
&lt;p>v0.1.3 adds opt-in encrypted cloud backup. A user&amp;rsquo;s CruxCoach account is a Nostr keypair, and the private key doubles as the input to the local backup encryption key. The app encrypts climbing data on-device and mirrors the ciphertext to Blossom storage servers (&lt;code>blossom.primal.net&lt;/code> and &lt;code>nostr.download&lt;/code>). Delete-remote actions call the Blossom cleanup path. Beyond backup, CruxCoach uses &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote signing for Amber support, &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> private DMs for in-app developer contact, &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> relay lists for relay discovery, and Vitor Pamplona&amp;rsquo;s &lt;a href="https://github.com/vitorpamplona/quartz">Quartz&lt;/a> library for Nostr plumbing. Users can install it through Zapstore or direct Codeberg APKs.&lt;/p>
&lt;h3 id="meiso-v130-adds-subtasks-blossom-attachments-and-nip-89-tagging">Meiso v1.3.0 adds subtasks, Blossom attachments, and NIP-89 tagging&lt;/h3>
&lt;p>&lt;a href="https://github.com/higedamc/meiso">Meiso&lt;/a> is a minimalist Flutter task manager for Android that stores tasks as &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encrypted kind &lt;code>30078&lt;/code> application data on Nostr relays. &lt;a href="https://github.com/higedamc/meiso/releases/tag/v1.3.0">v1.3.0&lt;/a>, released April 6, adds subtasks with parent/child relationships, task links for blocks/blocked-by/related-to/duplicate-of, image attachments through Blossom and &lt;a href="https://nostrcompass.org/en/topics/nip-96/">NIP-96&lt;/a> HTTP file upload endpoints, a &lt;a href="https://github.com/nostr-protocol/nips/blob/master/89.md">NIP-89&lt;/a> recommended-application &lt;code>client&lt;/code> tag on published events, and a Go command-line sync tool. v1.3.0 also fixes cold-start relay behavior and Amber client reuse.&lt;/p>
&lt;h3 id="noornote-nostria-nostr-calendar-nos2x-fox-and-library-releases">NoorNote, Nostria, Nostr Calendar, nos2x-fox, and library releases&lt;/h3>
&lt;p>&lt;a href="https://github.com/77elements/noornote">NoorNote&lt;/a> published &lt;a href="https://github.com/77elements/noornote/releases/tag/v0.8.7">v0.8.7&lt;/a>, &lt;a href="https://github.com/77elements/noornote/releases/tag/v0.8.8">v0.8.8&lt;/a>, and &lt;a href="https://github.com/77elements/noornote/releases/tag/v0.8.9">v0.8.9&lt;/a>. Those releases fix image and video click handling in quoted reposts, add lightbox support for long-form article images, and fix the blank desktop startup screen. &lt;a href="https://github.com/nostria-app/nostria">Nostria&lt;/a> cut &lt;a href="https://github.com/nostria-app/nostria/releases/tag/v3.1.29">v3.1.29&lt;/a>, &lt;a href="https://github.com/nostria-app/nostria/releases/tag/v3.1.30">v3.1.30&lt;/a>, and &lt;a href="https://github.com/nostria-app/nostria/releases/tag/v3.1.31">v3.1.31&lt;/a>, adding article-editor image compression, a wallet USD toggle, promotional-card controls, PDF support, and mobile layout polish.&lt;/p>
&lt;p>&lt;a href="https://github.com/formstr-hq/nostr-calendar/releases/tag/v1.4.1">Nostr Calendar v1.4.1&lt;/a> decouples calendar event publishing from calendar-list management and fixes invitation tracking. &lt;a href="https://github.com/diegogurpegui/nos2x-fox/releases/tag/v1.19.0">nos2x-fox v1.19.0&lt;/a> adds custom authorization timeframes for Firefox NIP-07 browser-signing grants. &lt;a href="https://github.com/mmalmi/nostr-double-ratchet/releases/tag/v0.0.97">nostr-double-ratchet v0.0.97&lt;/a> ships new binaries. &lt;a href="https://github.com/nostr-wot/nostr-wot-sdk/releases/tag/nostr-wot-sdk%400.9.0">nostr-wot-sdk 0.9.0&lt;/a> mounts &lt;code>NostrSessionProvider&lt;/code> by default, and &lt;a href="https://github.com/nbd-wtf/nostr-tools/pull/535">nostr-tools PR #535&lt;/a> adds multi-relay parsing support for NIP-47 wallet-connect strings.&lt;/p>
&lt;p>Late in the week, &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.1.0-pre1">Amber v6.1.0-pre1&lt;/a> shipped a pre-release with a better connect-new-app layout, signer-dialog fixes, improved notification permission handling, and refactored account selection. &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v0.3.14">nostr-vpn v0.3.14&lt;/a> cut a fresh build with macOS Apple Silicon, Linux, and Windows artifacts. &lt;a href="https://github.com/BitcreditProtocol/Bitcredit-Core/releases/tag/v0.5.8">Bitcredit Core v0.5.7-hotfix-1 and v0.5.8&lt;/a> shipped back-to-back fixes for an orphaned-block validation issue. &lt;a href="https://gitlab.com/chad.curtis/surveil/-/tags/v0.1.6">Surveil v0.1.6&lt;/a> brought mobile UI polish and an overhauled About page; the project itself is introduced &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-29-newsletter/#surveil-a-magic-the-gathering-deck-builder-on-nostr">below&lt;/a>.&lt;/p>
&lt;h3 id="applesauce-600-removes-legacy-event-factories-and-adds-blossom-uri-parsing">applesauce 6.0.0 removes legacy event factories and adds Blossom URI parsing&lt;/h3>
&lt;p>&lt;a href="https://github.com/hzrd149/applesauce">applesauce&lt;/a>, hzrd149&amp;rsquo;s TypeScript Nostr toolkit, shipped a 6.0.0 release train across the monorepo. &lt;a href="https://github.com/hzrd149/applesauce/releases/tag/applesauce-core%406.0.0">applesauce-core@6.0.0&lt;/a> removes the legacy &lt;code>EventFactory&lt;/code> class and old &lt;code>buildEvent&lt;/code>, &lt;code>modifyEvent&lt;/code>, and &lt;code>createEvent&lt;/code> helpers, pushing callers to the newer factory classes in &lt;code>applesauce-core/factories&lt;/code> and &lt;code>applesauce-common&lt;/code>. It also adds IP address and localhost handling to link parsing, BUD-10 Blossom URI regular expressions, and new observable helpers such as &lt;code>timeoutWithIgnore&lt;/code>, &lt;code>combineLatestBy&lt;/code>, &lt;code>combineLatestByIndex&lt;/code>, and &lt;code>combineLatestByKey&lt;/code>.&lt;/p>
&lt;p>Package-level releases fill out the Nostr-specific pieces. &lt;a href="https://github.com/hzrd149/applesauce/releases/tag/applesauce-content%406.0.0">applesauce-content@6.0.0&lt;/a> adds BUD-10 Blossom URI nodes for text and Markdown, giving renderers a first-class way to parse Blossom references in content. &lt;a href="https://github.com/hzrd149/applesauce/releases/tag/applesauce-actions%406.0.0">applesauce-actions@6.0.0&lt;/a> adds base factory classes for NIP-51 lists covering relays, users, and items, making list construction less ad hoc. &lt;a href="https://github.com/hzrd149/applesauce/releases/tag/applesauce-wallet-connect%406.0.0">applesauce-wallet-connect@6.0.0&lt;/a> exposes &lt;code>WalletConnect.connectURI&lt;/code>, so apps can access an existing NIP-47 wallet-connect URI directly.&lt;/p>
&lt;h2 id="unreleased-changes">Unreleased changes&lt;/h2>
&lt;h3 id="amethyst-advances-nests-audio-rooms-with-moq-interop-testing">Amethyst advances Nests audio rooms with MoQ interop testing&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> merged several Nests-focused PRs this week, building on last week&amp;rsquo;s &lt;a href="https://datatracker.ietf.org/group/moq/about/">Media over QUIC&lt;/a> audio-room stack. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2622">PR #2622&lt;/a> adds a cross-client interop harness that exercises the Amethyst MoQ client against the reference web implementation. The goal is to catch Android/browser wire-level divergence before users hit it. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2625">PR #2625&lt;/a> improves picture-in-picture speaker focus and connection status, while &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2620">PR #2620&lt;/a> clarifies avatars, mute state, and speaking state in the participant grid. Late in the week, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2634">PR #2634&lt;/a> fixes IME padding and window insets in the full-screen Nest view and &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2635">PR #2635&lt;/a> adds presence-based freshness filtering to the Nests feed. Separately, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2627">PR #2627&lt;/a> removes Amethyst&amp;rsquo;s custom C secp256k1 implementation and migrates to &lt;code>libschnorr256k1&lt;/code>.&lt;/p>
&lt;h3 id="nostream-adds-nip-65-relay-list-support-and-nwc-payments">nostream adds NIP-65 relay list support and NWC payments&lt;/h3>
&lt;p>&lt;a href="https://github.com/Cameri/nostream">nostream&lt;/a> merged three notable PRs after last week&amp;rsquo;s 53-PR relay sprint. &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> relay-list metadata support lands in &lt;a href="https://github.com/Cameri/nostream/pull/585">PR #585&lt;/a>, so the relay can index and serve kind &lt;code>10002&lt;/code> relay-list events. A Nostr Wallet Connect payments processor follows in &lt;a href="https://github.com/Cameri/nostream/pull/539">PR #539&lt;/a>, adding a pay-to-relay path. Connection cleanup improves in &lt;a href="https://github.com/Cameri/nostream/pull/438">PR #438&lt;/a>, which closes a dead-connection bug where sockets with active subscriptions were not being reaped, causing subscription counts to drift on long-running instances.&lt;/p>
&lt;h3 id="fips-adds-nostr-based-udpnat-bootstrap">FIPS adds Nostr-based udp:nat bootstrap&lt;/h3>
&lt;p>&lt;a href="https://github.com/jmcorgan/fips">FIPS&lt;/a>, the Free Internetworking Peering System previously covered in &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-25-newsletter/#fips-nostr-native-mesh-networking">Newsletter #6&lt;/a> and &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-25-newsletter/#fips-v020-ships-tor-transport-reproducible-builds-and-sidecar-examples">Newsletter #10&lt;/a>, merged &lt;a href="https://github.com/jmcorgan/fips/pull/53">PR #53&lt;/a> with Nostr-based &lt;code>udp:nat&lt;/code> bootstrap. The change lets nodes publish Nostr adverts, exchange encrypted offer/answer signaling, discover public addresses through STUN, perform UDP hole punching, and hand the punched socket into the normal FIPS transport stack. The implementation binds signal payload identities to the actual Nostr sender, queries configured DM and advert relays for inbox lookup, and rolls back failed adopted-traversal handoffs so orphaned UDP transports do not remain live. This is the Nostr announcement and NAT traversal work to track in the canonical repo, &lt;code>jmcorgan/fips&lt;/code>.&lt;/p>
&lt;h3 id="strfry-adds-per-connection-observability">strfry adds per-connection observability&lt;/h3>
&lt;p>&lt;a href="https://github.com/hoytech/strfry">strfry&lt;/a> merged &lt;a href="https://github.com/hoytech/strfry/pull/214">PR #214&lt;/a>, adding per-connection observability and connection-level metrics exportable through Prometheus. &lt;a href="https://github.com/hoytech/strfry/pull/204">PR #204&lt;/a> normalizes Prometheus labels, and &lt;a href="https://github.com/hoytech/strfry/pull/215">PR #215&lt;/a> adds a Community Integrations section to the docs covering Namecoin identity projects built on top of strfry.&lt;/p>
&lt;h3 id="sprout-adds-owner-attestation-and-multi-workspace-support">Sprout adds Owner Attestation and multi-workspace support&lt;/h3>
&lt;p>&lt;a href="https://github.com/block/sprout">Sprout&lt;/a>, Block&amp;rsquo;s Nostr client, merged &lt;a href="https://github.com/block/sprout/pull/406">PR #406&lt;/a> implementing NIP-OA (Owner Attestation). The feature gives an autonomous agent a cryptographic proof that a specific human pubkey authorized its actions. &lt;a href="https://github.com/block/sprout/pull/409">PR #409&lt;/a> adds multi-workspace support to the desktop app, &lt;a href="https://github.com/block/sprout/pull/411">PR #411&lt;/a> adds &lt;code>#channel&lt;/code> autocomplete to mobile compose, and &lt;a href="https://github.com/block/sprout/pull/410">PR #410&lt;/a> closes a race window that could drop active channel messages. &lt;a href="https://github.com/block/sprout/pull/413">PR #413&lt;/a> introduces NIP-RS for cross-device read state sync, and follow-up &lt;a href="https://github.com/block/sprout/pull/420">PR #420&lt;/a> and &lt;a href="https://github.com/block/sprout/pull/422">PR #422&lt;/a> wire that read state into the mobile unread badges.&lt;/p>
&lt;h3 id="zap-cooking-adds-recipe-packs-delete-requests-and-bunker-login">Zap Cooking adds recipe packs, delete requests, and bunker login&lt;/h3>
&lt;p>&lt;a href="https://github.com/zapcooking/frontend">Zap Cooking&lt;/a> merged a productive week of recipe-publishing work. &lt;a href="https://github.com/nostr-protocol/nips/blob/master/09.md">NIP-09&lt;/a> deletion requests for a user&amp;rsquo;s own Recipe Packs land in &lt;a href="https://github.com/zapcooking/frontend/pull/367">PR #367&lt;/a>. Publication reliability improves through &lt;a href="https://github.com/zapcooking/frontend/pull/366">PR #366&lt;/a>, which forces every new recipe onto the garden relay and adds a retry queue for the shared recipe set. One-click authored pack publishing lands in &lt;a href="https://github.com/zapcooking/frontend/pull/365">PR #365&lt;/a>, and &lt;a href="https://github.com/zapcooking/frontend/pull/331">PR #331&lt;/a> adds &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> bunker login support.&lt;/p>
&lt;h3 id="whitenoise-rs-encrypts-its-local-database">Whitenoise-rs encrypts its local database&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/whitenoise-rs">whitenoise-rs&lt;/a> merged &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/758">PR #758&lt;/a>, adding SQLCipher encryption for the on-disk Whitenoise database. That closes a long-standing at-rest security gap for the Marmot daemon stack. &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/775">PR #775&lt;/a> exposes group required capabilities, &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/772">PR #772&lt;/a> migrates group media operations to session-owned &lt;code>MediaOps&lt;/code>, and &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/773">PR #773&lt;/a> extracts a &lt;code>SharedServices&lt;/code> holder as part of the session-ops refactor. On the mobile side, &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/577">whitenoise PR #577&lt;/a> enables boot auto-restart for the Android foreground service, fixing the case where the daemon would not come back after a device reboot.&lt;/p>
&lt;h2 id="newly-tracked-and-discovered">Newly tracked and discovered&lt;/h2>
&lt;h3 id="nostrord-a-nip-29-client-built-with-kotlin-multiplatform-and-wasm">Nostrord: a NIP-29 client built with Kotlin Multiplatform and WASM&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostrord/nostrord">Nostrord&lt;/a> is a new &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> group-chat client targeting the Discord-replacement use case. Groups live on Nostr relays with relay-enforced membership, roles, moderation, and access control, so group state is hosted by the selected NIP-29 relay. The client developer does not control a separate application database for those groups. The web app runs at &lt;a href="https://web.nostrord.com">web.nostrord.com&lt;/a> and is built with Kotlin Multiplatform compiling to WebAssembly, with native Android, iOS, and desktop builds in development. Nostrord is an &lt;a href="https://opensats.org">OpenSats&lt;/a> grant recipient and interoperates with the same NIP-29 relays used by Flotilla, Chachi, and 0xChat.&lt;/p>
&lt;h3 id="clave-brings-nip-46-remote-signing-to-ios-via-apns">Clave brings NIP-46 remote signing to iOS via APNs&lt;/h3>
&lt;p>&lt;a href="https://github.com/DocNR/clave">Clave&lt;/a> is an iOS remote signer in beta that signs Nostr events when the app is not open. The private key stays in the iPhone Keychain. When a client sends a &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote-signing request, a server-side proxy delivers an Apple Push Notification, waking a Notification Service Extension for up to 30 seconds. That extension decrypts the request with &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encryption, signs with the Keychain key, and publishes the response. Device token registration uses &lt;a href="https://github.com/nostr-protocol/nips/blob/master/98.md">NIP-98&lt;/a> HTTP Auth to prevent token hijacking. Clave supports &lt;code>bunker://&lt;/code> and &lt;code>nostrconnect://&lt;/code> pairing, per-client trust levels, per-kind overrides, and has been tested with Nostur and noStrudel.&lt;/p>
&lt;h3 id="treasures-decentralized-geocaching-on-nostr">Treasures: decentralized geocaching on Nostr&lt;/h3>
&lt;p>&lt;a href="https://gitlab.com/chad.curtis/treasures">Treasures&lt;/a> is a geocaching platform where caches and finds are signed Nostr events. Cache creators publish kind &lt;code>37516&lt;/code> addressable events with GPS coordinates. Finders log discovery by scanning a QR code attached to the physical cache; the code encodes the creator pubkey, the cache &lt;code>d&lt;/code> tag, and a verification private key used as proof of the physical visit. &lt;a href="https://nostrcompass.org/en/topics/nip-57/">NIP-57&lt;/a> zaps can flow from finders to cache creators, and the live app is at &lt;a href="https://treasures.to">treasures.to&lt;/a>.&lt;/p>
&lt;h3 id="smesh-v051-self-hosted-nostr-relay-client-and-signer-in-one-stack">smesh v0.5.1: self-hosted Nostr relay, client, and signer in one stack&lt;/h3>
&lt;p>&lt;a href="https://git.smesh.lol/smesh/smesh">smesh&lt;/a> is a self-hosted Nostr stack written in Moxie, a custom language derived from Go and TinyGo by mleku. The stack ships a native relay binary with HTTP, WebSocket, AUTH, search, and Blossom support; &lt;code>sm3sh&lt;/code>, a web client compiled to ES modules; and a browser signer extension with NIP-07 browser signing plus NIP-04 and NIP-44 encryption support. Recent work includes MLS (RFC 9420) group messaging in v0.5.0, negentropy set reconciliation for relay sync, and a Web of Trust graph engine. The code lives on mleku&amp;rsquo;s self-hosted forge at &lt;code>git.smesh.lol&lt;/code>, built with his own &lt;code>git-web&lt;/code> tool. The related &lt;a href="https://git.smesh.lol/smesh/gitea-nostr-auth">gitea-nostr-auth&lt;/a> repo is an OAuth2/OIDC bridge for Gitea: users authenticate with a NIP-07 browser signer, the bridge discovers relays through NIP-65, and Gitea receives standard OIDC identity claims.&lt;/p>
&lt;h3 id="surveil-a-magic-the-gathering-deck-builder-on-nostr">Surveil: a Magic: The Gathering deck builder on Nostr&lt;/h3>
&lt;p>&lt;a href="https://gitlab.com/chad.curtis/surveil">Surveil&lt;/a> is a Nostr client for Magic: The Gathering players that lets users search cards, build decks, scan paper cards on Android with on-device ML Kit OCR, and share decks across the network. Decks are published as kind &lt;code>37381&lt;/code> addressable events, and the deck event spec is documented in the project&amp;rsquo;s &lt;code>NIP.md&lt;/code>. The social layer is built from standard Nostr primitives: NIP-22 (kind &lt;code>1111&lt;/code>) threaded comments scoped to each deck, NIP-25 (kind &lt;code>7&lt;/code>) reactions, &lt;a href="https://github.com/nostr-protocol/nips/blob/master/78.md">NIP-78&lt;/a> (kind &lt;code>30078&lt;/code>) profile data for player homes, kind &lt;code>3&lt;/code> follow feeds, and forks that carry an &lt;code>a&lt;/code> tag back to the original deck. &lt;a href="https://gitlab.com/chad.curtis/surveil/-/tags/v0.1.6">v0.1.6&lt;/a> shipped this week with mobile UI polish, life counter improvements, an overhauled About page, and a relay pill on the deck hero banner. The web app runs anywhere static HTML is served, the Android build ships through &lt;a href="https://zapstore.dev">Zapstore&lt;/a>, and kind &lt;code>37381&lt;/code> events are also indexed natively by &lt;a href="https://about.ditto.pub/reference">Ditto&lt;/a> as Magic decks. The repo is on GitLab at &lt;a href="https://gitlab.com/chad.curtis/surveil">chad.curtis/surveil&lt;/a>.&lt;/p>
&lt;h3 id="smaller-additions-fundstr-nod-city-deploy-nsite-to-pages-and-null--nostr">Smaller additions: Fundstr, Nod City, deploy-nsite-to-pages, and null&amp;ndash;nostr&lt;/h3>
&lt;p>&lt;a href="https://github.com/ritty65/Fundstr">Fundstr&lt;/a> is a creator-funding platform on Nostr using Cashu ecash for one-time and recurring pledges, with creator tier definitions and Nostr DMs. &lt;a href="https://nod.city">Nod City&lt;/a> is a Bitcoin-service review site where reviews are signed Nostr events and reviewers can receive zaps; no public source repo was found. &lt;a href="https://github.com/Origami74/deploy-nsite-to-pages">deploy-nsite-to-pages&lt;/a> is a GitHub Action that mirrors an nsite to GitHub Pages by using &lt;code>nsyte download&lt;/code>, supporting root kind &lt;code>15128&lt;/code> and named kind &lt;code>35128&lt;/code> nsites. &lt;a href="https://github.com/tami1A84/null--nostr">null&amp;ndash;nostr&lt;/a>, also discovered in this week&amp;rsquo;s NIP-34 data, is the client covered in the recent OpenSats wave as Nurunuru; it supports MLS group messaging, Amber, NIP-50 search, NIP-70 protected posts, ProofMode badges, and Zapstore distribution.&lt;/p>
&lt;p>FIPS is not a new project for Compass. It was covered in &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-25-newsletter/#fips-nostr-native-mesh-networking">Newsletter #6&lt;/a> and &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-25-newsletter/#fips-v020-ships-tor-transport-reproducible-builds-and-sidecar-examples">Newsletter #10&lt;/a>. The database now points at the correct canonical repo, &lt;a href="https://github.com/jmcorgan/fips">jmcorgan/fips&lt;/a>, and this week&amp;rsquo;s NIP-34 discovery also surfaced related git-over-Nostr mirrors such as &lt;code>fips&lt;/code> and &lt;code>awesome-fips&lt;/code>.&lt;/p>
&lt;h2 id="protocol-work">Protocol work&lt;/h2>
&lt;h3 id="nip-updates">NIP updates&lt;/h3>
&lt;p>Recent proposals and discussions in the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a>:&lt;/p>
&lt;p>&lt;strong>Merged this week:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>NIP-34 git repositories: remove unused refs tag extension&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2325">PR #2325&lt;/a>): Removes a &lt;code>refs&lt;/code> tag extension from &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> that was defined but unused. The cleanup reduces implementation ambiguity for git-over-Nostr tools.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>NIP-34 git repositories: remove incorrect NIP-09 claim&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2326">PR #2326&lt;/a>): Removes an incorrect claim that &lt;a href="https://github.com/nostr-protocol/nips/blob/master/09.md">NIP-09&lt;/a> deletion events can reset repository state. NIP-09 deletion is a client-side event-deletion request, not a repository state machine. The correction prevents NIP-34 implementors from treating deletion hints as authoritative repo resets.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Open and implementation-driven work:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>GitWorkshop kind &lt;code>1111&lt;/code> inline review comments&lt;/strong>: The inline code review comment kind is documented in GitWorkshop&amp;rsquo;s &lt;code>NIP.md&lt;/code> and is now in active use, but it has not yet been proposed as a formal NIP. Verdict events (kind &lt;code>7321&lt;/code>) and &lt;code>suggestion&lt;/code> blocks remain in draft and have not yet shipped. Implementation feedback from GitWorkshop and ngit will determine whether the shapes become a standalone git-review NIP or remain an application convention layered on NIP-34.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Nostr mail core and Nostrmon&lt;/strong>: Two new custom-NIP drafts circulated this week. &lt;a href="https://njump.me/57d11cdf2f9ed73f7f39d6a7a6012ee3d642584ab11887f96a031f7d00fd9697">Nostr mail core&lt;/a> proposes kind &lt;code>1301&lt;/code> for RFC 2822 email content, wrapped with NIP-59 for private delivery and bridged to legacy email through NIP-05-resolved bridge pubkeys. &lt;a href="https://njump.me/5e9a8cee19d464f5f0322518ac9ccaf2399c69da6572346b4fb12d36acb17a27">Nostrmon&lt;/a> sketches addressable event kinds for regions, maps, creatures, NPCs, player saves, and items. Both remain custom drafts, not merged NIPs.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>NIP-67: EOSE Completeness Hint&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2317">PR #2317&lt;/a>): The proposal continues to iterate on adding a positive completeness marker to &lt;code>EOSE&lt;/code>, allowing relays to distinguish &amp;ldquo;stored events fully delivered&amp;rdquo; from legacy &lt;code>EOSE&lt;/code> cases where the relay makes no completeness claim.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="six-nostr-aprils">Six Nostr aprils&lt;/h2>
&lt;p>April gives a clean cross-section of Nostr&amp;rsquo;s development path: the protocol document in 2021, early client work in 2022, the post-Damus application wave in 2023, private messaging and git-over-Nostr work in 2024, Blossom and relay-list cleanup in 2025, and adoption-focused client grants in 2026.&lt;/p>
&lt;h3 id="april-2021-the-protocol-document-before-the-nips-repo">April 2021: the protocol document before the NIPs repo&lt;/h3>
&lt;p>Fiatjaf published the original Nostr article, &lt;a href="https://fiatjaf.com/nostr.html">&amp;ldquo;Notes and Other Stuff Transmitted by Relays&amp;rdquo;&lt;/a>, on November 20, 2020. That first text already contained the core shape that still defines the protocol: users sign events with keys, publish them to relays, and read from relays they choose. The &lt;a href="https://github.com/nostr-protocol/nostr/commits?since=2021-04-01&amp;amp;until=2021-04-30">&lt;code>nostr-protocol/nostr&lt;/code> commit log&lt;/a> shows no commits between April 1 and April 30. Activity sits on either side: March 2021 commits added early &amp;ldquo;nostwitter&amp;rdquo; links and a &lt;code>kind&lt;/code> filter, while May 2021 repurposed NIP-02 and added NIP authorship.&lt;/p>
&lt;p>In April 2021, there was no public client market, no visible relay network, and no NIPs repo. The protocol still lived as a small document and a few experiments. Nostr had not yet become a social network or a development platform. It was still a relay/key/event model waiting for its first sustained contributor wave.&lt;/p>
&lt;h3 id="april-2022-nips-still-lived-in-the-main-repo">April 2022: NIPs still lived in the main repo&lt;/h3>
&lt;p>April 2022 was the last month before NIPs moved out of the main &lt;code>nostr-protocol/nostr&lt;/code> repo. Because the split had not happened yet, the dedicated &lt;a href="https://github.com/nostr-protocol/nips">&lt;code>nostr-protocol/nips&lt;/code>&lt;/a> repo had no April pull-request history. In the main repo, three April commits landed: &lt;a href="https://github.com/nostr-protocol/nostr/commit/bae286312a233b971bee5429adda7aff41747eb8">&amp;ldquo;Update readme to add nip12&amp;rdquo;&lt;/a> on April 8 by goswami1999, &lt;a href="https://github.com/nostr-protocol/nostr/commit/4b9e9d123273ba8a5c70d77df46922070c11c11d">&amp;ldquo;add kinds list&amp;rdquo;&lt;/a> on April 25 by jb55, and &lt;a href="https://github.com/nostr-protocol/nostr/commit/759997657f07e0344064228ffe5e93febe85d367">&amp;ldquo;add js formatting to sample code&amp;rdquo;&lt;/a> on April 28 by steliosrammos.&lt;/p>
&lt;p>Client work was also beginning to take shape. Damus commits from April 2022 added early chatroom behavior, profile handling, and app icons, while nostr-tools was becoming the JavaScript library path for early clients and experiments. On the protocol side, NIP-12 generic tag queries gave tag search a documented place, the kinds list moved Nostr toward a registry model, and better JavaScript examples made the spec easier for client and library authors to implement. On May 1, fiatjaf moved NIPs into the dedicated repo. April 2022 was the last month of the original single-repo era.&lt;/p>
&lt;h3 id="april-2023-post-damus-application-expansion">April 2023: post-Damus application expansion&lt;/h3>
&lt;p>April 2023 arrived three months after Damus launched on the iOS App Store on January 31, 2023, and after Jack Dorsey had posted his Nostr public key. The network had just absorbed its first major public growth wave. Clients such as Damus, Snort, Iris, Coracle, and Amethyst were active, while relay operators were learning what a larger social graph did to bandwidth, spam, search, and moderation assumptions.&lt;/p>
&lt;p>April 2023 had one merged NIPs PR: &lt;a href="https://github.com/nostr-protocol/nips/pull/456">PR #456&lt;/a>, merged April 17, adding NIP-19 bech32 entity links to NIP-21 URI handling. The surrounding commits show the application pressure behind the protocol work. April 2023 saw work on &lt;a href="https://github.com/nostr-protocol/nips/commit/8b39976e78f90fe766ad7149e250777cddacbb5e">NIP-45 COUNT&lt;/a>, event-specific zap markers, &lt;a href="https://github.com/nostr-protocol/nips/commit/bf0a0da6a48b96467172414d8e41dc72b0ca379c">NIP-15 marketplace&lt;/a>, NIP-26 delete delegation semantics, NIP-94 file metadata, NIP-47 wallet-connect error handling, and &lt;a href="https://github.com/nostr-protocol/nips/commit/e91ce3409e1ce8267fc07a21784d2538621267c3">NIP-30 custom emoji&lt;/a>. The contributor list had widened to include fiatjaf, staab, pablof7z, Semisol, CodyTseng, sethforprivacy, mikedilger, AsaiToshiya, alexgleason, martindsq, frbittencourt, and arkin0x.&lt;/p>
&lt;p>Damus, Snort, Iris, Coracle, and Amethyst were no longer demos around a spec; they were production clients dealing with onboarding, feeds, spam, zaps, media, and relay selection. April 2023&amp;rsquo;s protocol work reads like the backlog those clients created: zaps, marketplaces, file metadata, counting, emoji, and identity links all pushed the spec beyond simple notes and follows.&lt;/p>
&lt;h3 id="april-2024-private-messaging-git-over-nostr-and-maintainer-support">April 2024: private messaging, git-over-Nostr, and maintainer support&lt;/h3>
&lt;p>April 2024 had two NIP PR merges. &lt;a href="https://github.com/nostr-protocol/nips/pull/1167">PR #1167&lt;/a>, merged April 10, fixed confusing terminology in &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote signing, where clients and signers need exact language for requested and authorized actions. &lt;a href="https://github.com/nostr-protocol/nips/pull/1108">PR #1108&lt;/a>, merged April 17, expanded &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> git repositories with status events, clarifications, optional maintainers, repo identifiers, and discoverability tags. That step made git-over-Nostr more practical for ngit and later GitWorkshop.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/commit/df30012430c88d49fb5b124992b04d5c61b6338b">NIP-17&lt;/a>, formerly NIP-24, landed on April 24 as sealed gift-wrapped messages for private DMs and small group chats. Client and library work ran alongside: Amethyst, Primal, Gossip, nostr-tools, NDK, and rust-nostr were all active in the same period.&lt;/p>
&lt;p>OpenSats also announced long-term support for Nostr developers in April 2024: &lt;a href="https://opensats.org/blog/pablofz7-receives-lts-grant">PabloF7z&lt;/a> on April 9, &lt;a href="https://opensats.org/blog/stuart-bowman-receives-lts-grant">Stuart Bowman&lt;/a> on April 12, and &lt;a href="https://opensats.org/blog/hzrd149-receives-lts-grant">hzrd149&lt;/a> on April 15. Those grants moved funding from isolated project grants toward sustained maintenance of relays, libraries, and client infrastructure.&lt;/p>
&lt;h3 id="april-2025-dense-nip-cleanup-and-blossom-formalization">April 2025: dense NIP cleanup and Blossom formalization&lt;/h3>
&lt;p>April 2025 was the densest protocol month in this retrospective, with sixteen merged NIPs PRs. The month began with &lt;a href="https://github.com/nostr-protocol/nips/pull/1846">PR #1846&lt;/a>, adding blockchain transactions and addresses to NIP-73, and &lt;a href="https://github.com/nostr-protocol/nips/pull/1865">PR #1865&lt;/a>, adding NIP-C0 tags to the standardized tags table. It continued with &lt;a href="https://github.com/nostr-protocol/nips/pull/1801">PR #1801&lt;/a> and &lt;a href="https://github.com/nostr-protocol/nips/pull/1889">PR #1889&lt;/a>, both improving kind &lt;code>10002&lt;/code> relay-list republication guidance, and &lt;a href="https://github.com/nostr-protocol/nips/pull/1879">PR #1879&lt;/a>, which shrank and clarified &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a>.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/1822">PR #1822&lt;/a> added NIP-B7 for Blossom interaction, giving Nostr clients and Blossom servers a canonical coordination layer after more than a year of informal practice. &lt;a href="https://github.com/nostr-protocol/nips/pull/1051">PR #1051&lt;/a> deprecated &lt;a href="https://github.com/nostr-protocol/nips/blob/master/26.md">NIP-26&lt;/a>, the delegated event signing spec. NIP-26 had been difficult to implement safely and had become less attractive as NIP-46 and other signer patterns matured.&lt;/p>
&lt;p>The rest of the month combined cleanup with application expansion: &lt;a href="https://github.com/nostr-protocol/nips/pull/1882">PR #1882&lt;/a> added privacy policy and terms of service fields to &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a>, &lt;a href="https://github.com/nostr-protocol/nips/pull/1849">PR #1849&lt;/a> expanded kind &lt;code>39701&lt;/code> web bookmarks under NIP-B0, &lt;a href="https://github.com/nostr-protocol/nips/pull/1891">PR #1891&lt;/a> added that bookmark kind to the README, and &lt;a href="https://github.com/nostr-protocol/nips/pull/1895">PR #1895&lt;/a> added NIP-B0 standardized tags. OpenSats announced its &lt;a href="https://opensats.org/blog/eleventh-wave-of-nostr-grants">Eleventh Wave of Nostr Grants&lt;/a> on April 16, funding Swae, HAMSTR, Vertex, Nostr Double Ratchet, and Nostr Game Engine. Primal, Coracle, noStrudel, nostr-tools, NDK, and rust-nostr were also shipping through this period, so the protocol cleanup sat next to active client and library work.&lt;/p>
&lt;h3 id="april-2026-nip-34-hardening-badges-and-adoption-focused-grants">April 2026: NIP-34 hardening, badges, and adoption-focused grants&lt;/h3>
&lt;p>April 2026, the month this issue closes, had four merged NIPs PRs. The first was &lt;a href="https://github.com/nostr-protocol/nips/pull/2276">PR #2276&lt;/a>, merged April 1, which changed &lt;a href="https://github.com/nostr-protocol/nips/blob/master/58.md">NIP-58&lt;/a> profile badges to kind &lt;code>10008&lt;/code> and added kind &lt;code>30008&lt;/code> badge sets, making badge assignment and badge collections more composable. A second git-over-Nostr usability change arrived in &lt;a href="https://github.com/nostr-protocol/nips/pull/2312">PR #2312&lt;/a>, merged April 10, adding &lt;code>nostr://&lt;/code> clone URL semantics to &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a>. The April 25 cleanups, &lt;a href="https://github.com/nostr-protocol/nips/pull/2325">PR #2325&lt;/a> and &lt;a href="https://github.com/nostr-protocol/nips/pull/2326">PR #2326&lt;/a>, removed unused and incorrect NIP-34 language.&lt;/p>
&lt;p>Related commits sharpen the same surfaces. On April 22, fiatjaf added a Blossom server list to NIP-51 and adjusted NIP-29 metadata editing to match Flotilla&amp;rsquo;s PUT-style behavior. On April 26, he renamed NIP-5A for clarity. April 2026 focused on making already-used protocol surfaces easier to implement and harder to misread.&lt;/p>
&lt;p>OpenSats announced its &lt;a href="https://opensats.org/blog/sixteenth-wave-of-nostr-grants">Sixteenth Wave of Nostr Grants&lt;/a> on April 8, supporting Amethyst Desktop, Nostr Mail, Nostrord, Nurunuru (null&amp;ndash;nostr), and a HAMSTR renewal: desktop clients, email-like messaging, group UX, Japanese onboarding, and off-grid connectivity.&lt;/p>
&lt;hr>
&lt;p>&lt;em>Thanks for reading Nostr Compass #20. &lt;a href="https://nostr.com">DM us on Nostr&lt;/a> with tips, corrections, or new projects to cover.&lt;/em>&lt;/p></content:encoded></item><item><title>Nostr Compass #19</title><link>https://nostrcompass.org/en/newsletters/2026-04-22-newsletter/</link><pubDate>Wed, 22 Apr 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-04-22-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> lands a large Marmot, communities, and MoQ audio rooms pass, &lt;a href="https://github.com/OpenTollGate/tollgate">TollGate&lt;/a> stabilizes pay-per-use internet access over Nostr and Cashu in &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-22-newsletter/#tollgate-v010-stabilizes-pay-per-use-internet-over-nostr-and-cashu">v0.1.0&lt;/a>, and &lt;a href="https://github.com/Cameri/nostream">nostream&lt;/a> closes a week of relay work around &lt;a href="https://nostrcompass.org/en/topics/nip-45/">NIP-45&lt;/a>, &lt;a href="https://nostrcompass.org/en/topics/nip-62/">NIP-62&lt;/a>, compression, query hardening, and complete &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> parity. &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-22-newsletter/#forgesworn-publishes-a-29-repo-cryptographic-toolkit-for-nostr">Forgesworn&lt;/a> drops a full signing, identity, and paid-API stack for Nostr. &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-22-newsletter/#shockwallet-ships-nostr-native-lightning-wallet-sync-and-multi-node-connections">ShockWallet&lt;/a> keeps pushing Nostr-native Lightning wallet flows. The Formstr suite (&lt;a href="https://nostrcompass.org/en/newsletters/2026-04-22-newsletter/#formstr-suite-pollerama-security-pass-forms-i18n-calendar-rrule-support">Pollerama&lt;/a>, Forms, Calendar) merges 26 PRs across security hardening and RRULE support. &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-22-newsletter/#stablekraft-v100-ships-the-first-stable-pwa-release">StableKraft&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-22-newsletter/#keep-android-v100-ships-with-reproducible-builds-and-zero-trackers">Keep&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-22-newsletter/#topaz-v002-ships-a-nostr-relay-for-android">topaz&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-22-newsletter/#wot-relay-v021-migrates-eventstore-to-lmdb">WoT Relay&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-22-newsletter/#flotilla-173-and-174-add-kind-9-wrapping-for-richer-nip-29-rooms">Flotilla&lt;/a>, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-22-newsletter/#niplock-ships-a-nip-17-based-password-manager">NipLock&lt;/a> round out the shipping list. Deep dives cover &lt;a href="https://nostrcompass.org/en/topics/nip-72/">NIP-72 moderated communities&lt;/a> and &lt;a href="https://nostrcompass.org/en/topics/nip-57/">NIP-57 zaps&lt;/a>.&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> lands a large Marmot, communities, and MoQ audio rooms pass, &lt;a href="https://github.com/OpenTollGate/tollgate">TollGate&lt;/a> stabilizes pay-per-use internet access over Nostr and Cashu in &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-22-newsletter/#tollgate-v010-stabilizes-pay-per-use-internet-over-nostr-and-cashu">v0.1.0&lt;/a>, and &lt;a href="https://github.com/Cameri/nostream">nostream&lt;/a> closes a week of relay work around &lt;a href="https://nostrcompass.org/en/topics/nip-45/">NIP-45&lt;/a>, &lt;a href="https://nostrcompass.org/en/topics/nip-62/">NIP-62&lt;/a>, compression, query hardening, and complete &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> parity. &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-22-newsletter/#forgesworn-publishes-a-29-repo-cryptographic-toolkit-for-nostr">Forgesworn&lt;/a> drops a full signing, identity, and paid-API stack for Nostr. &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-22-newsletter/#shockwallet-ships-nostr-native-lightning-wallet-sync-and-multi-node-connections">ShockWallet&lt;/a> keeps pushing Nostr-native Lightning wallet flows. The Formstr suite (&lt;a href="https://nostrcompass.org/en/newsletters/2026-04-22-newsletter/#formstr-suite-pollerama-security-pass-forms-i18n-calendar-rrule-support">Pollerama&lt;/a>, Forms, Calendar) merges 26 PRs across security hardening and RRULE support. &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-22-newsletter/#stablekraft-v100-ships-the-first-stable-pwa-release">StableKraft&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-22-newsletter/#keep-android-v100-ships-with-reproducible-builds-and-zero-trackers">Keep&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-22-newsletter/#topaz-v002-ships-a-nostr-relay-for-android">topaz&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-22-newsletter/#wot-relay-v021-migrates-eventstore-to-lmdb">WoT Relay&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-22-newsletter/#flotilla-173-and-174-add-kind-9-wrapping-for-richer-nip-29-rooms">Flotilla&lt;/a>, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-22-newsletter/#niplock-ships-a-nip-17-based-password-manager">NipLock&lt;/a> round out the shipping list. Deep dives cover &lt;a href="https://nostrcompass.org/en/topics/nip-72/">NIP-72 moderated communities&lt;/a> and &lt;a href="https://nostrcompass.org/en/topics/nip-57/">NIP-57 zaps&lt;/a>.&lt;/p>
&lt;h2 id="top-stories">Top Stories&lt;/h2>
&lt;h3 id="amethyst-ships-marmot-mip-compliance-nip-72-communities-zap-goals-and-moq-audio-rooms">Amethyst ships Marmot MIP compliance, NIP-72 communities, zap goals, and MoQ audio rooms&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a>, the Android client maintained by vitorpamplona, merged 57 PRs this week. The week&amp;rsquo;s headline themes are &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> encrypted-group compliance, first-class moderated communities, zap goals on live streams, and a new audio-rooms stack built on Media over QUIC.&lt;/p>
&lt;p>On Marmot compliance, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2462">PR #2462&lt;/a> aligns the embedded &lt;a href="https://github.com/marmot-protocol/mdk">MDK&lt;/a> implementation with the MIP-01 and MIP-05 wire formats, adding VarInt encoding of TLS-style length prefixes and round-trip validation against MDK test vectors. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2435">PR #2435&lt;/a> adds MIP-00 KeyPackage Relay List support so invitees advertise which relays serve their KeyPackages, and &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2436">PR #2436&lt;/a> closes the remaining admin-gate and media-handling gaps flagged by cross-client testing with &lt;a href="https://github.com/marmot-protocol/whitenoise">White Noise&lt;/a>. Two correctness fixes land the same day: &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2466">PR #2466&lt;/a> corrects MLS commit framing so encrypted welcomes serialize to the same bytes &lt;a href="https://github.com/marmot-protocol/mdk">mdk-core&lt;/a> produces, and &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2471">PR #2471&lt;/a> resolves an outer-layer decryption bug that caused state divergence between Marmot co-admins. A second compliance pass in &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2477">PR #2477&lt;/a> and &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2493">PR #2493&lt;/a> closes additional commit-path and message-encryption gaps and adds a full MLS commit cryptography validator that checks signatures, key schedules, and welcome-message derivation against the reference vectors.&lt;/p>
&lt;p>Alongside the protocol work, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2488">PR #2488&lt;/a> ships &lt;code>amy&lt;/code>, a command-line tool for Marmot and MLS group operations driven from Amethyst&amp;rsquo;s implementation. Amy gives integrators a scriptable way to create groups, generate KeyPackages, simulate welcomes, and validate commits against a real Amethyst signer, which closes the biggest debugging gap for cross-client Marmot interop today.&lt;/p>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst/pull/2468">PR #2468&lt;/a> adds first-class &lt;a href="https://nostrcompass.org/en/topics/nip-72/">NIP-72&lt;/a> community creation and management. Users can author the kind &lt;code>34550&lt;/code> community definition, add moderators and relay hints, submit posts with an &lt;code>a&lt;/code> tag pointing at the community, and manage pending approvals through kind &lt;code>4550&lt;/code> approval events. The feature closes a long-standing gap between Amethyst and &lt;a href="https://github.com/hzrd149/nostrudel">noStrudel&lt;/a> on community moderation. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2458">PR #2458&lt;/a> and &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2473">PR #2473&lt;/a> add emoji-set support and a full &lt;a href="https://github.com/nostr-protocol/nips/blob/master/30.md">NIP-30&lt;/a> emoji-pack management UI so users can curate their own custom emoji libraries.&lt;/p>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst/pull/2469">PR #2469&lt;/a> wires &lt;a href="https://nostrcompass.org/en/topics/nip-75/">NIP-75&lt;/a> zap goals into the &lt;a href="https://nostrcompass.org/en/topics/nip-53/">NIP-53&lt;/a> Live Activities screen. Each live stream now carries a fundraising goal header with a progress bar, a one-tap zap button, and a top-zappers leaderboard. The leaderboard reads kind &lt;code>9735&lt;/code> zap receipts bound to the stream&amp;rsquo;s kind &lt;code>30311&lt;/code> event and tallies them against the goal&amp;rsquo;s &lt;code>amount&lt;/code> target. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2486">PR #2486&lt;/a> rounds out the live-stream surface with a dedicated Live Streams feed screen, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2491">PR #2491&lt;/a> adds NIP-53 proof-of-agreement and event-builder helpers, and &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2461">PR #2461&lt;/a> adds lowest-resolution HLS in feed, picture-in-picture playback, and automatic resolution selection in full screen.&lt;/p>
&lt;p>The most ambitious new surface is real-time audio. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2494">PR #2494&lt;/a> adds a &lt;a href="https://datatracker.ietf.org/group/moq/about/">Media over QUIC&lt;/a> transport client and audio-rooms support. MoQ&amp;rsquo;s pub-sub model over QUIC fits live audio better than WebSocket relays because clients can subscribe to specific tracks and priorities and let the transport handle congestion. Paired with the new Public Chats screen in &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2487">PR #2487&lt;/a>, Amethyst now has an end-to-end surface for public audio rooms that sits alongside its Marmot encrypted messaging.&lt;/p>
&lt;p>On the discovery and reliability side, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2485">PR #2485&lt;/a> and &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2490">PR #2490&lt;/a> add a Follow Packs discovery feed and wire curated follow sets into the default onboarding preference, giving new users a populated timeline on first launch. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/1983">PR #1983&lt;/a> lands an always-on notification service for real-time relay connections so Marmot DMs and mentions arrive without the app being foregrounded, and &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2480">PR #2480&lt;/a> adds on-demand HLS video caching with adaptive cache sizing.&lt;/p>
&lt;h3 id="tollgate-v010-stabilizes-pay-per-use-internet-over-nostr-and-cashu">TollGate v0.1.0 stabilizes pay-per-use internet over Nostr and Cashu&lt;/h3>
&lt;p>&lt;a href="https://github.com/OpenTollGate/tollgate">TollGate&lt;/a> cut its &lt;a href="https://github.com/OpenTollGate/tollgate/releases/tag/v0.1.0">v0.1.0 release&lt;/a> on April 21, the first tagged snapshot of its specification set for pay-per-use network access. The protocol lets a WiFi router running the TollGate software advertise pricing, accept &lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a> ecash tokens, and manage sessions through prepaid local tokens instead of accounts or subscriptions. A customer with a few sats in a local Cashu wallet can buy the next minute or megabyte of connectivity from any compatible TollGate on the network.&lt;/p>
&lt;p>The release pins three layers of the architecture. The protocol layer, defined in &lt;a href="https://github.com/OpenTollGate/tollgate/blob/v0.1.0/TIP-01.md">TIP-01&lt;/a>, specifies three base event shapes (Advertisement, Session, Notice), and &lt;a href="https://github.com/OpenTollGate/tollgate/blob/v0.1.0/TIP-02.md">TIP-02&lt;/a> layers Cashu payments on top so a customer can redeem tokens from any mint the gate advertises. Above that sits the interface layer: &lt;a href="https://github.com/OpenTollGate/tollgate/blob/v0.1.0/HTTP-01.md">HTTP-01&lt;/a> through HTTP-03 define a plain-HTTP surface for devices on restrictive operating systems, and &lt;a href="https://github.com/OpenTollGate/tollgate/blob/v0.1.0/NOSTR-01.md">NOSTR-01&lt;/a> defines the Nostr-relay transport for clients that can open WebSockets. Finally, &lt;a href="https://github.com/OpenTollGate/tollgate/blob/v0.1.0/WIFI-01.md">WIFI-01&lt;/a> covers the medium layer by describing the captive-portal routing for paying customers.&lt;/p>
&lt;p>The payment asset is a bearer token, so a customer can arrive with Cashu already in a local wallet and spend it immediately for the first minute of connectivity. Gates can also buy uplink from each other, so reach extends beyond a single operator. The new &lt;a href="https://nostrcompass.org/en/topics/tollgate/">TollGate topic page&lt;/a> covers the full layer stack.&lt;/p>
&lt;h3 id="nostream-merges-53-prs-for-nip-45-nip-62-compression-and-query-hardening">nostream merges 53 PRs for NIP-45, NIP-62, compression, and query hardening&lt;/h3>
&lt;p>&lt;a href="https://github.com/Cameri/nostream">nostream&lt;/a>, the TypeScript relay implementation by Cameri, merged 53 PRs in a single week covering new NIP support, query performance, security hardening, and operational polish.&lt;/p>
&lt;p>On feature work, &lt;a href="https://github.com/Cameri/nostream/pull/522">PR #522&lt;/a> adds &lt;a href="https://nostrcompass.org/en/topics/nip-45/">NIP-45&lt;/a> &lt;code>COUNT&lt;/code> support so clients can ask the relay how many events match a filter without fetching them, and &lt;a href="https://github.com/Cameri/nostream/pull/544">PR #544&lt;/a> adds &lt;a href="https://nostrcompass.org/en/topics/nip-62/">NIP-62&lt;/a> right-to-vanish to the advertised feature list. &lt;a href="https://github.com/Cameri/nostream/pull/548">PR #548&lt;/a> extends the filter schema to accept uppercase tag filters (&lt;code>#A&lt;/code> through &lt;code>#Z&lt;/code>) per the recent tag-case conventions, and &lt;a href="https://github.com/Cameri/nostream/pull/514">PR #514&lt;/a> adds gzip and xz compression to event import and export so operators can move large event dumps between nodes without extra tooling.&lt;/p>
&lt;p>Query performance and correctness land via &lt;a href="https://github.com/Cameri/nostream/pull/534">PR #534&lt;/a>, which introduces a benchmarking harness and an optimization pass on the filter-to-SQL translation. &lt;a href="https://github.com/Cameri/nostream/pull/524">PR #524&lt;/a> fixes a whitelist/blacklist pubkey matching bug by replacing prefix matching with exact-match checks, &lt;a href="https://github.com/Cameri/nostream/pull/553">PR #553&lt;/a> adds a deterministic tie-breaker to &lt;code>upsertMany&lt;/code> so concurrent inserts no longer race on equal &lt;code>created_at&lt;/code> timestamps, and &lt;a href="https://github.com/Cameri/nostream/pull/493">PR #493&lt;/a> restricts the relay to trusting &lt;code>X-Forwarded-For&lt;/code> only from configured trusted proxies. &lt;a href="https://github.com/Cameri/nostream/pull/557">PR #557&lt;/a> brings the relay to complete &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> relay information parity by aligning every advertised field with the current specification, including retention limits, authentication hints, and the trimmed optional-field set.&lt;/p>
&lt;h2 id="shipping-this-week">Shipping This Week&lt;/h2>
&lt;h3 id="primal-android-ships-explore-tab-nip-05-verification-and-audio-player">Primal Android ships Explore tab, NIP-05 verification, and audio player&lt;/h3>
&lt;p>&lt;a href="https://github.com/PrimalHQ/primal-android-app">Primal Android&lt;/a> pushed 11 merged PRs on top of last week&amp;rsquo;s feed redesign. &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/1021">PR #1021&lt;/a> introduces a new Explore tab built around popular users, follow packs, and curated feeds, and &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/1015">PR #1015&lt;/a> adds a feed editor that prepopulates from Primal&amp;rsquo;s Advanced Search DSL. &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/994">PR #994&lt;/a> ships &lt;a href="https://github.com/nostr-protocol/nips/blob/master/05.md">NIP-05&lt;/a> verification UI for profiles, and &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/997">PR #997&lt;/a> embeds an in-feed audio player that plays audio file attachments inline. &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/1018">PR #1018&lt;/a> adds &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> nostr-connect pairing from the wallet QR scanner, reusing the same camera path for signer pairing and wallet linking.&lt;/p>
&lt;h3 id="strfry-adds-prometheus-write-path-metrics-and-fixes-nip-42-auth-envelope">strfry adds Prometheus write-path metrics and fixes NIP-42 AUTH envelope&lt;/h3>
&lt;p>&lt;a href="https://github.com/hoytech/strfry">strfry&lt;/a> shipped a batch of operator-facing improvements. &lt;a href="https://github.com/hoytech/strfry/pull/194">PR #194&lt;/a> adds a dedicated Prometheus write-path metrics exporter and a new connection gauge, and &lt;a href="https://github.com/hoytech/strfry/pull/197">PR #197&lt;/a> logs per-connection bytes up and down plus compression ratios for operators tracking bandwidth. &lt;a href="https://github.com/hoytech/strfry/pull/192">PR #192&lt;/a> promotes the hard-coded filter tag limit to a runtime-configurable option so operators can tune it without a recompile. On protocol correctness, &lt;a href="https://github.com/hoytech/strfry/pull/201">PR #201&lt;/a> changes &lt;a href="https://github.com/nostr-protocol/nips/blob/master/42.md">NIP-42&lt;/a> AUTH failure responses from a &lt;code>NOTICE&lt;/code> message to the &lt;code>OK&lt;/code> envelope the NIP actually specifies, which was a long-standing interop wart for auth-gated relays.&lt;/p>
&lt;h3 id="shopstr-hardens-storefront-security-across-13-prs">Shopstr hardens storefront security across 13 PRs&lt;/h3>
&lt;p>&lt;a href="https://github.com/shopstr-eng/shopstr">Shopstr&lt;/a>, the Nostr marketplace client, merged 13 PRs this week dominated by security fixes. &lt;a href="https://github.com/shopstr-eng/shopstr/pull/434">PR #434&lt;/a> closes a stored-JavaScript hole in storefront links that allowed seller-to-visitor script execution, &lt;a href="https://github.com/shopstr-eng/shopstr/pull/417">PR #417&lt;/a> escapes storefront policy HTML rendering to block reflected XSS, and &lt;a href="https://github.com/shopstr-eng/shopstr/pull/418">PR #418&lt;/a> closes an unauthenticated cached-event deletion API that allowed cross-user data removal. &lt;a href="https://github.com/shopstr-eng/shopstr/pull/433">PR #433&lt;/a> requires authentication for cached-message reads, &lt;a href="https://github.com/shopstr-eng/shopstr/pull/419">PR #419&lt;/a> secures storefront mutation and event-cache endpoints behind proper auth, and &lt;a href="https://github.com/shopstr-eng/shopstr/pull/435">PR #435&lt;/a> and &lt;a href="https://github.com/shopstr-eng/shopstr/pull/414">PR #414&lt;/a> fix two server-side request forgery findings from code scanning. On functional bugs, &lt;a href="https://github.com/shopstr-eng/shopstr/pull/421">PR #421&lt;/a> makes the failed-relay-publish queue safe against replay, &lt;a href="https://github.com/shopstr-eng/shopstr/pull/425">PR #425&lt;/a> repairs a broken wallet-events fetch, and &lt;a href="https://github.com/shopstr-eng/shopstr/pull/392">PR #392&lt;/a> revalidates stored cart discounts before checkout.&lt;/p>
&lt;h3 id="nostria-v3126-through-v3128-add-background-music-playback-on-android">Nostria v3.1.26 through v3.1.28 add background music playback on Android&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostria-app/nostria">Nostria&lt;/a> cut six releases this week from &lt;a href="https://github.com/nostria-app/nostria/releases/tag/v3.1.22">v3.1.22&lt;/a> through &lt;a href="https://github.com/nostria-app/nostria/releases/tag/v3.1.28">v3.1.28&lt;/a>. The headline change in &lt;a href="https://github.com/nostria-app/nostria/releases/tag/v3.1.26">v3.1.26&lt;/a> is Android background music playback: the app keeps itself alive while audio is playing, with media controls available in the notification bar and on the lock screen. Follow-up releases &lt;a href="https://github.com/nostria-app/nostria/releases/tag/v3.1.27">v3.1.27&lt;/a> and &lt;a href="https://github.com/nostria-app/nostria/releases/tag/v3.1.28">v3.1.28&lt;/a> harden that new media-service surface. &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#nostria-v3119-through-v3121-add-local-ai-image-generation">Newsletter #18&lt;/a> covered the preceding v3.1.19 through v3.1.21 local-image-generation release.&lt;/p>
&lt;h3 id="wisp-v0180-beta-adds-normie-mode-for-you-feed-and-nip-29-group-config">Wisp v0.18.0-beta adds Normie Mode, For You feed, and NIP-29 group config&lt;/h3>
&lt;p>&lt;a href="https://github.com/barrydeen/wisp">Wisp&lt;/a>, the Kotlin and Jetpack Compose Android client by barrydeen, shipped &lt;a href="https://github.com/barrydeen/wisp/releases/tag/v0.18.0-beta">v0.18.0-beta&lt;/a> on April 16. The release targets users arriving from non-Bitcoin-native contexts: &lt;a href="https://github.com/barrydeen/wisp/pull/462">PR #462&lt;/a> adds a Normie Mode that surfaces fiat-denominated amounts throughout the app, and &lt;a href="https://github.com/barrydeen/wisp/pull/464">PR #464&lt;/a> overhauls onboarding with a topics picker and a first-post coach. &lt;a href="https://github.com/barrydeen/wisp/pull/469">PR #469&lt;/a> adds a For You feed that blends extended follows, trending events, and followed hashtags.&lt;/p>
&lt;p>On protocol work, &lt;a href="https://github.com/barrydeen/wisp/pull/471">PR #471&lt;/a> adds &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> group configuration for flags, invites, roles, and AUTH prompts, and &lt;a href="https://github.com/barrydeen/wisp/pull/478">PR #478&lt;/a> fixes an ordering bug so Wisp waits for &lt;a href="https://github.com/nostr-protocol/nips/blob/master/42.md">NIP-42&lt;/a> AUTH before issuing group &lt;code>9021&lt;/code>, &lt;code>9007&lt;/code>, and &lt;code>9009&lt;/code> events and surfaces admin-side failures. &lt;a href="https://github.com/barrydeen/wisp/pull/481">PR #481&lt;/a> broadcasts notes to the &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> inbox relays of mentioned pubkeys so replies reach their targets even when the sender&amp;rsquo;s and recipient&amp;rsquo;s relay sets do not overlap.&lt;/p>
&lt;h3 id="noornote-v084-adds-scheduled-posts-and-live-stream-zapping">NoorNote v0.8.4 adds Scheduled Posts and live stream zapping&lt;/h3>
&lt;p>&lt;a href="https://github.com/77elements/noornote">NoorNote&lt;/a> shipped &lt;a href="https://github.com/77elements/noornote/releases/tag/v0.8.4">v0.8.4&lt;/a> and &lt;a href="https://github.com/77elements/noornote/releases/tag/v0.8.5">v0.8.5&lt;/a>. The headline addition in v0.8.4 is a Scheduled Posts add-on: the app hands a fully signed event to a NoorNote-operated relay which publishes it at the scheduled moment, so private keys never leave the device. The same release adds one-tap zapping from live-stream cards, where the sats appear in the stream&amp;rsquo;s chat overlay via &lt;a href="https://nostrcompass.org/en/topics/nip-53/">NIP-53&lt;/a>, and keeps the wallet balance visible when the fiat-rate API is briefly unavailable. v0.8.5 fixes a timeline deduplication bug that caused duplicate posts on long Android scrolls.&lt;/p>
&lt;h3 id="topaz-v002-ships-a-nostr-relay-for-android">topaz v0.0.2 ships a Nostr relay for Android&lt;/h3>
&lt;p>&lt;a href="https://github.com/fiatjaf/topaz">topaz&lt;/a>, a new Nostr relay that runs on Android phones from &lt;a href="https://github.com/fiatjaf">fiatjaf&lt;/a>, published its &lt;a href="https://github.com/fiatjaf/topaz/releases/tag/v0.0.2">v0.0.2&lt;/a> release on 2026-04-17. The project is Kotlin-first and positions the phone as an always-available personal relay. At this stage the scope is narrow: a working relay in an installable Android package.&lt;/p>
&lt;h3 id="stablekraft-v100-ships-the-first-stable-music-and-podcast-pwa-release">StableKraft v1.0.0 ships the first stable music-and-podcast PWA release&lt;/h3>
&lt;p>&lt;a href="https://github.com/ChadFarrow/stablekraft-app">StableKraft&lt;/a> is a Next.js PWA for discovering, organizing, and streaming music pulled from podcast feeds, with Nostr for auth and social features and Lightning for V4V payments. It reached &lt;a href="https://github.com/ChadFarrow/stablekraft-app/releases/tag/v1.0.0">v1.0.0&lt;/a> on 2026-04-18. The same week tightened feed ingestion with a &lt;a href="https://github.com/ChadFarrow/stablekraft-app/commit/7ac90f6">15-minute OPML cache and illegal-XML stripping&lt;/a>, and shrank the nightly reparse window from 720 hours to 24 hours in a &lt;a href="https://github.com/ChadFarrow/stablekraft-app/commit/fbf337b">follow-up fix&lt;/a> so newly added feeds self-heal faster.&lt;/p>
&lt;h3 id="niplock-ships-a-nip-17-based-password-manager">NipLock ships a NIP-17-based password manager&lt;/h3>
&lt;p>&lt;a href="https://gitworkshop.dev/npub1z5jf78uhd68znuwwwu926th55rzd0wy8nd9clkr03cx22mwme0jqazk56h/relay.ngit.dev/passwd">NipLock&lt;/a> is a password manager that stores and syncs credentials across devices using &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> gift-wrapped direct messages. Each password entry is a NIP-17 DM from the user&amp;rsquo;s key to itself, so the same events replicate to any device that authenticates with the same key. Signing works with a raw &lt;code>nsec&lt;/code>, browser extensions like &lt;a href="https://github.com/fiatjaf/nos2x">nos2x&lt;/a>, or &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> via &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a>, which keeps the master key off the client device.&lt;/p>
&lt;h3 id="flotilla-budabit-polishes-its-nip-34-repo-surface">flotilla-budabit polishes its NIP-34 repo surface&lt;/h3>
&lt;p>The Budabit community&amp;rsquo;s fork of &lt;a href="https://gitea.coracle.social/coracle/flotilla">Flotilla&lt;/a>, &lt;a href="https://github.com/Pleb5/flotilla-budabit">flotilla-budabit&lt;/a>, shipped a cluster of fixes to its NIP-34 git-over-nostr workflow. Updates this week &lt;a href="https://github.com/Pleb5/flotilla-budabit/commit/a6fb67e">restore repo discussion controls&lt;/a>, &lt;a href="https://github.com/Pleb5/flotilla-budabit/commit/e2b891a">keep sticky repo tabs visible on detail pages&lt;/a>, &lt;a href="https://github.com/Pleb5/flotilla-budabit/commit/43d5e9e">load repo announcements from saved GRASP relays&lt;/a>, and &lt;a href="https://github.com/Pleb5/flotilla-budabit/commit/2dbb9f0">keep maintainer-applied patch status in sync&lt;/a>. Staying close to upstream Flotilla, the fork prioritizes the repo view for Budabit community contributors.&lt;/p>
&lt;h3 id="rx-nostr-372-through-374-add-default-verifier-and-optional-constructor-args">rx-nostr 3.7.2 through 3.7.4 add default verifier and optional constructor args&lt;/h3>
&lt;p>&lt;a href="https://github.com/penpenpng/rx-nostr">rx-nostr&lt;/a>, the RxJS-based Nostr library, shipped &lt;a href="https://github.com/penpenpng/rx-nostr/releases/tag/rx-nostr%403.7.2">3.7.2&lt;/a>, &lt;a href="https://github.com/penpenpng/rx-nostr/releases/tag/rx-nostr%403.7.3">3.7.3&lt;/a>, and &lt;a href="https://github.com/penpenpng/rx-nostr/releases/tag/rx-nostr%403.7.4">3.7.4&lt;/a>. &lt;a href="https://github.com/penpenpng/rx-nostr/pull/192">PR #192&lt;/a> adds a default Schnorr signature verifier so callers no longer have to wire one up manually, and a paired &lt;a href="https://github.com/penpenpng/rx-nostr/releases/tag/crypto%403.1.6">crypto@3.1.6&lt;/a> corrects a &lt;code>@noble/curves&lt;/code> usage bug that was producing spurious verification failures. &lt;a href="https://github.com/penpenpng/rx-nostr/pull/195">PR #195&lt;/a> in 3.7.4 makes the arguments of &lt;code>createRxNostr()&lt;/code> optional so quick integrations can instantiate the library with zero configuration.&lt;/p>
&lt;h3 id="keep-android-v100-ships-with-reproducible-builds-and-zero-trackers">Keep Android v1.0.0 ships with reproducible builds and zero trackers&lt;/h3>
&lt;p>&lt;a href="https://github.com/privkeyio/keep-android">Keep&lt;/a>, a Nostr-native password and secret manager, shipped &lt;a href="https://github.com/privkeyio/keep-android/releases/tag/v1.0.0">v1.0.0&lt;/a> on April 21 after a run of hardening PRs. &lt;a href="https://github.com/privkeyio/keep-android/pull/241">PR #241&lt;/a> adds a reproducible build recipe with a pinned and verified toolchain, &lt;a href="https://github.com/privkeyio/keep-android/pull/248">PR #248&lt;/a> swaps Google ML Kit for ZXing to remove a Google Play Services dependency, and &lt;a href="https://github.com/privkeyio/keep-android/pull/252">PR #252&lt;/a> publishes an &lt;a href="https://reports.exodus-privacy.eu.org/en/">Exodus Privacy scan&lt;/a> showing zero trackers on the v1.0.0 build. &lt;a href="https://github.com/privkeyio/keep-android/pull/256">PR #256&lt;/a> adds a &lt;code>zapstore.yaml&lt;/code> manifest so the v1.0.0 APK can be distributed through &lt;a href="https://zapstore.dev">zapstore&lt;/a> without an intermediate publisher.&lt;/p>
&lt;h3 id="flotilla-173-and-174-add-kind-9-wrapping-for-richer-nip-29-rooms">Flotilla 1.7.3 and 1.7.4 add kind-9 wrapping for richer NIP-29 rooms&lt;/h3>
&lt;p>&lt;a href="https://gitea.coracle.social/coracle/flotilla">Flotilla&lt;/a>, hodlbod&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> groups client, shipped &lt;a href="https://gitea.coracle.social/coracle/flotilla/src/tag/1.7.3">1.7.3&lt;/a> and &lt;a href="https://gitea.coracle.social/coracle/flotilla/src/tag/1.7.4">1.7.4&lt;/a>. The main protocol change is kind-9 wrapping of non-chat content types, announced in &lt;a href="#ZgotmplZ">hodlbod&amp;rsquo;s release note&lt;/a> and tracked against &lt;a href="https://github.com/nostr-protocol/nips/pull/2310">NIP PR #2310&lt;/a>. Wrapping calendar events, polls, and other non-chat payloads in kind &lt;code>9&lt;/code> preserves the room context when those objects are sent into a group, so clients can render the embedded object without losing which room it came from.&lt;/p>
&lt;p>The same release line adds polls, support for the Aegis URL scheme for &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> login, native share support for space invites, room mentions, mobile clipboard image paste, drafts, video in calls, and feed-pagination improvements. This is the first Flotilla release since &lt;a href="https://gitea.coracle.social/coracle/flotilla/src/tag/1.7.0">1.7.0 and 1.7.1&lt;/a>, which &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#flotilla-v170-adds-voice-rooms-and-email-login">Newsletter #16&lt;/a> covered for voice rooms and email login.&lt;/p>
&lt;h3 id="wot-relay-v021-migrates-eventstore-to-lmdb">WoT Relay v0.2.1 migrates eventstore to LMDB&lt;/h3>
&lt;p>&lt;a href="https://github.com/bitvora/wot-relay">WoT Relay&lt;/a>, the web-of-trust-filtered relay by bitvora, shipped &lt;a href="https://github.com/bitvora/wot-relay/releases/tag/v0.2.1">v0.2.1&lt;/a> on 2026-04-22. &lt;a href="https://github.com/bitvora/wot-relay/pull/97">PR #97&lt;/a> migrates the eventstore to &lt;a href="http://www.lmdb.tech/">LMDB&lt;/a> and retunes the WoT bootstrap fetches so the relay builds its initial trust graph without exhausting upstream read budgets, and &lt;a href="https://github.com/bitvora/wot-relay/pull/99">PR #99&lt;/a> bumps &lt;code>golang.org/x/crypto&lt;/code> to v0.45.0 for the corresponding security fixes. &lt;a href="https://github.com/bitvora/wot-relay/pull/100">PR #100&lt;/a> updates the advertised &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> software URL and version string for the release.&lt;/p>
&lt;h3 id="formstr-suite-pollerama-security-pass-forms-i18n-calendar-rrule-support">Formstr suite: Pollerama security pass, Forms i18n, Calendar RRULE support&lt;/h3>
&lt;p>The Formstr suite merged 26 PRs across Pollerama, Formstr forms, and Nostr Calendar this week, with a clear security theme on the polling app and feature work on the rest.&lt;/p>
&lt;p>&lt;a href="https://pollerama.fun">Pollerama&lt;/a>, the &lt;a href="https://github.com/formstr-hq/nostr-polls">nostr-polls&lt;/a> web app for creating and voting on Nostr polls, hardened its key handling. &lt;a href="https://github.com/formstr-hq/nostr-polls/pull/182">PR #182&lt;/a> expires cached direct messages on logout so a shared device does not leak prior-user state, &lt;a href="https://github.com/formstr-hq/nostr-polls/pull/175">PR #175&lt;/a> moves the local key to secure browser storage, and &lt;a href="https://github.com/formstr-hq/nostr-polls/pull/171">PR #171&lt;/a> guards &lt;code>JSON.parse&lt;/code> of kind &lt;code>0&lt;/code> profile content across every login path so a malformed profile cannot crash the session. On the product side, &lt;a href="https://github.com/formstr-hq/nostr-polls/pull/186">PR #186&lt;/a> wires HTTPS deep linking for &lt;code>pollerama.fun&lt;/code> so shared poll URLs open the app directly, and &lt;a href="https://github.com/formstr-hq/nostr-polls/pull/169">PR #169&lt;/a> makes author names clickable in poll results.&lt;/p>
&lt;p>&lt;a href="https://formstr.app">Formstr&lt;/a>, the &lt;a href="https://github.com/formstr-hq/nostr-forms">nostr-forms&lt;/a> suite for Nostr-native forms, broadened its input and onboarding surface. &lt;a href="https://github.com/formstr-hq/nostr-forms/pull/475">PR #475&lt;/a> adds audio and video URL support so a form can embed media directly, &lt;a href="https://github.com/formstr-hq/nostr-forms/pull/439">PR #439&lt;/a> introduces i18n to the web app, and &lt;a href="https://github.com/formstr-hq/nostr-forms/pull/466">PR #466&lt;/a> ships a Google Forms onboarding importer so existing form creators can migrate without rebuilding surveys. &lt;a href="https://github.com/formstr-hq/nostr-forms/pull/463">PR #463&lt;/a> closes a privacy leak by removing sensitive key logs from the browser console.&lt;/p>
&lt;p>&lt;a href="https://calendar.formstr.app">Nostr Calendar by Formstr&lt;/a> cut &lt;a href="https://github.com/formstr-hq/nostr-calendar/releases/tag/v1.3.0">v1.3.0&lt;/a> and &lt;a href="https://github.com/formstr-hq/nostr-calendar/releases/tag/v1.4.0">v1.4.0&lt;/a> on the same day, headlined by a proper recurrence-rule surface. &lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/107">PR #107&lt;/a> adds multiple and custom RRULE support so events can repeat on complex schedules beyond the single-cadence case, and &lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/101">PR #101&lt;/a> corrects a long-standing bug by interpreting floating RRULE dates as UTC per RFC 5545, which had been causing event-time drift across timezones. &lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/97">PR #97&lt;/a> lets users add shared events to their calendar, &lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/86">PR #86&lt;/a> introduces list-level notification preferences, and &lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/112">PR #112&lt;/a> ships the reworked login and loading path that lands in v1.4.0. All three projects build on &lt;a href="https://nostrcompass.org/en/topics/nip-52/">NIP-52&lt;/a> calendar events and share a common login stack.&lt;/p>
&lt;h3 id="also-shipped-notedeck-nostrblue-cliprelay-captains-log">Also shipped: notedeck, nostr.blue, cliprelay, Captain&amp;rsquo;s Log&lt;/h3>
&lt;p>A handful of clients cut iterative releases without headline features. Damus&amp;rsquo;s Rust desktop and mobile client &lt;a href="https://github.com/damus-io/notedeck">notedeck&lt;/a> published &lt;a href="https://github.com/damus-io/notedeck/releases/tag/v0.10.0-beta.4">v0.10.0-beta.4&lt;/a> with column-rendering and relay-pool fixes. The Dioxus-based Rust client &lt;a href="https://github.com/patrickulrich/nostr.blue/releases/tag/v0.8.6">nostr.blue v0.8.6&lt;/a> pulled in &lt;a href="https://github.com/patrickulrich/nostr.blue/commit/d90b4ff">Dioxus 0.7.5&lt;/a> and unblocked the Android build by &lt;a href="https://github.com/patrickulrich/nostr.blue/commit/4207f0c">converting the native audio bridge&lt;/a> to a &lt;code>manganis::ffi&lt;/code> plugin. &lt;a href="https://github.com/tajava2006/cliprelay">cliprelay&lt;/a>, a cross-device clipboard-sync tool that relays entries through Nostr, shipped &lt;a href="https://github.com/tajava2006/cliprelay/releases/tag/desktop%2Fv0.0.3">Desktop v0.0.3&lt;/a> and &lt;a href="https://github.com/tajava2006/cliprelay/releases/tag/android%2Fv0.0.4">Android v0.0.4&lt;/a>, tightening the sync loop and dropping 32-bit Android variants. &lt;a href="https://github.com/nodetec/comet">Captain&amp;rsquo;s Log&lt;/a> published three alpha builds whose most useful addition is sync-relay &lt;a href="https://github.com/nodetec/comet/releases/tag/alpha-95f47bd">liveness detection&lt;/a> so dropped sockets are replaced without user action.&lt;/p>
&lt;h2 id="in-development">In Development&lt;/h2>
&lt;h3 id="whitenoise-rs-refactors-to-session-scoped-account-views">whitenoise-rs refactors to session-scoped account views&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/whitenoise-rs">whitenoise-rs&lt;/a>, the Rust daemon under the &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> client, merged 15 PRs advancing a multi-phase refactor from global singletons to per-account &lt;code>AccountSession&lt;/code> views. The goal is to break one shared monolith into smaller per-account surfaces that are easier to reason about, test, and evolve without side effects leaking across the whole daemon.&lt;/p>
&lt;p>The foundation landed in &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/743">PR #743&lt;/a> with the &lt;code>AccountSession&lt;/code> and &lt;code>AccountManager&lt;/code> scaffolding, followed by scoped relay handles in &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/753">PR #753&lt;/a>. Subsequent phases moved drafts and settings, message ops, group read and write, membership, push notifications, key-package reads, and group creation onto session-owned surfaces across &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pulls?q=is%3Apr&amp;#43;is%3Amerged&amp;#43;768&amp;#43;OR&amp;#43;763&amp;#43;OR&amp;#43;766">PRs #760 through #769&lt;/a>. Phase 15 closed the loop in &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/770">PR #770&lt;/a>, which rehomes event dispatch onto the session so each account consumes its own relay traffic without contention on a shared dispatcher.&lt;/p>
&lt;h3 id="white-noise-app-adds-blockunblock-ui-leave-group-and-offline-notices">White Noise app adds block/unblock UI, leave-group, and offline notices&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/whitenoise">White Noise&lt;/a>, the &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> client, added the missing group-lifecycle controls. &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/578">PR #578&lt;/a> ships the block and unblock UI on top of a block hook landed in &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/573">PR #573&lt;/a>, and &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/571">PR #571&lt;/a> pairs with &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/572">PR #572&lt;/a> to wire Rust-side &lt;code>clear_chat&lt;/code>, &lt;code>delete_chat&lt;/code>, and &lt;code>leave_and_delete_group&lt;/code> into the app. &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/569">PR #569&lt;/a> and &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/576">PR #576&lt;/a> add offline notices on chat and settings screens so users know when the daemon cannot reach its relays. &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/585">PR #585&lt;/a> narrows the broad &amp;ldquo;delete all key packages&amp;rdquo; path to a &amp;ldquo;delete legacy key packages&amp;rdquo; operation so a client migrating between KeyPackage formats no longer wipes its current keys along with the legacy ones.&lt;/p>
&lt;h3 id="mdk-adds-mixed-version-invite-support-and-selfupdate-convergence">MDK adds mixed-version invite support and SelfUpdate convergence&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/mdk">MDK&lt;/a>, the &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> Development Kit, merged seven PRs. The thread running through the work is compatibility, keeping clients on slightly different Marmot versions able to invite each other, rotate their own state, and recover cleanly from malformed inputs.&lt;/p>
&lt;p>The headline fix is &lt;a href="https://github.com/marmot-protocol/mdk/pull/261">PR #261&lt;/a>, which computes a group&amp;rsquo;s &lt;code>RequiredCapabilities&lt;/code> as the LCD of invitee capabilities and unblocks mixed-version invites between &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> and &lt;a href="https://github.com/marmot-protocol/whitenoise">White Noise&lt;/a>. &lt;a href="https://github.com/marmot-protocol/mdk/pull/264">PR #264&lt;/a> converges the SelfUpdate wire format across implementations; SelfUpdate is the control message a group member sends when rotating its own KeyPackage or capability state, so drift there silently breaks self-rotation across clients even when invites and welcomes still parse. On robustness, &lt;a href="https://github.com/marmot-protocol/mdk/pull/262">PR #262&lt;/a> parses invitee key packages before persisting the creator&amp;rsquo;s signer so a malformed invitee cannot leave stray state, &lt;a href="https://github.com/marmot-protocol/mdk/pull/256">PR #256&lt;/a> fixes receiver-side admin depletion validation, and &lt;a href="https://github.com/marmot-protocol/mdk/pull/259">PR #259&lt;/a> prevents the in-memory storage backend from evicting security-critical state under pressure. &lt;a href="https://github.com/marmot-protocol/mdk/pull/265">PR #265&lt;/a> exposes a &lt;code>group_required_proposals&lt;/code> accessor so clients can inspect the proposals that MUST land before the next commit is valid without reaching into MDK internals.&lt;/p>
&lt;h3 id="nostter-adds-nip-44-encryption-across-people-lists-bookmarks-and-mutes">nostter adds NIP-44 encryption across people lists, bookmarks, and mutes&lt;/h3>
&lt;p>&lt;a href="https://github.com/SnowCait/nostter">nostter&lt;/a> merged 10 PRs. &lt;a href="https://github.com/SnowCait/nostter/pull/2088">PR #2088&lt;/a> adds &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encryption to mute lists, &lt;a href="https://github.com/SnowCait/nostter/pull/2089">PR #2089&lt;/a> adds it to bookmarks, and &lt;a href="https://github.com/SnowCait/nostter/pull/2090">PR #2090&lt;/a> adds it to people lists, all migrating away from &lt;a href="https://nostrcompass.org/en/topics/nip-04/">NIP-04&lt;/a> where applicable. &lt;a href="https://github.com/SnowCait/nostter/pull/2087">PR #2087&lt;/a> removes a legacy kind-30000 mute migration path now that the encrypted kind-10000 flow has stabilized.&lt;/p>
&lt;h3 id="zapcooking-ships-nourish-scoring-and-a-reusable-comment-thread">zap.cooking ships Nourish scoring and a reusable comment thread&lt;/h3>
&lt;p>&lt;a href="https://github.com/zapcooking/frontend">zap.cooking&lt;/a>, the Nostr recipe client, merged 20 PRs this week. The headline feature is a new Nourish recipe-scoring module (&lt;a href="https://github.com/zapcooking/frontend/pull/317">PR #317&lt;/a>, &lt;a href="https://github.com/zapcooking/frontend/pull/319">PR #319&lt;/a>) that rates recipes on nutritional axes. Alongside it, a four-stage refactor from &lt;a href="https://github.com/zapcooking/frontend/pull/299">PR #299&lt;/a> through &lt;a href="https://github.com/zapcooking/frontend/pull/302">PR #302&lt;/a> pulls the Comments module into a reusable &lt;code>CommentThread&lt;/code> that can be dropped into any view. Recipe-side polish includes scaling in &lt;a href="https://github.com/zapcooking/frontend/pull/309">PR #309&lt;/a>, a unified media-upload button in &lt;a href="https://github.com/zapcooking/frontend/pull/307">PR #307&lt;/a>, and a profile Replies tab in &lt;a href="https://github.com/zapcooking/frontend/pull/310">PR #310&lt;/a>.&lt;/p>
&lt;h3 id="ridestr-extracts-shared-rider-coordinator">ridestr extracts shared rider coordinator&lt;/h3>
&lt;p>&lt;a href="https://github.com/variablefate/ridestr">ridestr&lt;/a>, the decentralized ride-sharing app, merged 10 PRs refactoring its Compose screens into focused components and extracting rider and driver protocol logic into a shared &lt;code>:common&lt;/code> coordinator module (&lt;a href="https://github.com/variablefate/ridestr/pull/70">PR #70&lt;/a>). &lt;a href="https://github.com/variablefate/ridestr/pull/60">PR #60&lt;/a> adds a kind &lt;code>3189&lt;/code> driver-ping receiver for the Roadflare side of the app.&lt;/p>
&lt;h3 id="blossom-drafts-a-bud-01-sunset-header-for-blob-expiration">Blossom drafts a BUD-01 Sunset header for blob expiration&lt;/h3>
&lt;p>&lt;a href="https://github.com/hzrd149/blossom">Blossom&lt;/a>, hzrd149&amp;rsquo;s protocol for storing blobs on HTTP servers keyed by SHA-256 hash, opened &lt;a href="https://github.com/hzrd149/blossom/pull/99">PR #99&lt;/a> to add a &lt;code>Sunset&lt;/code> header to BUD-01. A server can use the header to advertise a future timestamp at which a blob will stop being served, so clients can plan around limited retention without first hitting a 404. Because the proposal uses standard &lt;a href="https://www.rfc-editor.org/rfc/rfc8594.html">RFC 8594&lt;/a> semantics and is advisory only, a server is free to keep the blob longer or to honor the declared expiration on a best-effort basis.&lt;/p>
&lt;h2 id="new-projects">New Projects&lt;/h2>
&lt;h3 id="forgesworn-publishes-a-29-repo-cryptographic-toolkit-for-nostr">Forgesworn publishes a 29-repo cryptographic toolkit for Nostr&lt;/h3>
&lt;p>&lt;a href="https://github.com/forgesworn">Forgesworn&lt;/a> shipped 29 open-source repositories over five days covering signing, identity, attestations, web-of-trust, and paid-API discovery on Nostr.&lt;/p>
&lt;p>The signing stack anchors on &lt;a href="https://github.com/forgesworn/nsec-tree">nsec-tree&lt;/a>, a deterministic sub-identity derivation scheme that turns one master secret into unlimited unlinkable Nostr identities, and on &lt;a href="https://github.com/forgesworn/heartwood">Heartwood&lt;/a>, an NIP-46 remote signer that runs on a Raspberry Pi with Tor on by default. &lt;a href="https://github.com/forgesworn/sapwood">Sapwood&lt;/a> adds a web management UI for shaping a Heartwood signer, and &lt;a href="https://github.com/forgesworn/heartwood-esp32">heartwood-esp32&lt;/a> ships a spike of the same signing token logic on a Heltec WiFi LoRa 32 board. &lt;a href="https://github.com/forgesworn/nsec-tree-cli">nsec-tree-cli&lt;/a> exposes the derivation, proof, and Shamir recovery flows for offline-first operation.&lt;/p>
&lt;p>On identity and trust, &lt;a href="https://github.com/forgesworn/signet">Signet&lt;/a> reached &lt;a href="https://github.com/forgesworn/signet/releases/tag/v1.6.0">v1.6.0&lt;/a> as a decentralized identity verification protocol for Nostr, with a QR-based pairing flow whose session pubkey is validated and pinned to the relay. &lt;a href="https://github.com/forgesworn/nostr-attestations">nostr-attestations&lt;/a> defines a single kind &lt;code>31000&lt;/code> event (NIP-VA) for credentials, endorsements, vouches, provenance, licensing, and trust, consolidating what today is spread across ad-hoc event shapes. &lt;a href="https://github.com/forgesworn/nostr-veil">nostr-veil&lt;/a> builds a privacy-preserving web of trust on top: NIP-85 assertions backed by &lt;a href="https://github.com/forgesworn/ring-sig">LSAG ring signatures&lt;/a> on secp256k1, so a vouch can prove group membership without revealing which member issued it.&lt;/p>
&lt;p>The monetization side covers paid APIs over Lightning and Nostr. &lt;a href="https://github.com/forgesworn/toll-booth">toll-booth&lt;/a> is an L402 middleware for Express, Hono, Deno, Bun, and Cloudflare Workers that turns any API into a Lightning toll booth in one line, with &lt;a href="https://github.com/forgesworn/toll-booth-dvm">toll-booth-dvm&lt;/a> exposing the gated API as a &lt;a href="https://nostrcompass.org/en/topics/nip-90/">NIP-90&lt;/a> Data Vending Machine and &lt;a href="https://github.com/forgesworn/toll-booth-announce">toll-booth-announce&lt;/a> bridging to &lt;a href="https://github.com/forgesworn/402-announce">402-announce&lt;/a>, which publishes kind &lt;code>31402&lt;/code> parameterised replaceable events for HTTP 402 service discovery on Nostr. &lt;a href="https://github.com/forgesworn/402-indexer">402-indexer&lt;/a> is the crawler that picks those announcements up. The org also published a &lt;a href="https://github.com/forgesworn/nip-drafts">29-NIP draft collection&lt;/a> covering service coordination, trust, payments, disputes, key hierarchy, resource curation, and paid API discovery.&lt;/p>
&lt;p>Everything is TypeScript, zero-dependency where possible, and released through a new bash-only supply-chain-hardened tool called &lt;a href="https://github.com/forgesworn/anvil">anvil&lt;/a> with multi-runner reproducible-build attestation and OIDC trusted publishing. Several primitives in the set, including ring signatures, range proofs, and Shamir word shares, fill long-standing gaps in the Nostr library layer.&lt;/p>
&lt;h3 id="shockwallet-ships-nostr-native-lightning-wallet-sync-and-multi-node-connections">ShockWallet ships Nostr-native Lightning wallet sync and multi-node connections&lt;/h3>
&lt;p>&lt;a href="https://github.com/shocknet/wallet2">ShockWallet&lt;/a> is a Lightning wallet that uses Nostr as its transport for connecting to self-custodial Lightning nodes. The app pairs with one or more &lt;a href="https://github.com/shocknet/Lightning.Pub">Lightning.Pub&lt;/a> nodes over Nostr via an &lt;code>nprofile&lt;/code>, then signs payment authorizations end-to-end between the wallet and the node. The team shipped &lt;a href="https://github.com/shocknet/wallet2/pull/608">PR #608&lt;/a> on 2026-04-18 with a channels-dashboard UI pass, landing alongside an admin-invite-link QR flow for new PUB users (&lt;a href="https://github.com/shocknet/wallet2/pull/606">PR #606&lt;/a>) and a readability fix for the metrics dashboard (&lt;a href="https://github.com/shocknet/wallet2/pull/607">PR #607&lt;/a>).&lt;/p>
&lt;p>ShockWallet uses &lt;a href="https://nostrcompass.org/en/topics/nip-01/">NIP-78&lt;/a> application-specific data events for multi-device wallet state sync, so a user&amp;rsquo;s wallet view stays consistent between a desktop browser and a phone without a centralized sync server. That puts it one layer below &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> (Nostr Wallet Connect): NIP-47 is the interface an app uses to ask an existing wallet to pay, while ShockWallet uses Nostr as the wallet&amp;rsquo;s own account and session transport to the underlying Lightning node. Alongside the wallet, the team is pushing &lt;a href="https://github.com/shocknet/CLINK">CLINK&lt;/a>, a Nostr-based session-pairing protocol for wallet-to-app connections, and maintaining a single TypeScript codebase that builds to web, Android, and iOS.&lt;/p>
&lt;h3 id="nostrability-issues-migrate-to-git-over-nostr-after-github-censorship">Nostrability issues migrate to git over Nostr after GitHub censorship&lt;/h3>
&lt;p>&lt;a href="https://gitworkshop.dev/elsat@habla.news/nostrability/issues">Nostrability&lt;/a>, elsat&amp;rsquo;s interoperability tracker for Nostr clients and relays, is moving its issue workflow to git over Nostr after the Nostrability organization was taken down on GitHub with no response from GitHub support for two weeks. The migrated issue tracker now lives on GitWorkshop/ngit, where existing issues have been carried over and future interop reports can stay inside Nostr-native infrastructure.&lt;/p>
&lt;h3 id="nowhere-encodes-full-websites-into-url-fragments-and-routes-orders-through-nostr">nowhere encodes full websites into URL fragments and routes orders through Nostr&lt;/h3>
&lt;p>&lt;a href="https://github.com/5t34k/nowhere">nowhere&lt;/a> is a new AGPL-3.0 project from &lt;a href="https://github.com/5t34k">5t34k&lt;/a> that serializes an entire site into the URL fragment after &lt;code>#&lt;/code>, compresses it with a dictionary substitution pass and raw DEFLATE, and base64url-encodes the result. Because HTTP prohibits browsers from sending fragments to servers, the host that delivers the page never sees the content, and the site itself is never stored on a server. The project ships eight site types (event, fundraiser, store, petition, message, drop, art, forum), and each one can be cryptographically signed by its creator and password-encrypted at the URL.&lt;/p>
&lt;p>Five of the eight types are purely static, but store, forum, and petition need live communication for orders, posts, and signatures, and that traffic runs through Nostr relays using ephemeral keys with &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encryption, so the relay stores events it cannot read from throwaway keys it cannot trace. A single-item store fits in roughly 120 characters, which means a nowhere link works as a printable QR code for offline use via the companion &lt;a href="https://nowhr.xyz/install">nowhr.xyz&lt;/a> reader. The repo is a pnpm workspace split into a standalone &lt;code>codec&lt;/code> package, a Svelte 5 &lt;code>web&lt;/code> component library with Nostr integration and payment handling, and the &lt;code>nowhr&lt;/code> app shell at &lt;a href="https://nowhr.xyz/app">nowhr.xyz&lt;/a>.&lt;/p>
&lt;h3 id="small-new-surfaces-relaykit-and-brainstorm-search">Small new surfaces: relayk.it and Brainstorm Search&lt;/h3>
&lt;p>Two small projects worth a mention without a heavy changelog hook. &lt;a href="https://relayk.it">relayk.it&lt;/a>, built by &lt;a href="https://nostr.com/sam@relayk.it">sam&lt;/a> from the Soapbox team, is a &lt;a href="https://shakespeare.diy">Shakespeare&lt;/a>-built relay-discovery client that runs entirely in the browser and points users toward active Nostr relays. &lt;a href="https://brainstorm.world">Brainstorm Search&lt;/a> ships as a single-page Nostr search UI focused on surfacing content across the network.&lt;/p>
&lt;h2 id="protocol-and-spec-work">Protocol and Spec Work&lt;/h2>
&lt;h3 id="nip-updates">NIP Updates&lt;/h3>
&lt;p>Recent proposals and discussions in the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a>:&lt;/p>
&lt;p>&lt;strong>Open PRs and Discussions:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-67/">NIP-67&lt;/a>: EOSE Completeness Hint&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2317">PR #2317&lt;/a>): Proposes adding an optional third element to the &lt;a href="https://nostrcompass.org/en/topics/nip-01/">NIP-01&lt;/a> &lt;code>EOSE&lt;/code> message so a relay can signal whether it has delivered every stored event matching the filter. Today, &lt;code>EOSE&lt;/code> marks the boundary between stored and real-time events but carries no information about completeness: a client that asks for 500 events from a relay capped at 300 receives 300 events and an &lt;code>EOSE&lt;/code>, with no way to distinguish &amp;ldquo;this is all of it&amp;rdquo; from &amp;ldquo;we stopped partway through.&amp;rdquo; The proposal adds the form &lt;code>[&amp;quot;EOSE&amp;quot;, &amp;quot;&amp;lt;sub_id&amp;gt;&amp;quot;, &amp;quot;finish&amp;quot;]&lt;/code> when the relay has delivered all matches, and leaves the legacy two-element form as an unchanged no-claim case. The design is backwards-compatible, since relays that do not advertise support fall through to today&amp;rsquo;s heuristic, and clients that know their relay supports it can stop paginating as soon as they see the positive signal.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>NIP-5D: Nostr Applets&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2303">PR #2303&lt;/a>): Proposes a new kind for distributing interactive applets on Nostr. Where &lt;a href="https://nostrcompass.org/en/topics/nip-5a/">NIP-5A&lt;/a> covers static websites and the in-progress &lt;a href="https://nostrcompass.org/en/topics/nip-5c/">NIP-5C&lt;/a> covers executable WASM scrolls, NIP-5D targets the middle ground of self-contained front-end applets that run in a client&amp;rsquo;s sandboxed iframe or WebView, addressable by Nostr event and updateable through a replaceable tag. Clients gain a way to ship third-party experiences (polls, calculators, mini-games) without each one wiring up a full plugin system. The open PR is actively iterating on the security model for message passing between the applet and host.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>NIP-29: Subgroups spec&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2319">PR #2319&lt;/a>): Extends &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> relay-based groups with a subgroup hierarchy so a single group can host multiple parallel channels without spawning independent groups on the same relay. The PR defines a subgroup identifier that piggybacks on the existing &lt;code>h&lt;/code> tag, specifies how kind &lt;code>9000&lt;/code>-range moderation events scope to a subgroup, and clarifies how clients should render the hierarchy. The change preserves the single-&lt;code>h&lt;/code>-tag shape for plain messages so older clients keep working in a subgrouped room.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>NIP-29: Explicit role permissions on kind 39003&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2316">PR #2316&lt;/a>): Defines an explicit permissions schema on the &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> kind &lt;code>39003&lt;/code> role event. Each role becomes a named set of granted operations (invite, add-user, remove-user, edit-metadata, delete-event, add-permission) with an optional time-bound expiry. Two NIP-29 relays running the same group can currently disagree on what a &amp;ldquo;moderator&amp;rdquo; can do, and clients have no way to reflect that difference to the user; the schema fixes that.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>NIP-11: access_control field for gated-relay discovery&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2318">PR #2318&lt;/a>): Adds a new optional &lt;code>access_control&lt;/code> object to the &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> relay information document, listing the relay&amp;rsquo;s gating mode (open, invite, payment, allowlist) and any endpoint a client can use to request access. The field is advisory only, and it lets clients and directories filter gated relays out of public-discovery lists and show users upfront why a relay refuses writes.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>NIP-63a: Minimal Payment Gateway Descriptor&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2315">PR #2315&lt;/a>): Covered in &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#nip-updates">Newsletter #18&lt;/a>. The PR continues to iterate on the kind &lt;code>10164&lt;/code> payment-gateway-descriptor shape and on the field layout for per-tier subscription rules.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>NIP-XX: Agent Reputation Attestations (Kind 30085)&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2320">PR #2320&lt;/a>): Proposes a kind &lt;code>30085&lt;/code> addressable event for signed attestations about autonomous agents and services on Nostr, covering reliability, honest-advertising, and dispute-resolution claims. Each attestation points to a target pubkey, carries a score in a bounded range, and references the evidence event that justifies the score. The motivation is that &lt;a href="https://nostrcompass.org/en/topics/nip-90/">NIP-90&lt;/a> Data Vending Machines and other service markets currently lack a standard way for customers to publish verifiable feedback that other customers can filter on.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>NIP-TPLD: Transient Private Location Data&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2309">PR #2309&lt;/a>): Continues from &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#nip-updates">Newsletter #18&lt;/a> with further iteration on the kind &lt;code>20411&lt;/code> ephemeral range, the per-recipient &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encryption shape, and the &lt;code>ttl&lt;/code> tag semantics for relay retention.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>marmot-ts 0.5.0 release PR&lt;/strong> (&lt;a href="https://github.com/marmot-protocol/marmot-ts/pull/70">PR #70&lt;/a>): The pending release PR for &lt;code>@internet-privacy/marmot-ts@0.5.0&lt;/code> bundles the first planned breaking changes in the TypeScript Marmot client. The release switches &lt;code>KeyPackageManager&lt;/code> to support both legacy kind &lt;code>443&lt;/code> and new kind &lt;code>30443&lt;/code> events, removes the &lt;code>KeyPackageStore&lt;/code> and group-state storage classes in favor of passing a generic key-value store directly into &lt;code>KeyPackageManager&lt;/code> and &lt;code>MarmotGroup&lt;/code>, and moves invite and group management onto &lt;code>MarmotClient.invites&lt;/code> and &lt;code>MarmotClient.groups&lt;/code>. Projects embedding marmot-ts directly will need constructor and storage-layer changes before they can pick the release up.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="nip-deep-dive-nip-72-moderated-communities">NIP Deep Dive: NIP-72 (Moderated Communities)&lt;/h2>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/72.md">NIP-72&lt;/a> defines a model for topic-based communities on Nostr in which moderators curate a read view over otherwise-unrestricted writes. Unlike &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> relay-based groups, where the relay is the authority for both membership and moderation, a NIP-72 community lives in plain Nostr events and every relay that carries the relevant kinds can serve it. Anyone can post to a community, and only posts that a recognized moderator has approved appear in the community feed.&lt;/p>
&lt;p>A community is defined by a kind &lt;code>34550&lt;/code> addressable event published by its creator. The event is a &lt;code>d&lt;/code>-tagged replaceable event, so the creator can edit the community&amp;rsquo;s metadata over time without losing the identity. The &lt;code>d&lt;/code> tag is the community&amp;rsquo;s stable slug, the &lt;code>name&lt;/code>, &lt;code>description&lt;/code>, &lt;code>image&lt;/code>, and &lt;code>rules&lt;/code> tags carry display metadata, and a series of &lt;code>p&lt;/code> tags with a &lt;code>&amp;quot;moderator&amp;quot;&lt;/code> marker list the pubkeys whose approvals count. Optional &lt;code>relay&lt;/code> tags with an &lt;code>author&lt;/code>, &lt;code>requests&lt;/code>, or &lt;code>approvals&lt;/code> marker hint at where each kind of event should be published and fetched from:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;f1e2d3c4b5a69788f1e2d3c4b5a69788f1e2d3c4b5a69788f1e2d3c4b5a69788&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;c3d2e1f0a9b8c7d6e5f4a3b2c1d0e9f8a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1745280000&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">34550&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;bitcoin-devs&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;name&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Bitcoin Devs&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;description&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;A moderated community for Bitcoin protocol discussion.&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;image&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;https://example.com/bitcoin-devs.png&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;d7e3a4b9c1f2e8d6a5b4c3d2e1f09876d7e3a4b9c1f2e8d6a5b4c3d2e1f09876&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;moderator&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;a1b2c3d4e5f6a7b8c9d0a1b2c3d4e5f6a7b8c9d0a1b2c3d4e5f6a7b8c9d0a1b2&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;moderator&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;relay&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.example.com&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;author&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;relay&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.moderator.com&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;approvals&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>A user submits a post by publishing any ordinary event (a kind &lt;code>1&lt;/code> note, a kind &lt;code>30023&lt;/code> long-form article, a kind &lt;code>31922&lt;/code> calendar event, and so on) and adding an &lt;code>a&lt;/code> tag whose value is the community&amp;rsquo;s coordinate &lt;code>34550:&amp;lt;creator_pubkey&amp;gt;:&amp;lt;slug&amp;gt;&lt;/code>. The post is a fully valid Nostr event on its own, and clients without NIP-72 support simply see a note addressed to a community-shaped coordinate. Community-aware clients filter their community view to posts that a recognized moderator has approved.&lt;/p>
&lt;p>Approval is a separate kind &lt;code>4550&lt;/code> event published by a moderator. The approval references the submission by &lt;code>e&lt;/code> tag, the submitter by &lt;code>p&lt;/code> tag, and the community by &lt;code>a&lt;/code> tag, and embeds the stringified submission event in the &lt;code>content&lt;/code> field as a cached copy. That embedded copy keeps the approved post renderable even if the original author later deletes the source event.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;d7e3a4b9c1f2e8d6a5b4c3d2e1f09876d7e3a4b9c1f2e8d6a5b4c3d2e1f09876&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1745283600&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">4550&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;a&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;34550:c3d2e1f0a9b8c7d6e5f4a3b2c1d0e9f8a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2:bitcoin-devs&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;e&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;k&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;1&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;{\&amp;#34;id\&amp;#34;:\&amp;#34;b3c4d5e6...\&amp;#34;,\&amp;#34;pubkey\&amp;#34;:\&amp;#34;e4f5a6b7...\&amp;#34;,\&amp;#34;kind\&amp;#34;:1,\&amp;#34;content\&amp;#34;:\&amp;#34;Question about sighash flags\&amp;#34;,\&amp;#34;tags\&amp;#34;:[[\&amp;#34;a\&amp;#34;,\&amp;#34;34550:c3d2e1f0...:bitcoin-devs\&amp;#34;]],\&amp;#34;created_at\&amp;#34;:1745283500,\&amp;#34;sig\&amp;#34;:\&amp;#34;...\&amp;#34;}&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;bbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aa&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The approval model has three useful properties. Moderation decisions are transparent: every approval is a signed Nostr event that anyone can fetch, so a skeptical user can audit which moderator approved which post and at what time. Moderation is non-exclusive: the same submission can be approved by multiple communities, and a post that one community rejects may be approved by another, because the &lt;code>a&lt;/code> tag is just an address on a curated view. Moderation is reversible at the read layer: if a community deletes a moderator from its kind &lt;code>34550&lt;/code> event, prior approvals from that moderator stop counting in clients that respect the current moderator list.&lt;/p>
&lt;p>The read side is where clients differ. Most community-aware clients render the feed by filtering for kind &lt;code>4550&lt;/code> events tagged with the community&amp;rsquo;s coordinate, deduplicating by the underlying event ID, and then rendering the embedded post. Some clients also fetch the submission events directly and use approvals only as a whitelist, which makes sense when approvals are incomplete or stale. A few clients (including &lt;a href="https://github.com/hzrd149/nostrudel">noStrudel&lt;/a> and, as of &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2468">PR #2468&lt;/a> this week, &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a>) expose the pending submission queue to moderators as a separate view.&lt;/p>
&lt;p>Compared to &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> relay-based groups, the tradeoff is clear. NIP-72 communities work over any relay network with no special support, so the write path is portable, and moderation is visible and forkable. A submission is public the moment it is published, and unapproved posts are hidden at the client-render layer. For spaces where spam must stay off the wire entirely, NIP-29 is the better fit. For public topic communities where approvals function more like a curated front page than a gate, NIP-72 fits better.&lt;/p>
&lt;h2 id="nip-deep-dive-nip-57-zaps">NIP Deep Dive: NIP-57 (Zaps)&lt;/h2>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/57.md">NIP-57&lt;/a> defines zaps, a way to attach Lightning payments to Nostr identities and events and to publish a verifiable receipt of payment back onto relays. A zap proves that a specific sender paid a specific amount to a specific recipient for a specific target, and the proof is readable by any Nostr client without trusting the sender&amp;rsquo;s word. The spec reaches across three systems (LNURL, Lightning, and Nostr) and pins down how each of them must cooperate.&lt;/p>
&lt;p>The flow has four actors. A sender&amp;rsquo;s client discovers the recipient&amp;rsquo;s LNURL endpoint from either the recipient&amp;rsquo;s kind &lt;code>0&lt;/code> profile metadata (&lt;code>lud06&lt;/code> or &lt;code>lud16&lt;/code> field) or a &lt;code>zap&lt;/code> tag on the event being zapped. That client then signs a kind &lt;code>9734&lt;/code> zap request event describing the intended payment and posts it to the recipient&amp;rsquo;s LNURL callback, not to relays. On the other side, the recipient&amp;rsquo;s LNURL server validates the request, returns a Lightning invoice whose description hash commits to the stringified request event, and, once the sender pays, publishes a kind &lt;code>9735&lt;/code> zap receipt to the relay set the sender requested.&lt;/p>
&lt;p>A zap request (kind &lt;code>9734&lt;/code>) is a signed event that declares the payment&amp;rsquo;s intent. The critical fields are a &lt;code>p&lt;/code> tag with the recipient pubkey, an optional &lt;code>e&lt;/code> or &lt;code>a&lt;/code> tag identifying the event or addressable content being zapped, an &lt;code>amount&lt;/code> tag in millisats, and a &lt;code>relays&lt;/code> tag listing where the receipt should be published. The &lt;code>content&lt;/code> carries an optional sender-supplied message that accompanies the zap. A &lt;code>k&lt;/code> tag records the target kind so a consumer can filter zaps by the type of content they fund:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;a5b4c3d2e1f09876a5b4c3d2e1f09876a5b4c3d2e1f09876a5b4c3d2e1f09876&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1745280000&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">9734&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;d7e3a4b9c1f2e8d6a5b4c3d2e1f09876d7e3a4b9c1f2e8d6a5b4c3d2e1f09876&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;e&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;amount&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;21000&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;relays&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.damus.io&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://nos.lol&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.nostr.band&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;k&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;1&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;great post&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;ccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbcc&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The zap receipt (kind &lt;code>9735&lt;/code>) is published by the recipient&amp;rsquo;s wallet server after payment confirmation. It is not signed by the sender; it is signed by the wallet server using the &lt;code>nostrPubkey&lt;/code> that the recipient advertised in their LNURL response. A valid receipt carries the stringified zap request in the &lt;code>description&lt;/code> tag, the paid invoice in the &lt;code>bolt11&lt;/code> tag, and a &lt;code>preimage&lt;/code> tag proving the invoice was settled:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1745280060&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">9735&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;d7e3a4b9c1f2e8d6a5b4c3d2e1f09876d7e3a4b9c1f2e8d6a5b4c3d2e1f09876&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;P&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;a5b4c3d2e1f09876a5b4c3d2e1f09876a5b4c3d2e1f09876a5b4c3d2e1f09876&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;e&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;bolt11&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;lnbc210n1pj...bolt11invoicestring&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;description&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;{\&amp;#34;id\&amp;#34;:\&amp;#34;c1d2e3f4...\&amp;#34;,\&amp;#34;pubkey\&amp;#34;:\&amp;#34;a5b4c3d2...\&amp;#34;,\&amp;#34;kind\&amp;#34;:9734,\&amp;#34;content\&amp;#34;:\&amp;#34;great post\&amp;#34;,\&amp;#34;tags\&amp;#34;:[...]}&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;preimage&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;ddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccdd&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The validation rule is where NIP-57 earns its trust guarantees. A client that displays a kind &lt;code>9735&lt;/code> receipt as a zap should verify four things: the receipt&amp;rsquo;s signature matches the &lt;code>nostrPubkey&lt;/code> advertised in the recipient&amp;rsquo;s LNURL response, the &lt;code>bolt11&lt;/code> invoice amount matches the &lt;code>amount&lt;/code> tag in the embedded zap request, the invoice&amp;rsquo;s description hash commits to the stringified zap request, and the &lt;code>preimage&lt;/code> hashes to the invoice&amp;rsquo;s &lt;code>payment_hash&lt;/code>. A receipt that fails any of these checks is only a claim of payment, not proof of it. Clients that render tallied zap counts without performing these checks are trivially spoofable by an attacker who publishes forged kind &lt;code>9735&lt;/code> events.&lt;/p>
&lt;p>Private zaps add a confidentiality layer on top. A sender can encrypt the zap request&amp;rsquo;s &lt;code>content&lt;/code> for the recipient and include an &lt;code>anon&lt;/code> tag on the outer zap request, so the relay network sees the payment target but cannot read the attached note. Some clients go one step further and generate a fresh ephemeral keypair for the zap request itself, so the receipt still proves a payment happened but the recipient cannot link the zap back to the sender&amp;rsquo;s long-lived pubkey. That &amp;ldquo;anonymous zap&amp;rdquo; pattern is stronger than a plain private zap, where the message is hidden but the sender key can still be visible in the request path.&lt;/p>
&lt;p>NIP-57 also underpins the zap-goal system specified in &lt;a href="https://nostrcompass.org/en/topics/nip-75/">NIP-75&lt;/a>. A goal is a kind &lt;code>9041&lt;/code> event that declares a target amount and a relay set where receipts count, and any zap receipt bound to the goal&amp;rsquo;s event ID contributes to its progress. Clients tally goal progress by summing the validated &lt;code>bolt11&lt;/code> amounts of matched kind &lt;code>9735&lt;/code> events. &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a>&amp;rsquo;s &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2469">PR #2469&lt;/a> this week wires goals into the &lt;a href="https://nostrcompass.org/en/topics/nip-53/">NIP-53&lt;/a> Live Activities screen and renders a top-zappers leaderboard from the same receipts.&lt;/p>
&lt;p>Zap splits are defined in an appendix to the NIP. A recipient can publish a kind &lt;code>0&lt;/code> profile with multiple &lt;code>zap&lt;/code> tags, each carrying a weight, so a single zap payment is divided among several pubkeys according to the published weights. Content creators, collaborators, and platform fee recipients can all be paid atomically from a single sender-signed zap request. Several clients, including &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a>, &lt;a href="https://github.com/damus-io/damus">Damus&lt;/a>, and &lt;a href="https://github.com/hzrd149/nostrudel">noStrudel&lt;/a>, implement split-paying end-to-end.&lt;/p>
&lt;hr>
&lt;p>That&amp;rsquo;s it for this week. If you&amp;rsquo;re building something or have news to share, DM us on Nostr or find us at &lt;a href="https://nostrcompass.org">nostrcompass.org&lt;/a>.&lt;/p></content:encoded></item><item><title>Nostr Compass #18</title><link>https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> merges 29 PRs including &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#amethyst-merges-desktop-tor-c-secp256k1-webrtc-calls-and-multi-wallet-nwc">desktop Tor support&lt;/a>, a &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#amethyst-merges-desktop-tor-c-secp256k1-webrtc-calls-and-multi-wallet-nwc">custom C secp256k1 implementation&lt;/a> with JNI bindings, a full &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#amethyst-merges-desktop-tor-c-secp256k1-webrtc-calls-and-multi-wallet-nwc">WebRTC call system&lt;/a> for &lt;a href="https://nostrcompass.org/en/topics/nip-ac/">NIP-AC&lt;/a> voice and video calls, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#amethyst-merges-desktop-tor-c-secp256k1-webrtc-calls-and-multi-wallet-nwc">RFC 9420 MLS compliance&lt;/a> for &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a>, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#amethyst-merges-desktop-tor-c-secp256k1-webrtc-calls-and-multi-wallet-nwc">multi-wallet NWC&lt;/a>. &lt;a href="https://github.com/vcavallo/nstrfy-android">nstrfy&lt;/a> &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#nstrfy-launches-nostr-native-push-notifications-for-android">launches&lt;/a> as an Android push notification app that replaces Firebase with Nostr relays using kind &lt;code>7741&lt;/code> events. &lt;a href="https://github.com/LibertyFarmer/hamstr">HAMSTR&lt;/a> &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#hamstr-adds-reticulum-for-nostr-over-lora-mesh">adds Reticulum&lt;/a> mesh networking, enabling Nostr events over LoRa radio with no internet connection. &lt;a href="https://github.com/nostrnative/bloom">Bloom&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#bloom-v010-ships-self-hosted-blossom-server-and-relay">v0.1.0&lt;/a> as a desktop app bundling a full &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> media server and Nostr relay. &lt;a href="https://github.com/zeSchlausKwab/wavefunc">WaveFunc&lt;/a> debuts with &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#wavefunc-v010-and-v011-launch-nostr-internet-radio">v0.1.0&lt;/a> as an internet radio directory and player built on Nostr. &lt;a href="https://github.com/marmot-protocol/botburrow">Botburrow&lt;/a> &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#botburrow-begins-development-as-marmot-bot-platform">starts development&lt;/a> as a self-hosted bot platform for &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> encrypted group chats. &lt;a href="https://github.com/v0l/snort">Snort&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#snort-ships-v050-through-v053-with-security-hardening-and-performance-overhaul">v0.5.0 through v0.5.3&lt;/a> with a security audit, batched WASM verification, and a rewritten message system. &lt;a href="https://github.com/PrimalHQ/primal-android-app">Primal Android&lt;/a> &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#primal-android-ships-3021-and-redesigns-feed-layout">ships v3.0.21&lt;/a> with a redesigned feed layout and unified main screen. Two NIP deep dives cover &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> (Relay-based Groups) and &lt;a href="https://nostrcompass.org/en/topics/nip-90/">NIP-90&lt;/a> (Data Vending Machines).&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> merges 29 PRs including &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#amethyst-merges-desktop-tor-c-secp256k1-webrtc-calls-and-multi-wallet-nwc">desktop Tor support&lt;/a>, a &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#amethyst-merges-desktop-tor-c-secp256k1-webrtc-calls-and-multi-wallet-nwc">custom C secp256k1 implementation&lt;/a> with JNI bindings, a full &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#amethyst-merges-desktop-tor-c-secp256k1-webrtc-calls-and-multi-wallet-nwc">WebRTC call system&lt;/a> for &lt;a href="https://nostrcompass.org/en/topics/nip-ac/">NIP-AC&lt;/a> voice and video calls, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#amethyst-merges-desktop-tor-c-secp256k1-webrtc-calls-and-multi-wallet-nwc">RFC 9420 MLS compliance&lt;/a> for &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a>, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#amethyst-merges-desktop-tor-c-secp256k1-webrtc-calls-and-multi-wallet-nwc">multi-wallet NWC&lt;/a>. &lt;a href="https://github.com/vcavallo/nstrfy-android">nstrfy&lt;/a> &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#nstrfy-launches-nostr-native-push-notifications-for-android">launches&lt;/a> as an Android push notification app that replaces Firebase with Nostr relays using kind &lt;code>7741&lt;/code> events. &lt;a href="https://github.com/LibertyFarmer/hamstr">HAMSTR&lt;/a> &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#hamstr-adds-reticulum-for-nostr-over-lora-mesh">adds Reticulum&lt;/a> mesh networking, enabling Nostr events over LoRa radio with no internet connection. &lt;a href="https://github.com/nostrnative/bloom">Bloom&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#bloom-v010-ships-self-hosted-blossom-server-and-relay">v0.1.0&lt;/a> as a desktop app bundling a full &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> media server and Nostr relay. &lt;a href="https://github.com/zeSchlausKwab/wavefunc">WaveFunc&lt;/a> debuts with &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#wavefunc-v010-and-v011-launch-nostr-internet-radio">v0.1.0&lt;/a> as an internet radio directory and player built on Nostr. &lt;a href="https://github.com/marmot-protocol/botburrow">Botburrow&lt;/a> &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#botburrow-begins-development-as-marmot-bot-platform">starts development&lt;/a> as a self-hosted bot platform for &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> encrypted group chats. &lt;a href="https://github.com/v0l/snort">Snort&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#snort-ships-v050-through-v053-with-security-hardening-and-performance-overhaul">v0.5.0 through v0.5.3&lt;/a> with a security audit, batched WASM verification, and a rewritten message system. &lt;a href="https://github.com/PrimalHQ/primal-android-app">Primal Android&lt;/a> &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-15-newsletter/#primal-android-ships-3021-and-redesigns-feed-layout">ships v3.0.21&lt;/a> with a redesigned feed layout and unified main screen. Two NIP deep dives cover &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> (Relay-based Groups) and &lt;a href="https://nostrcompass.org/en/topics/nip-90/">NIP-90&lt;/a> (Data Vending Machines).&lt;/p>
&lt;h2 id="top-stories">Top Stories&lt;/h2>
&lt;h3 id="amethyst-merges-desktop-tor-c-secp256k1-webrtc-calls-and-multi-wallet-nwc">Amethyst merges desktop Tor, C secp256k1, WebRTC calls, and multi-wallet NWC&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a>, the Android client maintained by vitorpamplona, merged 29 PRs this week across cryptography, networking, calling, and wallet infrastructure.&lt;/p>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst/pull/2381">PR #2381&lt;/a> is the largest change, adding desktop Tor support by embedding a kmp-tor daemon with a fail-closed design. If Tor is enabled, all relay connections route through the embedded Tor process, and the app refuses to connect if Tor fails to start. Privacy routing now has parity between the Android and desktop builds, backed by over 130 unit tests for the Tor integration.&lt;/p>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst/pull/2374">PR #2374&lt;/a> adds a custom C secp256k1 implementation with JNI bindings for signature verification. The implementation uses GLV decomposition, wNAF (windowed Non-Adjacent Form) point encoding, and hardware-accelerated SHA-256 on both x86_64 and ARM64 architectures. The result is a 2-3x speedup on Schnorr signature verification compared to the previous pure Kotlin path. Additional PRs in the series (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/2188">PR #2188&lt;/a>, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2195">PR #2195&lt;/a>, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2204">PR #2204&lt;/a>) add fused multiply-reduce operations, a dedicated Fe4 struct replacing LongArray for field element storage, and platform-specific intrinsics for an estimated 28% improvement on Android.&lt;/p>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst/pull/2202">PR #2202&lt;/a> updates the pure Kotlin MLS implementation to comply with RFC 9420, adding reuse guard checks, additional authenticated data (AAD) in ciphertext operations, ciphertext sample derivation, commit processing fixes, and thread safety for &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> protocol integration. Building on &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/#amethyst-ships-arti-tor-merges-pure-kotlin-mls-and-marmot">the Kotlin MLS work from last week&lt;/a>, this brings &lt;a href="https://nostrcompass.org/en/topics/quartz/">Quartz&lt;/a> closer to full MLS spec compliance.&lt;/p>
&lt;p>A series of WebRTC PRs (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/2203">PR #2203&lt;/a> through &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2211">PR #2211&lt;/a>) adds a complete voice and video calling system for &lt;a href="https://nostrcompass.org/en/topics/nip-ac/">NIP-AC&lt;/a>. The implementation covers ICE restart for dropped connections, runtime camera switching, network monitoring with automatic reconnection, configurable call settings (resolution, bitrate, TURN server selection), a foreground service fix for Android 14+ background restrictions, and thread safety across the call state machine.&lt;/p>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst/pull/1988">PR #1988&lt;/a> adds multi-wallet &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> (Nostr Wallet Connect) support. Users can now connect multiple NWC wallets to a single account, view balance cards for each, pick a default wallet, and migrate from the legacy single-wallet configuration.&lt;/p>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst/pull/2189">PR #2189&lt;/a> adds GIF-to-MP4 conversion with a quality slider, compressing a 3MB GIF down to approximately 159KB as MP4. The same week also brought AI tone suggestions in the post composer with automatic language detection and parallel precomputation of suggestions.&lt;/p>
&lt;h3 id="nstrfy-launches-nostr-native-push-notifications-for-android">nstrfy launches Nostr-native push notifications for Android&lt;/h3>
&lt;p>&lt;a href="https://github.com/vcavallo/nstrfy-android">nstrfy&lt;/a> launched on April 13 with three releases from &lt;a href="https://github.com/vcavallo/nstrfy-android/releases/tag/v1.0.0">v1.0.0&lt;/a> through &lt;a href="https://github.com/vcavallo/nstrfy-android/releases/tag/v1.2.0">v1.2.0&lt;/a>. The app is a fork of ntfy-android with the HTTP transport replaced by Nostr. Instead of polling a server for push notifications, nstrfy subscribes to kind &lt;code>7741&lt;/code> events on configurable relays and displays them as native Android notifications.&lt;/p>
&lt;p>The notification model supports both plaintext and &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encrypted payloads. When encryption is enabled, nstrfy uses &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> for signing via &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> or a local nsec. Topic-based subscriptions let users configure per-topic sender allowlists with npub whitelisting, so only approved senders can trigger notifications for a given topic. The app imports relay lists from the user&amp;rsquo;s profile using &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> and respects &lt;a href="https://nostrcompass.org/en/topics/nip-40/">NIP-40&lt;/a> event expiration. The full ntfy notification vocabulary is supportedf - tap-to-open URLs, priority levels, custom icons, and action buttons — so most ntfy-style alerts translate directly. User search is powered by NIP-50 via &lt;a href="https://nostrcompass.org/en/topics/web-of-trust/">Web of Trust&lt;/a> data from brainstorm.world.&lt;/p>
&lt;p>The &lt;a href="https://github.com/vcavallo/nstrfy.sh">nstrfy.sh&lt;/a> companion project provides both a bash CLI and a hosted web client at &lt;a href="https://nstrfy.sh">nstrfy.sh&lt;/a> for sending and listening from the browser, with NIP-07 signer support. The native app is available on &lt;a href="https://zapstore.dev/apps/io.nstrfy.android">Zapstore&lt;/a>.&lt;/p>
&lt;h3 id="hamstr-adds-reticulum-for-nostr-over-lora-mesh">HAMSTR adds Reticulum for Nostr over LoRa mesh&lt;/h3>
&lt;p>&lt;a href="https://github.com/LibertyFarmer/hamstr">HAMSTR&lt;/a>, the project that sends Nostr events and Lightning zaps over ham radio, merged &lt;a href="https://github.com/LibertyFarmer/hamstr/pull/10">PR #10&lt;/a> on April 12, adding &lt;a href="https://reticulum.network/">Reticulum&lt;/a> mesh networking as a transport backend. Reticulum is a cryptographic mesh protocol that runs over LoRa, HF, VHF/UHF radio, serial links, and TCP/IP. With this addition, HAMSTR can relay Nostr events across a mesh of RNode hardware devices with no internet infrastructure at all.&lt;/p>
&lt;p>The existing AX.25 Packet Radio and VARA HF transports remain available, so operators can choose the radio link that fits their setup. HAMSTR&amp;rsquo;s zero-knowledge server architecture means the relay never sees private keys, and its &lt;a href="https://nostrcompass.org/en/topics/nip-57/">NIP-57&lt;/a> zap compliance ensures that offline Lightning zaps appear correctly in clients like Amethyst and Primal. A setup guide for the Reticulum transport is included in &lt;a href="https://github.com/LibertyFarmer/hamstr/blob/master/RETICULUM.MD">RETICULUM.MD&lt;/a>. The same week, &lt;a href="https://github.com/LibertyFarmer/hamstr/pull/11">PR #11&lt;/a> migrated the frontend to Svelte 5 and TailwindCSS v4.&lt;/p>
&lt;h2 id="shipping-this-week">Shipping This Week&lt;/h2>
&lt;h3 id="bloom-v010-ships-self-hosted-blossom-server-and-relay">Bloom v0.1.0 ships self-hosted Blossom server and relay&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostrnative/bloom">Bloom&lt;/a> shipped its first release, &lt;a href="https://github.com/nostrnative/bloom/releases/tag/v0.1.0">v0.1.0&lt;/a>, on April 9. Built with Tauri v2 (Rust backend) and React 19, Bloom bundles a full &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> protocol media server (BUD-00 through BUD-10) and a Nostr relay into a single desktop application that runs on macOS, Windows, and Linux, with Android and iOS builds planned. Users get sovereign file storage with SHA-256 content addressing, &lt;a href="https://nostrcompass.org/en/topics/nip-94/">NIP-94&lt;/a> file metadata support, and Blossom URI scheme (&lt;code>blossom://&lt;/code>) resolution without managing server infrastructure. Sixteen platform-specific binary assets ship with the release.&lt;/p>
&lt;h3 id="wavefunc-v010-and-v011-launch-nostr-internet-radio">WaveFunc v0.1.0 and v0.1.1 launch Nostr internet radio&lt;/h3>
&lt;p>&lt;a href="https://github.com/zeSchlausKwab/wavefunc">WaveFunc&lt;/a> shipped &lt;a href="https://github.com/zeSchlausKwab/wavefunc/releases/tag/v0.1.0">v0.1.0&lt;/a> and &lt;a href="https://github.com/zeSchlausKwab/wavefunc/releases/tag/v0.1.1">v0.1.1&lt;/a> on April 13, launching as a Nostr-based internet radio directory and player. Custom event kinds define the data model: kind &lt;code>31237&lt;/code> for radio station listings, kind &lt;code>30078&lt;/code> for favorites lists, kind &lt;code>1311&lt;/code> for live chat, and kind &lt;code>1111&lt;/code> for station comments. A Khatru relay backend provides SQLite storage and Bluge full-text search supporting &lt;a href="https://nostrcompass.org/en/topics/nip-50/">NIP-50&lt;/a>.&lt;/p>
&lt;p>WaveFunc ships with a &lt;a href="https://nostrcompass.org/en/topics/nip-60/">NIP-60&lt;/a> Cashu wallet and nutzap support, migrated from NDK to applesauce-core. &lt;a href="https://github.com/zeSchlausKwab/wavefunc/releases/tag/v0.1.1">v0.1.1&lt;/a> adds genre carousels, a Lightning donation popover, station management for authenticated users, and Zapstore listing. The Tauri v2 desktop build gained system tray integration, media key support, autostart, and deep linking. Builds are available for macOS, Windows, Linux, and Android at &lt;a href="https://wavefunc.live">wavefunc.live&lt;/a>.&lt;/p>
&lt;h3 id="snort-ships-v050-through-v053-with-security-hardening-and-performance-overhaul">Snort ships v0.5.0 through v0.5.3 with security hardening and performance overhaul&lt;/h3>
&lt;p>&lt;a href="https://github.com/v0l/snort">Snort&lt;/a>, the React-based Nostr web client, shipped three releases from &lt;a href="https://github.com/v0l/snort/releases/tag/v0.5.0">v0.5.0&lt;/a> through &lt;a href="https://github.com/v0l/snort/releases/tag/v0.5.3">v0.5.3&lt;/a>. The v0.5.0 release is the largest, delivering a comprehensive security audit with real Schnorr signature verification, hardened &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> protection against forged relay messages, improved PIN encryption, and removal of unverified &lt;a href="https://github.com/nostr-protocol/nips/blob/master/26.md">NIP-26&lt;/a> delegation trust. Performance improvements include batched WASM signature verification, lazy-loaded routes, a rewritten priority profile loader with batch loading and chunking, and worker-relay optimizations. The release also adds kind &lt;code>7000&lt;/code> payment-required invoice display for &lt;a href="https://nostrcompass.org/en/topics/nip-90/">NIP-90&lt;/a> DVMs. &lt;a href="https://github.com/v0l/snort/pull/620">PR #620&lt;/a> reworked the messaging system for performance, persisting gift wraps in the worker relay and replacing O(n²) chat list computation with a single-pass Map-based approach.&lt;/p>
&lt;h3 id="primal-android-ships-3021-and-redesigns-feed-layout">Primal Android ships 3.0.21 and redesigns feed layout&lt;/h3>
&lt;p>&lt;a href="https://github.com/PrimalHQ/primal-android-app">Primal Android&lt;/a> shipped &lt;a href="https://github.com/PrimalHQ/primal-android-app/releases/tag/3.0.21">v3.0.21&lt;/a> with bug fixes for poll zap votes, wallet multi-account sharing, and auto-reconnect for the remote signer and wallet service. Seven merged PRs followed: &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/1008">PR #1008&lt;/a> unifies the main screen layout, &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/1010">PR #1010&lt;/a> implements a new feed card design with larger avatars and content indentation, &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/1009">PR #1009&lt;/a> adds video support and portrait layout to media feed cards, &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/1012">PR #1012&lt;/a> introduces a compact text field for quick replies, and &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/1013">PR #1013&lt;/a> redesigns the app bars.&lt;/p>
&lt;h3 id="nostria-v3119-through-v3121-add-local-ai-image-generation">Nostria v3.1.19 through v3.1.21 add local AI image generation&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostria-app/nostria">Nostria&lt;/a> shipped three releases from &lt;a href="https://github.com/nostria-app/nostria/releases/tag/v3.1.19">v3.1.19&lt;/a> through &lt;a href="https://github.com/nostria-app/nostria/releases/tag/v3.1.21">v3.1.21&lt;/a> with over 80 commits. The headline addition is local image generation using Janus Pro with WebGPU acceleration, so users can generate images on-device without an external API. The releases also add cloud image generation, multimodal chat, ONNX runtime support, an AI prompt library, and AI cache management. On the client side, the update brings a new dialog system, note editor overhaul, music embed improvements, and signer login flow changes. &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/#nostria-ships-native-mobile-app">Newsletter #17&lt;/a> covered the v3.1.18 native mobile release with local signer support.&lt;/p>
&lt;h3 id="tubestr-v103-ships-feed-and-studio-updates">TubeStr v1.0.3 ships feed and studio updates&lt;/h3>
&lt;p>&lt;a href="https://github.com/Tubestr/tubestr-v2">TubeStr&lt;/a>, a private family video sharing app built on Nostr, shipped &lt;a href="https://github.com/Tubestr/tubestr-v2/releases/tag/v1.0.3">v1.0.3&lt;/a> on April 13. The release adds feed and studio improvements. &lt;a href="https://github.com/Tubestr/tubestr-v2/pull/3">PR #3&lt;/a> revamps the onboarding screens and &lt;a href="https://github.com/Tubestr/tubestr-v2/pull/2">PR #2&lt;/a> fixes a video export error. The app uses NDK and MDK (&lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> Development Kit) for encrypted media sharing between family members, with &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> integration planned for media storage. TubeStr is available on &lt;a href="https://zapstore.dev">Zapstore&lt;/a>.&lt;/p>
&lt;h2 id="in-development">In Development&lt;/h2>
&lt;h3 id="botburrow-begins-development-as-marmot-bot-platform">Botburrow begins development as Marmot bot platform&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/botburrow">Botburrow&lt;/a> is a new project from the Marmot team, started on April 3. It is a self-hosted bot management platform where each bot gets its own Nostr identity, joins &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> MLS-encrypted group chats via Welcome messages, and sends and receives end-to-end encrypted messages. The dashboard, built with Rails 8.1, communicates with a single whitenoise-rs daemon (&lt;code>wnd&lt;/code>) over a Unix socket.&lt;/p>
&lt;p>Botburrow exposes a substantial scripting and operations layer: commands, triggers, and scheduled actions run custom Ruby code, scripts can inspect profiles, group membership, and pending invites through &lt;code>wnd&lt;/code>, the dashboard includes a live chat view for messaging bots inside real groups, and each bot has its own file storage for configs, cached data, and generated output. A &lt;a href="https://github.com/marmot-protocol/botburrow/commit/2ed012078eaab3c5b92dff16b87865c2e353bd80">Docker image&lt;/a> with multi-arch builds targets zero-config self-hosting on Umbrel and Start9. A &lt;a href="https://github.com/marmot-protocol/botburrow/commit/c8ef8c306af247560b1952878206d854cde3fe20">trust model section&lt;/a> in the README documents the security boundaries.&lt;/p>
&lt;h3 id="nostr-archives-adds-trending-feeds-relay-and-entity-resolution">Nostr Archives adds trending feeds relay and entity resolution&lt;/h3>
&lt;p>&lt;a href="https://github.com/barrydeen/nostrarchives-api">Nostr Archives&lt;/a>, the Nostr archival and analytics platform at &lt;a href="https://nostrarchives.com">nostrarchives.com&lt;/a>, continued steady development across its &lt;a href="https://github.com/barrydeen/nostrarchives-api">API&lt;/a> (Rust) and &lt;a href="https://github.com/barrydeen/nostrarchives-frontend">frontend&lt;/a> (Next.js 16). On the API side, &lt;a href="https://github.com/barrydeen/nostrarchives-api/pull/118">PR #118&lt;/a> adds time-range filtering to the client leaderboard and &lt;a href="https://github.com/barrydeen/nostrarchives-api/pull/117">PR #117&lt;/a> adds engagement counters to reply events. On the frontend, &lt;a href="https://github.com/barrydeen/nostrarchives-frontend/pull/85">PR #85&lt;/a> resolves Nostr entities directly from URL paths (paste an npub or note ID into the URL and the site renders it), and &lt;a href="https://github.com/barrydeen/nostrarchives-frontend/pull/86">PR #86&lt;/a> adds an API documentation page. The platform runs four relay services: a NIP-50 search relay, a trending feeds relay (visible at &lt;code>wss://feeds.nostrarchives.com&lt;/code>), a scheduler relay for future-dated events, and an indexer relay for kinds 0, 3, and 10002.&lt;/p>
&lt;h3 id="damus-fixes-favorites-timeline">Damus fixes favorites timeline&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/damus">Damus&lt;/a>, the iOS client, merged &lt;a href="https://github.com/damus-io/damus/pull/3708">PR #3708&lt;/a> rewriting the &lt;code>subscribe_to_favorites()&lt;/code> function with in-place filtering, deduplication rebuilding, and persisted tab selection.&lt;/p>
&lt;h3 id="nostur-adds-private-zaps-and-custom-emoji-viewing">Nostur adds private zaps and custom emoji viewing&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostur-com/nostur-ios-public">Nostur&lt;/a>, the iOS client, pushed 10 commits this week adding private zap support, custom emoji viewing, an animated &lt;code>.webp&lt;/code> rendering fix, and voice message audio format detection.&lt;/p>
&lt;h3 id="amber-ships-v601-through-v603-with-webdav-backup-and-relay-reconnection-fixes">Amber ships v6.0.1 through v6.0.3 with WebDAV backup and relay reconnection fixes&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a>, the Android &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> signer app, shipped three releases this week. &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.0.1">v6.0.1&lt;/a> adds two new backup options (WebDAV and share to Google Drive), implements exponential backoff for relay reconnections, updates the Quartz library to 1.08.0, and fixes event validation for app update and profile events. &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.0.2">v6.0.2&lt;/a> adds an account index option when using seed words and fixes relay reconnection when the relay is offline at startup. &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.0.3">v6.0.3&lt;/a> adds an additional fix for empty request IDs when receiving intents.&lt;/p>
&lt;h3 id="plektos-v060-redesigns-with-ditto-themes">Plektos v0.6.0 redesigns with Ditto themes&lt;/h3>
&lt;p>&lt;a href="https://github.com/derekross/plektos">Plektos&lt;/a>, the decentralized meetup and events platform built on &lt;a href="https://nostrcompass.org/en/topics/nip-52/">NIP-52&lt;/a> with interactive maps, shipped &lt;a href="https://github.com/derekross/plektos/commit/7a691cdf089ceb7a8582dd5c0ee026830f2cdc77">v0.6.0&lt;/a> and &lt;a href="https://github.com/derekross/plektos/commit/3a6474ae380522d8ee1b3526423fcfc3328fd879">v0.6.1&lt;/a> on April 14. The update adds Ditto-style community themes with custom background image uploads, avatar shape configuration, and a UI overhaul. &lt;a href="https://github.com/derekross/plektos/pull/6">PR #6&lt;/a> addresses a full code review covering security, architecture, and UX findings. Plektos uses Nostrify for protocol integration, &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> for remote login, and zaps for ticket payments. The Android build is available on Zapstore.&lt;/p>
&lt;h3 id="shadow-adds-nostr-os-api-and-cashu-wallet-app">Shadow adds Nostr OS API and Cashu wallet app&lt;/h3>
&lt;p>&lt;a href="https://github.com/justinmoon/shadow">Shadow&lt;/a>, Justin Moon&amp;rsquo;s app runtime platform, pushed over 30 commits in two days. &lt;a href="https://github.com/justinmoon/shadow/commit/88cbda5131814d2730a2d892029932136db005df">Commit 88cbda5&lt;/a> adds a Cashu wallet app running inside the Shadow runtime. &lt;a href="https://github.com/justinmoon/shadow/commit/865c415">Commit 865c415&lt;/a> adds a podcast player demo. The runtime exposes &lt;code>Shadow.os.nostr&lt;/code> and &lt;code>Shadow.os.audio&lt;/code> as first-class OS-level APIs, and the Pixel runtime lane runs a Wayland compositor on rooted Android devices with GPU compositing. &lt;a href="https://github.com/justinmoon/shadow/pull/1">PR #1&lt;/a> and &lt;a href="https://github.com/justinmoon/shadow/pull/2">PR #2&lt;/a> from contributor k0sti fix desktop Linux font loading and XDG state directory handling. No formal release yet.&lt;/p>
&lt;h3 id="lief-fixes-amber-login-and-adds-zapstore">Lief fixes Amber login and adds Zapstore&lt;/h3>
&lt;p>&lt;a href="https://gitlab.com/chad.curtis/lief">Lief&lt;/a>, a Nostr app for composing and sending long-form letters to other Nostr users, shipped build &lt;code>v2026.04.12&lt;/code> on April 12. The update fixes an &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> signer login issue on Android, simplifies the signer nudge flow, upgrades the nostrify dependency, and adds Zapstore integration.&lt;/p>
&lt;h3 id="espy-overhauls-color-picker-and-fixes-amber-login">Espy overhauls color picker and fixes Amber login&lt;/h3>
&lt;p>&lt;a href="https://gitlab.com/chad.curtis/espy">Espy&lt;/a>, a Nostr social app where users share &amp;ldquo;color moments,&amp;rdquo; capturing 3-6 color palettes from real-life scenes as a form of pre-verbal visual communication, shipped build &lt;code>v2026.04.12&lt;/code> on April 12. The update overhauls the color picker with a curved saturation arc replacing the grayscale toggle, fixes hue ring flicker bugs, and adds Easter egg characters (Alchemist and Astrologer). Compression reduced PNG assets by 703KB. The release also fixes an &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> signer login issue, simplifies the signer nudge flow, upgrades the nostrify dependency, and adds Zapstore integration.&lt;/p>
&lt;h3 id="jumble-adds-per-feed-kind-filters-and-articles-tab">Jumble adds per-feed kind filters and articles tab&lt;/h3>
&lt;p>&lt;a href="https://github.com/CodyTseng/jumble">Jumble&lt;/a>, the Nostr client, pushed 13 commits this week adding per-feed kind filtering, an Articles tab, notification read status sync with a privacy-preserving option, an avatar hide mode, and an account switching race condition fix.&lt;/p>
&lt;h3 id="primal-web-ships-8-version-bumps">Primal Web ships 8 version bumps&lt;/h3>
&lt;p>&lt;a href="https://github.com/PrimalHQ/primal-web-app">Primal Web&lt;/a> shipped versions 3.0.93 through 3.0.101 in one week with 21 commits. The work focused on live stream chat improvements, mention boundary fixes, bookmark pagination, duplicate like prevention, and relay proxy fixes.&lt;/p>
&lt;h2 id="protocol-and-spec-work">Protocol and Spec Work&lt;/h2>
&lt;h3 id="nip-updates">NIP Updates&lt;/h3>
&lt;p>Recent changes to the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a>:&lt;/p>
&lt;p>&lt;strong>Merged:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> (Git Stuff): Add &lt;code>nostr://&lt;/code> clone URLs&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2312">PR #2312&lt;/a>): &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> defines how to host git repositories on Nostr using kind &lt;code>30617&lt;/code> repository announcements that list branches, tags, relay locations, and maintainer pubkeys. Until now, the spec lacked a formal URL scheme for referencing these repositories. This PR adds a &lt;code>nostr://&lt;/code> clone URL format that works with &lt;code>git-remote-nostr&lt;/code> helpers, so &lt;code>git clone nostr://npub1.../relay.ngit.dev/ngit&lt;/code> resolves the npub (or &lt;a href="https://github.com/nostr-protocol/nips/blob/master/05.md">NIP-05&lt;/a> address), discovers the repository&amp;rsquo;s relay locations, and fetches the repository data. Three URL patterns are defined: &lt;code>nostr://&amp;lt;naddr&amp;gt;&lt;/code> for direct addressable event references, &lt;code>nostr://&amp;lt;npub|nip05&amp;gt;/&amp;lt;identifier&amp;gt;&lt;/code> for human-readable repository references, and &lt;code>nostr://&amp;lt;npub|nip05&amp;gt;/&amp;lt;relay-hint&amp;gt;/&amp;lt;identifier&amp;gt;&lt;/code> when the client needs a relay hint. Both the relay hint and identifier are percent-encoded per RFC 3986. The format is already implemented by Shakespeare and ngit&amp;rsquo;s git-remote-nostr helper, and displayed by GitWorkshop.dev and NostrHub.io. The PR also tightens the &lt;code>d&lt;/code> tag format for repository identifiers so that &lt;code>nostr://&lt;/code> URLs produce valid URIs.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Open PRs and Discussions:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>NIP-63a: Minimal Payment Gateway Descriptor&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2315">PR #2315&lt;/a>): Proposes a new kind &lt;code>10164&lt;/code> replaceable event that lets content creators declare payment gateways, pricing models, and subscription rules for accessing paid content. Today, payment-gated content on Nostr requires each client to implement its own payment flow, with no standard way for a creator to say &amp;ldquo;this content costs X sats via gateway Y.&amp;rdquo; The proposed event would embed payment gateway descriptors directly in Nostr events, letting clients discover a creator&amp;rsquo;s accepted payment methods, pricing tiers, and subscription options from a single replaceable event. This decouples payment presentation from specific providers, so a creator could accept Lightning, Cashu, or fiat gateways without each client needing custom integration for each payment method.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>NIP-XX: Relay Self-Declaration Manifest and Retention Horizon&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2314">PR #2314&lt;/a>): Proposes two wire protocol primitives for relay transparency. The first is kind &lt;code>10100&lt;/code>, a gossipable replaceable event where relay operators declare their endpoints (clearnet, Tor, I2P), retention window, write policy, and supported NIPs. Unlike &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> relay information documents (HTTP-only, not discoverable through Nostr itself), kind &lt;code>10100&lt;/code> manifests propagate through the Nostr event network like any other event, with TOFU key binding via the NIP-11 &lt;code>pubkey&lt;/code> field to prevent spoofing. The second primitive is &lt;code>HORIZON&lt;/code>, a new relay-to-client message &lt;code>[&amp;quot;HORIZON&amp;quot;, &amp;lt;sub_id&amp;gt;, &amp;lt;earliest_timestamp&amp;gt;]&lt;/code> sent before &lt;code>EOSE&lt;/code>. When a client&amp;rsquo;s subscription time range extends past the relay&amp;rsquo;s retention window, the relay replies with the earliest timestamp it holds, replacing silent dead-ends (&amp;ldquo;no results found&amp;rdquo;) with explicit temporal boundaries (&amp;ldquo;I only have data from timestamp X onward&amp;rdquo;). The motivation is that NIP-11&amp;rsquo;s &lt;code>retention&lt;/code> field was removed in February 2026 as unused because HTTP-only delivery was a distribution failure. A reference implementation runs on nostr-rs-relay 0.9.0 with 90-day pruning.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>NIP-TPLD: Transient Private Location Data&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2309">PR #2309&lt;/a>): Proposes kind &lt;code>20411&lt;/code> (ephemeral range) for sharing encrypted geolocation data with specific recipients. Centralized location-sharing services like Google Maps and Apple Find My require trusting a central authority with real-time movements. This NIP defines a privacy-first alternative where the event content contains a JSON map of recipient pubkeys to &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encrypted payloads, each containing a geohash at a configurable precision level (from city-level at precision 5 to street-level at precision 8). Multiple recipients are handled in a single event with per-recipient encryption, so each person can only decrypt their own payload. A &lt;code>ttl&lt;/code> tag sets the suggested time-to-live in seconds, and the ephemeral kind range (20000-20999) signals to relays that these events should not be stored indefinitely. The &lt;code>p&lt;/code> tags allow clients to filter relevant events without decrypting content.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-5c/">NIP-5C&lt;/a> (Scrolls): WASM programs update&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2281">PR #2281&lt;/a>): Continues development of the WebAssembly program publishing and execution spec, which defines conventions for publishing and discovering WASM binaries as Nostr events. Scrolls are self-contained programs that clients can download from relays and execute in a sandboxed runtime, turning Nostr into a distribution network for executable code. The PR refines the event format and runtime interface. A &lt;a href="https://nprogram.netlify.app/">demo app&lt;/a> shows scrolls running in-browser, with example programs published as Nostr events that any client can fetch and execute. The concept extends &lt;a href="https://nostrcompass.org/en/topics/nip-5a/">NIP-5A&lt;/a> (static websites) from serving HTML pages to running interactive programs, all distributed through the same relay infrastructure.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> large payload support&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/1907">PR #1907&lt;/a>): Proposes extending &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> versioned encryption to handle payloads larger than the current 65,535-byte limit. The change is backwards-compatible: implementations that do not need large messages can ignore it entirely. The practical motivation is &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote signing of large kind &lt;code>3&lt;/code> contact lists, where a user&amp;rsquo;s follow list can exceed the encryption size limit when serialized as JSON. Without this change, remote signers cannot encrypt responses containing large contact lists, forcing workarounds or truncation.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-c7/">NIP-C7&lt;/a>: Restrict kind 9 to chat views&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2310">PR #2310&lt;/a>): &lt;a href="https://nostrcompass.org/en/topics/nip-c7/">NIP-C7&lt;/a> defines kind &lt;code>9&lt;/code> as a lightweight chat message, a short text note meant for real-time conversation in chat contexts like &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> group chats and &lt;a href="https://nostrcompass.org/en/topics/nip-53/">NIP-53&lt;/a> live activity streams. This PR adds a requirement that clients rendering &amp;ldquo;chat view&amp;rdquo; as a stream of ordered events MUST only fetch kind &lt;code>9&lt;/code> events, preventing missing context when other content types (kind &lt;code>1&lt;/code> notes, kind &lt;code>30023&lt;/code> articles) are mixed into the chat timeline. Other content types can still be quoted within a kind &lt;code>9&lt;/code> message following &lt;a href="https://nostrcompass.org/en/topics/nip-18/">NIP-18&lt;/a> reposts. The motivation comes from a community discussion about kind &lt;code>9&lt;/code> messages appearing in general-purpose feeds where they lack context, since chat messages are typically short responses that only make sense within a conversation thread.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="nip-deep-dive-nip-29-relay-based-groups">NIP Deep Dive: NIP-29 (Relay-based Groups)&lt;/h2>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/29.md">NIP-29&lt;/a> defines a model for group messaging where the relay itself manages group membership and moderation. Groups live on a specific relay, identified by a random string ID, and the relay enforces who can write to the group. This is a different architecture from &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> (client-side MLS encryption) or &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> group chats (gift-wrapped DMs): in NIP-29, the relay is the authority, the messages are readable by the relay operator, and moderation happens at the relay level.&lt;/p>
&lt;p>A group is identified by the format &lt;code>&amp;lt;host&amp;gt;'&amp;lt;group-id&amp;gt;&lt;/code>, for example &lt;code>groups.nostr.com'abcdef&lt;/code>. The special group ID &lt;code>_&lt;/code> is reserved as a top-level group for relay-wide discussion. All user events sent to a group carry an &lt;code>h&lt;/code> tag with the group ID:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;d7e3a4b9c1f2e8d6a5b4c3d2e1f09876d7e3a4b9c1f2e8d6a5b4c3d2e1f09876&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1744675200&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">9&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;h&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;abcdef&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;previous&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;a1b2c3d4&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;e5f67890&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;12345678&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Has anyone tested the new relay config?&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>previous&lt;/code> tag is a tamper-detection mechanism. Clients include the first 8 hex characters (4 bytes) of recent events they have seen from the same relay in the last 50 messages. Relays reject events containing &lt;code>previous&lt;/code> references to events not in their database, which prevents messages from being replayed to a forked copy of the group on another relay. This is not a full chain of custody, but it makes out-of-context rebroadcasting detectable.&lt;/p>
&lt;p>Group membership is managed through a set of moderation event kinds in the &lt;code>9000-9020&lt;/code> range. A user joins by publishing a kind &lt;code>9021&lt;/code> join request, which the relay accepts or rejects based on its policy:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;f1a2b3c4d5e6f7890123456789abcdef0123456789abcdef1234567890abcdef&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1744675200&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">9021&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;h&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;abcdef&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;code&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;invite-xyz-123&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;I&amp;#39;d like to join the dev discussion group.&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;11223344556677889900aabbccddeeff11223344556677889900aabbccddeeff11223344556677889900aabbccddeeff11223344556677889900aabbccddeeff&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The optional &lt;code>code&lt;/code> tag ties to invite codes created by admins via kind &lt;code>9009&lt;/code> events. A user leaves by publishing kind &lt;code>9022&lt;/code>, and the relay automatically issues a kind &lt;code>9001&lt;/code> removal in response. Admins can add users with roles (kind &lt;code>9000&lt;/code>), remove users (kind &lt;code>9001&lt;/code>), edit group metadata (kind &lt;code>9002&lt;/code>), and delete events (kind &lt;code>9005&lt;/code>). The roles system is flexible: roles are arbitrary labels, and what each role can do is relay policy, not protocol-defined. The relay publishes the group&amp;rsquo;s configuration as addressable events: kind &lt;code>39000&lt;/code> for metadata (name, description, picture, visibility settings), kind &lt;code>39001&lt;/code> for the admin list, kind &lt;code>39002&lt;/code> for the member list, and kind &lt;code>39003&lt;/code> for the roles and their capabilities.&lt;/p>
&lt;p>Groups can be public (anyone can read, only members can write), closed (only members can read and write), or fully open. The visibility and write-access settings are orthogonal and controlled by the &lt;code>public&lt;/code>, &lt;code>open&lt;/code>, &lt;code>visible&lt;/code>, and &lt;code>unrestricted&lt;/code> flags in the kind &lt;code>9002&lt;/code> metadata edit event. A relay can host many groups simultaneously, each with independent membership and moderation.&lt;/p>
&lt;p>The spec accepts any event kind inside a group, not just chat messages. Long-form articles (&lt;a href="https://nostrcompass.org/en/topics/nip-23/">NIP-23&lt;/a>), calendar events (&lt;a href="https://nostrcompass.org/en/topics/nip-52/">NIP-52&lt;/a>), live streams (&lt;a href="https://nostrcompass.org/en/topics/nip-53/">NIP-53&lt;/a>), and market listings can all carry an &lt;code>h&lt;/code> tag and participate in a group context. This makes NIP-29 groups function like Discord servers or Slack workspaces where different content types coexist in the same namespace.&lt;/p>
&lt;p>&lt;a href="https://gitea.coracle.social/coracle/flotilla">Flotilla&lt;/a> is the most actively developed NIP-29 client, with voice rooms, email login, and proof-of-work DMs added in &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#flotilla-v170-adds-voice-rooms-and-email-login">v1.7.0&lt;/a>. &lt;a href="https://github.com/coracle-social/coracle">Coracle&lt;/a> supports NIP-29 groups as well. On the relay side, &lt;a href="https://github.com/fiatjaf/relay29">groups.fiatjaf.com&lt;/a> is a reference implementation by fiatjaf. &lt;a href="https://github.com/Nostrord/nostrord">Nostrord&lt;/a>, a Kotlin Multiplatform NIP-29 client funded by &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/#opensats-announces-sixteenth-wave-of-nostr-grants">OpenSats&lt;/a>, is in early development with Discord-style moderation and threading.&lt;/p>
&lt;p>The tradeoff against encrypted alternatives like &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> is explicit. NIP-29 groups are readable by the relay operator. There is no end-to-end encryption, no forward secrecy, and no post-compromise security. The relay is a trusted party for content integrity and membership enforcement. What you get in return is simplicity: no key material to manage, no state synchronization across devices, no MLS handshake negotiation. A relay operator spins up a group, users join, and messages flow. For public communities, dev channels, and open discussion spaces, the relay-trust model matches the use case. For private messaging where the relay should not read content, NIP-17 or Marmot are the appropriate choices.&lt;/p>
&lt;h2 id="nip-deep-dive-nip-90-data-vending-machines">NIP Deep Dive: NIP-90 (Data Vending Machines)&lt;/h2>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/90.md">NIP-90&lt;/a> defines a protocol for on-demand computation over Nostr. A customer publishes a job request, service providers compete to fulfill it, and results are delivered as Nostr events. The spec describes this as &amp;ldquo;money in, data out,&amp;rdquo; and the design treats Nostr as a marketplace for data processing where customers care about the output, not who produces it.&lt;/p>
&lt;p>The protocol reserves kinds &lt;code>5000-5999&lt;/code> for job requests, &lt;code>6000-6999&lt;/code> for job results, and kind &lt;code>7000&lt;/code> for job feedback. A result kind is always 1000 higher than its request kind: a kind &lt;code>5001&lt;/code> request produces a kind &lt;code>6001&lt;/code> result. Here is a job request asking for text summarization:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;d7e3a4b9c1f2e8d6a5b4c3d2e1f09876d7e3a4b9c1f2e8d6a5b4c3d2e1f09876&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1744675200&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">5001&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;i&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;https://example.com/article.txt&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;url&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;output&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;text/plain&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;relays&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.damus.io&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://nos.lol&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;bid&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;5000&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;param&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;lang&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;en&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;param&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;max_tokens&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;280&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>i&lt;/code> tag specifies input data with a type marker. Four input types are defined: &lt;code>url&lt;/code> (fetch and process the data at this URL), &lt;code>event&lt;/code> (use a Nostr event as input), &lt;code>job&lt;/code> (chain from the output of a previous job), and &lt;code>text&lt;/code> (inline text). The &lt;code>bid&lt;/code> tag sets a maximum payment in millisats. The &lt;code>param&lt;/code> tag carries job-type-specific parameters, and the &lt;code>output&lt;/code> tag specifies the expected response format.&lt;/p>
&lt;p>A service provider picks up the request and publishes a result:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1744675260&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">6001&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;request&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;{\&amp;#34;id\&amp;#34;:\&amp;#34;c3d4e5...\&amp;#34;,\&amp;#34;kind\&amp;#34;:5001,...}&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;e&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.damus.io&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;i&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;https://example.com/article.txt&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;url&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;d7e3a4b9c1f2e8d6a5b4c3d2e1f09876d7e3a4b9c1f2e8d6a5b4c3d2e1f09876&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;amount&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;5000&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;lnbc50n1pj...&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;The article discusses three protocol changes proposed for the next quarter...&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The result tags the original request event, includes the input for reference, addresses the customer&amp;rsquo;s pubkey, and optionally includes a Lightning invoice in the &lt;code>amount&lt;/code> tag. The customer can verify the result came from a specific service provider by checking the pubkey.&lt;/p>
&lt;p>Job feedback (kind &lt;code>7000&lt;/code>) provides status updates while a job is in progress. Service providers can emit feedback events with status values like &lt;code>payment-required&lt;/code> (send a Lightning invoice before processing), &lt;code>processing&lt;/code> (work is underway), &lt;code>error&lt;/code> (something went wrong), or &lt;code>success&lt;/code> (job complete). This gives customers real-time visibility into long-running jobs:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1744675230&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">7000&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;status&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;payment-required&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;e&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.damus.io&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;d7e3a4b9c1f2e8d6a5b4c3d2e1f09876d7e3a4b9c1f2e8d6a5b4c3d2e1f09876&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;amount&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;5000&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;lnbc50n1pj...&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;11223344556677889900aabbccddeeff11223344556677889900aabbccddeeff11223344556677889900aabbccddeeff11223344556677889900aabbccddeeff&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Job chaining allows outputs to feed into subsequent jobs. A customer can set the input type to &lt;code>job&lt;/code> and reference a previous job&amp;rsquo;s event ID. The service provider for the downstream job waits for the upstream result, then processes it. This creates composable pipelines: transcribe audio (kind &lt;code>5002&lt;/code>), then summarize the transcript (kind &lt;code>5001&lt;/code>), then translate the summary (kind &lt;code>5003&lt;/code>). Each step can be fulfilled by a different service provider.&lt;/p>
&lt;p>For privacy, customers can encrypt the &lt;code>i&lt;/code> and &lt;code>param&lt;/code> tags using &lt;a href="https://nostrcompass.org/en/topics/nip-04/">NIP-04&lt;/a> encryption with the service provider&amp;rsquo;s pubkey, placing the encrypted payload in the &lt;code>content&lt;/code> field and adding an &lt;code>encrypted&lt;/code> tag. This hides the input data and parameters from relays and other service providers, though it requires the customer to select a specific provider up front.&lt;/p>
&lt;p>Specific job request types are defined in a &lt;a href="https://github.com/nostr-protocol/data-vending-machines/tree/master/kinds">separate repository&lt;/a>. Current types include text generation (kind &lt;code>5050&lt;/code>), summarization (kind &lt;code>5001&lt;/code>), translation (kind &lt;code>5002&lt;/code>), speech-to-text (kind &lt;code>5003&lt;/code>), image generation (kind &lt;code>5100&lt;/code>), and content recommendation (kind &lt;code>5300&lt;/code>).&lt;/p>
&lt;p>&lt;a href="https://github.com/v0l/snort">Snort&lt;/a> added kind &lt;code>7000&lt;/code> payment-required invoice display in &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/#snort-ships-security-hardening-and-dvm-payment-invoices">Newsletter #17&lt;/a>, rendering Lightning invoices directly in the feed when a DVM responds with a payment requirement. &lt;a href="https://github.com/hzrd149/nostrudel">noStrudel&lt;/a> has a DVM explorer for browsing available service providers. On the provider side, projects like &lt;a href="https://github.com/dtdannen/dvmdash">DVMDash&lt;/a> track DVM activity across the network, and several AI-focused services offer text generation, image creation, and content moderation through the NIP-90 protocol. The &lt;a href="https://nostrcompass.org/en/topics/nip-89/">NIP-89&lt;/a> (Recommended Application Handlers) spec complements NIP-90 by letting service providers publish their capabilities as discoverable Nostr events.&lt;/p>
&lt;hr>
&lt;p>That&amp;rsquo;s it for this week. Building something or have news to share? DM us on Nostr or find us at &lt;a href="https://nostrcompass.org">nostrcompass.org&lt;/a>.&lt;/p></content:encoded></item><item><title>Nostr Compass #17</title><link>https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/</link><pubDate>Wed, 08 Apr 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/#amethyst-ships-arti-tor-merges-pure-kotlin-mls-and-marmot">v1.08.0&lt;/a> with Arti Tor integration and a redesigned Shorts UI, while merging pure Kotlin implementations of &lt;a href="https://nostrcompass.org/en/topics/mls/">MLS&lt;/a> and &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> into its &lt;a href="https://nostrcompass.org/en/topics/quartz/">Quartz&lt;/a> library. &lt;a href="https://github.com/nostur-com/nostur-ios-public">Nostur&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/#nostur-v1270-adds-video-recording-and-private-replies">v1.27.0&lt;/a> with video recording, animated GIF profiles, and private replies. &lt;a href="https://github.com/r0d8lsh0p/shosho-releases">Shosho&lt;/a> launches &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/#shosho-v0150-launches-shows-and-vertical-video-carousel">v0.15.0&lt;/a> with Shows (custom live stream info connected to OBS) and a TikTok-style vertical video carousel. &lt;a href="https://github.com/Spl0itable/NYM">Nymchat&lt;/a> &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/#nymchat-reverts-marmot-ships-enhanced-nip-17-group-chats">reverts Marmot and ships enhanced NIP-17 group chats&lt;/a> with rotating ephemeral keys. &lt;a href="https://github.com/mmalmi/nostr-vpn">Nostr VPN&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/#nostr-vpn-ships-exit-node-support-and-umbrel-packaging">exit node support and Umbrel packaging&lt;/a> across six releases. &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> jumps to &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/#amber-v600-pre1-adds-per-connection-nip-46-signing-keys">v6.0.0-pre1&lt;/a> with per-connection &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> signing keys and Zapstore in-app updates. &lt;a href="https://github.com/damus-io/notedeck">Notedeck&lt;/a> reaches &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/#notedeck-v0100-beta-ships-zapstore-self-update">v0.10.0-beta&lt;/a> with APK self-update via Zapstore, and &lt;a href="https://nostrcompass.org/en/topics/nip-58/">NIP-58&lt;/a> (Badges) gets a &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/#nip-updates">kind migration&lt;/a>. Two NIP deep dives cover &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> (Private Direct Messages) and &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> (Nostr Remote Signing).&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/#amethyst-ships-arti-tor-merges-pure-kotlin-mls-and-marmot">v1.08.0&lt;/a> with Arti Tor integration and a redesigned Shorts UI, while merging pure Kotlin implementations of &lt;a href="https://nostrcompass.org/en/topics/mls/">MLS&lt;/a> and &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> into its &lt;a href="https://nostrcompass.org/en/topics/quartz/">Quartz&lt;/a> library. &lt;a href="https://github.com/nostur-com/nostur-ios-public">Nostur&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/#nostur-v1270-adds-video-recording-and-private-replies">v1.27.0&lt;/a> with video recording, animated GIF profiles, and private replies. &lt;a href="https://github.com/r0d8lsh0p/shosho-releases">Shosho&lt;/a> launches &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/#shosho-v0150-launches-shows-and-vertical-video-carousel">v0.15.0&lt;/a> with Shows (custom live stream info connected to OBS) and a TikTok-style vertical video carousel. &lt;a href="https://github.com/Spl0itable/NYM">Nymchat&lt;/a> &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/#nymchat-reverts-marmot-ships-enhanced-nip-17-group-chats">reverts Marmot and ships enhanced NIP-17 group chats&lt;/a> with rotating ephemeral keys. &lt;a href="https://github.com/mmalmi/nostr-vpn">Nostr VPN&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/#nostr-vpn-ships-exit-node-support-and-umbrel-packaging">exit node support and Umbrel packaging&lt;/a> across six releases. &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> jumps to &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/#amber-v600-pre1-adds-per-connection-nip-46-signing-keys">v6.0.0-pre1&lt;/a> with per-connection &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> signing keys and Zapstore in-app updates. &lt;a href="https://github.com/damus-io/notedeck">Notedeck&lt;/a> reaches &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/#notedeck-v0100-beta-ships-zapstore-self-update">v0.10.0-beta&lt;/a> with APK self-update via Zapstore, and &lt;a href="https://nostrcompass.org/en/topics/nip-58/">NIP-58&lt;/a> (Badges) gets a &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/#nip-updates">kind migration&lt;/a>. Two NIP deep dives cover &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> (Private Direct Messages) and &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> (Nostr Remote Signing).&lt;/p>
&lt;h2 id="top-stories">Top Stories&lt;/h2>
&lt;h3 id="amethyst-ships-arti-tor-merges-pure-kotlin-mls-and-marmot">Amethyst ships Arti Tor, merges pure Kotlin MLS and Marmot&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a>, the Android client maintained by vitorpamplona, shipped four releases from &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.07.3">v1.07.3&lt;/a> through &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.08.0">v1.08.0&lt;/a> and merged a large batch of unreleased work into its &lt;a href="https://nostrcompass.org/en/topics/quartz/">Quartz&lt;/a> library (the shared Kotlin Multiplatform Nostr module). The headline release is v1.08.0 &amp;ldquo;Arti Tor,&amp;rdquo; which migrates the app&amp;rsquo;s Tor connectivity from the C-based Tor library to &lt;a href="https://gitlab.torproject.org/tpo/core/arti">Arti&lt;/a>, the Tor Project&amp;rsquo;s Rust implementation. The migration addresses random crashes that occurred under the previous C Tor bindings. Arti is the Tor Project&amp;rsquo;s long-term replacement for the C codebase, written from scratch in Rust for memory safety and async I/O.&lt;/p>
&lt;p>The v1.07.3 release redesigned the Shorts UI, replacing the paged design with edge-to-edge feeds for pictures, shorts, and long videos. The same release migrated badges to kind &lt;code>10008&lt;/code> and bookmarks to kind &lt;code>10003&lt;/code>, aligning with the &lt;a href="https://nostrcompass.org/en/topics/nip-58/">NIP-58&lt;/a> kind migration &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/#nip-updates">merged this week&lt;/a>. v1.07.4 fixed a Nostr Wallet Connect secret handling issue, and v1.07.5 fixed an image upload crash.&lt;/p>
&lt;p>On main but not yet in a tagged release, the team wrote a full Kotlin implementation of both &lt;a href="https://nostrcompass.org/en/topics/mls/">MLS&lt;/a> and the &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> protocol, replacing the need for native C/Rust library bindings. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2147">PR #2147&lt;/a> adds the core Marmot MLS group messaging layer, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2149">PR #2149&lt;/a> adds the group chat UI, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2146">PR #2146&lt;/a> adds inbound and outbound message processors with a subscription manager, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2141">PR #2141&lt;/a> adds MLS group state persistence and KeyPackage rotation management, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2150">PR #2150&lt;/a> adds a full MLS test suite with improved GroupInfo signing, and &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2158">PR #2158&lt;/a> adds KeyPackage publication status tracking. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2166">PR #2166&lt;/a> adds a pure Kotlin secp256k1 implementation for Nostr cryptographic operations, replacing the native C library dependency. Combined with the Kotlin MLS implementation, &lt;a href="https://nostrcompass.org/en/topics/quartz/">Quartz&lt;/a> can run Nostr signing and Marmot group messaging without any native bindings, which opens the door to Kotlin Multiplatform targets including iOS.&lt;/p>
&lt;p>The team is also building &lt;a href="https://nostrcompass.org/en/topics/nip-ac/">NIP-AC&lt;/a> (P2P Voice and Video Calls) support: &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2143">PR #2143&lt;/a> adds a full test suite for the NIP-AC call state machine, and &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2164">PR #2164&lt;/a> prevents stale call offers from retriggering after app restart.&lt;/p>
&lt;h3 id="nostur-v1270-adds-video-recording-and-private-replies">Nostur v1.27.0 adds video recording and private replies&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostur-com/nostur-ios-public">Nostur&lt;/a>, the iOS Nostr client, shipped &lt;a href="https://github.com/nostur-com/nostur-ios-public/releases/tag/v1.27.0">v1.27.0&lt;/a> on April 2. The release adds in-app video recording with trim-before-upload, so users can capture short clips, cut them to length, and publish without leaving the client. Animated GIF support extends to profile and banner photos, with animated WebP rendering added as well. A new Shortcuts integration lets users send Nostr posts from Apple Shortcuts automations. The release also adds private replies and fixes DM compatibility issues that affected message delivery between Nostur and other clients.&lt;/p>
&lt;h3 id="shosho-v0150-launches-shows-and-vertical-video-carousel">Shosho v0.15.0 launches Shows and vertical video carousel&lt;/h3>
&lt;p>&lt;a href="https://github.com/r0d8lsh0p/shosho-releases">Shosho&lt;/a>, the Nostr live streaming app, shipped &lt;a href="https://github.com/r0d8lsh0p/shosho-releases/releases/tag/v0.15.0">v0.15.0&lt;/a> and &lt;a href="https://github.com/r0d8lsh0p/shosho-releases/releases/tag/v0.15.1">v0.15.1&lt;/a> on April 7. The headline feature is Shows: streamers can set up custom show info before going live and connect their show to OBS or any external encoder. This separates the &amp;ldquo;what am I streaming&amp;rdquo; metadata from the act of going live, so streamers can prepare titles, descriptions, and products before they start broadcasting. The same release adds a TikTok-style vertical video carousel for swiping through lives, clips, and replays in a full-screen feed, and Quick Add for publishing video clips and adding products directly from a profile page. v0.15.1 fixes a bug where the keyboard was hiding the live stream chat input.&lt;/p>
&lt;h2 id="shipping-this-week">Shipping This Week&lt;/h2>
&lt;h3 id="notedeck-v0100-beta-ships-zapstore-self-update">Notedeck v0.10.0-beta ships Zapstore self-update&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/notedeck">Notedeck&lt;/a>, the desktop and mobile client from the Damus team, shipped &lt;a href="https://github.com/damus-io/notedeck/releases/tag/v0.10.0-beta.1">v0.10.0-beta.1&lt;/a> and &lt;a href="https://github.com/damus-io/notedeck/releases/tag/v0.10.0-beta.2">v0.10.0-beta.2&lt;/a> as test prereleases for APK self-update. &lt;a href="https://github.com/damus-io/notedeck/pull/1417">PR #1417&lt;/a> adds APK self-update via the Nostr/Zapstore updater on Android, building on the &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-18-newsletter/#notedeck-moves-release-discovery-onto-nostr">Nostr-native update discovery work from Newsletter #14&lt;/a>. The update flow discovers new releases through Nostr events published to relays, then downloads the APK from wherever the developer hosts it (GitHub releases, Blossom CDN, or other sources), verifies the SHA-256 hash against the signed Nostr event, and installs it. &lt;a href="https://github.com/damus-io/notedeck/pull/1438">PR #1438&lt;/a> fixes a welcome screen bug where Login and CreateAccount buttons immediately navigated back, and &lt;a href="https://github.com/damus-io/notedeck/pull/1424">PR #1424&lt;/a> fixes text overflow in the Agentium AI session view.&lt;/p>
&lt;h3 id="amber-v600-pre1-adds-per-connection-nip-46-signing-keys">Amber v6.0.0-pre1 adds per-connection NIP-46 signing keys&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a>, the &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> (Android Signer Application) signer app, shipped &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.0.0-pre1">v6.0.0-pre1&lt;/a> on April 4. The most important change is per-connection signing keys for the &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> (Nostr Remote Signing) bunker protocol. Instead of using a single keypair for all bunker connections, Amber now generates a distinct key for each connected client. If one client connection is compromised, the attacker cannot impersonate the signer to other clients.&lt;/p>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber/pull/377">PR #377&lt;/a> adds in-app update checking and installation via Zapstore, joining &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/#notedeck-v0100-beta-ships-zapstore-self-update">Notedeck&lt;/a> in adopting Nostr-native app distribution. &lt;a href="https://github.com/greenart7c3/Amber/pull/375">PR #375&lt;/a> handles AndroidKeyStore failures gracefully by displaying a warning to users instead of crashing, and &lt;a href="https://github.com/greenart7c3/Amber/pull/371">PR #371&lt;/a> adds database cleanup with size limits and content truncation to prevent unbounded storage growth. The pre-release also carries the &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> relay auth whitelist and mnemonic recovery phrase login from the &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#amber-v502-through-v504">v5.0.x cycle covered last week&lt;/a>.&lt;/p>
&lt;h3 id="nostria-ships-native-mobile-app">Nostria ships native mobile app&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostria-app/nostria">Nostria&lt;/a>, the cross-platform Nostr client maintained by SondreB, released a native mobile app for Android with eight releases from &lt;a href="https://github.com/nostria-app/nostria/releases/tag/v3.1.11">v3.1.11&lt;/a> through &lt;a href="https://github.com/nostria-app/nostria/releases/tag/v3.1.18">v3.1.18&lt;/a>. The most important new capability is native local signer support for signers such as &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> and Aegis. &lt;a href="https://www.nostria.app/download">Desktop installers&lt;/a> for Linux, macOS, and Windows are also available. &lt;a href="https://github.com/nostria-app/nostria/pull/610">PR #610&lt;/a> reduces feed memory pressure with adaptive runtime limits and preview URL cleanup. v3.1.14 fixes integration with Brainstorm, a &lt;a href="https://nostrcompass.org/en/topics/web-of-trust/">Web of Trust&lt;/a> provider. v3.1.15 focuses on music improvements. The new Android app is available on &lt;a href="https://zapstore.dev/apps/app.nostria">Zapstore&lt;/a>.&lt;/p>
&lt;h3 id="divine-108-ships-resumable-uploads-and-dms">diVine 1.0.8 ships resumable uploads and DMs&lt;/h3>
&lt;p>&lt;a href="https://github.com/divinevideo/divine-mobile">diVine&lt;/a>, the short-form video client, shipped &lt;a href="https://github.com/divinevideo/divine-mobile/releases/tag/1.0.8">1.0.8&lt;/a> with 87 merged PRs. Resumable uploads let creators pick up interrupted uploads chunk by chunk instead of restarting from scratch on a flaky connection. The release adds video quality and bitrate settings, double-tap to like, and DM improvements. &lt;a href="https://github.com/divinevideo/divine-mobile/pull/2722">PR #2722&lt;/a> adds a macOS camera plugin for desktop video capture, and &lt;a href="https://github.com/divinevideo/divine-mobile/pull/2820">PR #2820&lt;/a> migrates the notification system to a BLoC architecture with enrichment and grouping. The team also replaced AI-generated stickers and category art with OpenMoji SVGs (&lt;a href="https://github.com/divinevideo/divine-mobile/pull/2844">PR #2844&lt;/a>, &lt;a href="https://github.com/divinevideo/divine-mobile/pull/2842">PR #2842&lt;/a>).&lt;/p>
&lt;h3 id="manent-v130-adds-sensitive-note-blurring-and-nip-42-auth">Manent v1.3.0 adds sensitive note blurring and NIP-42 auth&lt;/h3>
&lt;p>&lt;a href="https://github.com/dtonon/manent">Manent&lt;/a>, the private encrypted notes and file storage app, shipped &lt;a href="https://github.com/dtonon/manent/releases/tag/v1.3.0">v1.3.0&lt;/a> on April 2. Users can now mark notes as sensitive to blur them in the list view, keeping private content hidden during casual scrolling. The release also adds &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> (Authentication of Clients to Relays) support, letting Manent authenticate to relays that require it before accepting events. Manent stores all data encrypted on Nostr relays using the user&amp;rsquo;s keypair, so NIP-42 support expands the set of relays it can use for storage.&lt;/p>
&lt;h3 id="wisp-v0170-through-v0173-add-live-stream-zaps-and-wallet-backup">Wisp v0.17.0 through v0.17.3 add live stream zaps and wallet backup&lt;/h3>
&lt;p>&lt;a href="https://github.com/barrydeen/wisp">Wisp&lt;/a>, the Android Nostr client, shipped six releases from &lt;a href="https://github.com/barrydeen/wisp/releases/tag/v0.16.2-beta">v0.16.2-beta&lt;/a> through &lt;a href="https://github.com/barrydeen/wisp/releases/tag/v0.17.3-beta">v0.17.3-beta&lt;/a> with 44 merged PRs. The v0.17.0 release adds wallet backup safety prompts and zap UX improvements. &lt;a href="https://github.com/barrydeen/wisp/releases/tag/v0.17.1-beta">v0.17.1&lt;/a> adds live stream chat visibility across platforms and live stream zap functionality. &lt;a href="https://github.com/barrydeen/wisp/pull/423">PR #423&lt;/a> adds auto-search profiles, a zap success animation, and user status improvements. &lt;a href="https://github.com/barrydeen/wisp/pull/426">PR #426&lt;/a> fixes an out-of-memory crash in &lt;code>computeId&lt;/code> for events with large tag lists. The v0.16.x releases added emoji shortcode autocomplete, group chat UI improvements, and blocked user filtering across all notification paths.&lt;/p>
&lt;h3 id="mostro-ships-deep-links-nostr-exchange-rates-and-a-duplicate-payment-fix">Mostro ships deep links, Nostr exchange rates, and a duplicate payment fix&lt;/h3>
&lt;p>&lt;a href="https://github.com/MostroP2P/mostro">Mostro&lt;/a>, the peer-to-peer Bitcoin exchange built on Nostr, saw updates across both its server daemon and mobile client this week. On the server side, &lt;a href="https://github.com/MostroP2P/mostro/pull/692">PR #692&lt;/a> prevents stale order writes from causing duplicate payments, a bug that could result in a seller being paid twice for the same trade. &lt;a href="https://github.com/MostroP2P/mostro/pull/693">PR #693&lt;/a> uses targeted updates for dev_fee writes instead of full order overwrites.&lt;/p>
&lt;p>&lt;a href="https://github.com/MostroP2P/mobile">Mostro Mobile&lt;/a>, the Flutter client, shipped &lt;a href="https://github.com/MostroP2P/mobile/releases/tag/v1.2.3">v1.2.3&lt;/a> on April 3. The release handles deep links from different Mostro instances, so users can tap links that route to the correct exchange server. &lt;a href="https://github.com/MostroP2P/mobile/pull/498">PR #498&lt;/a> detects admin and dispute DMs in the background notification pipeline, and the app now fetches exchange rates from Nostr with an HTTP/cache fallback. &lt;a href="https://github.com/MostroP2P/mobile/pull/560">PR #560&lt;/a> fixes a relay connection blocking bug that prevented the app from reaching relays under certain network conditions.&lt;/p>
&lt;h3 id="unfiltered-v1012-adds-hashtags-and-comments">Unfiltered v1.0.12 adds hashtags and comments&lt;/h3>
&lt;p>&lt;a href="https://github.com/dmcarrington/unfiltered">Unfiltered&lt;/a>, a Nostr client focused on image-forward content, shipped &lt;a href="https://github.com/dmcarrington/unfiltered/releases/tag/v1.0.12">v1.0.12&lt;/a>. &lt;a href="https://github.com/dmcarrington/unfiltered/pull/69">PR #69&lt;/a> adds hashtag support and &lt;a href="https://github.com/dmcarrington/unfiltered/pull/72">PR #72&lt;/a> adds the ability to write and display comments on posts. &lt;a href="https://github.com/dmcarrington/unfiltered/pull/71">PR #71&lt;/a> fixes navigation issues with multiple images per post.&lt;/p>
&lt;h3 id="primal-android-ships-wallet-multi-account-sharing-and-remote-signer-auto-reconnect">Primal Android ships wallet multi-account sharing and remote signer auto-reconnect&lt;/h3>
&lt;p>&lt;a href="https://github.com/PrimalHQ/primal-android-app">Primal&lt;/a>, the Android Nostr client, shipped a release on April 7. The update adds wallet multi-account sharing and overflow menu with wallet deletion in Dev Tools. The remote signer now auto-reconnects on connection drops, and the wallet service gained its own auto-reconnect logic. Fixes include poll zap votes no longer appearing as Top Zaps, empty poll option crash prevention, wallet balance hiding when no wallet exists, and WalletException type mapping to error codes in NWC responses.&lt;/p>
&lt;h3 id="titan-v010-launches-native-nsite-browser-with-bitcoin-name-registration">Titan v0.1.0 launches native nsite:// browser with Bitcoin name registration&lt;/h3>
&lt;p>&lt;a href="https://github.com/btcjt/titan">Titan&lt;/a>, a native desktop browser for the Nostr web, shipped &lt;a href="https://github.com/btcjt/titan/releases/tag/v0.1.0">v0.1.0&lt;/a> on April 7. Titan resolves &lt;code>nsite://&lt;/code> URLs by looking up human-readable names registered on Bitcoin, querying Nostr relays for the site&amp;rsquo;s content events, and rendering pages fetched from &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> servers. The result is a web browsing experience with no DNS, no TLS certificates, and no hosting providers. Names are registered through a &lt;a href="https://npub1hmq6xuqnplk5lw0h3700cujmx5gymqn5wrn42u6432r6ntzumezqc3marw.nsite.lol/register">web interface&lt;/a> tied to Bitcoin transactions. The initial release ships as a macOS &lt;code>.dmg&lt;/code> (ARM, with Rosetta 2 support for Intel) and includes Nix development environment support.&lt;/p>
&lt;h3 id="bikel-v150-ships-native-foreground-service-for-de-googled-phones">Bikel v1.5.0 ships native foreground service for de-Googled phones&lt;/h3>
&lt;p>&lt;a href="https://github.com/Mnpezz/bikel">Bikel&lt;/a>, a decentralized cycling tracker that turns rides into public infrastructure data using Nostr, shipped &lt;a href="https://github.com/Mnpezz/bikel/releases/tag/v1.5.0">v1.5.0&lt;/a> on April 4. The release migrates from GMS-dependent Expo TaskManager to a custom native foreground service, ensuring reliable background ride tracking on LineageOS, GrapheneOS, and other de-Googled Android variants. The Bikel Bot gained dual-pocket architecture with autonomous eCash collection via Cashu nutzaps. v1.4.3 and v1.4.2 fix background tracking sync for non-standard Android environments, and the app adds OSM bike rack map point toggles.&lt;/p>
&lt;h3 id="sprout-adds-nip-01-nip-23-and-nip-33-support">Sprout adds NIP-01, NIP-23, and NIP-33 support&lt;/h3>
&lt;p>&lt;a href="https://github.com/block/sprout">Sprout&lt;/a>, a communication platform by Block with a built-in Nostr relay, shipped &lt;a href="https://github.com/block/sprout/releases/tag/desktop/v0.1.0-rc7">desktop/v0.1.0-rc7&lt;/a> on April 6. This week the team added support for &lt;a href="https://nostrcompass.org/en/topics/nip-23/">NIP-23&lt;/a> (Long-form Content) kind &lt;code>30023&lt;/code> articles, &lt;a href="https://nostrcompass.org/en/topics/nip-33/">NIP-33&lt;/a> parameterized replaceable events with &lt;code>d&lt;/code>-tag keyed replacement, and &lt;a href="https://nostrcompass.org/en/topics/nip-01/">NIP-01&lt;/a>/&lt;a href="https://nostrcompass.org/en/topics/nip-02/">NIP-02&lt;/a> kind &lt;code>1&lt;/code> text notes and kind &lt;code>3&lt;/code> follow lists. The release also adds an adaptive IDE theme system with 54 themes, workflow and agent run history UX polish, and a members sidebar cleanup.&lt;/p>
&lt;h3 id="mesh-llm-v0560-ships-distributed-config-protocol">mesh-llm v0.56.0 ships distributed config protocol&lt;/h3>
&lt;p>&lt;a href="https://github.com/michaelneale/mesh-llm">mesh-llm&lt;/a>, a distributed LLM inference system that uses Nostr keypairs for node identity, shipped &lt;a href="https://github.com/michaelneale/mesh-llm/releases/tag/v0.56.0">v0.56.0&lt;/a> on April 7. The release adds a distributed config protocol with ownership semantics, asymmetric KV cache quantization (Q8_0 keys with Q4 values) for reduced memory usage, OS keychain storage for identity keystores, smooth chat streaming with message queuing, and fixes for fullscreen layout and KV cache splitting with flash attention.&lt;/p>
&lt;h3 id="nostr-vpn-ships-exit-node-support-and-umbrel-packaging">Nostr VPN ships exit node support and Umbrel packaging&lt;/h3>
&lt;p>&lt;a href="https://github.com/mmalmi/nostr-vpn">Nostr VPN&lt;/a>, a peer-to-peer VPN that uses Nostr relays for signaling and WireGuard for encrypted tunnels, shipped six releases from &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v0.3.0">v0.3.0&lt;/a> through &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v0.3.6">v0.3.6&lt;/a> this week. The v0.3.x cycle adds exit node support on Windows and macOS, letting peers route internet traffic through other nodes in the network. Invite and alias propagation now sync over Nostr, so users can share network access without out-of-band coordination. The releases add Umbrel packaging for self-hosted deployment, NAT punch-through using remembered public endpoints, automatic stale exit node cleanup, and a published protocol specification. The project also stabilized macOS route handling with self-healing default routes and underlay repair, and added an Android build via Tauri. Builds are available for macOS (Apple Silicon and Intel), Linux (AppImage and .deb), Windows, and Android.&lt;/p>
&lt;h3 id="nymchat-reverts-marmot-ships-enhanced-nip-17-group-chats">Nymchat reverts Marmot, ships enhanced NIP-17 group chats&lt;/h3>
&lt;p>&lt;a href="https://github.com/Spl0itable/NYM">Nymchat&lt;/a>, the MLS-capable chat client, shipped 14 releases from &lt;a href="https://github.com/Spl0itable/NYM/releases/tag/3.56.261">v3.56.261&lt;/a> through &lt;a href="https://github.com/Spl0itable/NYM/releases/tag/v3.58.274">v3.58.274&lt;/a>. The most significant change is a protocol pivot: &lt;a href="https://github.com/Spl0itable/NYM/releases/tag/v3.57.261">v3.57.261&lt;/a> added Marmot MLS group chats, but &lt;a href="https://github.com/Spl0itable/NYM/releases/tag/v3.58.268">v3.58.268&lt;/a> reverted back to &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> because Marmot&amp;rsquo;s multi-device support is not yet finished, which caused issues with group chat state synchronization across devices. v3.58.271 introduces enhanced NIP-17 group chats with rotating ephemeral keys for all messages, designed to prevent timing and correlation attacks. The week also brought a friend system with granular control over settings (&lt;a href="https://github.com/Spl0itable/NYM/releases/tag/v3.58.262">v3.58.262&lt;/a>), MLS group chat message sync in encrypted app settings, and multiple relay connectivity fixes.&lt;/p>
&lt;h3 id="nak-v0195-adds-blossom-multi-server-and-outbox-publishing">nak v0.19.5 adds Blossom multi-server and outbox publishing&lt;/h3>
&lt;p>&lt;a href="https://github.com/fiatjaf/nak">nak&lt;/a>, fiatjaf&amp;rsquo;s command-line Nostr toolkit, shipped &lt;a href="https://github.com/fiatjaf/nak/releases/tag/v0.19.5">v0.19.5&lt;/a>. The &lt;code>blossom&lt;/code> command now accepts multiple &lt;code>--server&lt;/code> flags for uploading to several &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> servers in one call. A new &lt;code>key&lt;/code> command expands partial keys by left-padding with zeroes. The &lt;code>event&lt;/code> command gains an &lt;code>--outbox&lt;/code> flag for publishing events through the outbox model, and &lt;code>fetch&lt;/code> now exits with an error code when no event is returned.&lt;/p>
&lt;h2 id="in-development">In Development&lt;/h2>
&lt;h3 id="white-noise-adds-thumbhash-previews-and-push-registration-bridge">White Noise adds thumbhash previews and push registration bridge&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/whitenoise">White Noise&lt;/a>, the private messenger built on the &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> protocol, merged five PRs. &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/549">PR #549&lt;/a> replaces blurhash image previews with thumbhash, a newer algorithm that produces sharper placeholder images at a smaller payload size (typically under 30 bytes versus blurhash&amp;rsquo;s ~50-100 bytes) while preserving the aspect ratio and color distribution of the original image. Blurhash is retained as a fallback for older content. &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/548">PR #548&lt;/a> updates whitenoise-rs and adds the &lt;a href="https://nostrcompass.org/en/topics/mip-05/">MIP-05&lt;/a> push registration bridge, connecting the &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#marmot-moves-keypackages-to-addressable-events-and-tightens-push-notifications">push notification spec work from last week&lt;/a> to the client. &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/493">PR #493&lt;/a> adds cursor-based pagination for chat messages, replacing the previous loading strategy with a scroll-driven approach.&lt;/p>
&lt;h3 id="route96-adds-dynamic-label-configuration-and-zero-egress-cleanup">Route96 adds dynamic label configuration and zero-egress cleanup&lt;/h3>
&lt;p>&lt;a href="https://github.com/v0l/route96">Route96&lt;/a>, the &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> media server by v0l, merged three PRs. &lt;a href="https://github.com/v0l/route96/pull/80">PR #80&lt;/a> adds dynamic label model configuration via the admin API, letting operators swap content classification models without restarting the server. &lt;a href="https://github.com/v0l/route96/pull/82">PR #82&lt;/a> adds label configuration fields to the admin UI. &lt;a href="https://github.com/v0l/route96/pull/79">PR #79&lt;/a> adds a zero-egress file cleanup policy that automatically removes files that have never been downloaded, keeping storage costs down for operators.&lt;/p>
&lt;h3 id="snort-ships-security-hardening-and-dvm-payment-invoices">Snort ships security hardening and DVM payment invoices&lt;/h3>
&lt;p>&lt;a href="https://github.com/v0l/snort">Snort&lt;/a>, the web client, shipped two releases this week with a comprehensive security audit. Fixes include Schnorr signature verification, &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> relay message forgery protection (preventing attackers from injecting signing requests through compromised relays), PIN encryption improvements, and removal of NIP-26 delegation trust. Performance gains come from batched Schnorr verification in WASM, lazy-loaded routes, pre-compiled translations, and elimination of double verification per event. &lt;a href="https://github.com/v0l/snort/pull/618">PR #618&lt;/a> adds &lt;a href="https://nostrcompass.org/en/topics/nip-90/">NIP-90&lt;/a> (Data Vending Machine) kind &lt;code>7000&lt;/code> payment-required invoice display, so when a DVM responds with a payment requirement, Snort renders the Lightning invoice directly in the feed.&lt;/p>
&lt;h3 id="damus-improves-lmdb-compaction">Damus improves LMDB compaction&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/damus">Damus&lt;/a>, the iOS client, merged &lt;a href="https://github.com/damus-io/damus/pull/3719">PR #3719&lt;/a> adding automatic LMDB compaction on a schedule, preventing the local database from growing unbounded over time. &lt;a href="https://github.com/damus-io/damus/pull/3663">PR #3663&lt;/a> improves the BlurOverlayView to look protective instead of broken.&lt;/p>
&lt;h3 id="captains-log-adds-tag-indexing-and-note-sync">Captain&amp;rsquo;s Log adds tag indexing and note sync&lt;/h3>
&lt;p>&lt;a href="https://github.com/nodetec/captains-log">Captain&amp;rsquo;s Log&lt;/a> (Comet), the Nostr-native long-form writing tool from Nodetec, merged four PRs this week. &lt;a href="https://github.com/nodetec/captains-log/pull/156">PR #156&lt;/a> adds tag indexing and sync support across notes, &lt;a href="https://github.com/nodetec/captains-log/pull/157">PR #157&lt;/a> refactors note sync and tag handling, and &lt;a href="https://github.com/nodetec/captains-log/pull/159">PR #159&lt;/a> fixes trashed note sync so deleted notes stay deleted across devices.&lt;/p>
&lt;h3 id="relatr-v02x-redesigns-plugin-system-with-nostr-native-validator-marketplace">Relatr v0.2.x redesigns plugin system with Nostr-native validator marketplace&lt;/h3>
&lt;p>&lt;a href="https://github.com/ContextVM/relatr">Relatr&lt;/a>, a &lt;a href="https://nostrcompass.org/en/topics/web-of-trust/">Web of Trust&lt;/a> scoring engine that computes trust rankings from social graph distance and configurable validators, shipped the v0.2.x family with a complete plugin system redesign. Validators are now written in Elo, a portable functional expression language forked to support multi-step host-orchestrated capabilities (Nostr queries, social graph lookups, NIP-05 resolution). Plugins are published as kind &lt;code>765&lt;/code> Nostr events, making distribution native to the relay network. A new &lt;a href="https://relatr.net">plugin marketplace&lt;/a> lets operators discover, install, and weight validators from the browser, with a CLI (&lt;code>relo&lt;/code>) for local authoring and publishing. The architecture is sandboxed: plugins can only invoke capabilities the host explicitly provides, so a malicious validator cannot escape its defined scope. Relatr instances can now be managed from the website, with full visibility into which plugins compose the scoring algorithm and their individual weights.&lt;/p>
&lt;h3 id="shopstr-improves-mobile-navigation-and-access-control">Shopstr improves mobile navigation and access control&lt;/h3>
&lt;p>&lt;a href="https://github.com/shopstr-eng/shopstr">Shopstr&lt;/a>, the Nostr-native marketplace for buying and selling with Bitcoin, pushed 158 commits across its main app and the &lt;a href="https://github.com/shopstr-eng/milk-market">Milk Market&lt;/a> companion project this week. Fixes include mobile community layout improvements, menu close-on-navigation behavior, and dropdown auto-close. Protected routes can no longer be accessed via direct URL without signing in, and the slug matching logic now handles multiple exact matches correctly.&lt;/p>
&lt;h3 id="pollerama-adds-notifications-movie-search-and-rating-ui">Pollerama adds notifications, movie search, and rating UI&lt;/h3>
&lt;p>&lt;a href="https://github.com/formstr-hq/nostr-polls">Pollerama&lt;/a>, a polling, survey, and social rating app built on Nostr, added thread notifications, a movie search feature, and a rating UI overhaul. The release also fixes feed loading issues and bumps dependency versions.&lt;/p>
&lt;h3 id="purser-builds-nostr-native-payment-daemon-with-marmot-encryption">Purser builds Nostr-native payment daemon with Marmot encryption&lt;/h3>
&lt;p>&lt;a href="https://github.com/EthnTuttle/purser">Purser&lt;/a>, a Nostr-native payment daemon designed as a Zaprite replacement, merged nine PRs this week building out its core architecture. The project uses &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> MLS via MDK for encrypted merchant-customer messaging, with Strike and Square as payment providers. This week landed config and catalog loading, message schema validation, the MDK communication layer, Strike and Square provider implementations, a polling engine, anti-spam rate limiting, pending payment persistence, and the order processing pipeline. All 99 tests now exercise actual mdk-core MLS operations after the team removed mock MLS in favor of real encryption in local mode.&lt;/p>
&lt;h3 id="vector-refactors-dm-attachments-and-adds-profile-editing">Vector refactors DM attachments and adds profile editing&lt;/h3>
&lt;p>&lt;a href="https://github.com/VectorPrivacy/Vector">Vector&lt;/a>, the privacy-focused Nostr messenger built with Tauri, merged &lt;a href="https://github.com/VectorPrivacy/Vector/pull/55">PR #55&lt;/a> refactoring the frontend. DM attachment decryption and saving moved to the vector-core library, and the app now supports profile editing. The upload cancel flag is properly wired through TauriSendCallback, and unused attachment preview callbacks were cleaned up.&lt;/p>
&lt;h2 id="protocol-and-spec-work">Protocol and Spec Work&lt;/h2>
&lt;h3 id="nip-updates">NIP Updates&lt;/h3>
&lt;p>Recent changes to the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a>:&lt;/p>
&lt;p>&lt;strong>Merged:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-58/">NIP-58&lt;/a> (Badges): Profile Badges move to kind 10008, Badge Sets to kind 30008&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2276">PR #2276&lt;/a>): Migrates Profile Badges from kind &lt;code>30008&lt;/code> to kind &lt;code>10008&lt;/code> (a replaceable event, one per pubkey) and introduces kind &lt;code>30008&lt;/code> for Badge Sets. Previously, Profile Badges used the same kind (&lt;code>30008&lt;/code>) as Badge definitions, making them parameterized replaceable events keyed by a &lt;code>d&lt;/code> tag. The new kind &lt;code>10008&lt;/code> is a simple replaceable event: one per pubkey, no &lt;code>d&lt;/code> tag needed. Clients query a single replaceable event per user instead of scanning parameterized replaceable events. Amethyst v1.07.3 already ships with this migration.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> (Git Stuff): Add git-related follow lists&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2130">PR #2130&lt;/a>): Adds follow list conventions for NIP-34 repository and issue tracking. Users publish kind &lt;code>30000&lt;/code> follow sets with &lt;code>d&lt;/code> tags like &lt;code>git-repos&lt;/code> or &lt;code>git-issues&lt;/code> containing &lt;code>a&lt;/code> tag references to repositories (kind &lt;code>30617&lt;/code>) they want to track. Clients can subscribe to these follow sets to show repository activity in a user&amp;rsquo;s feed, similar to how kind &lt;code>3&lt;/code> contact lists work for pubkeys.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Open PRs and Discussions:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>NIP-AC: P2P Voice and Video Calls over WebRTC&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2301">PR #2301&lt;/a>): Expands the original NIP-100 (implemented by 0xChat) with three changes: migration to &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encryption wrapped in &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> gift wraps to eliminate metadata leaks, a specified WebRTC workflow for voice and video call setup (offer, answer, ICE candidates), and a mesh group call model where each peer establishes a direct WebRTC connection to every other peer. The spec is not backwards-compatible with NIP-100. Amethyst is already building against it, with a call state machine test suite (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/2143">PR #2143&lt;/a>) and stale call offer handling (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/2164">PR #2164&lt;/a>) landing this week.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-340/">NIP-340&lt;/a> (FROST Quorum)&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2299">PR #2299&lt;/a>): Proposes conventions for &lt;a href="https://nostrcompass.org/en/topics/frost/">FROST&lt;/a> (Flexible Round-Optimized Schnorr Threshold) threshold signing on Nostr. FROST lets a group of signers collectively control a Nostr identity where any t-of-n members can sign events without reconstructing the full private key. The NIP defines how to coordinate signing rounds, distribute key shares, and publish threshold-signed events, building on the Igloo signer work from the &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#igloo-signer-11">FROSTR project&lt;/a>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-5d/">NIP-5D&lt;/a> (Nostr Web Applets)&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2303">PR #2303&lt;/a>): Defines a &lt;code>postMessage&lt;/code> protocol for sandboxed web applications (&amp;ldquo;napplets&amp;rdquo;) running in iframes to communicate with a hosting application (&amp;ldquo;shell&amp;rdquo;). The shell provides the napplet with Nostr signing, relay access, and user context through a structured message API, while the iframe sandbox prevents direct key access. This extends the static website hosting model from &lt;a href="https://nostrcompass.org/en/topics/nip-5a/">NIP-5A&lt;/a> toward interactive applications that can read and write Nostr events. The NIP is under active development with a working runtime implementation.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-5c/">NIP-5C&lt;/a> (Scrolls)&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2281">PR #2281&lt;/a>): Renamed from the earlier NIP-A5 proposal. Defines conventions for publishing and discovering WebAssembly programs on Nostr. WASM binaries are stored as Nostr events, and clients can download and execute them in a sandboxed runtime. A &lt;a href="https://nprogram.netlify.app/">demo app&lt;/a> shows scrolls running in-browser, with example programs published as Nostr events that any client can fetch and execute.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-85/">NIP-85&lt;/a> (Trusted Assertions): Clarifications&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2304">PR #2304&lt;/a>): Tightens the specification language around multiple keys and relays per service provider, clarifying how clients should handle assertions from providers that operate across several pubkeys or relay endpoints.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-24/">NIP-24&lt;/a> (Extra Metadata Fields): published_at for replaceable events&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2300">PR #2300&lt;/a>): Generalizes the &lt;code>published_at&lt;/code> tag from &lt;a href="https://nostrcompass.org/en/topics/nip-23/">NIP-23&lt;/a> (Long-form Content) to all replaceable and addressable events. The tag is display-only: if &lt;code>published_at&lt;/code> equals &lt;code>created_at&lt;/code>, clients show the event as &amp;ldquo;created&amp;rdquo; at that time; if they differ (because the event was updated), clients can show &amp;ldquo;updated&amp;rdquo; instead. This lets kind &lt;code>0&lt;/code> profiles display &amp;ldquo;joined at&amp;rdquo; dates and other replaceable events preserve their original publication timestamp across updates. A complementary &lt;a href="https://nostrcompass.org/en/topics/nip-51/">NIP-51&lt;/a> proposal (&lt;a href="https://github.com/nostr-protocol/nips/pull/2302">PR #2302&lt;/a>) adds the same tag to list events.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> (Gift Wrap): Ephemeral gift wrap kind&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2245">PR #2245&lt;/a>): Adds kind &lt;code>21059&lt;/code> as an ephemeral counterpart to the existing kind &lt;code>1059&lt;/code> gift wrap. Ephemeral events (kinds &lt;code>20000&lt;/code>-&lt;code>29999&lt;/code>) follow &lt;a href="https://nostrcompass.org/en/topics/nip-01/">NIP-01&lt;/a> semantics: relays are not expected to store them and may discard them after delivery. This lets applications send gift-wrapped messages that disappear from relays once delivered, reducing storage requirements for high-volume messaging while keeping the same three-layer encryption model as regular &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> DMs.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h3 id="opensats-announces-sixteenth-wave-of-nostr-grants">OpenSats announces sixteenth wave of Nostr grants&lt;/h3>
&lt;p>&lt;a href="https://opensats.org">OpenSats&lt;/a> announced its &lt;a href="https://opensats.org/blog/sixteenth-wave-of-nostr-grants">sixteenth wave of Nostr grants&lt;/a> on April 8, funding four first-time grants and one renewal. &lt;a href="https://github.com/vitorpamplona/amethyst/tree/main/desktopApp">Amethyst Desktop&lt;/a> receives funding for contributor Robert Nagy to build a standalone desktop app on top of the &lt;a href="https://nostrcompass.org/en/topics/quartz/">Quartz&lt;/a> and Commons modules, bringing the Android client&amp;rsquo;s feature set to mouse-driven interfaces with persistent relay connections. &lt;a href="https://github.com/nogringo/nostr-mail">Nostr Mail&lt;/a> receives funding to build a full email system on Nostr using kind &lt;code>1301&lt;/code> events wrapped in &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> gift wraps, with a Flutter client and SMTP bridge servers for Gmail/Outlook compatibility. &lt;a href="https://github.com/Nostrord/nostrord">Nostrord&lt;/a> receives funding for a Kotlin Multiplatform &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> relay-based group client with Discord-like group messaging, moderation, and threads. &lt;a href="https://github.com/tami1A84/null--nostr">Nurunuru&lt;/a> receives funding to build a native iOS version of the Japanese-focused Nostr client modeled on LINE&amp;rsquo;s familiar interface, with passkey-based biometric login for onboarding. HAMSTR received a grant renewal (first funded in the &lt;a href="https://opensats.org/blog/eleventh-wave-of-nostr-grants#hamstr">eleventh wave&lt;/a>).&lt;/p>
&lt;h2 id="nip-deep-dive-nip-17-private-direct-messages">NIP Deep Dive: NIP-17 (Private Direct Messages)&lt;/h2>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/17.md">NIP-17&lt;/a> defines the current standard for private direct messages on Nostr. It replaces the older &lt;a href="https://nostrcompass.org/en/topics/nip-04/">NIP-04&lt;/a> (Encrypted Direct Messages) scheme, which leaked metadata (sender, receiver, and timestamps were all visible on relays) and used a weaker encryption construction. NIP-17 combines &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> (Encrypted Payloads) for encryption with &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> (Gift Wrap) for metadata protection, creating a three-layer system where relays cannot see who is talking to whom.&lt;/p>
&lt;p>The protocol uses three event kinds stacked inside each other. The innermost layer is the actual message, an unsigned kind &lt;code>14&lt;/code> event:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;d7e3a4b9c1f2e8d6a5b4c3d2e1f09876d7e3a4b9c1f2e8d6a5b4c3d2e1f09876&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1744108800&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">14&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;f1a2b3c4d5e6f7890123456789abcdef01234567890abcdef1234567890abcdef&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://inbox.example.com&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;subject&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Project update&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;The new relay config is deployed. Let me know if you see any issues.&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The kind &lt;code>14&lt;/code> event is deliberately unsigned (empty &lt;code>sig&lt;/code>). The spec describes this as providing deniability, but in practice the protection is limited. The kind &lt;code>13&lt;/code> seal that wraps the rumor is signed by the sender&amp;rsquo;s real key. A recipient can show the signed seal to a third party, proving the sender communicated with them, even without revealing the message content. With zero-knowledge proofs, a recipient can prove the exact message content without revealing their own private key. The unsigned rumor is like an unsigned letter in a signed envelope: the envelope&amp;rsquo;s signature links the sender to the contents. True deniability would require symmetric authentication (like Signal&amp;rsquo;s HMACs), which is incompatible with Nostr&amp;rsquo;s decentralized relay model where messages must be self-authenticating. NIP-17&amp;rsquo;s real strengths are metadata privacy and content secrecy, not deniability.&lt;/p>
&lt;p>This unsigned message gets wrapped in a kind &lt;code>13&lt;/code> seal, which is signed by the actual sender and encrypted with &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> to the recipient:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;d7e3a4b9c1f2e8d6a5b4c3d2e1f09876d7e3a4b9c1f2e8d6a5b4c3d2e1f09876&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1744022400&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">13&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;nip44-encrypted kind 14 payload&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The seal has no tags, so even if decrypted it would not reveal the recipient. The seal is signed by the sender&amp;rsquo;s real key, which lets the recipient authenticate the message by checking that the seal&amp;rsquo;s &lt;code>pubkey&lt;/code> matches the inner kind &lt;code>14&lt;/code>&amp;rsquo;s &lt;code>pubkey&lt;/code>.&lt;/p>
&lt;p>The seal then gets wrapped in a kind &lt;code>1059&lt;/code> gift wrap, signed by a random throwaway key and addressed to the recipient:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1744065600&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1059&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;f1a2b3c4d5e6f7890123456789abcdef01234567890abcdef1234567890abcdef&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;nip44-encrypted kind 13 payload&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The gift wrap&amp;rsquo;s &lt;code>pubkey&lt;/code> is a random key generated just for this message, and the &lt;code>created_at&lt;/code> is randomized up to two days in the past. This is the outermost layer that relays actually see: a message from an unknown pubkey addressed to the recipient, with a timestamp that does not reflect when the message was actually sent. The randomized timestamp protects against after-the-fact analysis of stored events, but an adversary actively connected to relays can still observe when the gift wrap first appeared, so this defense is limited to passive observers who query relay data later. Because the pubkey is random and the timestamp is fake, relays cannot determine the real sender. To read the message, the recipient decrypts the gift wrap using their own key and the random pubkey, finds the seal inside, decrypts the seal using their own key and the sender&amp;rsquo;s pubkey from the seal, and finds the kind &lt;code>14&lt;/code> message inside.&lt;/p>
&lt;p>NIP-17 does not provide forward secrecy. All messages are encrypted using the static Nostr keypair (via NIP-44&amp;rsquo;s key derivation from the sender and recipient&amp;rsquo;s keys). If a private key is compromised, every past and future message encrypted to that key can be decrypted. This is a deliberate tradeoff: because encryption depends only on the nsec, a user who backs up their nsec can recover their entire message history from any relay that still stores the gift wraps. Protocols like MLS (used by &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a>) provide forward secrecy through rotating key material, but at the cost of requiring state synchronization and making historical message recovery impossible after key rotation.&lt;/p>
&lt;p>NIP-17 also defines kind &lt;code>15&lt;/code> for encrypted file messages, which adds &lt;code>file-type&lt;/code>, &lt;code>encryption-algorithm&lt;/code>, &lt;code>decryption-key&lt;/code>, and &lt;code>decryption-nonce&lt;/code> tags so the recipient can decrypt an attached file that was encrypted with AES-GCM before upload to a Blossom server. Kind &lt;code>10050&lt;/code> is used to publish the user&amp;rsquo;s preferred DM relay list, so senders know where to deliver gift wraps. The set of &lt;code>pubkey&lt;/code> + &lt;code>p&lt;/code> tags in a message defines a chat room; adding or removing a participant creates a new room with clean history.&lt;/p>
&lt;p>Implementations cover most major clients. &lt;a href="https://github.com/psic4t/nospeak">nospeak&lt;/a> uses NIP-17 for all one-on-one messaging. &lt;a href="https://gitea.coracle.social/coracle/flotilla">Flotilla&lt;/a> uses NIP-17 for its proof-of-work DMs. &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a>, &lt;a href="https://github.com/PrimalHQ/primal-android-app">Primal&lt;/a>, &lt;a href="https://github.com/nostur-com/nostur-ios-public">Nostur&lt;/a>, &lt;a href="https://github.com/damus-io/damus">Damus&lt;/a>, &lt;a href="https://github.com/hzrd149/nostrudel">noStrudel&lt;/a>, and &lt;a href="https://github.com/coracle-social/coracle">Coracle&lt;/a> all implement NIP-17 as their primary DM protocol. The spec also supports disappearing messages by setting an &lt;code>expiration&lt;/code> tag in the gift wrap.&lt;/p>
&lt;h2 id="nip-deep-dive-nip-46-nostr-remote-signing">NIP Deep Dive: NIP-46 (Nostr Remote Signing)&lt;/h2>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/46.md">NIP-46&lt;/a> defines a protocol for separating the user&amp;rsquo;s private key from the client application. Instead of pasting an nsec into a web app, the user runs a remote signer (also called a &amp;ldquo;bunker&amp;rdquo;) that holds the private key and responds to signing requests over Nostr relays. The client never sees the private key. This reduces the attack surface: a compromised client can request signatures but cannot extract the key itself.&lt;/p>
&lt;p>The protocol uses kind &lt;code>24133&lt;/code> for both requests and responses, encrypted with &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> (Encrypted Payloads). A client generates a disposable &lt;code>client-keypair&lt;/code> for the session and communicates with the remote signer through NIP-44 encrypted messages tagged with each other&amp;rsquo;s pubkeys. Here is a signing request from a client to a remote signer:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;aa11bb22cc33dd44ee55ff6677889900aabbccdd11223344556677889900aabb&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;eff37350d839ce3707332348af4549a96051bd695d3223af4aabce4993531d86&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1744108800&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">24133&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;nip44-encrypted JSON-RPC request&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;1122334455667788990011223344556677889900aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff0011223344556677&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The encrypted &lt;code>content&lt;/code> contains a JSON-RPC-like structure:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;random-request-id-1&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;method&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;sign_event&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;params&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;{\&amp;#34;kind\&amp;#34;:1,\&amp;#34;content\&amp;#34;:\&amp;#34;Hello from remote signing\&amp;#34;,\&amp;#34;tags\&amp;#34;:[],\&amp;#34;created_at\&amp;#34;:1744108800}&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The remote signer decrypts the request, presents it to the user for approval (or auto-approves based on configured permissions), signs the event with the user&amp;rsquo;s private key, and returns the signed event in a response:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;bb22cc33dd44ee55ff6677889900aabb11223344556677889900aabbccddeeff&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1744108801&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">24133&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;eff37350d839ce3707332348af4549a96051bd695d3223af4aabce4993531d86&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;nip44-encrypted JSON-RPC response&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Connections can be initiated from either side. A remote signer provides a &lt;code>bunker://&lt;/code> URL containing its pubkey and relay information. A client provides a &lt;code>nostrconnect://&lt;/code> URL with its client pubkey, relays, and a secret for connection verification. The &lt;code>secret&lt;/code> parameter prevents connection spoofing: only the party that received the URL out-of-band can complete the handshake.&lt;/p>
&lt;p>Eight methods are defined: &lt;code>connect&lt;/code> for establishing the session, &lt;code>sign_event&lt;/code> for signing events, &lt;code>get_public_key&lt;/code> for learning the user&amp;rsquo;s pubkey, &lt;code>ping&lt;/code> for keepalive, &lt;code>nip04_encrypt&lt;/code>/&lt;code>nip04_decrypt&lt;/code> for legacy encryption, &lt;code>nip44_encrypt&lt;/code>/&lt;code>nip44_decrypt&lt;/code> for current encryption, and &lt;code>switch_relays&lt;/code> for relay management. Relay migration is handled by the remote signer, which can move the connection to new relays over time without breaking the session.&lt;/p>
&lt;p>Clients request specific capabilities at connection time through a permission system. A permission string like &lt;code>nip44_encrypt,sign_event:1,sign_event:14&lt;/code> requests NIP-44 encryption access and signing access for kind &lt;code>1&lt;/code> and kind &lt;code>14&lt;/code> events only. The remote signer can accept, reject, or modify these permissions. This means a web client for reading and posting notes might only get &lt;code>sign_event:1&lt;/code> permission, while a DM client might also get &lt;code>sign_event:14&lt;/code> and &lt;code>nip44_encrypt&lt;/code> permissions.&lt;/p>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> implements NIP-46 on Android, and its &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-08-newsletter/#amber-v600-pre1-adds-per-connection-nip-46-signing-keys">v6.0.0-pre1&lt;/a> this week adds per-connection signing keys for isolation between clients. &lt;a href="https://github.com/nicktee/nsecapp">nsec.app&lt;/a> (formerly Nostr Connect) provides a web-based bunker. &lt;a href="https://github.com/nbd-wtf/nostr-tools">nostr-tools&lt;/a> includes &lt;code>BunkerSigner&lt;/code> for JavaScript clients, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#nostr-tools-adds-bunker-relay-control-and-fixes-nip-47-multi-relay-parsing">last week&amp;rsquo;s PR #530&lt;/a> added &lt;code>skipSwitchRelays&lt;/code> for manual relay management. The protocol also supports auth challenges: when a remote signer needs additional authentication (password, biometric, or hardware token), it responds with an &lt;code>auth_url&lt;/code> that the client opens in a browser for the user to complete.&lt;/p>
&lt;hr>
&lt;p>That&amp;rsquo;s it for this week. Building something or have news to share? DM us on Nostr or find us at &lt;a href="https://nostrcompass.org">nostrcompass.org&lt;/a>.&lt;/p></content:encoded></item><item><title>Nostr Compass #16</title><link>https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/</link><pubDate>Wed, 01 Apr 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#amethyst-ships-pinned-notes-relay-management-and-request-to-vanish">v1.07.0&lt;/a> with pinned notes, relay management via &lt;a href="https://nostrcompass.org/en/topics/nip-86/">NIP-86&lt;/a>, and &lt;a href="https://nostrcompass.org/en/topics/nip-62/">NIP-62&lt;/a> Request to Vanish support. &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#nip-5a-merges-bringing-static-websites-to-nostr">NIP-5A&lt;/a> (Static Websites) merges into the NIPs repository, defining how to host websites under Nostr keypairs using &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> storage. &lt;a href="https://gitea.coracle.social/coracle/flotilla">Flotilla&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#flotilla-v170-adds-voice-rooms-and-email-login">v1.7.0&lt;/a> with voice rooms, email/password login, and proof-of-work DMs. &lt;a href="https://github.com/marmot-protocol/whitenoise">White Noise&lt;/a> fixes relay churn in &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#white-noise-fixes-relay-churn-and-expands-client-controls">v2026.3.23&lt;/a>, &lt;a href="https://github.com/psic4t/nospeak">nospeak&lt;/a> launches its &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#nospeak-launches-as-a-10-private-messenger">1.0.0&lt;/a> as a no-signup encrypted messenger. &lt;a href="https://github.com/Spl0itable/NYM">Nymchat&lt;/a> &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#nymchat-ships-marmot-powered-group-chats">adopts Marmot&lt;/a> for MLS-encrypted group chats with NIP-17 fallback. &lt;a href="https://github.com/formstr-hq/nostr-calendar">Calendar by Form*&lt;/a> reaches &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#calendar-by-form-v100">v1.0.0&lt;/a> with private calendar lists and ICS import, &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> adds &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#amber-v502-through-v504">mnemonic recovery and NIP-42 relay auth whitelisting&lt;/a>, and the &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#marmot-moves-keypackages-to-addressable-events-and-tightens-push-notifications">Marmot spec&lt;/a> moves KeyPackages to addressable events while tightening MIP-05 push notification formatting.&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#amethyst-ships-pinned-notes-relay-management-and-request-to-vanish">v1.07.0&lt;/a> with pinned notes, relay management via &lt;a href="https://nostrcompass.org/en/topics/nip-86/">NIP-86&lt;/a>, and &lt;a href="https://nostrcompass.org/en/topics/nip-62/">NIP-62&lt;/a> Request to Vanish support. &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#nip-5a-merges-bringing-static-websites-to-nostr">NIP-5A&lt;/a> (Static Websites) merges into the NIPs repository, defining how to host websites under Nostr keypairs using &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> storage. &lt;a href="https://gitea.coracle.social/coracle/flotilla">Flotilla&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#flotilla-v170-adds-voice-rooms-and-email-login">v1.7.0&lt;/a> with voice rooms, email/password login, and proof-of-work DMs. &lt;a href="https://github.com/marmot-protocol/whitenoise">White Noise&lt;/a> fixes relay churn in &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#white-noise-fixes-relay-churn-and-expands-client-controls">v2026.3.23&lt;/a>, &lt;a href="https://github.com/psic4t/nospeak">nospeak&lt;/a> launches its &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#nospeak-launches-as-a-10-private-messenger">1.0.0&lt;/a> as a no-signup encrypted messenger. &lt;a href="https://github.com/Spl0itable/NYM">Nymchat&lt;/a> &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#nymchat-ships-marmot-powered-group-chats">adopts Marmot&lt;/a> for MLS-encrypted group chats with NIP-17 fallback. &lt;a href="https://github.com/formstr-hq/nostr-calendar">Calendar by Form*&lt;/a> reaches &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#calendar-by-form-v100">v1.0.0&lt;/a> with private calendar lists and ICS import, &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> adds &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#amber-v502-through-v504">mnemonic recovery and NIP-42 relay auth whitelisting&lt;/a>, and the &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#marmot-moves-keypackages-to-addressable-events-and-tightens-push-notifications">Marmot spec&lt;/a> moves KeyPackages to addressable events while tightening MIP-05 push notification formatting.&lt;/p>
&lt;h2 id="news">News&lt;/h2>
&lt;h3 id="amethyst-ships-pinned-notes-relay-management-and-request-to-vanish">Amethyst ships pinned notes, relay management, and Request to Vanish&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a>, the Android client maintained by vitorpamplona, shipped six releases in three days, from &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.07.0">v1.07.0&lt;/a> through &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.07.5">v1.07.5&lt;/a>. The headline feature set spans six protocol surfaces: pinned notes, a dedicated polls feed screen, &lt;a href="https://nostrcompass.org/en/topics/nip-62/">NIP-62&lt;/a> (Request to Vanish) support for requesting full event deletion from relays, &lt;a href="https://nostrcompass.org/en/topics/nip-86/">NIP-86&lt;/a> (Relay Management API) from within the client, &lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a> (Relay Discovery and Liveness Monitoring) assessments in the relay info screen, and &lt;a href="https://nostrcompass.org/en/topics/nip-43/">NIP-43&lt;/a> (Relay Access Metadata and Requests) member information display.&lt;/p>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-86/">NIP-86&lt;/a> defines a JSON-RPC interface for relay operators, letting clients send administrative commands such as banning pubkeys, allowing pubkeys, and listing banned users over a standardized API. Amethyst now exposes this directly in its relay management UI, so users running their own relays can administer them from the same client they use for posting. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/2039">PR #2039&lt;/a> replaces the old hex-input dialog for ban and allow pubkeys with an interactive user search dialog.&lt;/p>
&lt;p>v1.07.2 added GIF keyboard uploads and fixed a signing regression where Amber rejection responses were being misread because older Amber versions returned an empty string for the &lt;code>rejected&lt;/code> field (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/2042">PR #2042&lt;/a>). v1.07.5 fixes an image uploading crash. The &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.06.2">v1.06.2&lt;/a> and &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.06.3">v1.06.3&lt;/a> releases earlier in the week added a poll type selector for single vs. multiple choice polls, drag-to-seek on video progress bars, and anonymous posting improvements.&lt;/p>
&lt;h3 id="nip-5a-merges-bringing-static-websites-to-nostr">NIP-5A merges, bringing static websites to Nostr&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/5A.md">NIP-5A&lt;/a> (Static Websites) merged via &lt;a href="https://github.com/nostr-protocol/nips/pull/1538">PR #1538&lt;/a>, defining how to host static websites under Nostr keypairs. The spec uses two event kinds: kind &lt;code>15128&lt;/code> for a root site, one per pubkey, and kind &lt;code>35128&lt;/code> for named sites identified by a &lt;code>d&lt;/code> tag. Each manifest maps URL paths to SHA256 hashes, with optional &lt;code>server&lt;/code> tags pointing to &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> storage hosts where the actual files live.&lt;/p>
&lt;p>The hosting model works like this: a site author builds a static site, uploads the files to one or more Blossom servers, then publishes a signed manifest event that maps paths to content hashes. A host server receives web requests, resolves the author&amp;rsquo;s pubkey from the subdomain, fetches the manifest from the author&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> relay list, and serves files by downloading the matching blobs from Blossom. The site stays under the author&amp;rsquo;s control because only that key can sign an updated manifest. The host server is replaceable because any server that understands NIP-5A can serve the same site from the same manifest.&lt;/p>
&lt;p>The spec builds on infrastructure that already exists. &lt;a href="https://github.com/lez/nsite">nsite&lt;/a>, the NIP-5A reference host implementation built by lez, and &lt;a href="https://github.com/hzrd149/nsite-manager">nsite-manager&lt;/a>, hzrd149&amp;rsquo;s management UI, were already running before the NIP merged. The merge makes the event kinds and URL resolution rules official, which gives second and third implementations a stable target.&lt;/p>
&lt;h3 id="white-noise-fixes-relay-churn-and-expands-client-controls">White Noise fixes relay churn and expands client controls&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/whitenoise">White Noise&lt;/a>, the private messenger built on the &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> protocol, shipped &lt;a href="https://github.com/marmot-protocol/whitenoise/releases/tag/v2026.3.23">v2026.3.23&lt;/a> on March 25. The main work is relay stability. Login no longer waits for every relay-list publish before moving on, because relay-list publishing now uses quorum logic and retries the rest in the background. One-off fetches and publishes use scoped ephemeral relay sessions instead of lingering in the long-lived pool, restored sessions recover their group refresh path after startup, and the app now exposes relay diagnostics and relay state inspection through &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/495">PR #495&lt;/a> and &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/502">PR #502&lt;/a>.&lt;/p>
&lt;p>The same release changes how conversations behave. &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/468">PR #468&lt;/a> adds NIP-C7 reply threading with &lt;code>q&lt;/code> tags and &lt;code>nostr:nevent&lt;/code> references, &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/471">PR #471&lt;/a> and &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/512">PR #512&lt;/a> keep deleted messages visible as deleted placeholders instead of silently removing them, &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/478">PR #478&lt;/a> adds an in-app bug report flow using &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> (Encrypted Payloads) anonymous reports, and &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/486">PR #486&lt;/a> adds support chat directly in the client. User-facing message controls also landed in the same window: &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/532">PR #532&lt;/a> archives chats, &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/541">PR #541&lt;/a> adds mute and unmute with configurable durations, and &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/535">PR #535&lt;/a> adds notification settings. &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/539">PR #539&lt;/a> is preparatory push-registration work, wiring APNs registration on iOS and Play Services detection on Android so registration can be built on top of it. On the backend side, the &lt;a href="https://github.com/marmot-protocol/mdk">MDK&lt;/a> (Marmot Development Kit) added MIP-05 push notification primitives and a notification request builder (&lt;a href="https://github.com/marmot-protocol/mdk/pull/235">PR #235&lt;/a>, &lt;a href="https://github.com/marmot-protocol/mdk/pull/238">PR #238&lt;/a>), while &lt;a href="https://github.com/marmot-protocol/whitenoise-rs">whitenoise-rs&lt;/a> added push notification registration persistence (&lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/688">PR #688&lt;/a>), background task cancellation fixes (&lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/696">PR #696&lt;/a>), and key package recovery on startup (&lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/693">PR #693&lt;/a>).&lt;/p>
&lt;h3 id="nostr-vpn-reaches-v030-with-roster-sync-and-invite-v2">Nostr VPN reaches v0.3.0 with roster sync and invite v2&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/newsletters/2026-03-25-newsletter/#nostr-vpn-launches-as-a-tailscale-alternative">Following last week&amp;rsquo;s launch coverage&lt;/a>, &lt;a href="https://github.com/mmalmi/nostr-vpn">nostr-vpn&lt;/a>, the peer-to-peer VPN that uses Nostr relays for signaling and WireGuard for encrypted tunnels, continued its rapid release pace, shipping releases through &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v0.3.3">v0.3.3&lt;/a>. The version bump brings two breaking changes: the invite format moves to v2 (0.3.0 can still import v1 invites, but older builds cannot import v2 invites), and admin-signed roster sync was added to the signaling protocol. Mixed-version peers can still connect at the mesh layer, but older peers will not participate in roster synchronization.&lt;/p>
&lt;p>The roster sync addition starts the move toward a managed network. An admin node can now push membership changes to all peers, so adding or removing a device from the mesh does not require each peer to manually update its configuration. The v0.2.x releases during the same week addressed specific deployment problems: &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v0.2.22">v0.2.22&lt;/a> through &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v0.2.28">v0.2.28&lt;/a> fixed Windows service management, added Android build scripts, and refined the LAN pairing flow.&lt;/p>
&lt;h3 id="nospeak-launches-as-a-10-private-messenger">nospeak launches as a 1.0 private messenger&lt;/h3>
&lt;p>&lt;a href="https://github.com/psic4t/nospeak">nospeak&lt;/a>, a private messenger built on Nostr, shipped its &lt;a href="https://github.com/psic4t/nospeak/releases/tag/v1.0.0">1.0.0&lt;/a> release on March 27. The project includes one-on-one and group conversations, contact management, and a self-hostable architecture. One-on-one chats use &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> (Private Direct Messages), which combines &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> (Gift Wrap) with &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> (Encrypted Payloads) to hide the sender from relays. For media, files are encrypted client-side with AES-256-GCM before upload to Blossom servers. The release also ships as a container image for self-hosting.&lt;/p>
&lt;h3 id="flotilla-v170-adds-voice-rooms-and-email-login">Flotilla v1.7.0 adds voice rooms and email login&lt;/h3>
&lt;p>&lt;a href="https://gitea.coracle.social/coracle/flotilla">Flotilla&lt;/a>, hodlbod&amp;rsquo;s Discord-like &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> (Relay-based Groups) client built around the &amp;ldquo;relays as groups&amp;rdquo; model, shipped &lt;a href="https://gitea.coracle.social/coracle/flotilla/src/tag/1.7.0">v1.7.0&lt;/a> and &lt;a href="https://gitea.coracle.social/coracle/flotilla/src/tag/1.7.1">v1.7.1&lt;/a> on March 30 and 31. The headline feature is voice rooms, contributed by mplorentz. Users can now join voice calls within group channels, with a join dialog (&lt;a href="https://gitea.coracle.social/coracle/flotilla/pulls/109">PR #109&lt;/a>) that lets them select an audio input device and choose whether to join the voice call or just view the text chat. The dialog solves a UX problem from the previous iteration: entering a voice-enabled room previously forced microphone activation even when the user only wanted to read messages or check room settings.&lt;/p>
&lt;p>The same release adds email and password login as an alternative to Nostr key-based auth, proof-of-work on DMs, DM editing, redesigned relay onboarding and settings, Blossom support detection via &lt;code>supported_nips&lt;/code>, improved notification badges, Android push notification fallback, and file upload fixes on Android. v1.7.1 follows with a fix for pomade registration fallback when using an offline signer.&lt;/p>
&lt;p>Hodlbod is also building &lt;a href="https://gitea.coracle.social/coracle/caravel">Caravel&lt;/a>, a hosting manager and dashboard for zooid relays, which logged 40 commits this week in initial development.&lt;/p>
&lt;h3 id="nymchat-ships-marmot-powered-group-chats">Nymchat ships Marmot-powered group chats&lt;/h3>
&lt;p>&lt;a href="https://github.com/Spl0itable/NYM">Nymchat&lt;/a> (also known as NYM, Nostr Ynstant Messenger), the ephemeral chat client bridged with Bitchat, announced that all new group chats now use the &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> protocol for MLS-encrypted messaging. The integration uses kinds &lt;code>443&lt;/code>, &lt;code>444&lt;/code>, and &lt;code>445&lt;/code> for key packages, welcome messages, and group messages respectively, providing forward secrecy, post-compromise security, and zero metadata leakage. If a recipient cannot use MLS, Nymchat falls back to its earlier &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> (Private Direct Messages) group chat path, which is still end-to-end encrypted but lacks the ratchet-tree properties of MLS.&lt;/p>
&lt;p>The v3.55 and v3.56 series this week focused on group chat edge cases: loading on new devices, leave behavior, notification routing, and unread badge counts. The same cycle also patched an XSS vulnerability from unescaped HTML and added keyword and phrase blocking extended to user nicknames. This makes Nymchat yet another Marmot client joining &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#white-noise-fixes-relay-churn-and-expands-client-controls">White Noise&lt;/a> and &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#openchat-v024-through-v030">OpenChat&lt;/a>, broadening the set of apps that can exchange MLS-encrypted group messages over the same protocol.&lt;/p>
&lt;h2 id="releases">Releases&lt;/h2>
&lt;h3 id="calendar-by-form-v100">Calendar by Form* v1.0.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/formstr-hq/nostr-calendar">Calendar by Form*&lt;/a>, the decentralized calendar app built on &lt;a href="https://nostrcompass.org/en/topics/nip-52/">NIP-52&lt;/a> (Calendar Events), reached &lt;a href="https://github.com/formstr-hq/nostr-calendar/releases/tag/v1.0.0">v1.0.0&lt;/a> on March 29. The release adds private calendar lists using encrypted Nostr events (kind &lt;code>32123&lt;/code>) with &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> (Encrypted Payloads) self-encryption, so users can organize events into private collections without exposing the grouping to relays. The same release adds ICS intent handling for importing calendar data from other applications and invitation requests for sharing events between users.&lt;/p>
&lt;h3 id="amber-v502-through-v504">Amber v5.0.2 through v5.0.4&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a>, the &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> (Android Signer Application) signer app, shipped three point releases: &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v5.0.2">v5.0.2&lt;/a>, &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v5.0.3">v5.0.3&lt;/a>, and &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v5.0.4">v5.0.4&lt;/a>. The most visible addition is mnemonic recovery phrase login (&lt;a href="https://github.com/greenart7c3/Amber/pull/358">PR #358&lt;/a>), which lets users restore their signer from a BIP39 seed phrase instead of requiring the raw nsec or ncryptsec string. &lt;a href="https://github.com/greenart7c3/Amber/pull/357">PR #357&lt;/a> adds a &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> relay auth whitelist, so users can restrict which relays are allowed to request client authentication. &lt;a href="https://github.com/greenart7c3/Amber/pull/353">PR #353&lt;/a> adds encryption scope selection for decrypt permissions, letting users grant NIP-04-only or NIP-44-only decrypt access instead of a blanket permission. v5.0.4 fixes a bug where rejection was not respecting scoped encrypt and decrypt permissions and improves performance when receiving multiple bunker requests.&lt;/p>
&lt;h3 id="aegis-v040">Aegis v0.4.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/ZharlieW/Aegis">Aegis&lt;/a>, the cross-platform signer, shipped &lt;a href="https://github.com/ZharlieW/Aegis/releases/tag/v0.4.0">v0.4.0&lt;/a> on March 26. The release adds Full and Selective authorization modes in Settings and fixes multiple QR-scanning problems. Follow-up commits &lt;a href="https://github.com/ZharlieW/Aegis/commit/d4f799fe51dd82968d54f72ac77f2de29d0cfe6b">d4f799f&lt;/a>, &lt;a href="https://github.com/ZharlieW/Aegis/commit/3313af92e55e449ebc98fbd91a085bd444d716e7">3313af9&lt;/a>, &lt;a href="https://github.com/ZharlieW/Aegis/commit/3b214e4176f5dbe7f18690d0996e69dd151fe00f">3b214e4&lt;/a>, and &lt;a href="https://github.com/ZharlieW/Aegis/commit/e4f40b6f1f48c2dae1bb5e4246df26c26dba419e">e4f40b6&lt;/a> continue the same work with batch select controls, reusable batch selection stats, set-all-groups selection APIs, and per-permission usage statistics on the app permissions page.&lt;/p>
&lt;h3 id="schemata-v027-through-v030">Schemata v0.2.7 through v0.3.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostrability/schemata">Schemata&lt;/a>, the JSON Schema definitions for validating Nostr event kinds, shipped four releases from &lt;a href="https://github.com/nostrability/schemata/releases/tag/v0.2.7">v0.2.7&lt;/a> through &lt;a href="https://github.com/nostrability/schemata/releases/tag/v0.3.0">v0.3.0&lt;/a> with 21 merged PRs. The v0.3.0 release brings pattern consistency fixes across relay URLs, hex IDs, MIME types, and BOLT-11 strings (&lt;a href="https://github.com/nostrability/schemata/pull/126">PR #126&lt;/a>), centralized relay URL patterns (&lt;a href="https://github.com/nostrability/schemata/pull/117">PR #117&lt;/a>), &lt;a href="https://nostrcompass.org/en/topics/nip-19/">NIP-19&lt;/a> bech32 base type schemas (&lt;a href="https://github.com/nostrability/schemata/pull/118">PR #118&lt;/a>), and validation for kind 777 spell events (&lt;a href="https://github.com/nostrability/schemata/pull/125">PR #125&lt;/a>). The release pipeline now publishes a kind &lt;code>1&lt;/code> note to Nostr on each release (&lt;a href="https://github.com/nostrability/schemata/pull/120">PR #120&lt;/a>), so the project announces itself through the protocol it validates. Schemata now supports a dozen languages beyond the canonical JS/TS package: Rust, Go, Python, Kotlin, Java, Swift, Dart, PHP, C#/.NET, C++, Ruby, and C.&lt;/p>
&lt;p>Alongside Schemata, the team published &lt;a href="https://github.com/nostrability/schemata-codegen">schemata-codegen&lt;/a>, an experimental code generator that takes a different approach to the same validation problem. Where Schemata&amp;rsquo;s validator packages require a JSON Schema runtime dependency, schemata-codegen ports schemas directly into typed native-language constructs (typed tag tuples, kind interfaces, and runtime validators), removing the need for a validator library at runtime. The &lt;a href="https://github.com/nostrability/schemata-codegen/blob/main/CODEGEN-VS-VALIDATORS.md">codegen-vs-validators comparison&lt;/a> documents when each approach fits.&lt;/p>
&lt;h3 id="bigbrotr-v650-through-v654">BigBrotr v6.5.0 through v6.5.4&lt;/h3>
&lt;p>&lt;a href="https://github.com/BigBrotr/bigbrotr">BigBrotr&lt;/a>, the relay analytics platform, shipped five releases from &lt;a href="https://github.com/BigBrotr/bigbrotr/releases/tag/v6.5.0">v6.5.0&lt;/a> through &lt;a href="https://github.com/BigBrotr/bigbrotr/releases/tag/v6.5.4">v6.5.4&lt;/a>. The v6.5.0 release centralizes relay URL validation with a &lt;code>parse_relay_url()&lt;/code> factory function and adds URL length checking and path sanitization. The monitoring infrastructure also received fixes: announcement events now include geohash location tags (following &lt;a href="https://nostrcompass.org/en/topics/nip-52/">NIP-52&lt;/a>), and timeout protection was added to the Geo/Net &lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a> metadata tests that had no deadline and could hang indefinitely. &lt;a href="https://github.com/BigBrotr/bigbrotr/pull/410">PR #410&lt;/a> upgrades PostgreSQL from 16 to 18, which brings the async I/O subsystem and improved WAL throughput to the relay analytics pipeline.&lt;/p>
&lt;h3 id="vertex-lab-relay-adds-nip-50-profile-search">Vertex Lab relay adds NIP-50 profile search&lt;/h3>
&lt;p>&lt;a href="https://vertexlab.io">Vertex Lab&lt;/a>, the team behind &lt;a href="https://github.com/vertex-lab/npub.world">npub.world&lt;/a> and the &lt;a href="https://github.com/vertex-lab/vertex">Vertex&lt;/a> Web of Trust engine, announced that &lt;code>wss://relay.vertexlab.io&lt;/code> now supports &lt;a href="https://nostrcompass.org/en/topics/nip-50/">NIP-50&lt;/a> (Search) for profile queries. NIP-50 extends the standard Nostr &lt;code>REQ&lt;/code> filter with a &lt;code>search&lt;/code> field, letting clients send full-text search queries to relays that support indexing. Adding profile search to a relay that already serves Web of Trust data means clients connected to &lt;code>relay.vertexlab.io&lt;/code> can discover users by name or description without a separate search service.&lt;/p>
&lt;h3 id="hashtree-v0217-and-v0218-ship-webrtc-mesh-and-iris-desktop">Hashtree v0.2.17 and v0.2.18 ship WebRTC mesh and Iris Desktop&lt;/h3>
&lt;p>&lt;a href="https://github.com/mmalmi/hashtree">Hashtree&lt;/a>, mmalmi&amp;rsquo;s content-addressed blob storage system that publishes Merkle roots on Nostr, shipped &lt;a href="https://github.com/mmalmi/hashtree/releases/tag/v0.2.17">v0.2.17&lt;/a> and &lt;a href="https://github.com/mmalmi/hashtree/releases/tag/v0.2.18">v0.2.18&lt;/a> on March 31. The two releases cap a 30-commit sprint that adds three distinct capabilities. First, the &lt;code>hashtree-webrtc&lt;/code> crate (renamed to &lt;code>hashtree-network&lt;/code> in v0.2.18) adds WebRTC-based peer-to-peer blob distribution with unified mesh signaling across the Rust CLI, the simulation harness, and the TypeScript client. Second, the release pipeline now builds Windows artifacts (CLI zip and Iris installer), bringing cross-platform coverage to macOS, Linux, and Windows. Third, both releases bundle Iris Desktop 0.1.0, mmalmi&amp;rsquo;s Nostr social client, as AppImage, .deb, and Windows installer assets alongside the hashtree CLI. &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-18-newsletter/">Hashtree was first covered in Newsletter #10&lt;/a> when it launched as a filesystem-based &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a>-compatible store. The WebRTC layer is the first step toward peer-to-peer content distribution without depending on centralized Blossom servers.&lt;/p>
&lt;h3 id="nostr-mail-client-v070-through-v072">Nostr Mail Client v0.7.0 through v0.7.2&lt;/h3>
&lt;p>&lt;a href="https://github.com/nogringo/nostr-mail-client">Nostr Mail Client&lt;/a>, the Flutter mail-style client built on Nostr identities, shipped &lt;a href="https://github.com/nogringo/nostr-mail-client/releases/tag/v0.7.0">v0.7.0&lt;/a>, &lt;a href="https://github.com/nogringo/nostr-mail-client/releases/tag/v0.7.1">v0.7.1&lt;/a>, and &lt;a href="https://github.com/nogringo/nostr-mail-client/releases/tag/v0.7.2">v0.7.2&lt;/a> in three days. The visible product work centered on onboarding (&lt;a href="https://github.com/nogringo/nostr-mail-client/pull/9">PR #9&lt;/a>) and profile editing (&lt;a href="https://github.com/nogringo/nostr-mail-client/pull/10">PR #10&lt;/a>), which are basic pieces for any client trying to present Nostr as a mailbox. The later point releases packaged that work into fresh Android and Linux builds.&lt;/p>
&lt;h3 id="wisp-v0140-through-v0161">Wisp v0.14.0 through v0.16.1&lt;/h3>
&lt;p>&lt;a href="https://github.com/barrydeen/wisp">Wisp&lt;/a>, the Android Nostr client, shipped 13 more releases from &lt;a href="https://github.com/barrydeen/wisp/releases/tag/v0.14.0-beta">v0.14.0-beta&lt;/a> through &lt;a href="https://github.com/barrydeen/wisp/releases/tag/v0.16.3-beta">v0.16.3-beta&lt;/a>. The work this week includes NIP-17 rumor JSON fixes (&lt;a href="https://github.com/barrydeen/wisp/pull/385">PR #385&lt;/a>), repost badges on gallery cards (&lt;a href="https://github.com/barrydeen/wisp/pull/383">PR #383&lt;/a>), expandable reaction details (&lt;a href="https://github.com/barrydeen/wisp/pull/382">PR #382&lt;/a>), persistent emoji sets (&lt;a href="https://github.com/barrydeen/wisp/pull/381">PR #381&lt;/a>), and video autoplay controls (&lt;a href="https://github.com/barrydeen/wisp/pull/380">PR #380&lt;/a>). The latest &lt;a href="https://github.com/barrydeen/wisp/releases/tag/v0.16.3-beta">v0.16.3-beta&lt;/a> also fixes custom emoji shortcodes with hyphens and missing emoji tags.&lt;/p>
&lt;h3 id="primal-android-3017">Primal Android 3.0.17&lt;/h3>
&lt;p>&lt;a href="https://github.com/PrimalHQ/primal-android-app">Primal Android&lt;/a> shipped &lt;a href="https://github.com/PrimalHQ/primal-android-app/releases/tag/3.0.17">3.0.17&lt;/a> on March 24. &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/1000">PR #1000&lt;/a> maps WalletException types to error codes in NWC responses, giving &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> clients structured failure information instead of generic errors. &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/995">PR #995&lt;/a> fixes poll zap votes appearing as Top Zaps, and &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/998">PR #998&lt;/a> hides wallet balance and action buttons when no wallet is configured.&lt;/p>
&lt;h3 id="openchat-v024-through-v030">OpenChat v0.2.4 through v0.3.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/DavidGershony/openChat">OpenChat&lt;/a>, the Avalonia-based chat client built on the &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> stack, shipped six releases from &lt;a href="https://github.com/DavidGershony/openChat/releases/tag/v0.2.4">v0.2.4&lt;/a> through &lt;a href="https://github.com/DavidGershony/openChat/releases/tag/v0.3.0">v0.3.0&lt;/a> in four days. The commit log tells the story of a client filling in the gaps between &amp;ldquo;Marmot works&amp;rdquo; and &amp;ldquo;someone can actually use this daily.&amp;rdquo; &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> relay authentication landed, followed by a relay picker UI with duplicate event filtering. Voice messages gained pause, resume, seek, and time display. The signer path was hardened: Amber connections were fixed with an updated &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> URI format, the WebSocket auto-reconnects before sending requests, and duplicate Amber requests are now caught by checking for replayed responses. On the storage side, Linux and macOS got AES-256-GCM secure storage with file-backed keys, and user metadata fetching now uses &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> relay discovery and caches results in a local database.&lt;/p>
&lt;h3 id="igloo-signer-11">Igloo Signer 1.1&lt;/h3>
&lt;p>&lt;a href="https://github.com/FROSTR-ORG/igloo-ios-prototype">Igloo&lt;/a>, the iOS &lt;a href="https://nostrcompass.org/en/topics/frost/">FROST&lt;/a> threshold signer from the FROSTR project, shipped &lt;a href="https://github.com/FROSTR-ORG/igloo-ios-prototype/releases/tag/v1.1">v1.1&lt;/a> on March 28. FROST (Flexible Round-Optimized Schnorr Threshold) signatures let a group of signers collectively control a Nostr keypair, where any t-of-n participants can sign an event without any single party holding the full private key. Igloo is one of the first mobile implementations of this approach for Nostr.&lt;/p>
&lt;h3 id="nak-v0193-and-v0194">nak v0.19.3 and v0.19.4&lt;/h3>
&lt;p>&lt;a href="https://github.com/fiatjaf/nak">nak&lt;/a>, fiatjaf&amp;rsquo;s command-line Nostr toolkit, shipped &lt;a href="https://github.com/fiatjaf/nak/releases/tag/v0.19.3">v0.19.3&lt;/a> and &lt;a href="https://github.com/fiatjaf/nak/releases/tag/v0.19.4">v0.19.4&lt;/a> on March 26 and 30. Both releases fix panic conditions: &lt;a href="https://github.com/fiatjaf/nak/pull/118">PR #118&lt;/a> replaces &lt;code>strings.Split&lt;/code> with &lt;code>strings.Cut&lt;/code> to prevent a potential out-of-bounds access, and &lt;a href="https://github.com/fiatjaf/nak/pull/119">PR #119&lt;/a> prevents the same class of panic in curl flag parsing.&lt;/p>
&lt;h3 id="flora-v030">Flora v0.3.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/shawnyeager/flora-extension">Flora&lt;/a>, a Chrome extension for decentralized screen recording and sharing on Nostr, shipped &lt;a href="https://github.com/shawnyeager/flora-extension/releases/tag/v0.3.0">v0.3.0&lt;/a>. The release adds private encrypted video sharing with public, unlisted, and private modes. Private recordings are encrypted with AES-256-GCM and delivered to recipients via &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> (Private Direct Messages), so the recording never touches a server in cleartext.&lt;/p>
&lt;h3 id="yakihonne-mobile-203">YakiHonne Mobile 2.0.3&lt;/h3>
&lt;p>&lt;a href="https://github.com/YakiHonne/mobile-app">YakiHonne&lt;/a>, the mobile Nostr client, shipped &lt;a href="https://github.com/YakiHonne/mobile-app/releases/tag/YakiHonne-2.0.3">2.0.3&lt;/a> with relay reviews and join requests, expanded nested replies, auto-translation for notes, and NWC multi-relay support.&lt;/p>
&lt;h2 id="project-updates">Project Updates&lt;/h2>
&lt;h3 id="zap-cooking-adds-zap-polls-and-branta-payment-verification">Zap Cooking adds zap polls and Branta payment verification&lt;/h3>
&lt;p>&lt;a href="https://github.com/zapcooking/frontend">Zap Cooking&lt;/a>, the recipe and content platform, merged 11 PRs this week focused on interactive content and payment flows. &lt;a href="https://github.com/zapcooking/frontend/pull/277">PR #277&lt;/a> adds zap polls (kind 6969), where users vote by sending sats and can view voter lists with profile pictures. &lt;a href="https://github.com/zapcooking/frontend/pull/274">PR #274&lt;/a> redesigns the poll UX so the voting interface sits more naturally in the feed.&lt;/p>
&lt;p>&lt;a href="https://github.com/zapcooking/frontend/pull/276">PR #276&lt;/a> adds camera-based QR scanning to the Send Payment flow and integrates &lt;a href="https://branta.pro/">Branta&lt;/a>, a verification service that checks whether a payment destination is legitimate before send. Branta checks payment destinations against phishing, address swaps, and man-in-the-middle interception before send. In Zap Cooking&amp;rsquo;s implementation, a Branta-verified platform name and logo show up directly in the payment flow, and Branta-enabled QR codes can carry &lt;code>branta_id&lt;/code> and &lt;code>branta_secret&lt;/code> parameters so the wallet can verify the destination from the scanned code itself.&lt;/p>
&lt;h3 id="divine-lays-groundwork-for-unified-search-and-hardens-video-delivery">diVine lays groundwork for unified search and hardens video delivery&lt;/h3>
&lt;p>&lt;a href="https://github.com/divinevideo/divine-mobile">diVine&lt;/a>, the short-form video client, spent the week tightening search, feed navigation, playback recovery, and upload behavior. &lt;a href="https://github.com/divinevideo/divine-mobile/pull/2540">PR #2540&lt;/a> lays down the foundation for a unified search screen, with grouped sections for Videos, People, and Tags. &lt;a href="https://github.com/divinevideo/divine-mobile/pull/2623">PR #2623&lt;/a> hardens pagination across profile feeds, inbox, notifications, discover lists, classic vines, search, and the composable grid feeds by moving them onto a shared pagination controller.&lt;/p>
&lt;p>Video delivery also got several concrete fixes. &lt;a href="https://github.com/divinevideo/divine-mobile/pull/2643">PR #2643&lt;/a> retries Divine-hosted derivative sources in order and falls back to the raw blob before surfacing a playback error, so transient failures on one source do not kill playback immediately. &lt;a href="https://github.com/divinevideo/divine-mobile/pull/2634">PR #2634&lt;/a> keeps resumable uploads on the Divine-owned path when capability probing fails transiently, reducing broken uploads from short network faults. &lt;a href="https://github.com/divinevideo/divine-mobile/pull/2637">PR #2637&lt;/a> also changes the sensitive-content gate so videos are only hard-gated for actual warning labels, not merely for creator-supplied content warning labels.&lt;/p>
&lt;h3 id="shopstr-adds-custom-storefronts-and-milk-market-keeps-shipping-marketplace-work">Shopstr adds custom storefronts and Milk Market keeps shipping marketplace work&lt;/h3>
&lt;p>&lt;a href="https://github.com/shopstr-eng/shopstr">Shopstr&lt;/a>, the Nostr-based marketplace, merged &lt;a href="https://github.com/shopstr-eng/shopstr/pull/245">PR #245&lt;/a> adding custom storefronts. That gives sellers a more distinct home surface instead of forcing every listing into the same generic presentation.&lt;/p>
&lt;p>&lt;a href="https://github.com/shopstr-eng/milk-market">Milk Market&lt;/a>, a dedicated marketplace for milk, continued with storefront optimizations (&lt;a href="https://github.com/shopstr-eng/milk-market/pull/18">PR #18&lt;/a>), account recovery (&lt;a href="https://github.com/shopstr-eng/milk-market/pull/17">PR #17&lt;/a>), beef splits (&lt;a href="https://github.com/shopstr-eng/milk-market/pull/15">PR #15&lt;/a>), and MCP tool typing fixes (&lt;a href="https://github.com/shopstr-eng/milk-market/pull/16">PR #16&lt;/a>).&lt;/p>
&lt;h3 id="notedeck-adds-sound-effects-and-extends-its-updater-path-toward-android">Notedeck adds sound effects and extends its updater path toward Android&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/notedeck">Notedeck&lt;/a>, the desktop client from the Damus team, merged &lt;a href="https://github.com/damus-io/notedeck/pull/1412">PR #1412&lt;/a> adding a sound effects subsystem with UI interaction sounds using rodio, and &lt;a href="https://github.com/damus-io/notedeck/pull/1399">PR #1399&lt;/a> with Agentium updates including a CLI title flag and collapsible session folders. An open &lt;a href="https://github.com/damus-io/notedeck/pull/1417">PR #1417&lt;/a> proposes APK self-update via Nostr/Zapstore on Android, building on &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-18-newsletter/#notedeck-moves-release-discovery-onto-nostr">Notedeck&amp;rsquo;s Nostr-native updater work from Newsletter #14&lt;/a>.&lt;/p>
&lt;h3 id="nostria-adds-repost-relay-hints-and-nip-98-alignment">Nostria adds repost relay hints and NIP-98 alignment&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostria-app/nostria">Nostria&lt;/a> merged &lt;a href="https://github.com/nostria-app/nostria/pull/583">PR #583&lt;/a> adding &lt;a href="https://nostrcompass.org/en/topics/nip-18/">NIP-18&lt;/a> (Reposts) relay hints to repost &lt;code>e&lt;/code> tags for kind 6 and kind 16 events, &lt;a href="https://github.com/nostria-app/nostria/pull/582">PR #582&lt;/a> aligning Brainstorm HTTP auth (kind 27235) with &lt;a href="https://nostrcompass.org/en/topics/nip-98/">NIP-98&lt;/a> (HTTP Auth) required tags, and &lt;a href="https://github.com/nostria-app/nostria/pull/576">PR #576&lt;/a> adding Schemata schema validation tests. The NIP-98 change means Nostria can authenticate to external services using the same HTTP auth format other clients use.&lt;/p>
&lt;h3 id="nostr-doc-adds-desktop-packaging-and-offline-first-work">Nostr-Doc adds desktop packaging and offline-first work&lt;/h3>
&lt;p>&lt;a href="https://github.com/formstr-hq/nostr-docs">Nostr-Doc&lt;/a>, the collaborative editor from Form*, had a busy week of packaging and editor work. &lt;a href="https://github.com/formstr-hq/nostr-docs/commit/fcdc00a564c8d76f094c586b06efce07592a60e4">commit fcdc00a&lt;/a> adds a desktop app, &lt;a href="https://github.com/formstr-hq/nostr-docs/commit/3977a8eb2e62b84a67de756c2776e14de8470927">commit 3977a8e&lt;/a> starts native app work, and &lt;a href="https://github.com/formstr-hq/nostr-docs/commit/413a030f5b47fb8e32a5dff81bcef557ad9b5869">commit 413a030&lt;/a> pushes the app toward offline-first behavior. On the editor side, &lt;a href="https://github.com/formstr-hq/nostr-docs/commit/1855ce86ee83ad504e14e47d9c339baffb114786">commit 1855ce8&lt;/a> adds Ctrl+S save, save warnings, link preview fixes, and corrected strikethrough rendering.&lt;/p>
&lt;h3 id="rust-nostr-optimizes-nip-21-parsing-and-adds-relay-side-nip-62-support">rust-nostr optimizes NIP-21 parsing and adds relay-side NIP-62 support&lt;/h3>
&lt;p>&lt;a href="https://github.com/rust-nostr/nostr">rust-nostr&lt;/a> merged eight PRs. The most notable is &lt;a href="https://github.com/rust-nostr/nostr/pull/1308">PR #1308&lt;/a>, which optimizes &lt;a href="https://github.com/nostr-protocol/nips/blob/master/21.md">NIP-21&lt;/a> URI parsing in &lt;code>PublicKey::parse&lt;/code> by aligning it with standard bech32 parsing performance. Previously NIP-21 URIs took roughly twice as long to parse as raw bech32 keys. The project also has four open PRs adding relay-specific &lt;a href="https://nostrcompass.org/en/topics/nip-62/">NIP-62&lt;/a> (Request to Vanish) support across the memory, LMDB, SQLite, and database test backends (&lt;a href="https://github.com/rust-nostr/nostr/pull/1315">PR #1315&lt;/a>, &lt;a href="https://github.com/rust-nostr/nostr/pull/1316">PR #1316&lt;/a>, &lt;a href="https://github.com/rust-nostr/nostr/pull/1317">PR #1317&lt;/a>, &lt;a href="https://github.com/rust-nostr/nostr/pull/1318">PR #1318&lt;/a>).&lt;/p>
&lt;h3 id="nostr-tools-adds-bunker-relay-control-and-fixes-nip-47-multi-relay-parsing">nostr-tools adds bunker relay control and fixes NIP-47 multi-relay parsing&lt;/h3>
&lt;p>&lt;a href="https://github.com/nbd-wtf/nostr-tools">nostr-tools&lt;/a> merged &lt;a href="https://github.com/nbd-wtf/nostr-tools/pull/530">PR #530&lt;/a> adding &lt;code>skipSwitchRelays&lt;/code> to BunkerSignerParams for manual relay management, and &lt;a href="https://github.com/nbd-wtf/nostr-tools/pull/529">PR #529&lt;/a> fixing &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> (Nostr Wallet Connect) connection string parsing to support multiple relays as the spec allows.&lt;/p>
&lt;h3 id="nostrability-integrates-sherlock-audit-data-and-publishes-schemata-overview">Nostrability integrates Sherlock audit data and publishes Schemata overview&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostrability/nostrability">Nostrability&lt;/a>, the interoperability tracker for Nostr clients, merged 14 PRs. &lt;a href="https://github.com/nostrability/nostrability/pull/306">PR #306&lt;/a> integrates Sherlock scan statistics into the dashboard. Sherlock is Nostrability&amp;rsquo;s automated audit tool that connects to Nostr clients, captures the events they publish, and validates each event against the Schemata JSON Schema definitions to detect spec violations. The dashboard now shows per-client schema fail rates (&lt;a href="https://github.com/nostrability/nostrability/pull/315">PR #315&lt;/a>) so developers can see which event kinds their client gets wrong. &lt;a href="https://github.com/nostrability/nostrability/pull/323">PR #323&lt;/a> overhauls the Nostr publish workflow so release announcements run as a separate job that cannot be cancelled by earlier CI steps.&lt;/p>
&lt;p>elsat also published &lt;a href="https://njump.me/naddr1qvzqqqr4gupzq96n3hp2vfmf6z2y8uvvxl97xk86kkalnqghx4p25lzl79c76a7yqy2hwumn8ghj7un9d3shjtnyv9kh2uewd9hj7qgwwaehxw309ahx7uewd3hkctcqz4fnx4rkw3x57nrcwdn8zt22xd982jehfptsgqtrww">Schemata for nostr devs&lt;/a> on March 30, describing how schemata, schemata-codegen, and Sherlock fit together and giving current coverage numbers: 179 event kind schemas across 65 NIPs, 154 tag schemas, 13 protocol messages, and 310 sample events.&lt;/p>
&lt;h3 id="nalgorithm-adds-digest-generation-and-local-score-caching">Nalgorithm adds digest generation and local score caching&lt;/h3>
&lt;p>&lt;a href="https://github.com/jooray/nalgorithm">Nalgorithm&lt;/a>, a new relevance-ranked Nostr feed project, started public development this week. &lt;a href="https://github.com/jooray/nalgorithm/commit/cf6c501e754ef95a1b4fecc1a76288471a101f43">commit cf6c501&lt;/a> lays down the initial web app that fetches posts from follows and scores them against a user-defined preference prompt. &lt;a href="https://github.com/jooray/nalgorithm/commit/8e931b6ae85d470e73603752134ff49b7ba4bb86">commit 8e931b6&lt;/a> adds a CLI digest tool that turns top-ranked posts into a spoken-word summary, while &lt;a href="https://github.com/jooray/nalgorithm/commit/4cb9c635489a9a3429e8d71f3861dc2a11624153">commit 4cb9c63&lt;/a> adds file-based score caching and incremental learned-prompt evolution from recent likes. &lt;a href="https://github.com/jooray/nalgorithm/commit/c2edfb8b89fadbe0028c3f5729bda7e23b2e3c03">commit c2edfb8&lt;/a> also stops caching fallback scores from failed batches, so a transient scoring failure does not permanently flatten a post&amp;rsquo;s rank.&lt;/p>
&lt;h3 id="tenex-adds-rag-vector-store-and-targeted-mcp-startup">TENEX adds RAG vector store and targeted MCP startup&lt;/h3>
&lt;p>&lt;a href="https://github.com/tenex-chat/tenex">TENEX&lt;/a>, the Nostr-native agent framework that bridges AI agents to Nostr channels via Telegram, merged seven PRs this week. &lt;a href="https://github.com/tenex-chat/tenex/pull/101">PR #101&lt;/a> adds a pluggable vector store abstraction with SQLite-vec, LanceDB, and Qdrant backends, giving agents retrieval-augmented generation without locking into one vector database. &lt;a href="https://github.com/tenex-chat/tenex/pull/102">PR #102&lt;/a> makes MCP startup targeted: only MCP servers whose tools an agent actually uses are started, instead of eagerly launching all servers on first execution. &lt;a href="https://github.com/tenex-chat/tenex/pull/100">PR #100&lt;/a> adds a &lt;code>send_message&lt;/code> tool so agents with Telegram channel bindings can proactively push messages instead of only responding to incoming ones. &lt;a href="https://github.com/tenex-chat/tenex/pull/106">PR #106&lt;/a> avoids a subprocess spawn that triggered a 9GB Bun/JSC memory pre-allocation by reading &lt;code>.git/HEAD&lt;/code> directly instead of running &lt;code>git branch&lt;/code>.&lt;/p>
&lt;h3 id="dart-ndk-moves-amber-signer-and-adds-alby-go-1-click">Dart NDK moves Amber signer and adds Alby Go 1-click&lt;/h3>
&lt;p>&lt;a href="https://github.com/relaystr/ndk">Dart NDK&lt;/a>, the Flutter Nostr development kit, shipped 11 merged PRs. &lt;a href="https://github.com/relaystr/ndk/pull/525">PR #525&lt;/a> moves Amber signer support into the ndk_flutter package, and &lt;a href="https://github.com/relaystr/ndk/pull/552">PR #552&lt;/a> adds Alby Go one-click wallet connection to the sample app. &lt;a href="https://github.com/relaystr/ndk/pull/502">PR #502&lt;/a> adds an install.sh script for the CLI, and &lt;a href="https://github.com/relaystr/ndk/pull/523">PR #523&lt;/a> removes the Rust verifier dependency in favor of native asset handling.&lt;/p>
&lt;h2 id="protocol-and-spec-work">Protocol and Spec Work&lt;/h2>
&lt;h3 id="marmot-moves-keypackages-to-addressable-events-and-tightens-push-notifications">Marmot moves KeyPackages to addressable events and tightens push notifications&lt;/h3>
&lt;p>The &lt;a href="https://github.com/marmot-protocol/marmot">Marmot specification&lt;/a> merged four PRs that change how the protocol handles key material and group membership. &lt;a href="https://github.com/marmot-protocol/marmot/pull/54">PR #54&lt;/a> migrates KeyPackage events from regular &lt;code>kind:443&lt;/code> to addressable &lt;code>kind:30443&lt;/code> with a &lt;code>d&lt;/code> tag, eliminating the need for &lt;a href="https://nostrcompass.org/en/topics/nip-09/">NIP-09&lt;/a> event deletion during key rotation. Addressable events overwrite in place, making rotation self-contained. &lt;a href="https://github.com/marmot-protocol/marmot/pull/57">PR #57&lt;/a> allows non-admin users to commit SelfRemove proposals (voluntary group departure), and &lt;a href="https://github.com/marmot-protocol/marmot/pull/62">PR #62&lt;/a> requires admins to relinquish admin status before using SelfRemove, preventing an admin from disappearing while still holding elevated privileges.&lt;/p>
&lt;p>&lt;a href="https://github.com/marmot-protocol/marmot/pull/61">PR #61&lt;/a> tightens the &lt;a href="https://nostrcompass.org/en/topics/mip-05/">MIP-05&lt;/a> push notification format, making the single-blob base64 encoding, versioning, token wire format, and x-only key usage explicit. The effect is one defined wire representation for token blobs and x-only keys across spec, client libraries, and app backends. Implementation of these spec changes landed in the White Noise stack this week and is covered in the &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#white-noise-fixes-relay-churn-and-expands-client-controls">White Noise v2026.3.23 section above&lt;/a>.&lt;/p>
&lt;h3 id="nip-updates">NIP Updates&lt;/h3>
&lt;p>Recent changes to the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a>:&lt;/p>
&lt;p>&lt;strong>Merged:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/5A.md">NIP-5A&lt;/a>: Static Websites&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/1538">PR #1538&lt;/a>): Defines kind &lt;code>15128&lt;/code> (root site) and kind &lt;code>35128&lt;/code> (named site) manifest events for hosting static websites under Nostr keypairs using Blossom storage. See the &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#nip-deep-dive-nip-5a-static-websites">deep dive below&lt;/a>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-30/">NIP-30&lt;/a> (Custom Emoji): Allow hyphens in shortcodes&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2297">PR #2297&lt;/a>): Updates the shortcode description to include hyphens. Hyphenated shortcodes have been used in practice since the NIP was introduced, so the spec now documents current usage.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Open PRs and Discussions:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>NIP-C1: Agent TUI Messages&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2295">PR #2295&lt;/a>): Proposes a structured message format for agents to send interactive UI elements through encrypted DMs, including typed &lt;code>text&lt;/code>, &lt;code>buttons&lt;/code>, &lt;code>card&lt;/code>, and &lt;code>table&lt;/code> payloads. The draft keeps everything inside existing &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> and &lt;a href="https://nostrcompass.org/en/topics/nip-04/">NIP-04&lt;/a> direct-message content as JSON. It does not define a new event kind, and it uses a simple callback string format for button responses.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>NIP-95: Hybrid Peer-to-Peer Relay Protocol&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2293">PR #2293&lt;/a>): Proposes a hybrid relay model where relays stay authoritative but can also coordinate peer-to-peer distribution of recent events over WebRTC. The draft introduces relay messages such as &lt;code>PEER_REGISTER&lt;/code>, &lt;code>PEER_REQUEST&lt;/code>, and &lt;code>PEER_OFFER&lt;/code>, with stable clients acting as Super Peers and the relay acting as the seed node and fallback.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>NIP-B9: Zap Poll Events&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2284">PR #2284&lt;/a>): Reopens the old NIP-69 zap-poll idea now that &lt;a href="https://github.com/nostr-protocol/nips/blob/master/88.md">NIP-88&lt;/a> (Polls) covers free polls. The draft uses kind &lt;code>6969&lt;/code> poll definitions and kind &lt;code>9734&lt;/code> zaps as votes, making it a paid polling system with economic Sybil resistance. It complements free one-key-one-vote polls.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>NIP-AD: Super Zap&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2289">PR #2289&lt;/a>): Proposes a convention where zaps sent to a relay&amp;rsquo;s pubkey or a client&amp;rsquo;s pubkey are displayed as specialized promotional notes, effectively turning zap receipts into an ad surface. Relay operators and clients would publish profiles with &lt;code>lud16&lt;/code>, fetch those receipts, extract the embedded content from zap descriptions, and optionally set minimum-sats thresholds to suppress spam.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>NIP-XX: Agent Reputation Attestations&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2285">PR #2285&lt;/a>): Proposes kind &lt;code>30085&lt;/code> as a parameterized replaceable event for structured reputation attestations about Nostr agents. The draft avoids a single global score by making reputation observer-dependent, adds temporal decay so old attestations fade, supports negative ratings with evidence requirements, and sketches both simple weighted scoring and graph-diversity scoring for better Sybil resistance.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>NIP-XX: Paid API Service Announcements&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2291">PR #2291&lt;/a>): Proposes kind &lt;code>31402&lt;/code> addressable events for advertising paid HTTP APIs, with Nostr handling discovery and HTTP 402 handling payment. The draft is tags-first so relays can filter on payment methods, prices, and capabilities without parsing JSON content, and it allows optional request and response schemas so clients or agents can auto-generate calls.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>NIP-XX: Key Derivation from LNURL-auth via SplitSig&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2294">PR #2294&lt;/a>): Proposes deriving a Nostr keypair from an LNURL-auth ECDSA signature combined with a client-side random nonce. The derivation formula is &lt;code>nsec = SHA256(ecdsa_signature || nonce)&lt;/code>. The server sees the ECDSA signature (inherent to the LNURL-auth handshake) but never sees the nonce, and the browser generates the nonce but does not control the signature. Neither piece alone can derive the nsec. The intended outcome is that the same Lightning wallet produces the same Nostr key across devices, with the wallet as the recovery anchor and no server able to reconstruct the private key.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a>: Document rejected field&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2290">PR #2290&lt;/a>): Documents the &lt;code>rejected&lt;/code> field for intent-based signer responses, formalizing the behavior that &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#amethyst-ships-pinned-notes-relay-management-and-request-to-vanish">Amethyst&amp;rsquo;s v1.07.x fix&lt;/a> had to work around.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="nip-deep-dive-nip-5a-static-websites">NIP Deep Dive: NIP-5A (Static Websites)&lt;/h2>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/5A.md">NIP-5A&lt;/a> defines how to host static websites under Nostr keypairs, using two event kinds and existing blob storage infrastructure to turn signed events into served web pages. The &lt;a href="https://github.com/nostr-protocol/nips/blob/master/5A.md">specification&lt;/a> was merged on March 25 via &lt;a href="https://github.com/nostr-protocol/nips/pull/1538">PR #1538&lt;/a>.&lt;/p>
&lt;p>The model uses kind &lt;code>15128&lt;/code> for a root site, one per pubkey, and kind &lt;code>35128&lt;/code> for named sites identified by a &lt;code>d&lt;/code> tag. Each manifest maps absolute URL paths to SHA256 hashes. Here is a root site manifest:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;5324d695ed7abf7cdd2a48deb881c93b7f4e43de702989bbfb55a1b97b35a3de&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;266815e0c9210dfa324c6cba3573b14bee49da4209a9456f9484e5106cd408a5&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1743465600&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">15128&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;path&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;/index.html&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;186ea5fd14e88fd1ac49351759e7ab906fa94892002b60bf7f5a428f28ca1c99&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;path&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;/about.html&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;a1b2c3d4e5f6789012345678901234567890abcdef1234567890abcdef123456&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;path&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;/favicon.ico&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;fedcba0987654321fedcba0987654321fedcba0987654321fedcba0987654321&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;server&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;https://blossom.primal.net&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;title&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;My Nostr Site&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;description&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;A static website hosted on Nostr&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;source&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;https://github.com/lez/nsite&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;f4e4a9e785f70e9fcaa855d769438fea10781e84cd889e3fcb823774f83d094cf2c05d5a3ac4aebc1227a4ebc3d56867286c15a6df92d55045658bb428fd5fb5&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The serving flow works in three steps. A host server receives an HTTP request, extracts the author&amp;rsquo;s pubkey from the subdomain (either an npub for root sites or a base36-encoded pubkey for named sites), fetches the author&amp;rsquo;s relay list via &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a>, and queries for the site manifest. Once the manifest is found, the server resolves the requested path to a content hash, downloads the matching blob from the Blossom server or servers listed in the &lt;code>server&lt;/code> tags, and returns it.&lt;/p>
&lt;p>The DNS subdomain format is tightly specified. Root sites use the standard npub as the subdomain. Named sites use a 50-character base36 encoding of the raw pubkey followed by the &lt;code>d&lt;/code> tag value, all in a single DNS label. Because DNS labels are limited to 63 characters and the base36 encoding always takes 50, the &lt;code>d&lt;/code> tag is limited to 13 characters. The spec also requires &lt;code>d&lt;/code> tags to match &lt;code>^[a-z0-9-]{1,13}$&lt;/code> and not end with a hyphen, preventing DNS resolution ambiguities.&lt;/p>
&lt;p>Using content hashes means the same site can be served by different host servers, and file integrity is verifiable without trusting the server. A host server does not need to store any files itself. It fetches them on demand from Blossom using the hashes in the manifest. That means the author controls what is served, the Blossom server stores the raw files, and the host server just connects the two. Any of these three components can be replaced independently.&lt;/p>
&lt;p>Existing implementations include &lt;a href="https://github.com/lez/nsite">nsite&lt;/a>, the host server that resolves manifests and serves files, and &lt;a href="https://github.com/hzrd149/nsite-manager">nsite-manager&lt;/a>, a UI for building and publishing manifests. The spec also added a &lt;code>source&lt;/code> tag for linking to the site&amp;rsquo;s source code repository, and the README update merged separately in &lt;a href="https://github.com/nostr-protocol/nips/pull/2286">PR #2286&lt;/a> registered both kind &lt;code>15128&lt;/code> and &lt;code>35128&lt;/code> in the NIP kind index.&lt;/p>
&lt;h2 id="nip-deep-dive-nip-62-request-to-vanish">NIP Deep Dive: NIP-62 (Request to Vanish)&lt;/h2>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/62.md">NIP-62&lt;/a> defines kind &lt;code>62&lt;/code> as a request for relays to delete all events from the requesting pubkey. The &lt;a href="https://github.com/nostr-protocol/nips/blob/master/62.md">specification&lt;/a> is legally motivated: in jurisdictions with right-to-be-forgotten laws, having a standardized, signed deletion request gives relay operators a clear signal to act on.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;a7b8c9d0e1f23456789012345678901234567890abcdef1234567890abcdef12&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;f1e2d3c4b5a697887766554433221100ffeeddccbbaa99887766554433221100&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1743465600&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">62&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;relay&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.example.com&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Requesting deletion of all events from this relay.&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;11aa22bb33cc44dd55ee66ff77889900aabbccddeeff0011223344556677889911aa22bb33cc44dd55ee66ff77889900aabbccddeeff00112233445566778899&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The spec separates targeted and global vanish requests. A targeted request includes specific &lt;code>relay&lt;/code> tags identifying which relays should act. A global request uses the literal string &lt;code>ALL_RELAYS&lt;/code> as the relay tag value, asking every relay that sees the event to delete all events from that pubkey. Relays that comply must also ensure deleted events cannot be re-broadcast back into the relay, making the deletion sticky.&lt;/p>
&lt;p>NIP-62 goes beyond &lt;a href="https://nostrcompass.org/en/topics/nip-09/">NIP-09&lt;/a> (Event Deletion) in both scope and intent. NIP-09 lets you delete individual events, and relays MAY comply. NIP-62 requests deletion of everything, and the spec says relays MUST comply if their URL is tagged. It also asks relays to delete &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> (Gift Wrap) events that p-tagged the requesting pubkey, which means incoming DMs get cleaned up alongside the user&amp;rsquo;s own events. Publishing a NIP-09 deletion against a NIP-62 vanish request has no effect: once you vanish, you cannot un-vanish by deleting the vanish request.&lt;/p>
&lt;p>This week, &lt;a href="https://nostrcompass.org/en/newsletters/2026-04-01-newsletter/#amethyst-ships-pinned-notes-relay-management-and-request-to-vanish">Amethyst v1.07.0&lt;/a> shipped client-side NIP-62 support, letting users initiate vanish requests from the app. On the relay side, &lt;a href="https://github.com/rust-nostr/nostr">rust-nostr&lt;/a> has four open PRs adding NIP-62 support across the memory, LMDB, SQLite, and database test backends (&lt;a href="https://github.com/rust-nostr/nostr/pull/1315">PR #1315&lt;/a>, &lt;a href="https://github.com/rust-nostr/nostr/pull/1316">PR #1316&lt;/a>, &lt;a href="https://github.com/rust-nostr/nostr/pull/1317">PR #1317&lt;/a>, &lt;a href="https://github.com/rust-nostr/nostr/pull/1318">PR #1318&lt;/a>). This puts client support and relay support work into the same week.&lt;/p>
&lt;p>The protocol design raises a practical tension. Nostr&amp;rsquo;s value proposition includes censorship resistance, meaning relays should not be able to prevent publication. NIP-62 introduces a case where a relay MUST prevent re-publication from a specific pubkey. The two properties coexist because the request is self-directed: you are asking for deletion of your own events, not someone else&amp;rsquo;s. The censorship-resistance property remains intact for everyone except the person who explicitly opted out.&lt;/p>
&lt;hr>
&lt;p>That&amp;rsquo;s it for this week. Building something or have news to share? &lt;a href="nostr:npub1wav4fae3gyfy3xj298kxj2mj8phavz7vavps34przq02j7w902qq902923">Reach out via &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> (Private Direct Messages) DM&lt;/a> or find us on Nostr.&lt;/p></content:encoded></item><item><title>Nostr Compass #15</title><link>https://nostrcompass.org/en/newsletters/2026-03-25-newsletter/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-03-25-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/PrimalHQ/primal-android-app">Primal Android&lt;/a> follows its 3.0 wallet release with &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-25-newsletter/#primal-adds-follow-packs-zap-enrichment-and-deep-links">Follow Packs, zap enrichment, and &lt;code>primalconnect://&lt;/code> deep links&lt;/a>. &lt;a href="https://github.com/BigBrotr/bigbrotr">BigBrotr&lt;/a> publishes an &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-25-newsletter/#bigbrotr-maps-exposed-private-keys-across-the-relay-network">nsec leak analysis&lt;/a> scanning 41 million events across 1,085 relays, finding 16,599 valid private keys, while &lt;a href="https://npub.world">npub.world&lt;/a> integrates leak warnings into profile pages the same week. Martti Malmi launches &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-25-newsletter/#nostr-vpn-launches-as-a-tailscale-alternative">nostr-vpn&lt;/a>, a Tailscale alternative that signals over Nostr relays and creates WireGuard tunnels, shipping 11 releases in seven days. The &lt;a href="https://github.com/VectorPrivacy/Vector">Vector&lt;/a> team &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-25-newsletter/#open-source-doom-runs-peer-to-peer-over-nostr">open-sources P2P DOOM&lt;/a> over Nostr, &lt;a href="https://github.com/jmcorgan/fips">FIPS&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-25-newsletter/#fips-v020-ships-tor-transport-reproducible-builds-and-sidecar-examples">v0.2.0&lt;/a>, and &lt;a href="https://github.com/nostrability/schemata">Nostrability Schemata&lt;/a> expands to &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-25-newsletter/#nostrability-schemata-goes-multilingual">six languages&lt;/a> in one week.&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/PrimalHQ/primal-android-app">Primal Android&lt;/a> follows its 3.0 wallet release with &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-25-newsletter/#primal-adds-follow-packs-zap-enrichment-and-deep-links">Follow Packs, zap enrichment, and &lt;code>primalconnect://&lt;/code> deep links&lt;/a>. &lt;a href="https://github.com/BigBrotr/bigbrotr">BigBrotr&lt;/a> publishes an &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-25-newsletter/#bigbrotr-maps-exposed-private-keys-across-the-relay-network">nsec leak analysis&lt;/a> scanning 41 million events across 1,085 relays, finding 16,599 valid private keys, while &lt;a href="https://npub.world">npub.world&lt;/a> integrates leak warnings into profile pages the same week. Martti Malmi launches &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-25-newsletter/#nostr-vpn-launches-as-a-tailscale-alternative">nostr-vpn&lt;/a>, a Tailscale alternative that signals over Nostr relays and creates WireGuard tunnels, shipping 11 releases in seven days. The &lt;a href="https://github.com/VectorPrivacy/Vector">Vector&lt;/a> team &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-25-newsletter/#open-source-doom-runs-peer-to-peer-over-nostr">open-sources P2P DOOM&lt;/a> over Nostr, &lt;a href="https://github.com/jmcorgan/fips">FIPS&lt;/a> ships &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-25-newsletter/#fips-v020-ships-tor-transport-reproducible-builds-and-sidecar-examples">v0.2.0&lt;/a>, and &lt;a href="https://github.com/nostrability/schemata">Nostrability Schemata&lt;/a> expands to &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-25-newsletter/#nostrability-schemata-goes-multilingual">six languages&lt;/a> in one week.&lt;/p>
&lt;h2 id="news">News&lt;/h2>
&lt;h3 id="primal-adds-follow-packs-zap-enrichment-and-deep-links">Primal adds Follow Packs, zap enrichment, and deep links&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/newsletters/2026-03-18-newsletter/">Following last week&amp;rsquo;s 3.0.7 coverage&lt;/a>, &lt;a href="https://github.com/PrimalHQ/primal-android-app">Primal Android&lt;/a> spent this week on post-release work around onboarding, composer UX, and wallet context. Redesigned onboarding introduces Follow Packs (&lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/949">PR #949&lt;/a>), a native GIF button joins the note composer, a zap enrichment service (&lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/979">PR #979&lt;/a>) annotates wallet transactions with zap context, and a &lt;code>primalconnect://&lt;/code> deep-linking protocol (&lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/969">PR #969&lt;/a>) enables cross-app navigation.&lt;/p>
&lt;p>&lt;a href="https://github.com/PrimalHQ/primal-ios-app">Primal iOS&lt;/a> is shipping the same work through TestFlight in parallel, with the wallet switch (&lt;a href="https://github.com/PrimalHQ/primal-ios-app/pull/191">PR #191&lt;/a>), poll implementation, and onboarding refactor landing in the same window.&lt;/p>
&lt;h3 id="bigbrotr-maps-exposed-private-keys-across-the-relay-network">BigBrotr maps exposed private keys across the relay network&lt;/h3>
&lt;p>&lt;a href="https://github.com/BigBrotr/bigbrotr">BigBrotr&lt;/a>, the Nostr relay analytics platform, published a &lt;a href="https://bigbrotr.com/blog/exposed-nsec-analysis/">detailed analysis of exposed private keys&lt;/a> on the relay network. The study scanned 41 million events from 1,085 relays, searching for valid nsec strings embedded in event content, and found 16,599 valid private keys. That number looks alarming until you filter out a bot called &amp;ldquo;Mr.nsec&amp;rdquo; that accounts for 92% of the matches. After removing bot traffic, only 38 real accounts with more than 21,000 combined followers had exposed keys, and none showed signs of awareness that their keys were public.&lt;/p>
&lt;p>The team built an nsec-leak-checker as a &lt;a href="https://nostrcompass.org/en/topics/nip-90/">NIP-90&lt;/a> (Data Vending Machine) service, letting users check whether their private key appears anywhere in the scanned dataset without revealing the key to the checker. &lt;a href="https://npub.world">npub.world&lt;/a> integrated the leak data the same week, displaying warning banners on profile pages where exposed keys were detected. The combination gives the network both a programmatic interface for DVMs and agents and a human-readable warning for regular users. The underlying dataset also feeds &lt;a href="https://github.com/BigBrotr/bigbrotr/releases/tag/v6.4.0">BigBrotr v6.4.0&lt;/a>, which adds replaceable and addressable event materialized views and a synchronizer idle timeout fix.&lt;/p>
&lt;h3 id="nostr-vpn-launches-as-a-tailscale-alternative">Nostr VPN launches as a Tailscale alternative&lt;/h3>
&lt;p>Martti Malmi (mmalmi), creator of Iris, built and shipped &lt;a href="https://github.com/mmalmi/nostr-vpn">nostr-vpn&lt;/a>, a peer-to-peer VPN that uses Nostr relays for signaling and WireGuard (via boringtun) for encrypted tunnels. The motivation was direct: &amp;ldquo;Got annoyed by Tailscale requiring 3rd party accounts, so created Nostr VPN.&amp;rdquo; The tool creates mesh networks between devices using Nostr keypairs as identity, with no central coordination server.&lt;/p>
&lt;p>The project shipped 11 releases in seven days, from &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v0.2.2">v0.2.2&lt;/a> through &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v0.2.13">v0.2.13&lt;/a>. That sprint added Windows support, LAN pairing for local network discovery, and an Android sidecar for mobile devices. The architecture is simple: two devices exchange connection metadata over Nostr relays, then establish a direct WireGuard tunnel. Nostr handles discovery and NAT traversal signaling. WireGuard handles the actual traffic. Identity is a Nostr keypair.&lt;/p>
&lt;p>Malmi also continued pushing &lt;a href="https://github.com/mmalmi/nostr-double-ratchet">nostr-double-ratchet&lt;/a>, a Signal-style secure messaging channel library, shipping six releases from &lt;a href="https://github.com/mmalmi/nostr-double-ratchet/releases/tag/v0.0.86">v0.0.86&lt;/a> through &lt;a href="https://github.com/mmalmi/nostr-double-ratchet/releases/tag/v0.0.93">v0.0.93&lt;/a> during the same week.&lt;/p>
&lt;h3 id="open-source-doom-runs-peer-to-peer-over-nostr">Open-source DOOM runs peer-to-peer over Nostr&lt;/h3>
&lt;p>The &lt;a href="https://github.com/VectorPrivacy/Vector">Vector&lt;/a> team open-sourced a peer-to-peer multiplayer DOOM implementation that uses Nostr for peer discovery, &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> for end-to-end encryption, and &lt;a href="https://github.com/n0-computer/iroh">Iroh&lt;/a>, the QUIC networking library from n0, for gossip transport. The game ships as a 4.2 MB WebXDC file that can be sent inside chat messages, requiring no servers to host or coordinate a match.&lt;/p>
&lt;p>The technical approach replaces the original 1993 lockstep netcode with a real-time hybrid sync model. Players discover each other through Nostr relay queries, negotiate sessions through Marmot-encrypted channels, then hand off to Iroh&amp;rsquo;s QUIC gossip layer for the low-latency game traffic. The stack uses Nostr for discovery, Marmot for encryption, and Iroh for transport.&lt;/p>
&lt;p>Vector also shipped security hardening this week. The release adds a memory-hardened key vault with anti-debug protections and zeroize for sensitive key material, user blocking with full DM and group message filtering, and WebXDC realtime channel fixes for Mini Apps.&lt;/p>
&lt;h3 id="fips-v020-ships-tor-transport-reproducible-builds-and-sidecar-examples">FIPS v0.2.0 ships Tor transport, reproducible builds, and sidecar examples&lt;/h3>
&lt;p>&lt;a href="https://github.com/jmcorgan/fips">FIPS&lt;/a>, the Free Internetworking Peering System and Nostr-adjacent mesh networking project, shipped &lt;a href="https://github.com/jmcorgan/fips/releases/tag/v0.2.0-rel">v0.2.0&lt;/a>. The release adds Tor transport support for anonymized mesh links, reproducible builds, a sidecar example that connects through a Nostr relay, and Nostr release publishing in the OpenWrt package workflow. The release also fixes post-rekey jitter spikes caused by drain-window frames. The wire format changed from v0.1.0, so existing v0.1.0 nodes cannot interoperate with v0.2.0 without upgrading.&lt;/p>
&lt;h3 id="nostrability-schemata-goes-multilingual">Nostrability Schemata goes multilingual&lt;/h3>
&lt;p>The &lt;a href="https://github.com/nostrability/schemata">Nostrability Schemata&lt;/a> project, which maintains JSON Schema definitions for validating Nostr event kinds, expanded from JavaScript-only to six languages in one week. New packages shipped for Rust, Go, Dart, Swift, and Python, each providing both a data package and a validator. &lt;a href="https://github.com/nostrability/schemata/releases/tag/v0.2.6">v0.2.6&lt;/a> also added 17 new event kind schemas.&lt;/p>
&lt;p>The &lt;a href="https://nostrability.github.io/nostrability/">Nostrability interop tracker&lt;/a> received a parallel overhaul. A new What&amp;rsquo;s New tab publishes updates through both an Atom feed and a Nostr event, app category filtering lets visitors drill into specific client types, and the tracker now auto-detects programming languages from GitHub repository metadata. Nostrability also has its own npub now, making the project itself discoverable through the protocol it documents. For library authors working across languages, the multi-language schema packages mean the same event kind definitions are available as native imports instead of requiring each project to maintain its own schema copy.&lt;/p>
&lt;h2 id="releases">Releases&lt;/h2>
&lt;h3 id="amethyst-v1060-and-v1061">Amethyst v1.06.0 and v1.06.1&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a>, the Android client maintained by vitorpamplona, shipped &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.06.0">v1.06.0&lt;/a> and &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.06.1">v1.06.1&lt;/a> on March 23. The headline feature is poll support using &lt;a href="https://nostrcompass.org/en/topics/nip-85/">NIP-85&lt;/a> (Trusted Assertions) data for weighted voting, with redesigned poll and zap poll cards. The new rendering gives both standard polls and zap-weighted polls a cleaner visual layout. v1.06.1 follows with concurrent modification crash fixes that address stability regressions introduced in the poll rendering path.&lt;/p>
&lt;h3 id="amber-v500-and-v501">Amber v5.0.0 and v5.0.1&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a>, the &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> (Android Signer Application) signer app, promoted its recent 4.1.x pre-release work into stable with &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v5.0.0">v5.0.0&lt;/a> on March 18. That stable release carries the &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> relay-auth, built-in Tor, content-type-specific permissions, and encrypted PIN storage changes covered last week. &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v5.0.1">v5.0.1&lt;/a> then removes internet permission from the offline build flavor, so that build can no longer make network requests at the Android permission layer.&lt;/p>
&lt;h3 id="mostro-v0170-and-mostro-mobile-v122">Mostro v0.17.0 and Mostro Mobile v1.2.2&lt;/h3>
&lt;p>&lt;a href="https://github.com/MostroP2P/mostro">Mostro&lt;/a>, the peer-to-peer Bitcoin exchange built on Nostr, shipped &lt;a href="https://github.com/MostroP2P/mostro/releases/tag/v0.17.0">v0.17.0&lt;/a> on March 18. The server release continues the dispute and rating work from the v0.16.x cycle, adding more complete trade reputation data for buyers and sellers as Nostr events. &lt;a href="https://github.com/MostroP2P/mobile">Mostro Mobile&lt;/a>, the Flutter client, followed with &lt;a href="https://github.com/MostroP2P/mobile/releases/tag/v1.2.2">v1.2.2&lt;/a> on March 23, keeping the mobile interface in sync with the latest protocol changes.&lt;/p>
&lt;h3 id="shosho-v0140">Shosho v0.14.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/r0d8lsh0p/shosho-releases">Shosho&lt;/a>, the Nostr live streaming app, shipped &lt;a href="https://github.com/r0d8lsh0p/shosho-releases/releases/tag/v0.14.0">v0.14.0&lt;/a> on March 19 with the launch of Shosho Shop. The release adds a Shop tab on profiles, Shop in Browse, and an In-Live Shop button on lives and clips. The release notes say existing &amp;ldquo;Nostr products&amp;rdquo; appear automatically and buyers click through to the seller&amp;rsquo;s Plebeian Market page for purchase. Shosho&amp;rsquo;s release notes do not identify the listing event kind, so it is not yet possible to confirm whether Shosho Shop reads the same &lt;a href="https://nostrcompass.org/en/topics/nip-99/">NIP-99&lt;/a> classified listings that &lt;a href="https://github.com/shopstr-eng/shopstr">Shopstr&lt;/a> explicitly supports in its README.&lt;/p>
&lt;h3 id="applesauce-v520">Applesauce v5.2.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/hzrd149/applesauce">Applesauce&lt;/a>, hzrd149&amp;rsquo;s collection of helper packages for building Nostr applications, shipped &lt;a href="https://github.com/hzrd149/applesauce/releases/tag/applesauce-core@5.2.0">v5.2.0&lt;/a> on March 22. The release spans six packages. The SQLite package fixes a UNIQUE constraint collision on event tags that caused duplicate inserts. The signers package adds &lt;code>AndroidNativeSigner&lt;/code>, which wraps the &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> native Android signer interface so web-view-based apps can use hardware-backed signing without custom bridge code. The relay package adds a &lt;code>challenge&lt;/code> field to relay and pool status objects, tracking &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> auth state so apps can detect when a relay is requesting authentication and respond programmatically. The core package gains &lt;code>isEventPointerSame&lt;/code> and &lt;code>isAddressPointerSame&lt;/code> methods for deduplicating event references, and the common package adds &lt;code>user.blossomServers$&lt;/code> for resolving a user&amp;rsquo;s Blossom media servers. Applesauce powers noStrudel, Satellite, and several other web clients, so these fixes propagate across the web client layer.&lt;/p>
&lt;h3 id="wisp-ships-16-releases-in-one-week">Wisp ships 16 releases in one week&lt;/h3>
&lt;p>&lt;a href="https://github.com/barrydeen/wisp">Wisp&lt;/a>, the Android Nostr client, shipped 16 releases from &lt;a href="https://github.com/barrydeen/wisp/releases/tag/v0.9.3-beta">v0.9.3-beta&lt;/a> through &lt;a href="https://github.com/barrydeen/wisp/releases/tag/v0.13.1-beta">v0.13.1-beta&lt;/a> this week. The feature additions include multi-account support, a zen notifications mode for reduced interruptions, drafts and scheduled posts, safety content filters, and a new flame icon.&lt;/p>
&lt;h3 id="manent-v120">Manent v1.2.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/dtonon/manent">Manent&lt;/a>, the private encrypted notes and file storage app, shipped &lt;a href="https://github.com/dtonon/manent/releases/tag/v1.2.0">v1.2.0&lt;/a> on March 20. The release adds camera capture directly from the app, image resizing before upload to reduce storage costs, and pinch-to-zoom for reviewing stored images. Manent stores notes and files encrypted on Nostr relays using the user&amp;rsquo;s keypair, making the phone or desktop app a thin client that can reconstruct its full state from relay data.&lt;/p>
&lt;h3 id="divine-107">diVine 1.0.7&lt;/h3>
&lt;p>&lt;a href="https://github.com/divinevideo/divine-mobile">diVine&lt;/a>, the short-form video client, shipped &lt;a href="https://github.com/divinevideo/divine-mobile/releases/tag/1.0.7">1.0.7&lt;/a> on March 21 with a video playback watchdog that auto-resumes stalled videos. After the E2E test infrastructure and direct MP4 loading in &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-11-newsletter/#divine-ships-v106-with-e2e-test-infrastructure-and-nip-49-import">v1.0.6&lt;/a>, this release targets the remaining playback failure path: videos that stop mid-stream without throwing an error.&lt;/p>
&lt;h3 id="alby-extension-v3142">Alby Extension v3.14.2&lt;/h3>
&lt;p>&lt;a href="https://github.com/getAlby/lightning-browser-extension">Alby Extension&lt;/a>, the &lt;a href="https://nostrcompass.org/en/topics/nip-07/">NIP-07&lt;/a> (Browser Extension Signer) browser extension, shipped &lt;a href="https://github.com/getAlby/lightning-browser-extension/releases/tag/v3.14.2">v3.14.2&lt;/a> on March 18 with Lightning address QR code display and Schnorr signing support. The Schnorr addition aligns the browser extension with the secp256k1 signature scheme that Nostr uses natively.&lt;/p>
&lt;h3 id="noornote-v065-through-v0611">NoorNote v0.6.5 through v0.6.11&lt;/h3>
&lt;p>&lt;a href="https://github.com/77elements/noornote">NoorNote&lt;/a>, the note-taking app, shipped seven releases from &lt;a href="https://github.com/77elements/noornote/releases/tag/v0.6.5">v0.6.5&lt;/a> through &lt;a href="https://github.com/77elements/noornote/releases/tag/v0.6.11">v0.6.11&lt;/a>. The headline addition is Follow Packs: curated bundles of accounts that users can browse and subscribe to in bulk, similar to Twitter Lists but designed for onboarding. Users can create, edit, and share Follow Packs with custom titles, descriptions, and cover images. The series also upgrades the underlying Nostr library from NDK v2 to v3, which brings improved relay connection handling and subscription management. Picture notes and a redesigned relay connection experience round out the run.&lt;/p>
&lt;h3 id="nak-v0191-and-v0192">nak v0.19.1 and v0.19.2&lt;/h3>
&lt;p>&lt;a href="https://github.com/fiatjaf/nak">nak&lt;/a>, fiatjaf&amp;rsquo;s command-line Nostr toolkit for interacting with relays, encoding and decoding &lt;a href="https://nostrcompass.org/en/topics/nip-19/">NIP-19&lt;/a> (Bech32-Encoded Entities) identifiers, signing events, and querying relay data, shipped &lt;a href="https://github.com/fiatjaf/nak/releases/tag/v0.19.1">v0.19.1&lt;/a> and &lt;a href="https://github.com/fiatjaf/nak/releases/tag/v0.19.2">v0.19.2&lt;/a> on March 17 and 20. The two point releases follow the &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-18-newsletter/">v0.19.0&lt;/a> group-forum UI addition from last week.&lt;/p>
&lt;h3 id="calendar-by-form-v021">Calendar by Form* v0.2.1&lt;/h3>
&lt;p>&lt;a href="https://github.com/formstr-hq/nostr-calendar">Calendar by Form*&lt;/a>, the decentralized calendar app built on &lt;a href="https://nostrcompass.org/en/topics/nip-52/">NIP-52&lt;/a> (Calendar Events), shipped &lt;a href="https://github.com/formstr-hq/nostr-calendar/releases/tag/v0.2.1">v0.2.1&lt;/a> on March 20. The release fixes a notification template issue that affected event reminders. Calendar stores events as Nostr kind 31922 (date-based) and kind 31923 (time-based) events, letting any Nostr client render calendar data if it chooses to support the kinds. The app is built by the Formstr team, who also maintain Formstr (decentralized forms) and Pollerama (polls).&lt;/p>
&lt;h3 id="nym-v350-through-v353">NYM v3.50 through v3.53&lt;/h3>
&lt;p>&lt;a href="https://github.com/Spl0itable/NYM">NYM&lt;/a>, the lightweight ephemeral chat client bridged with Bitchat, shipped 28 releases from v3.50 through v3.53 (the patch versions increment rapidly). The most notable feature is Nymbot, a built-in chat bot that responds to &lt;code>@nymbot&lt;/code> mentions in channels and provides relay status and management functions. A &amp;ldquo;hardcore mode&amp;rdquo; generates a fresh keypair for every sent message, making conversation threads unlinkable at the identity level. The tradeoff is clear: you lose persistent identity but gain per-message anonymity. The relay proxy layer also received work, with sharded relay proxy workers for better connectivity, geohash channel support, and clock skew tolerance for nodes with imprecise system clocks.&lt;/p>
&lt;h2 id="project-updates">Project Updates&lt;/h2>
&lt;h3 id="ditto-adds-bluesky-bridge-and-wikipedia-integration">Ditto adds Bluesky bridge and Wikipedia integration&lt;/h3>
&lt;p>&lt;a href="https://github.com/soapbox-pub/ditto">Ditto&lt;/a>, the Soapbox team&amp;rsquo;s customizable Nostr social client, logged over 300 commits this week across three distinct feature tracks. The first is a Bluesky bridge (19 commits) that renders Bluesky posts inline as full feed-style threads, adds sidebar navigation to a Bluesky discovery page backed by the official Discover (whats-hot) feed, and wires up action buttons for commenting, sharing, reacting, and copying links. When a user replies to a Bluesky post from within Ditto, the compose modal shows a disclaimer callout noting the cross-protocol nature of the interaction. &lt;a href="https://nostrcompass.org/en/topics/nip-73/">NIP-73&lt;/a> (External Content IDs) kind 17 reactions power the cross-protocol model: a Nostr user reacts to a Bluesky post, and the reaction is stored as a standard Nostr event referencing the external content identifier. This is the same NIP-73 pattern that could bridge reactions to any external content, from Bluesky posts to YouTube videos to web pages.&lt;/p>
&lt;p>The second track is a Wikipedia integration (9 commits). Ditto now renders rich Wikipedia article content on detail pages instead of generic link previews, adds search autocomplete with article thumbnails, and provides a &lt;code>/wikipedia&lt;/code> page pulling featured content from the Wikipedia API. Wikipedia and Archive.org results also appear in the general search autocomplete dropdown. The third track is iOS platform support via Capacitor, with a remote build script and platform configuration landing alongside a UI overhaul (55 commits) that replaces backdrop-blur headers with a new arc-based navigation design across every page in the app. The 314 commits move Ditto from a Nostr-only client toward a multi-protocol aggregator that treats Bluesky and Wikipedia as first-class content sources alongside the Nostr feed.&lt;/p>
&lt;h3 id="pika-builds-a-nip-34-forge-ci-pipeline">Pika builds a NIP-34 forge CI pipeline&lt;/h3>
&lt;p>&lt;a href="https://github.com/sledtools/pika">Pika&lt;/a>, the Marmot-based encrypted messaging app, merged 33 PRs this week focused on a self-hosted &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> forge with pre-merge CI. The forge is a git hosting layer that receives patches as NIP-34 events, runs CI checks before merge, and reports structured status back through Nostr events. &lt;a href="https://github.com/sledtools/pika/pull/701">PR #701&lt;/a> adds lane-based pre-merge and nightly CI, where each code path (Rust, TypeScript, Apple builds) runs in its own lane with independent pass/fail status. &lt;a href="https://github.com/sledtools/pika/pull/715">PR #715&lt;/a> cuts managed CI agents to Incus OpenClaw containers for isolation, and &lt;a href="https://github.com/sledtools/pika/pull/733">PR #733&lt;/a> adds a &lt;code>ph forge&lt;/code> CLI for interacting with the hosted forge from the command line. Supporting PRs handle repo write permissions for merges (&lt;a href="https://github.com/sledtools/pika/pull/736">PR #736&lt;/a>), structured CI metadata with live status badges (&lt;a href="https://github.com/sledtools/pika/pull/722">PR #722&lt;/a>), Apple nightly build splits (&lt;a href="https://github.com/sledtools/pika/pull/738">PR #738&lt;/a>), and forge auth and branch lookup fixes (&lt;a href="https://github.com/sledtools/pika/pull/734">PR #734&lt;/a>). This is one of the first working CI/CD systems built on top of NIP-34 git events, moving Nostr-based source code hosting beyond basic patch exchange toward the merge-and-test workflow that developers expect from GitHub or GitLab.&lt;/p>
&lt;h3 id="nostria-adds-communities-code-snippets-and-voice-event-handling">Nostria adds communities, code snippets, and voice event handling&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostria-app/nostria">Nostria&lt;/a>, the cross-platform Nostr client maintained by sondreb, spent this week extending the app surface beyond the Web of Trust filtering covered in #14. The main addition is a full &lt;a href="https://nostrcompass.org/en/topics/nip-72/">NIP-72&lt;/a> (Moderated Communities) implementation with community creation, moderator and relay configuration, post approval tracking with image previews, and a dedicated community page with Posts and Moderators tabs.&lt;/p>
&lt;p>The same stretch of work also adds code snippet rendering and editing with a syntax-highlighted editor, voice event reply support for audio conversations, chat relay settings for direct messages, channel sharing through the Web Share API, a toolbar docking system for the media player, in-app signup for the latest Brainstorm Web of Trust service, send and receive money flows in DMs using NWC and BOLT-11 invoices, Nostr-native GIF handling, and a stronger RSS import path for musicians that can pick up existing Lightning splits from podcast feeds.&lt;/p>
&lt;h3 id="nostr-vpn-rapid-iteration">nostr-vpn rapid iteration&lt;/h3>
&lt;p>Beyond the &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-25-newsletter/#nostr-vpn-launches-as-a-tailscale-alternative">initial launch&lt;/a>, the &lt;a href="https://github.com/mmalmi/nostr-vpn">nostr-vpn&lt;/a> commit log reveals the specific problems encountered during real deployment. &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v0.2.3">v0.2.3&lt;/a> through &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v0.2.5">v0.2.5&lt;/a> added the initial installer script and cross-platform CLI. &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v0.2.6">v0.2.6&lt;/a> and &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v0.2.7">v0.2.7&lt;/a> brought Windows support, which required UAC path quoting for config writes and daemon-owned config updates. &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v0.2.8">v0.2.8&lt;/a> through &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v0.2.10">v0.2.10&lt;/a> fixed Windows GUI service actions, CLI subprocess handling, and machine-scoped service configuration. &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v0.2.12">v0.2.12&lt;/a> replaced LAN discovery with timed LAN pairing, a user-initiated flow where two devices on the same local network pair without relay signaling. The pattern is textbook early-stage field testing: each release targets a specific deployment failure, the user base is small enough to iterate daily, and the developer is using the tool personally between releases.&lt;/p>
&lt;h3 id="comet-automated-builds">Comet automated builds&lt;/h3>
&lt;p>&lt;a href="https://github.com/nodetec/comet">Comet&lt;/a> (formerly Captain&amp;rsquo;s Log), the Nostr-native long-form writing tool from Nodetec, produced over 40 automated alpha builds this week. Comet is a desktop app for writing and publishing NIP-23 (Long-form Content) articles, with local draft storage, markdown editing, and one-click publishing to the user&amp;rsquo;s relay set. The automated build pipeline generates a tagged release for every commit to the main branch, which makes the raw release count misleading as a measure of feature velocity. What the 40 builds do show is that the app is under daily active development, with each commit tested, packaged, and made available for download within minutes.&lt;/p>
&lt;h2 id="nip-updates">NIP Updates&lt;/h2>
&lt;p>Recent changes to the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a> during the March 17-24 window:&lt;/p>
&lt;p>No NIP merges landed between March 18 and March 24.&lt;/p>
&lt;p>&lt;strong>Open PRs and Discussions updated during the window:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>NIP-AA: Autonomous Agents on Nostr&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2259">PR #2259&lt;/a>): Proposes conventions for autonomous agents operating on the Nostr network. The PR defines how agents identify themselves, discover services, and coordinate with other agents and humans through Nostr events.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-50/">NIP-50&lt;/a> (Search): Sort extensions&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2283">PR #2283&lt;/a>): Adds sort parameters to NIP-50 search queries, including top, hot, zaps, and new. This would let clients request ranked results from relays that support full-text search instead of sorting client-side.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>NIP-A5: WASM Programs&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2281">PR #2281&lt;/a>): Proposes a convention for publishing and discovering WebAssembly programs on Nostr. WASM binaries could be distributed as Nostr events, with relays serving as a discovery layer for portable executable code.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>NIP-CF: Combine Forces interoperable napps&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2277">PR #2277&lt;/a>): Defines a convention for interoperable Nostr applications (&amp;ldquo;napps&amp;rdquo;) that can compose functionality across different clients and services.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Snapshots NIP&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2279">PR #2279&lt;/a>): Proposes a mechanism for relay state snapshots, for relay synchronization and backup.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Checkpoints NIP&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2278">PR #2278&lt;/a>): Proposes checkpoint events for marking known-good relay state, complementing the snapshots proposal.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-58/">NIP-58&lt;/a> (Badges): Badge Sets refactor&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2276">PR #2276&lt;/a>): Restructures how badge collections are organized and referenced.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> (Relay Information Document): Extensions&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2280">PR #2280&lt;/a>): Adds additional fields to the relay information document for richer machine-readable relay metadata.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="five-years-of-nostr-marches">Five Years of Nostr Marches&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/#five-years-of-nostr-februaries">Last month&amp;rsquo;s newsletter&lt;/a> covered how Nostr&amp;rsquo;s Februaries progressed from the NIP-01 (Basic Protocol Flow) rewrite through the Damus App Store wave to mesh networking and agent proposals. This retrospective traces what happened each March from 2021 through 2026.&lt;/p>
&lt;h3 id="march-2021-two-commits">March 2021: Two Commits&lt;/h3>
&lt;p>Four months into its existence, Nostr&amp;rsquo;s March produced exactly two commits to the protocol repository, both on March 4. fiatjaf &lt;a href="https://github.com/nostr-protocol/nostr/commit/dcd8cc3">added links to nostwitter instances&lt;/a>, pointing early visitors to working deployments, and &lt;a href="https://github.com/nostr-protocol/nostr/commit/54dfb46">added kind to the basic filter definition&lt;/a>. That second commit is revealing: in March 2021, you could not yet filter Nostr events by kind. The protocol was that primitive. Two or three relays served the network. The Telegram group was the sole coordination channel. The NIPs repository did not exist yet; protocol proposals lived as files in the main nostr repo. fiatjaf was the only committer that month. The entire March 2021 output of what would become a protocol supporting VPNs, multiplayer games, and mesh networking five years later fits in a single git diff.&lt;/p>
&lt;h3 id="march-2022-pre-damus-building">March 2022: Pre-Damus Building&lt;/h3>
&lt;p>The main protocol repository received zero commits in March 2022. Development had shifted entirely to tool repositories. &lt;a href="https://github.com/fiatjaf/branle">Branle&lt;/a>, fiatjaf&amp;rsquo;s Vue.js web client and at the time the primary Nostr interface, received 5 commits including Docker deployment support and &lt;a href="https://nostrcompass.org/en/topics/nip-05/">NIP-05&lt;/a> (DNS-Based Verification) display name fixes that removed the &lt;code>_@&lt;/code> prefix from verification badges. Robert C. Martin&amp;rsquo;s &lt;a href="https://github.com/unclebob/more-speech">more-speech&lt;/a>, the Clojure desktop client, logged 13 or more commits adding threading, keyboard navigation, and an edit window. The most famous software author actively building on Nostr that month was not a crypto developer but the person whose &amp;ldquo;Clean Code&amp;rdquo; has sold millions of copies, writing a Nostr client in Clojure, a language choice that tells you everything about the early community: these were opinionated programmers building for themselves.&lt;/p>
&lt;p>The relay network had expanded to roughly 15 relays with an active user base in the hundreds. Damus did not exist yet and would not be created until April 2022. Nostream also had not appeared. The month&amp;rsquo;s work was infrastructure: making the existing tools more reliable for the small community that was already using them daily.&lt;/p>
&lt;h3 id="march-2023-post-explosion-infrastructure">March 2023: Post-Explosion Infrastructure&lt;/h3>
&lt;p>One month after the Damus App Store wave and the surge past 300,000 public keys, March 2023 was about absorbing the growth. The &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a> merged 28 pull requests, the second-highest monthly count in protocol history. &lt;a href="https://nostrcompass.org/en/topics/nip-51/">NIP-51&lt;/a> (Lists) merged, giving clients structured follow, mute, and bookmark collections. &lt;a href="https://nostrcompass.org/en/topics/nip-39/">NIP-39&lt;/a> (External Identities in Profiles) landed, NIP-78 (Application-Specific Data) provided a general-purpose storage kind for apps that needed private state, and a rewrite of &lt;a href="https://nostrcompass.org/en/topics/nip-57/">NIP-57&lt;/a> (Lightning Zaps) (&lt;a href="https://github.com/nostr-protocol/nips/pull/392">PR #392&lt;/a>) consolidated the zap flow and clarified terminology. The most-discussed PR of the month was an alternative mention handling proposal (&lt;a href="https://github.com/nostr-protocol/nips/pull/381">PR #381&lt;/a>) with over 50 comments.&lt;/p>
&lt;p>The most consequential new project was &lt;a href="https://github.com/nostr-dev-kit/ndk">NDK&lt;/a> (Nostr Development Kit), the TypeScript library for relay connections, event signing, caching, and subscription management. pablof7z made the &lt;a href="https://github.com/nostr-dev-kit/ndk/commit/09e5e03">initial commit&lt;/a> on March 16, 2023, then rewrote it from scratch 11 days later on March 27 (&amp;ldquo;basically another initial commit&amp;rdquo;), and had LNURL and zap support working by March 31. NDK went from nothing to zap-capable in 15 days. Five days after NDK&amp;rsquo;s creation, on March 21, the Alby team created &lt;a href="https://github.com/getAlby/nostr-wallet-connect">NWC&lt;/a> (Nostr Wallet Connect), the reference implementation of &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> that connected Lightning wallets to Nostr applications. The two projects that would underpin the next three years of web-based Nostr development were born in the same 30-day window. OpenSats had not yet launched its Nostr fund; the first wave would not come until &lt;a href="https://opensats.org/blog/nostr-grants-july-2023">July 2023&lt;/a>, four months after NDK&amp;rsquo;s creation.&lt;/p>
&lt;p>Other notable creations that month included NostrGit, NostrChat, a nostr-signing-device project by LNbits, and nostrmo. &lt;a href="https://github.com/mikedilger/gossip">Gossip&lt;/a>, the Rust desktop client focused on intelligent relay selection, shipped three releases. The protocol was in build mode, and the tools created in March 2023 are still in use three years later.&lt;/p>
&lt;h3 id="march-2024-protocol-maturation">March 2024: Protocol Maturation&lt;/h3>
&lt;p>March 2024 was about hardening the protocol for long-term use. The NIPs repository merged 12 pull requests. The most significant was &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> (Git Stuff), &lt;a href="https://github.com/nostr-protocol/nips/pull/997">PR #997&lt;/a>, which merged on March 5 after over 130 comments and 44 days of review. The discussion thread is a time capsule of the community debating how to build a decentralized GitHub. jb55 drew parallels to &lt;code>git send-email&lt;/code>, Giszmo proposed using root commit hashes for cross-fork discovery (&amp;ldquo;something GitHub doesn&amp;rsquo;t do and we could&amp;rdquo;), mikedilger suggested &lt;a href="https://nostrcompass.org/en/topics/nip-98/">NIP-98&lt;/a> (HTTP Auth) event-signed authentication instead of SSH keys, and fiatjaf bluntly dismissed the need for version-control generality: &amp;ldquo;not for each version control system, just for git. No one uses the others.&amp;rdquo; Within hours of opening the PR, fiatjaf had already switched nak, go-nostr, and gitstr to accept patches over Nostr. DanConwayDev, whose ngit was already an OpenSats grantee, was among the most active contributors to the discussion. A bot field for profile metadata also merged, giving clients a machine-readable way to distinguish automated accounts from human ones.&lt;/p>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> shipped v0.85.0 with git event support, wiki articles, medical data rendering, and content editing in a single release. &lt;a href="https://github.com/MostroP2P/mostro">Mostro&lt;/a> reached v0.10.0. &lt;a href="https://github.com/Spl0itable/nosflare">Nosflare&lt;/a>, a serverless Nostr relay running on Cloudflare Workers, proved that relay logic could run at the edge. OpenSats issued a &lt;a href="https://opensats.org/blog/long-term-support-for-bruno-garcia">Long-Term Support grant to Bruno Garcia&lt;/a> for sustained contributions to the Amethyst client.&lt;/p>
&lt;h3 id="march-2025-infrastructure-expansion">March 2025: Infrastructure Expansion&lt;/h3>
&lt;p>March 2025 produced 10 merged NIPs. The headline was &lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a> (Relay Discovery and Liveness Monitoring), &lt;a href="https://github.com/nostr-protocol/nips/pull/230">PR #230&lt;/a>, which merged on March 3 after a 25-month journey. dskvr first proposed relay monitoring in February 2023, was told it could be done client-side, explained why connecting to thousands of relays at once was impractical for individual clients, went through seven complete drafts, built monitoring nodes across eight geographic regions (Northeast US, Brazil, US-West, US-East, Australia, India, Korea, South Africa), and waited for the relay tooling to catch up. By the time it merged, implementations already existed in nostr.watch, relaypag.es, monitorlizard, Snort, noStrudel, and Jumble. The NIP-66 data would later fuel the Nostrability outbox benchmarks &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/#outbox-model-under-the-microscope">covered in Newsletter #12&lt;/a>. NIP-C0 (Code Snippets) also merged (&lt;a href="https://github.com/nostr-protocol/nips/pull/1852">PR #1852&lt;/a>, 63 comments), adding kind 1337 events for sharing source code.&lt;/p>
&lt;p>The first MCP servers for Nostr appeared this month. &lt;a href="https://github.com/AustinKelsay/nostr-mcp-server">nostr-mcp-server&lt;/a> appeared on March 23 and &lt;a href="https://github.com/getAlby/nwc-mcp-server">nwc-mcp-server&lt;/a> on March 14, just four months after Anthropic announced the Model Context Protocol in November 2024. These early bridges preceded the full &lt;a href="https://nostrcompass.org/en/topics/contextvm/">ContextVM&lt;/a> SDK and the agent commerce work that followed in late 2025 and early 2026.&lt;/p>
&lt;p>&lt;a href="https://github.com/mikedilger/gossip">Gossip&lt;/a> shipped v0.14.0. &lt;a href="https://github.com/coracle-social/coracle">Coracle&lt;/a>, hodlbod&amp;rsquo;s web client with relay-aware feed management, shipped three releases. OpenSats announced its &lt;a href="https://opensats.org/blog/tenth-wave-of-nostr-grants">tenth wave of Nostr grants&lt;/a>, continuing the funding pipeline that had been running since mid-2023.&lt;/p>
&lt;h3 id="march-2026-convergence">March 2026: Convergence&lt;/h3>
&lt;p>&lt;em>March 2026 activity is drawn from Nostr Compass issues &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/">#12&lt;/a> through &lt;a href="">#15&lt;/a> (this issue).&lt;/em>&lt;/p>
&lt;p>March 2026 is the month where disparate threads converged into working systems. The &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/#marmot-development-kit-ships-first-public-release">Marmot Development Kit&lt;/a> shipped its first public release with encrypted media, multi-language bindings, and a ChaCha20-Poly1305 migration that required coordinated updates across spec, Rust, and TypeScript. &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-11-newsletter/#shopstr-and-milk-market-open-mcp-commerce-surfaces">Shopstr and Milk Market&lt;/a> added MCP commerce surfaces for agent-driven purchasing. &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> relay auth landed simultaneously in &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-11-newsletter/#nip-42-relay-auth-across-bunker-signer-and-relay">Amber&lt;/a>, strfry, and OAuth Bunker, closing the loop between signer, relay, and bunker software. &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-18-newsletter/#notedeck-moves-release-discovery-onto-nostr">Notedeck&lt;/a> shipped Nostr-native software updates using &lt;a href="https://nostrcompass.org/en/topics/nip-94/">NIP-94&lt;/a> (File Metadata) release events.&lt;/p>
&lt;p>This week, &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-25-newsletter/#bigbrotr-maps-exposed-private-keys-across-the-relay-network">BigBrotr&lt;/a> scanned the full relay network for leaked private keys and published both the analysis and a DVM checker. &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-25-newsletter/#nostr-vpn-launches-as-a-tailscale-alternative">Nostr VPN&lt;/a> proved that Nostr&amp;rsquo;s key model works for network infrastructure, not only social media. &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-25-newsletter/#open-source-doom-runs-peer-to-peer-over-nostr">DOOM&lt;/a> demonstrated that Nostr discovery, Marmot encryption, and QUIC transport can run a real-time multiplayer game. &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-25-newsletter/#amber-v500-and-v501">Amber&lt;/a> jumped to v5.0.0. &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-25-newsletter/#wisp-ships-16-releases-in-one-week">Wisp&lt;/a> shipped 16 releases in seven days. Twenty-five or more tagged releases came from major projects in a single week.&lt;/p>
&lt;p>Seven NIPs merged in the first 24 days of the month. The protocol added &lt;a href="https://nostrcompass.org/en/topics/nip-54/">NIP-54&lt;/a> (Wiki) Djot markup, &lt;a href="https://nostrcompass.org/en/topics/nip-19/">NIP-19&lt;/a> (Bech32-Encoded Entities) input limits, &lt;a href="https://nostrcompass.org/en/topics/nip-91/">NIP-91&lt;/a> (AND Operator for Filters) boolean query logic, and &lt;a href="https://nostrcompass.org/en/topics/nip-85/">NIP-85&lt;/a> (Trusted Assertions) Web of Trust assertions. Open proposals ranged from autonomous agents (NIP-AA) to WASM programs (NIP-A5) to search sort extensions for &lt;a href="https://nostrcompass.org/en/topics/nip-50/">NIP-50&lt;/a>.&lt;/p>
&lt;h3 id="looking-ahead">Looking Ahead&lt;/h3>
&lt;p>Five Marches of Nostr trace a clear arc. In 2021, one person made two commits to a protocol that could not yet filter events by kind. By 2023, NDK and NWC were born five days apart to absorb the post-Damus explosion. By 2024, a 141-comment PR thread debated how git collaboration should work on a social protocol. By 2025, a relay monitoring spec that had been patiently rewritten seven times over 25 months finally merged. In 2026, someone got annoyed by Tailscale requiring an account and built a VPN using Nostr keypairs, while someone else shipped multiplayer DOOM that discovers peers through Nostr relays and encrypts gameplay through Marmot. BigBrotr&amp;rsquo;s scan of 41 million events across 1,085 relays gives a concrete measure of how far the network has grown. The protocol&amp;rsquo;s surface area in March 2026 would have been unrecognizable to March 2021, but the underlying model, events signed by secp256k1 keys and distributed through relays, has not changed.&lt;/p>
&lt;hr>
&lt;p>That&amp;rsquo;s it for this week. Building something or have news to share? &lt;a href="nostr:npub1wav4fae3gyfy3xj298kxj2mj8phavz7vavps34przq02j7w902qq902923">Reach out via &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> (Private Direct Messages) DM&lt;/a> or find us on Nostr.&lt;/p></content:encoded></item><item><title>Nostr Compass #14</title><link>https://nostrcompass.org/en/newsletters/2026-03-18-newsletter/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-03-18-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> lands full &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> (Nostr Wallet Connect) method support, &lt;a href="https://github.com/getAlby/hub">Alby Hub&lt;/a> adds multiple relay support in &lt;a href="https://github.com/getAlby/hub/releases/tag/v1.21.6">v1.21.6&lt;/a>, &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> ships &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v4.1.3">v4.1.3&lt;/a> with built-in Tor and finer signer permissions, and &lt;a href="https://github.com/ZeusLN/zeus">Zeus&lt;/a> removes a risky NWC keysend path in &lt;a href="https://github.com/ZeusLN/zeus/pull/3835">PR #3835&lt;/a>. &lt;a href="https://github.com/damus-io/notedeck">Notedeck&lt;/a> ships a signed updater in &lt;a href="https://github.com/damus-io/notedeck/releases/tag/v0.8.0-rc2">v0.8.0-rc2&lt;/a> that discovers releases through &lt;a href="https://nostrcompass.org/en/topics/nip-94/">NIP-94&lt;/a> (File Metadata) events, while &lt;a href="https://github.com/damus-io/damus">Damus&lt;/a> fixes stale &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> (Relay List Metadata) state, &lt;a href="https://github.com/nostrability/outbox">Nostrability Outbox&lt;/a> revises its benchmark results with corrected data, and &lt;a href="https://github.com/PrimalHQ/primal-ios-app">Primal iOS&lt;/a> tests direct relay subscriptions for DMs. &lt;a href="https://github.com/PrimalHQ/primal-android-app">Primal Android&lt;/a> ships &lt;a href="https://github.com/PrimalHQ/primal-android-app/releases/tag/3.0.7">3.0.7&lt;/a>, &lt;a href="https://github.com/v0l/route96">Route96&lt;/a> ships &lt;a href="https://github.com/v0l/route96/releases/tag/v0.6.0">v0.6.0&lt;/a>, &lt;a href="https://github.com/DavidGershony/openChat">OpenChat&lt;/a> keeps tightening Marmot interoperability in &lt;a href="https://github.com/DavidGershony/openChat/releases/tag/v0.1.0-alpha.11">v0.1.0-alpha.11&lt;/a>, &lt;a href="https://github.com/sledtools/pika">Pika&lt;/a> consolidates its runtime in &lt;a href="https://github.com/sledtools/pika/releases/tag/pika/v1.1.1">pika/v1.1.1&lt;/a>, and &lt;a href="https://github.com/nostria-app/nostria">Nostria&lt;/a> adds &lt;a href="https://nostrcompass.org/en/topics/nip-85/">NIP-85&lt;/a> (Trusted Assertions) Web of Trust filtering. The NIPs repository merges &lt;a href="https://nostrcompass.org/en/topics/nip-54/">NIP-54&lt;/a> (Wiki) Djot markup and a 5000-character input cap for &lt;a href="https://nostrcompass.org/en/topics/nip-19/">NIP-19&lt;/a> (Bech32-Encoded Entities), and this issue digs into &lt;a href="https://nostrcompass.org/en/topics/nip-94/">NIP-94&lt;/a> (File Metadata) and what the &lt;a href="https://nostrcompass.org/en/topics/nip-54/">NIP-54&lt;/a> Djot switch changes for implementers.&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> lands full &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> (Nostr Wallet Connect) method support, &lt;a href="https://github.com/getAlby/hub">Alby Hub&lt;/a> adds multiple relay support in &lt;a href="https://github.com/getAlby/hub/releases/tag/v1.21.6">v1.21.6&lt;/a>, &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> ships &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v4.1.3">v4.1.3&lt;/a> with built-in Tor and finer signer permissions, and &lt;a href="https://github.com/ZeusLN/zeus">Zeus&lt;/a> removes a risky NWC keysend path in &lt;a href="https://github.com/ZeusLN/zeus/pull/3835">PR #3835&lt;/a>. &lt;a href="https://github.com/damus-io/notedeck">Notedeck&lt;/a> ships a signed updater in &lt;a href="https://github.com/damus-io/notedeck/releases/tag/v0.8.0-rc2">v0.8.0-rc2&lt;/a> that discovers releases through &lt;a href="https://nostrcompass.org/en/topics/nip-94/">NIP-94&lt;/a> (File Metadata) events, while &lt;a href="https://github.com/damus-io/damus">Damus&lt;/a> fixes stale &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> (Relay List Metadata) state, &lt;a href="https://github.com/nostrability/outbox">Nostrability Outbox&lt;/a> revises its benchmark results with corrected data, and &lt;a href="https://github.com/PrimalHQ/primal-ios-app">Primal iOS&lt;/a> tests direct relay subscriptions for DMs. &lt;a href="https://github.com/PrimalHQ/primal-android-app">Primal Android&lt;/a> ships &lt;a href="https://github.com/PrimalHQ/primal-android-app/releases/tag/3.0.7">3.0.7&lt;/a>, &lt;a href="https://github.com/v0l/route96">Route96&lt;/a> ships &lt;a href="https://github.com/v0l/route96/releases/tag/v0.6.0">v0.6.0&lt;/a>, &lt;a href="https://github.com/DavidGershony/openChat">OpenChat&lt;/a> keeps tightening Marmot interoperability in &lt;a href="https://github.com/DavidGershony/openChat/releases/tag/v0.1.0-alpha.11">v0.1.0-alpha.11&lt;/a>, &lt;a href="https://github.com/sledtools/pika">Pika&lt;/a> consolidates its runtime in &lt;a href="https://github.com/sledtools/pika/releases/tag/pika/v1.1.1">pika/v1.1.1&lt;/a>, and &lt;a href="https://github.com/nostria-app/nostria">Nostria&lt;/a> adds &lt;a href="https://nostrcompass.org/en/topics/nip-85/">NIP-85&lt;/a> (Trusted Assertions) Web of Trust filtering. The NIPs repository merges &lt;a href="https://nostrcompass.org/en/topics/nip-54/">NIP-54&lt;/a> (Wiki) Djot markup and a 5000-character input cap for &lt;a href="https://nostrcompass.org/en/topics/nip-19/">NIP-19&lt;/a> (Bech32-Encoded Entities), and this issue digs into &lt;a href="https://nostrcompass.org/en/topics/nip-94/">NIP-94&lt;/a> (File Metadata) and what the &lt;a href="https://nostrcompass.org/en/topics/nip-54/">NIP-54&lt;/a> Djot switch changes for implementers.&lt;/p>
&lt;h2 id="news">News&lt;/h2>
&lt;h3 id="wallet-connect-support-broadens-and-wallet-clients-tighten-failure-paths">Wallet Connect support broadens, and wallet clients tighten failure paths&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a>, the Android client maintained by vitorpamplona, merged &lt;a href="https://github.com/vitorpamplona/amethyst/pull/1828">PR #1828&lt;/a>, which brings its &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> implementation close to full protocol coverage. The patch adds &lt;code>make_invoice&lt;/code>, &lt;code>lookup_invoice&lt;/code>, &lt;code>list_transactions&lt;/code>, &lt;code>get_balance&lt;/code>, &lt;code>get_info&lt;/code>, hold invoice methods, keysend support with TLV records, capability discovery via kind &lt;code>13194&lt;/code>, and notification events on kind &lt;code>23197&lt;/code> with &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> (Encrypted Payloads). That gives the client a much wider NWC surface without leaning on app-specific extensions.&lt;/p>
&lt;p>The surrounding wallet stack moved in the same direction. &lt;a href="https://github.com/getAlby/hub">Alby Hub&lt;/a>, the self-custodial Lightning node and wallet service behind many NWC deployments, shipped &lt;a href="https://github.com/getAlby/hub/releases/tag/v1.21.6">v1.21.6&lt;/a> with multiple relay support and simpler connection and swap flows. &lt;a href="https://github.com/ZeusLN/zeus">Zeus&lt;/a>, the mobile Lightning wallet, merged &lt;a href="https://github.com/ZeusLN/zeus/pull/3835">PR #3835&lt;/a> removing NWC keysend support after identifying a silent fund-drain path in that flow, while also fixing pending-event and Cashu activity handling. Wallet connectivity on Nostr is getting broader, and implementers are removing flows that are hard to secure.&lt;/p>
&lt;h3 id="notedeck-moves-release-discovery-onto-nostr">Notedeck moves release discovery onto Nostr&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/newsletters/2026-03-11-newsletter/">Following last week&amp;rsquo;s Notedeck coverage&lt;/a>, &lt;a href="https://github.com/damus-io/notedeck">Notedeck&lt;/a>, the native desktop client from the Damus team, shipped &lt;a href="https://github.com/damus-io/notedeck/releases/tag/v0.8.0-rc2">v0.8.0-rc2&lt;/a> after merging &lt;a href="https://github.com/damus-io/notedeck/pull/1326">PR #1326&lt;/a>. The new updater subscribes to signed kind &lt;code>1063&lt;/code> release events, matches the local platform, downloads the referenced binary, and verifies its SHA256 hash before install. Release metadata no longer has to come from the GitHub API or a project website. A trusted release pubkey and a relay connection are enough.&lt;/p>
&lt;p>The same patch adds a &lt;code>notedeck-release&lt;/code> CLI that publishes those events from GitHub release artifacts, which means the release pipeline now has a Nostr-native publishing path as well as a Nostr-native discovery path. It also puts the Damus and Notedeck updater model much closer to Zapstore&amp;rsquo;s relay-published signed release flow: Zapstore&amp;rsquo;s &lt;code>zsp&lt;/code> tooling already handles software assets as kind &lt;code>1063&lt;/code> or &lt;code>3063&lt;/code> events, so this path is not locked to one client or one publisher. The rest of the release candidate is practical desktop work, follows columns, profile &amp;ldquo;View As User,&amp;rdquo; &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> (Gift Wrap) support, real-time note stats, and &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> (Relay Information Document) limitation handling, but the updater is the part likely to outlive this one release cycle.&lt;/p>
&lt;h3 id="relay-state-is-moving-closer-to-runtime-behavior">Relay state is moving closer to runtime behavior&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/damus">Damus&lt;/a> merged &lt;a href="https://github.com/damus-io/damus/pull/3665">PR #3665&lt;/a>, replacing a stale stored relay-list event ID with a direct database query for the latest kind &lt;code>10002&lt;/code> event. When the old value went stale, relay add and remove operations could fall back to bootstrap or year-old lists, which made some relay changes appear to succeed while leaving the active state unchanged. &lt;a href="https://github.com/damus-io/damus/pull/3690">PR #3690&lt;/a> fixes a second failure path by deleting stale &lt;code>lock.mdb&lt;/code> state during LMDB compaction so the app does not crash with &lt;code>SIGBUS&lt;/code> on the next launch.&lt;/p>
&lt;p>&lt;a href="https://github.com/PrimalHQ/primal-ios-app">Primal iOS&lt;/a> opened &lt;a href="https://github.com/PrimalHQ/primal-ios-app/pull/194">PR #194&lt;/a>, which subscribes directly to a chat partner&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-04/">NIP-04&lt;/a> (Encrypted Direct Messages) write relays while a conversation is open, keeping the cache server as fallback. &lt;a href="https://github.com/nostur-com/nostur-ios-public">Nostur&lt;/a> opened &lt;a href="https://github.com/nostur-com/nostur-ios-public/pull/53">PR #53&lt;/a>, which combines randomized relay scoring, &lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a> liveness filtering from nostr.watch, and Thompson sampling to change relay selection from a fixed heuristic into a learned policy. Clients have long treated relay choice as setup data. More apps now treat it as live state that needs measurement and repair logic.&lt;/p>
&lt;h2 id="releases">Releases&lt;/h2>
&lt;h3 id="primal-android-307">Primal Android 3.0.7&lt;/h3>
&lt;p>&lt;a href="https://github.com/PrimalHQ/primal-android-app">Primal Android&lt;/a>, the Android client from Primal, shipped &lt;a href="https://github.com/PrimalHQ/primal-android-app/releases/tag/3.0.7">3.0.7&lt;/a> with a new poll and wallet cycle. &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/945">PR #945&lt;/a> adds zap-based poll voting, &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/948">PR #948&lt;/a> paginates vote loading so larger polls stay usable, and &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/965">PR #965&lt;/a> fetches zap receipts for all transactions. The same release also tags supported events with &lt;a href="https://nostrcompass.org/en/topics/nip-89/">NIP-89&lt;/a> (Recommended Application Handlers) client metadata in &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/968">PR #968&lt;/a>, which helps downstream clients attribute event origins more cleanly.&lt;/p>
&lt;h3 id="amber-v413">Amber v4.1.3&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/newsletters/2026-03-11-newsletter/">Following last week&amp;rsquo;s Amber coverage&lt;/a>, &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a>, the Android signer app for &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> flows, shipped &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v4.1.3">v4.1.3&lt;/a>. The release builds on its recent &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> relay-auth work with more operational hardening: &lt;a href="https://github.com/greenart7c3/Amber/pull/327">PR #327&lt;/a> adds built-in Tor alongside Orbot support, &lt;a href="https://github.com/greenart7c3/Amber/pull/324">PR #324&lt;/a> replaces coarse NIP-based encryption permissions with content-type-specific rules, and &lt;a href="https://github.com/greenart7c3/Amber/pull/336">PR #336&lt;/a> removes network permissions from the offline flavor while &lt;a href="https://github.com/greenart7c3/Amber/pull/335">PR #335&lt;/a> adds CI checks to keep it that way. &lt;a href="https://github.com/greenart7c3/Amber/pull/322">PR #322&lt;/a> also moves PIN storage into encrypted DataStore.&lt;/p>
&lt;p>This release tightens the signer boundary itself. That is useful for any Android flow that hands real keys or relay-auth decisions to Amber, because the hard part is not only what the signer can do. It is also how narrowly it can be scoped.&lt;/p>
&lt;h3 id="route96-v060">Route96 v0.6.0&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/newsletters/2026-03-11-newsletter/">Following last week&amp;rsquo;s Route96 coverage&lt;/a>, &lt;a href="https://github.com/v0l/route96">Route96&lt;/a>, the media server that supports Blossom and &lt;a href="https://nostrcompass.org/en/topics/nip-96/">NIP-96&lt;/a> (HTTP File Storage), released &lt;a href="https://github.com/v0l/route96/releases/tag/v0.6.0">v0.6.0&lt;/a>. The release moves configuration and whitelist state into the database with hot reload and adds retention policies for cold or aging files. It also adds a richer &lt;code>GET /user/files&lt;/code> endpoint plus file-stat tracking for downloads and egress, which gives operators more visibility into how their storage server is being used.&lt;/p>
&lt;h3 id="openchat-v010-alpha11">OpenChat v0.1.0-alpha.11&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/newsletters/2026-03-11-newsletter/">Following last week&amp;rsquo;s OpenChat coverage&lt;/a>, &lt;a href="https://github.com/DavidGershony/openChat">OpenChat&lt;/a>, the Avalonia-based chat client built on the Marmot stack, shipped &lt;a href="https://github.com/DavidGershony/openChat/releases/tag/v0.1.0-alpha.11">v0.1.0-alpha.11&lt;/a> after a week of fast protocol work. &lt;a href="https://github.com/DavidGershony/openChat/commit/c33895d6b1a198f01b9b01a7be974bdce033fb9c">Commit c33895d&lt;/a> wraps Welcome events in &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> gift wrap and removes old MIP-00 tag-normalization shims, &lt;a href="https://github.com/DavidGershony/openChat/commit/2738ff428154f60f50debb8f2a53662d427b28f1">commit 2738ff4&lt;/a> completes the MIP-02 compliance audit, and &lt;a href="https://github.com/DavidGershony/openChat/commit/8e470cf7945bced010168c8229d73d67db638b9f">commit 8e470cf&lt;/a> does the same for MIP-03 group message encryption. &lt;a href="https://github.com/DavidGershony/openChat/commit/129ca37e264efaa2d1a8b04fe95cd72e5e212547">Commit 129ca37&lt;/a> also consolidates NIP-44 handling onto the shared marmot-cs implementation, reducing the risk of client-side crypto drift.&lt;/p>
&lt;h3 id="nak-v0190-and-v0191">nak v0.19.0 and v0.19.1&lt;/h3>
&lt;p>&lt;a href="https://github.com/fiatjaf/nak">nak&lt;/a>, fiatjaf&amp;rsquo;s command-line Nostr toolkit, shipped &lt;a href="https://github.com/fiatjaf/nak/releases/tag/v0.19.0">v0.19.0&lt;/a> and &lt;a href="https://github.com/fiatjaf/nak/releases/tag/v0.19.1">v0.19.1&lt;/a>. The 0.19 series adds a group-forum UI in &lt;a href="https://github.com/fiatjaf/nak/commit/5f4efdbc69a36fc80ea3f97b2cdee1db6a7c5b47">commit 5f4efdb&lt;/a>, switches group metadata edits to a full replace flow in &lt;a href="https://github.com/fiatjaf/nak/commit/da0b75337198010687aceb6a07bbae67407faee3">commit da0b753&lt;/a>, and replaces the older &lt;code>no-text&lt;/code> handling with &lt;code>supported_kinds&lt;/code> in &lt;a href="https://github.com/fiatjaf/nak/commit/bef67d35d259e0450debf0fd870e1a937a2406bf">commit bef67d3&lt;/a>. For group implementers, that keeps the CLI aligned with the direction group specs and clients are moving.&lt;/p>
&lt;h2 id="project-updates">Project Updates&lt;/h2>
&lt;h3 id="amethyst">Amethyst&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/newsletters/2026-03-11-newsletter/">Following last week&amp;rsquo;s Amethyst coverage&lt;/a>, &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a>, the Android client with one of the broadest protocol surfaces in Nostr, kept building on its wallet and relay work after the NIP-47 patch. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/1853">PR #1853&lt;/a> adds &lt;a href="https://nostrcompass.org/en/topics/nip-45/">NIP-45&lt;/a> (Event Counting) COUNT queries across relay management screens, so users can see how many events each relay actually holds for home feed, notifications, DMs, and index data. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/1849">PR #1849&lt;/a> adds encrypted file uploads for &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> (Private Direct Messages) chats, with a retry path for unencrypted uploads when a storage host rejects the encrypted version.&lt;/p>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst/pull/1791">PR #1791&lt;/a> also brings full &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> (Nostr Connect) desktop bunker login with a heartbeat indicator, which matters because remote signing failures often feel like random UI breakage from the user&amp;rsquo;s side. The client shows whether the signer is alive and how recently it answered, while also making it obvious when the current session uses a bunker.&lt;/p>
&lt;h3 id="nostria">Nostria&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostria-app/nostria">Nostria&lt;/a>, the multi-platform client built around a local-first stack, merged &lt;a href="https://github.com/nostria-app/nostria/pull/561">PR #561&lt;/a> adding Web of Trust filtering for feeds and thread replies. The feature uses the existing trust-service rank data and exposes it as both a feed filter and a reply filter, hiding authors whose rank does not clear the threshold while preserving thread structure when trusted descendants are present. That gives users a middle layer between &amp;ldquo;show everyone&amp;rdquo; and hardcoded list-based curation.&lt;/p>
&lt;p>The same week also brought &lt;a href="https://github.com/nostria-app/nostria/pull/563">PR #563&lt;/a>, which adds content filtering and repost support to the summary page. Outside the tracked PR list, Nostria has also been filling in more of its power-user surface. It now supports the latest Brainstorm Web of Trust service with in-app signup, along with send and receive money flows in DMs using NWC and BOLT-11 invoices. It also adds Nostr-native GIF handling through the emoji NIP and a stronger RSS import path for musicians that can pick up existing Lightning splits from podcast feeds. Nostria is treating ranking, media, payments, and publishing as one connected app surface.&lt;/p>
&lt;h3 id="nostur">Nostur&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostur-com/nostur-ios-public">Nostur&lt;/a>, the iOS client maintained by nostur-com, opened &lt;a href="https://github.com/nostur-com/nostur-ios-public/pull/53">PR #53&lt;/a> to change outbox routing from a fixed plan into a scored policy. The patch adds randomized relay scoring, &lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a> relay liveness filtering with a cached nostr.watch feed, and Thompson sampling so relay success and failure data changes future selections. The design keeps a safety valve when too many relays would be filtered out and preserves &lt;code>.onion&lt;/code> relays. This is one of the clearest current examples of a client treating relay selection as an adaptive system.&lt;/p>
&lt;h3 id="nostrability-outbox">Nostrability Outbox&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/">Following the earlier Outbox benchmark report&lt;/a>, &lt;a href="https://github.com/nostrability/outbox">Nostrability Outbox&lt;/a>, the benchmark and analysis project focused on &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> and &lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a> client routing, spent the week tightening its own claims. &lt;a href="https://github.com/nostrability/outbox/pull/35">PR #35&lt;/a> replaces inflated Thompson-sampling results with a full re-benchmark across 1,511 runs and recommends the &lt;code>CG3&lt;/code> variant for NDK-style routing. &lt;a href="https://github.com/nostrability/outbox/pull/43">PR #43&lt;/a> adds decay and use-case comparisons, fixes a &lt;code>0 follows&lt;/code> cache-poisoning bug, then re-runs the Telluride dataset after pinning cache TTLs.&lt;/p>
&lt;p>That is not product work in the usual sense, but it matters for client authors because the project&amp;rsquo;s numbers are now sharper and less flattering in the places where they had previously overclaimed. The corrected result is still useful. Randomized selection keeps beating purely deterministic routing in the cases Outbox cares about, Thompson-style learning can materially improve coverage when clients persist useful relay history, and &lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a> liveness filtering cuts wasted time on dead relays. The work is also turning into concrete implementation proposals, including &lt;a href="https://github.com/nostr-dev-kit/ndk/pull/387">NDK #387&lt;/a>, &lt;a href="https://github.com/nostur-com/nostur-ios-public/pull/53">Nostur #53&lt;/a>, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/1833">Amethyst #1833&lt;/a>, &lt;a href="https://github.com/rust-nostr/nostr/pull/1282">rust-nostr #1282&lt;/a>, &lt;a href="https://github.com/coracle-social/welshman/pull/53">welshman #53&lt;/a>, and &lt;a href="https://github.com/hzrd149/applesauce/pull/54">applesauce #54&lt;/a> plus &lt;a href="https://github.com/hzrd149/applesauce/pull/55">applesauce #55&lt;/a>.&lt;/p>
&lt;h3 id="white-noise-backend">White Noise backend&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/whitenoise-rs">whitenoise-rs&lt;/a>, the Rust backend used by White Noise and other Marmot tooling, merged two boundary-hardening patches around Blossom media handling. &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/637">PR #637&lt;/a> enforces HTTPS on Blossom URLs and adds an upload timeout, while &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/642">PR #642&lt;/a> caps blob downloads at &lt;code>100 MiB&lt;/code> to block oversized media pulls from turning into a denial-of-service path. For private messaging software, media URLs are one of the sharpest interfaces between encrypted application logic and untrusted network infrastructure. This week the team tightened that edge.&lt;/p>
&lt;h3 id="rust-nostr">rust-nostr&lt;/h3>
&lt;p>&lt;a href="https://github.com/rust-nostr/nostr">rust-nostr&lt;/a>, the Rust protocol library, merged &lt;a href="https://github.com/rust-nostr/nostr/pull/1280">PR #1280&lt;/a> adding convenience constructors for &lt;code>LocalRelayBuilderNip42&lt;/code>. The new read and write helpers give embedded relay and test setups a clearer way to turn &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> auth policy into code. This is a small library patch, but it matters for teams building local or app-bundled relays that need auth turned on without repeating boilerplate every time.&lt;/p>
&lt;h3 id="pika">Pika&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/">Following earlier Pika coverage&lt;/a>, &lt;a href="https://github.com/sledtools/pika">Pika&lt;/a>, the Marmot-based messaging app, shipped &lt;a href="https://github.com/sledtools/pika/releases/tag/pika/v1.1.1">pika/v1.1.1&lt;/a> and &lt;a href="https://github.com/sledtools/pika/releases/tag/pikachat-v1.1.1">pikachat-v1.1.1&lt;/a> with a release cycle focused on runtime convergence. &lt;a href="https://github.com/sledtools/pika/pull/542">PR #542&lt;/a> introduces a shared Marmot runtime facade for the CLI and sidecar, with the app host moving onto the same surface. &lt;a href="https://github.com/sledtools/pika/pull/556">PR #556&lt;/a> tightens OpenClaw agent lifecycle and provisioning state, while &lt;a href="https://github.com/sledtools/pika/pull/600">PR #600&lt;/a> adds restore-from-backup and stricter recovery safety for managed environments.&lt;/p>
&lt;p>The direct user-facing surface here is smaller than in the last Pika writeup, but the architectural change is meaningful. Pulling group, media, call, and session logic behind one shared runtime reduces the chance that the app and daemon drift apart as the Marmot stack grows.&lt;/p>
&lt;h2 id="nip-updates">NIP Updates&lt;/h2>
&lt;p>Recent changes to the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a>:&lt;/p>
&lt;p>&lt;strong>Merged:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-54/">NIP-54&lt;/a> (Wiki): Switch from Asciidoc to Djot&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2242">PR #2242&lt;/a>): Wiki content on kind &lt;code>30818&lt;/code> now uses Djot as the canonical markup format. The merged text adds explicit wikilink behavior, merge-request examples for kind &lt;code>818&lt;/code>, redirect examples for kind &lt;code>30819&lt;/code>, and non-Latin normalization examples for &lt;code>d&lt;/code> tags. That gives implementers a cleaner parsing target than Asciidoc and removes one more spec path that depended on a Ruby-centered toolchain.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-19/">NIP-19&lt;/a> (Bech32-Encoded Entities): Add input limit&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2264">PR #2264&lt;/a>): The spec now recommends capping Bech32-encoded entity strings at 5000 characters. This is a small change with real parser value, because NIP-19 strings now appear in QR flows, deep links, share sheets, and user-pasted input across many clients.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Open PRs and Discussions:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Nostr Key File for &lt;a href="https://nostrcompass.org/en/topics/nip-49/">NIP-49&lt;/a> (Private Key Encryption)&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2269">PR #2269&lt;/a>): Proposes a &lt;code>.nostrkey&lt;/code> file format for password-encrypted key export and import. If merged, it would give clients a more normal file-based backup path than copying raw &lt;code>ncryptsec&lt;/code> strings around.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Membership state consistency for &lt;a href="https://nostrcompass.org/en/topics/nip-43/">NIP-43&lt;/a> (Relay Access Metadata and Requests)&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2267">PR #2267&lt;/a>): Adds a section clarifying that relays should maintain one authoritative membership state per pubkey. That would simplify group-client logic around membership changes and replayed history.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Deletion guidance for &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> (Private Direct Messages)&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2260">PR #2260&lt;/a>): Proposes a concrete path for editing and deleting private messages through gift-wrapped delete events. The work is still open, but client authors need an answer here if NIP-17 is going to replace older DM flows fully.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Share-intent URI for &lt;a href="https://nostrcompass.org/en/topics/nip-222/">NIP-222&lt;/a>&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2266">PR #2266&lt;/a>): The draft would standardize how mobile and desktop apps hand shared content into a Nostr client. That is one of the roughest interop edges in current app-to-app flows.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="nip-deep-dive-nip-94-file-metadata">NIP Deep Dive: NIP-94 (File Metadata)&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-94/">NIP-94&lt;/a> defines kind &lt;code>1063&lt;/code> as a first-class metadata event for a file. The &lt;a href="https://github.com/nostr-protocol/nips/blob/master/94.md">specification&lt;/a> gives the event its own human-readable &lt;code>content&lt;/code> plus machine-readable tags for download URL, MIME type, hashes, dimensions, previews, fallbacks, and storage service hints. That matters because the file becomes queryable on relays as its own object. A client does not have to scrape metadata out of surrounding content to understand what the file is.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;6a92ef8d7c3a1b5d4e8f9a0b1c2d3e4f567890abcdef1234567890abcdef1234&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;f1e2d3c4b5a697887766554433221100ffeeddccbbaa99887766554433221100&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1742342400&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1063&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;url&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;https://downloads.example.org/notedeck/v0.8.0-rc2/notedeck-macos-universal.tar.gz&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;m&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;application/gzip&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;x&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;4a5b6c7d8e9f00112233445566778899aabbccddeeff00112233445566778899&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;ox&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;4a5b6c7d8e9f00112233445566778899aabbccddeeff00112233445566778899&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;size&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;48392011&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;dim&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;0x0&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;magnet&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;magnet:?xt=urn:btih:00112233445566778899aabbccddeeff00112233&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;i&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;00112233445566778899aabbccddeeff00112233&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;blurhash&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;LEHV6nWB2yk8pyo0adR*.7kCMdnj&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;thumb&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;https://downloads.example.org/notedeck/v0.8.0-rc2/thumb.png&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;bbccddeeff00112233445566778899aabbccddeeff0011223344556677889900&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;image&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;https://downloads.example.org/notedeck/v0.8.0-rc2/screenshot.png&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;ccddeeff00112233445566778899aabbccddeeff001122334455667788990011&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;summary&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Signed macOS release artifact for Notedeck v0.8.0-rc2&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;alt&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Notedeck desktop release archive&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;fallback&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;https://mirror.example.net/notedeck/v0.8.0-rc2/notedeck-macos-universal.tar.gz&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;service&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;nip96&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Notedeck macOS universal build&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;11aa22bb33cc44dd55ee66ff77889900aabbccddeeff0011223344556677889911aa22bb33cc44dd55ee66ff77889900aabbccddeeff00112233445566778899&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The tags do more work than they first appear to do. &lt;code>x&lt;/code> identifies the served file, while &lt;code>ox&lt;/code> identifies the original file before any server-side transformation. The preview tags let clients build browseable file indexes without downloading the full asset, and &lt;code>summary&lt;/code> can carry a short excerpt beside them. &lt;code>fallback&lt;/code> gives a second source when the main URL fails, and &lt;code>service&lt;/code> hints at the storage protocol behind the file, such as &lt;a href="https://nostrcompass.org/en/topics/nip-96/">NIP-96&lt;/a> or another host. NIP-94 therefore sits below social posting and above raw storage. It describes the file, not the conversation around the file.&lt;/p>
&lt;p>That is why this week&amp;rsquo;s Notedeck updater is interesting. &lt;a href="https://github.com/damus-io/notedeck/pull/1326">PR #1326&lt;/a> uses signed kind &lt;code>1063&lt;/code> events for software release discovery, then verifies the downloaded binary against the published SHA256. The same event shape can describe a software artifact or a media upload. NIP-94 is old enough to be stable, but it still has room to grow because more projects are treating metadata events as a transport for machines, not only as decoration for people.&lt;/p>
&lt;h2 id="nip-deep-dive-nip-54-wiki">NIP Deep Dive: NIP-54 (Wiki)&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-54/">NIP-54&lt;/a> defines kind &lt;code>30818&lt;/code> as a wiki article event. The &lt;a href="https://github.com/nostr-protocol/nips/blob/master/54.md">specification&lt;/a> treats the &lt;code>d&lt;/code> tag as the normalized article topic and lets many authors publish entries for the same subject. The article body lives in &lt;code>content&lt;/code>, while tags handle normalized identity, display title, summaries, and references to earlier versions. That means NIP-54 is not only a content format. It is also a retrieval and ranking problem, because each client still has to decide which article version to show.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;8c94e5d1f2a300112233445566778899aabbccddeeff00112233445566778899&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1742342400&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">30818&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;nostr-wiki&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;title&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Nostr Wiki&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;summary&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Djot-formatted reference article about Nostr wiki events&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;a&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;30818:11223344556677889900aabbccddeeff00112233445566778899aabbccddeeff:nostr-wiki&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.example.org&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;fork&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;e&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;11223344556677889900aabbccddeeff00112233445566778899aabbccddeeff&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.example.org&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;fork&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Nostr is a [protocol][] for carrying events across relays.\n\n[protocol]: nostr:nevent1example&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;33cc44dd55ee66ff77889900aabbccddeeff0011223344556677889900112233cc44dd55ee66ff77889900aabbccddeeff00112233445566778899001122&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The merge this week changes the canonical markup from Asciidoc to Djot in &lt;a href="https://github.com/nostr-protocol/nips/pull/2242">PR #2242&lt;/a>. That matters for implementers because Djot has a tighter standalone spec and simpler parser story across languages. The merged text also clarifies how reference-style wikilinks resolve, how merge requests use kind &lt;code>818&lt;/code>, how redirects use kind &lt;code>30819&lt;/code>, and how &lt;code>d&lt;/code> tag normalization should behave for non-Latin scripts. Those are the parts that make two independent clients agree on what article a link points to.&lt;/p>
&lt;p>NIP-54 also sits in an unusual place in the protocol. A wiki client needs content rendering, but it also needs ranking policy. Reactions, relay lists, contact lists, and explicit deference signals all feed into which article wins for a given topic. The Djot switch does not solve that ranking problem, but it does remove one of the parser ambiguities that sat underneath it. That is why the merge matters now: the change is less about nicer prose formatting and more about making multi-client wiki behavior easier to implement consistently.&lt;/p>
&lt;p>Building something, or want us to cover it? Reach out via &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> DM on Nostr at &lt;code>npub1wav4fae3gyfy3xj298kxj2mj8phavz7vavps34przq02j7w902qq902923&lt;/code>.&lt;/p></content:encoded></item><item><title>Nostr Compass #13</title><link>https://nostrcompass.org/en/newsletters/2026-03-11-newsletter/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-03-11-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/shopstr-eng/shopstr">Shopstr&lt;/a> and &lt;a href="https://github.com/shopstr-eng/milk-market">Milk Market&lt;/a> add MCP surfaces for agent-driven commerce, while &lt;a href="https://github.com/flox1an/oauth-bunker">OAuth Bunker&lt;/a>, &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a>, and &lt;a href="https://github.com/hoytech/strfry">strfry&lt;/a> add &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> (Authentication of Clients to Relays) relay-auth and protected-event support across app, signer, and relay software. &lt;a href="https://github.com/v0l/route96">Route96&lt;/a> ships two releases around AI labeling, moderation queues, perceptual hashing, and machine-readable server docs. &lt;a href="https://github.com/satsdisco/samizdat">Samizdat&lt;/a>, already live on the web, released its first Android alpha and later added &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> (Android Signer Application) signer support. &lt;a href="https://github.com/formstr-hq/nostr-forms">Formstr&lt;/a> adds signup through &lt;a href="https://nostrcompass.org/en/topics/nip-49/">NIP-49&lt;/a> (Private Key Encryption), &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> ships Namecoin-based &lt;a href="https://nostrcompass.org/en/topics/nip-05/">NIP-05&lt;/a> (Domain Verification) resolution work, &lt;a href="https://github.com/MostroP2P/mostro">Mostro&lt;/a> ships &lt;a href="https://github.com/MostroP2P/mostro/releases/tag/v0.16.4">v0.16.4&lt;/a>, and the NIPs repo merges &lt;a href="https://nostrcompass.org/en/topics/nip-91/">NIP-91&lt;/a> (AND Operator for Filters) and defensive guidance for &lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a> (Relay Discovery and Liveness Monitoring).&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/shopstr-eng/shopstr">Shopstr&lt;/a> and &lt;a href="https://github.com/shopstr-eng/milk-market">Milk Market&lt;/a> add MCP surfaces for agent-driven commerce, while &lt;a href="https://github.com/flox1an/oauth-bunker">OAuth Bunker&lt;/a>, &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a>, and &lt;a href="https://github.com/hoytech/strfry">strfry&lt;/a> add &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> (Authentication of Clients to Relays) relay-auth and protected-event support across app, signer, and relay software. &lt;a href="https://github.com/v0l/route96">Route96&lt;/a> ships two releases around AI labeling, moderation queues, perceptual hashing, and machine-readable server docs. &lt;a href="https://github.com/satsdisco/samizdat">Samizdat&lt;/a>, already live on the web, released its first Android alpha and later added &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> (Android Signer Application) signer support. &lt;a href="https://github.com/formstr-hq/nostr-forms">Formstr&lt;/a> adds signup through &lt;a href="https://nostrcompass.org/en/topics/nip-49/">NIP-49&lt;/a> (Private Key Encryption), &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> ships Namecoin-based &lt;a href="https://nostrcompass.org/en/topics/nip-05/">NIP-05&lt;/a> (Domain Verification) resolution work, &lt;a href="https://github.com/MostroP2P/mostro">Mostro&lt;/a> ships &lt;a href="https://github.com/MostroP2P/mostro/releases/tag/v0.16.4">v0.16.4&lt;/a>, and the NIPs repo merges &lt;a href="https://nostrcompass.org/en/topics/nip-91/">NIP-91&lt;/a> (AND Operator for Filters) and defensive guidance for &lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a> (Relay Discovery and Liveness Monitoring).&lt;/p>
&lt;h2 id="news">News&lt;/h2>
&lt;h3 id="shopstr-and-milk-market-open-mcp-commerce-surfaces">Shopstr and Milk Market Open MCP Commerce Surfaces&lt;/h3>
&lt;p>&lt;a href="https://github.com/shopstr-eng/shopstr">Shopstr&lt;/a>, the peer-to-peer marketplace with Lightning and Cashu payments, merged &lt;a href="https://github.com/shopstr-eng/shopstr/pull/234">PR #234&lt;/a> (&lt;a href="https://github.com/shopstr-eng/shopstr/commit/94ef7d1a4519e8e0158668d13c8cb8684b1d46e2">commit 94ef7d1&lt;/a>), adding an MCP server with API-key authentication for agent account management. The change adds &lt;code>.well-known/agent.json&lt;/code> for agent discovery, MCP onboarding and status endpoints, order creation and payment-verification routes, dedicated purchase and read tools, and a settings screen for API keys. &lt;a href="https://github.com/shopstr-eng/shopstr/pull/236">PR #236&lt;/a> extends that with seller-side actions for messages, addresses, order updates, and product-spec selection. A security fix in &lt;a href="https://github.com/shopstr-eng/shopstr/pull/235">PR #235&lt;/a> replaces single-iteration SHA-256 API key hashing with salted PBKDF2 at 100,000 iterations.&lt;/p>
&lt;p>Agents can read &lt;a href="https://nostrcompass.org/en/topics/nip-99/">NIP-99&lt;/a> (Classified Listings) listings and move through checkout using the existing &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> (Nostr Wallet Connect) and &lt;a href="https://nostrcompass.org/en/topics/nip-60/">NIP-60&lt;/a> (Cashu Wallet) payment flows without scraping pages or reverse-engineering client behavior.&lt;/p>
&lt;p>&lt;a href="https://github.com/shopstr-eng/milk-market">Milk Market&lt;/a>, a food marketplace on Nostr at &lt;a href="https://milk.market">milk.market&lt;/a>, landed the same MCP and API-key foundation in &lt;a href="https://github.com/shopstr-eng/milk-market/commit/da6c0b499494b4e4861c4ff8a220e066c46285b3">commit da6c0b4&lt;/a>. &lt;a href="https://github.com/shopstr-eng/milk-market/pull/10">PR #10&lt;/a> adds subscription orders, shipping address changes post-purchase, and multi-merchant and multi-currency checkout handling for Stripe and other fiat payment paths. A follow-up &lt;a href="https://github.com/shopstr-eng/milk-market/pull/11">PR #11&lt;/a> fixes a startup database initialization bug where the failed relay publishes table was not created on fresh installs, causing 500 errors on first load. The agent-facing interface works with Bitcoin-native checkout on Shopstr or mixed fiat and Bitcoin checkout on Milk Market.&lt;/p>
&lt;h3 id="nip-42-relay-auth-across-bunker-signer-and-relay">NIP-42 Relay Auth Across Bunker, Signer, and Relay&lt;/h3>
&lt;p>&lt;a href="https://github.com/flox1an/oauth-bunker">OAuth Bunker&lt;/a>, a &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> (Nostr Connect) bunker that bridges OAuth providers to Nostr signing, added &lt;a href="https://nostrcompass.org/en/topics/nip-07/">NIP-07&lt;/a> (Browser Extension Signer) login, automatic single-identity selection, and cleanup for deleted identities (&lt;a href="https://github.com/flox1an/oauth-bunker/commit/f0c7683cb2374fd9a3ebd1b186055da8abd2c2ff">commit f0c7683&lt;/a>). When only one identity exists, the bunker now selects it automatically instead of prompting. Deleting an identity also removes its dangling assignments and connections. &lt;a href="https://github.com/flox1an/oauth-bunker/commit/6b8796c6c59c7d48dc1ede92d6de6bf54feb56cc">Commit 6b8796c&lt;/a> adds an &lt;code>ALWAYS_ALLOWED_KINDS&lt;/code> configuration path for assigned users, defaulting to kind &lt;code>30078&lt;/code> app-specific data, so delegated identities can write to app-specific storage without per-event approval.&lt;/p>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a>, the primary &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> signer for Android, shipped &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v4.1.3-pre4">v4.1.3-pre4&lt;/a> with four pre-releases across the week. &lt;a href="https://github.com/greenart7c3/Amber/pull/317">PR #317&lt;/a> adds &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> relay authentication handling for kind &lt;code>22242&lt;/code> requests. The implementation adds a new database column tracking relay-specific permissions with a unique index on &lt;code>(pkKey, type, kind, relay)&lt;/code>. Users see a dedicated auth screen where they can grant or deny per relay or across all relays with a wildcard &lt;code>*&lt;/code> scope, and persist that choice. Wildcard permissions clear all relay-specific entries for a kind. &lt;a href="https://github.com/greenart7c3/Amber/pull/318">PR #318&lt;/a> follows up by refactoring multi-event request screens to display details inline using composable cards instead of navigating to a separate screen. The release also updates default profile relays, adds bottom-sheet request display, and fixes a crash on MediaTek devices by disabling StrongBox keystore.&lt;/p>
&lt;p>On the relay side, &lt;a href="https://github.com/hoytech/strfry/pull/156">strfry PR #156&lt;/a> implements NIP-42 auth handling for &lt;a href="https://nostrcompass.org/en/topics/nip-70/">NIP-70&lt;/a> (Protected Events), and &lt;a href="https://github.com/hoytech/strfry/pull/176">PR #176&lt;/a> rejects reposts that embed protected events.&lt;/p>
&lt;h3 id="notedeck-adds-nip-11-relay-limits-and-agentium-features">Notedeck Adds NIP-11 Relay Limits and Agentium Features&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/notedeck">Notedeck&lt;/a>, the native desktop client by the Damus team, merged 14 PRs this week. &lt;a href="https://github.com/damus-io/notedeck/pull/1316">PR #1316&lt;/a> adds &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> (Relay Information Document) relay limitation fetching, so all outbox relays now respect &lt;code>max_message_length&lt;/code> and &lt;code>max_subscriptions&lt;/code> from the relay info document. The implementation includes background job processing, exponential backoff with jitter for connection retries, and custom HTTP Accept headers. &lt;a href="https://github.com/damus-io/notedeck/pull/1312">PR #1312&lt;/a> fixes a bug where DMs sometimes failed to load after account switching, and &lt;a href="https://github.com/damus-io/notedeck/pull/1333">PR #1333&lt;/a> adds a backoff mechanism to multicast relay communication to prevent broadcast spam on errors.&lt;/p>
&lt;p>The Agentium subsystem (Notedeck&amp;rsquo;s built-in coding agent UI, internally called &amp;ldquo;Dave&amp;rdquo;) received clipboard image paste, named run configurations that sync across devices via kind &lt;code>31991&lt;/code> events (&lt;a href="https://nostrcompass.org/en/topics/nip-33/">NIP-33&lt;/a> (Parameterized Replaceable Events)), a git worktree creator, and a model picker for selecting backends per session (&lt;a href="https://github.com/damus-io/notedeck/pull/1336">PR #1336&lt;/a>). &lt;a href="https://github.com/damus-io/notedeck/pull/1338">PR #1338&lt;/a> integrates &lt;code>egui_kittest&lt;/code> for headless UI testing, and &lt;a href="https://github.com/damus-io/notedeck/pull/1339">PR #1339&lt;/a> adds a dashboard card tracking new contact list creations by client. An open &lt;a href="https://github.com/damus-io/notedeck/pull/1314">PR #1314&lt;/a> ports Amethyst&amp;rsquo;s Namecoin NIP-05 resolution to Notedeck with ElectrumX lookups, SOCKS5 Tor routing, and search bar integration.&lt;/p>
&lt;h3 id="divine-ships-v106-with-e2e-test-infrastructure-and-nip-49-import">diVine Ships v1.0.6 with E2E Test Infrastructure and NIP-49 Import&lt;/h3>
&lt;p>&lt;a href="https://github.com/divinevideo/divine-mobile">diVine&lt;/a>, the short-form looping video client restoring Vine archives at &lt;a href="https://divine.video">divine.video&lt;/a>, shipped &lt;a href="https://github.com/divinevideo/divine-mobile/releases/tag/1.0.6">v1.0.6&lt;/a> with 127 merged PRs. The release adds &lt;a href="https://nostrcompass.org/en/topics/nip-49/">NIP-49&lt;/a> account import, external &lt;a href="https://nostrcompass.org/en/topics/nip-05/">NIP-05&lt;/a> support, multi-account handling, macOS and experimental Linux builds, and a redesigned drafts and clips library backed by local storage.&lt;/p>
&lt;p>On the engineering side, &lt;a href="https://github.com/divinevideo/divine-mobile/pull/1928">PR #1928&lt;/a> adds a full E2E integration test infrastructure using Patrol for native UI automation against a Docker backend stack (relay, API, Blossom, Postgres, Redis, ClickHouse). Five auth journey tests cover registration, verification, password reset, session expiry, and token refresh. &lt;a href="https://github.com/divinevideo/divine-mobile/pull/2105">PR #2105&lt;/a> switches video loading from HLS-first to direct MP4 with automatic HLS fallback, reducing load times from 30-60 seconds to near-instant. &lt;a href="https://github.com/divinevideo/divine-mobile/pull/2076">PR #2076&lt;/a> caches the home feed API response to SharedPreferences for instant cold-start display. &lt;a href="https://github.com/divinevideo/divine-mobile/pull/2104">PR #2104&lt;/a> enforces &lt;code>ai-generated&lt;/code> content labels as hidden in feeds, and &lt;a href="https://github.com/divinevideo/divine-mobile/pull/2100">PR #2100&lt;/a> adds a safety setting to show only diVine-hosted videos. The Hive-to-Drift profile cache migration continues across &lt;a href="https://github.com/divinevideo/divine-mobile/pull/1881">PR #1881&lt;/a>, &lt;a href="https://github.com/divinevideo/divine-mobile/pull/1883">PR #1883&lt;/a>, and &lt;a href="https://github.com/divinevideo/divine-mobile/pull/1903">PR #1903&lt;/a>, replacing ~1,074 lines of Hive code with Drift DAOs.&lt;/p>
&lt;h3 id="vector-v032-ships-nip-77-negentropy-sync-and-mls-improvements">Vector v0.3.2 Ships NIP-77 Negentropy Sync and MLS Improvements&lt;/h3>
&lt;p>&lt;a href="https://github.com/VectorPrivacy/Vector">Vector&lt;/a>, a privacy-focused desktop messenger using MLS group encryption with &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> (Private Direct Messages) and &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> (Encrypted Payloads) encryption, shipped &lt;a href="https://github.com/VectorPrivacy/Vector/releases/tag/v0.3.2">v0.3.2&lt;/a>. The headline change is NIP-77 negentropy for MLS group sync (&lt;a href="https://github.com/VectorPrivacy/Vector/commit/b06adf4af2673fb5ac5add01356999ea70628eac">commit b06adf4&lt;/a>), which catches up on missed messages significantly faster using parallel boot. The release also adds a rebuilt audio engine with full Linux support, image spoilers with blurred previews, clickable hyperlinks with rich link previews, &lt;code>@mention&lt;/code> pings with &lt;code>@everyone&lt;/code> for group admins, emoji shortcode autocomplete, group muting, tap-to-react on existing reactions, and cancellable file uploads. Vector explicitly filters out NIP-17 group chat events (&lt;a href="https://github.com/VectorPrivacy/Vector/commit/2179a51c0449b3a70663a1573195b7945adf58ba">commit 2179a51&lt;/a>), using MLS exclusively for group encryption.&lt;/p>
&lt;h2 id="releases">Releases&lt;/h2>
&lt;h3 id="route96-v050-and-v051">Route96 v0.5.0 and v0.5.1&lt;/h3>
&lt;p>&lt;a href="https://github.com/v0l/route96">Route96&lt;/a>, a media server that supports Blossom and &lt;a href="https://nostrcompass.org/en/topics/nip-96/">NIP-96&lt;/a> (HTTP File Storage), shipped &lt;a href="https://github.com/v0l/route96/releases/tag/v0.5.0">v0.5.0&lt;/a> and &lt;a href="https://github.com/v0l/route96/releases/tag/v0.5.1">v0.5.1&lt;/a>. v0.5.0 adds automated AI labeling, retroactive backfill for unlabeled uploads, moderation queues for flagged files, EXIF-based privacy rejection, and banned-hash handling.&lt;/p>
&lt;p>v0.5.1 adds perceptual image hashes, locality-sensitive hashing for similar-image lookup, batch admin endpoints, and a published &lt;a href="https://github.com/v0l/route96/releases/tag/v0.5.1">&lt;code>SKILL.md&lt;/code>&lt;/a> describing the server&amp;rsquo;s Blossom and NIP-96 API surface for agent tooling. &lt;a href="https://github.com/v0l/route96/pull/58">PR #58&lt;/a> moves background workers onto fully async Tokio tasks, and &lt;a href="https://github.com/v0l/route96/commit/97b00a39e27b07053c2ad335dbf475bacba57bf8">commit 97b00a3&lt;/a> adds backoff to avoid hot loops.&lt;/p>
&lt;h3 id="samizdat-v100-alpha">Samizdat v1.0.0-alpha&lt;/h3>
&lt;p>&lt;a href="https://github.com/satsdisco/samizdat">Samizdat&lt;/a>, a long-form reader and publisher available at &lt;a href="https://samizdat.press">samizdat.press&lt;/a>, shipped its first Android build in &lt;a href="https://github.com/satsdisco/samizdat/releases/tag/v1.0.0-alpha">v1.0.0-alpha&lt;/a>. The app opens to a curated Press page of long-form Nostr articles with bottom tab navigation across Press, Feed, Saved, and Write views. The Android build adds native key storage through Android Keystore encryption with biometric unlock, handles &lt;code>nostr:&lt;/code> URIs and &lt;code>samizdat.press&lt;/code> deep links, and supports signer handoff via the Android app chooser (Amber, Primal, etc.) instead of requiring direct key import. Pull-to-refresh, safe-area handling across screen sizes, and native share, clipboard, haptics, and splash-screen integrations are now part of the Android shell rather than the web wrapper.&lt;/p>
&lt;p>&lt;a href="https://github.com/satsdisco/samizdat/commit/d17308f3c2e6020e14074fbb1c03a8f60f29a3e6">Commit d17308f&lt;/a> adds intent-based &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> signing for Amber and Primal flows, and &lt;a href="https://github.com/satsdisco/samizdat/commit/e29dab84f7b58edd621f7b86ed7ca6458f965614">commit e29dab8&lt;/a> replaces a JavaScript bridge workaround with a native Capacitor plugin using &lt;code>startActivityForResult&lt;/code>. The app requires Android 7.0+ (API 24), ships as a debug APK in this alpha, and still lacks push notifications. Publishing currently depends on a signer app, while &lt;code>nsec&lt;/code> login covers local reading and account access.&lt;/p>
&lt;h3 id="calendar-by-form-v020">Calendar by Form* v0.2.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/formstr-hq/nostr-calendar">Calendar by Form*&lt;/a>, a decentralized calendar app with &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> (Gift Wrap) private event sharing available at &lt;a href="https://calendar.formstr.app">calendar.formstr.app&lt;/a>, shipped &lt;a href="https://github.com/formstr-hq/nostr-calendar/releases/tag/v0.2.0">v0.2.0&lt;/a> with &lt;a href="https://github.com/formstr-hq/nostr-calendar/pull/38">PR #38&lt;/a>. The release extends recurring-event handling for &lt;a href="https://nostrcompass.org/en/topics/nip-52/">NIP-52&lt;/a> (Calendar Events), moving past the v0.1.0 single-event foundation. The underlying changes also touch local event storage, signer handling, and Android notification plumbing. This is the second active application from the Formstr organization following last month&amp;rsquo;s repository migration.&lt;/p>
&lt;h3 id="mostro-v0164">Mostro v0.16.4&lt;/h3>
&lt;p>&lt;a href="https://github.com/MostroP2P/mostro">Mostro&lt;/a>, the peer-to-peer Bitcoin exchange built on Nostr, released &lt;a href="https://github.com/MostroP2P/mostro/releases/tag/v0.16.4">v0.16.4&lt;/a>. The dispute-session restore (&lt;a href="https://github.com/MostroP2P/mostro/pull/599">PR #599&lt;/a>) and auto-close (&lt;a href="https://github.com/MostroP2P/mostro/pull/606">PR #606&lt;/a>) fixes &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/">covered last week&lt;/a> are included. New in this release: &lt;a href="https://github.com/MostroP2P/mostro/pull/625">PR #625&lt;/a> adds a &lt;code>days&lt;/code> field to user rating events of kind &lt;code>38384&lt;/code>, &lt;a href="https://github.com/MostroP2P/mostro/pull/612">PR #612&lt;/a> adds expiration to those rating events, and &lt;a href="https://github.com/MostroP2P/mostro/pull/614">PR #614&lt;/a> switches order events to configured expiration settings instead of a hardcoded 24-hour window. &lt;a href="https://github.com/MostroP2P/mostro/pull/622">PR #622&lt;/a> adds an idempotency check to prevent duplicate development-fee payments.&lt;/p>
&lt;h3 id="mostro-mobile-v121">Mostro Mobile v1.2.1&lt;/h3>
&lt;p>&lt;a href="https://github.com/MostroP2P/mobile">Mostro Mobile&lt;/a>, the Flutter client for the Mostro P2P exchange, shipped &lt;a href="https://github.com/MostroP2P/mobile/releases/tag/v1.2.1">v1.2.1&lt;/a> with 11 new features and 11 bug fixes. The release adds encrypted multimedia rendering in dispute chat (&lt;a href="https://github.com/MostroP2P/mobile/pull/514">PR #514&lt;/a>), auto-close of dispute UI when orders reach terminal state (&lt;a href="https://github.com/MostroP2P/mobile/pull/503">PR #503&lt;/a>), QR scanning for NWC wallet import (&lt;a href="https://github.com/MostroP2P/mobile/commit/12eaee4d154fa31b07f82b96819de520e825aee6">commit 12eaee4&lt;/a>), French translations, and FCM push notification handling. &lt;a href="https://github.com/MostroP2P/mobile/pull/496">PR #496&lt;/a> fixes a Schnorr signature padding bug by pinning the bip340 dependency to v0.2.0.&lt;/p>
&lt;h3 id="0xchat-v154">0xchat v1.5.4&lt;/h3>
&lt;p>&lt;a href="https://github.com/0xchat-app/0xchat-app-main">0xchat&lt;/a>, the Telegram-style messaging client with Cashu support, shipped &lt;a href="https://github.com/0xchat-app/0xchat-app-main/releases/tag/v1.5.4-release">v1.5.4&lt;/a> focused on Linux desktop fixes: AppImage dock icons, emoji rendering, context menu freezes, and reply/copy UI hangs. The release also fixes image upload issues and npub.cash integration. &lt;a href="https://github.com/0xchat-app/0xchat-app-main/pull/49">PR #49&lt;/a> eliminates unnecessary UI rebuilds by removing a 3-second polling timer that forced glassmorphic repaints while doing nothing, and unblocks login initialization by running the event cache load concurrently instead of blocking relay, contacts, and channel startup.&lt;/p>
&lt;h3 id="keep-v060">Keep v0.6.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/privkeyio/keep-android">Keep&lt;/a>, a FROST threshold signer for Android with &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> and &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> support, shipped &lt;a href="https://github.com/privkeyio/keep-android/releases/tag/v0.6.0">v0.6.0&lt;/a> and &lt;a href="https://github.com/privkeyio/keep-android/releases/tag/v0.6.1">v0.6.1&lt;/a>. v0.6.0 adds wallet descriptor coordination and management UI, a backup/restore flow with biometric authentication (&lt;a href="https://github.com/privkeyio/keep-android/pull/184">PR #184&lt;/a>), nsec recovery from threshold shares (&lt;a href="https://github.com/privkeyio/keep-android/pull/187">PR #187&lt;/a>), cross-platform animated QR frame generation via Rust UniFFI (&lt;a href="https://github.com/privkeyio/keep-android/pull/188">PR #188&lt;/a>), and a signing audit trail with chain verification (&lt;a href="https://github.com/privkeyio/keep-android/pull/189">PR #189&lt;/a>). v0.6.1 switches the license from AGPL-3.0 to MIT (&lt;a href="https://github.com/privkeyio/keep-android/pull/191">PR #191&lt;/a>).&lt;/p>
&lt;h3 id="njump-v030">njump v0.3.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/fiatjaf/njump">njump&lt;/a>, the static gateway for viewing Nostr content at &lt;a href="https://njump.me">njump.me&lt;/a>, shipped &lt;a href="https://github.com/fiatjaf/njump/releases/tag/v0.3.0">v0.3.0&lt;/a> with a breaking change in &lt;code>note1&lt;/code> code parsing and an update to the underlying nostr library.&lt;/p>
&lt;h3 id="roadstr-v011">Roadstr v0.1.1&lt;/h3>
&lt;p>&lt;a href="https://github.com/jooray/roadstr">Roadstr&lt;/a>, a decentralized road event reporting app using Nostr, shipped its initial demo release &lt;a href="https://github.com/jooray/roadstr/releases/tag/v0.1.1">v0.1.1&lt;/a>. The app displays road events on a map using vector tiles from openfreemap.org.&lt;/p>
&lt;h3 id="bitcredit-v053">Bitcredit v0.5.3&lt;/h3>
&lt;p>&lt;a href="https://github.com/BitcreditProtocol/Bitcredit-Core">Bitcredit&lt;/a>, an e-bill application with a Nostr transport layer and dedicated relay at &lt;a href="https://www.bit.cr/">bit.cr&lt;/a>, shipped &lt;a href="https://github.com/BitcreditProtocol/Bitcredit-Core/releases/tag/v0.5.3">v0.5.3&lt;/a>. &lt;a href="https://github.com/BitcreditProtocol/Bitcredit-Core/pull/846">PR #846&lt;/a> adds &lt;code>payment_actions&lt;/code> and &lt;code>bill_state&lt;/code> fields to the API for payment and acceptance state, and &lt;a href="https://github.com/BitcreditProtocol/Bitcredit-Core/pull/849">PR #849&lt;/a> fixes signing address handling for anonymous signers.&lt;/p>
&lt;h3 id="openchat-v010-alpha3">OpenChat v0.1.0-alpha.3&lt;/h3>
&lt;p>&lt;a href="https://github.com/DavidGershony/openChat">OpenChat&lt;/a>, a chat application built on the Marmot protocol&amp;rsquo;s .NET MLS and C# libraries, shipped &lt;a href="https://github.com/DavidGershony/openChat/releases/tag/v0.1.0-alpha.3">v0.1.0-alpha.3&lt;/a>. The release adds external signer support for Amber and &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> flows (&lt;a href="https://github.com/DavidGershony/openChat/commit/e568d979fe15eead19172f2eb6f8cf26ca845247">commit e568d97&lt;/a>), moves MLS state persistence into the MLS service to eliminate crash-window data loss (&lt;a href="https://github.com/DavidGershony/openChat/commit/4720bc8625136a0d5b0e23322bc0c50cd80577e8">commit 4720bc8&lt;/a>), and publishes Windows, Linux, and Android builds through a new CI pipeline.&lt;/p>
&lt;h3 id="opensignal-v100">OpenSignal v1.0.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/turizspace/opensignal">OpenSignal&lt;/a>, a Kotlin Multiplatform trading copilot for Nostr, shipped &lt;a href="https://github.com/turizspace/OpenSignal/releases/tag/v1.0.0">v1.0.0&lt;/a>. The release packages shared KMP modules for domain logic, chart rendering, Nostr authentication and publishing, Blossom &lt;a href="https://nostrcompass.org/en/topics/nip-96/">NIP-96&lt;/a> upload support, and ONNX-based AI inference hooks across Desktop and Android shells. The published architecture also includes a FastAPI AI service for chart screenshot analysis, model training pipelines, and a risk engine that produces structured trade plans with sizing and warnings. Login supports either raw &lt;code>nsec&lt;/code> keys or external signers, and the output flow ends in Nostr event publishing rather than local-only analysis.&lt;/p>
&lt;h2 id="project-updates">Project Updates&lt;/h2>
&lt;h3 id="formstr">Formstr&lt;/h3>
&lt;p>&lt;a href="https://github.com/formstr-hq/nostr-forms">Formstr&lt;/a>, the Google Forms alternative on Nostr, merged &lt;a href="https://github.com/formstr-hq/nostr-forms/pull/434">PR #434&lt;/a> (&lt;a href="https://github.com/formstr-hq/nostr-forms/commit/e9c4fd5dadfa0b83f1e87d7596eaf35f9fdb7da8">commit e9c4fd5&lt;/a>), adding a signup flow using &lt;a href="https://nostrcompass.org/en/topics/nip-49/">NIP-49&lt;/a> (Private Key Encryption) encrypted private keys. Before this change, users needed either a &lt;a href="https://nostrcompass.org/en/topics/nip-07/">NIP-07&lt;/a> browser extension or a raw &lt;code>nsec&lt;/code> paste to use Formstr. The new flow generates a key pair client-side, encrypts the private key with a user-chosen password via NIP-49&amp;rsquo;s scrypt + XChaCha20-Poly1305 scheme, and stores the resulting &lt;code>ncryptsec&lt;/code> string. Users can then log back in with their password without installing a signer extension. Key management stays client-side throughout.&lt;/p>
&lt;h3 id="amethyst">Amethyst&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a>, the feature-rich Android client, merged four PRs shipping the Namecoin-backed &lt;a href="https://nostrcompass.org/en/topics/nip-05/">NIP-05&lt;/a> resolution work that was &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/">open last week&lt;/a>. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/1734">PR #1734&lt;/a> adds censorship-resistant NIP-05 verification via ElectrumX for &lt;code>.bit&lt;/code>, &lt;code>d/&lt;/code>, and &lt;code>id/&lt;/code> identifiers. When Amethyst detects one of these suffixes in a NIP-05 field, it queries an ElectrumX-NMC server for the name&amp;rsquo;s transaction history, parses the &lt;code>NAME_UPDATE&lt;/code> script from the latest output to extract the Nostr pubkey, and rejects names older than 36,000 blocks (Namecoin&amp;rsquo;s expiry window). ElectrumX connections route through SOCKS5 when Tor is enabled, with dynamic server selection between clearnet and &lt;code>.onion&lt;/code> endpoints. An LRU cache with a one-hour TTL prevents repeated blockchain queries.&lt;/p>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst/pull/1771">PR #1771&lt;/a> fixes race conditions and resolver correctness in that flow. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/1785">PR #1785&lt;/a> lets new users import a follow list during signup from either ordinary NIP-05 identifiers or Namecoin-backed ones. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/1786">PR #1786&lt;/a> adds custom ElectrumX server settings so users can choose which server handles their lookups.&lt;/p>
&lt;h3 id="nostr-idb">nostr-idb&lt;/h3>
&lt;p>&lt;a href="https://github.com/hzrd149/nostr-idb">nostr-idb&lt;/a>, a library providing helper methods for storing Nostr events in IndexedDB, merged &lt;a href="https://github.com/hzrd149/nostr-idb/pull/6">PR #6&lt;/a> adding support for &lt;a href="https://nostrcompass.org/en/topics/nip-91/">NIP-91&lt;/a> AND tag filters. The change adds intersection semantics to the client-side filter matching so IndexedDB queries can require all listed tag values rather than any one. &lt;a href="https://github.com/hzrd149/nostr-idb/pull/8">PR #8&lt;/a> updates the library to the latest NIP-DB interface, and a follow-up &lt;a href="https://github.com/hzrd149/nostr-idb/commit/b49b3d32c575ff8214dc3fb07675109c2a971972">commit b49b3d3&lt;/a> fixes a subscribe deadlock and removes nostr-tools as a production dependency.&lt;/p>
&lt;h3 id="pensieve">Pensieve&lt;/h3>
&lt;p>&lt;a href="https://github.com/andotherstuff/pensieve">Pensieve&lt;/a>, an archive-first Nostr indexer with ClickHouse analytics, merged &lt;a href="https://github.com/andotherstuff/pensieve/pull/8">PR #8&lt;/a> adding per-entry cache TTL enforcement and per-key miss coalescing to reduce API CPU spikes. The highest-cost time-series endpoints (engagement stats, hourly activity, per-kind activity) now use 10-minute server-side TTLs instead of triggering synchronized recompute storms.&lt;/p>
&lt;h3 id="blossom">Blossom&lt;/h3>
&lt;p>&lt;a href="https://github.com/hzrd149/blossom">Blossom&lt;/a>, the decentralized media-hosting protocol and server stack, merged two BUD-11 authorization updates. &lt;a href="https://github.com/hzrd149/blossom/pull/91">PR #91&lt;/a> moves optional authorization into its own BUD and clarifies the role of the &lt;code>x&lt;/code> and &lt;code>server&lt;/code> tags. &lt;a href="https://github.com/hzrd149/blossom/pull/93">PR #93&lt;/a> cleans up endpoint-specific auth behavior and formalizes the &lt;code>X-SHA-256&lt;/code> header for upload verification. The two PRs consolidate auth logic into BUD-11 and remove ambiguities around request hashing for upload, delete, and media-management flows.&lt;/p>
&lt;h2 id="nip-updates">NIP Updates&lt;/h2>
&lt;p>Recent changes to the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a>:&lt;/p>
&lt;p>&lt;strong>Merged:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-91/">NIP-91&lt;/a> (AND Operator for Filters)&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/1365">PR #1365&lt;/a>): Adds intersection semantics for tag filters, letting relays answer queries that require all listed tag values instead of any one of them. Reduces client-side post-filtering and bandwidth on tag-heavy queries.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a> (Relay Discovery and Liveness Monitoring): Defensive Measures&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2240">PR #2240&lt;/a>): Following the &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/">outbox benchmark work covered last week&lt;/a>, the spec now adds warnings around unhappy paths for relay monitoring data. Clients must not require kind &lt;code>30166&lt;/code> monitoring events in order to function. A monitor can be wrong, stale, or malicious. Clients are expected to cross-check sources and avoid cutting off large parts of a user&amp;rsquo;s relay graph based on a single feed.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-39/">NIP-39&lt;/a> (External Identities in Profiles): kind 10011 Registry Cleanup&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2256">PR #2256&lt;/a>): Adds the kind &lt;code>10011&lt;/code> reference directly to the spec, aligning with Amethyst&amp;rsquo;s implementation &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/">covered last week&lt;/a>.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Open PRs and Discussions:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-70/">NIP-70&lt;/a> (Protected Events): Reject reposts that embed protected events&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2251">PR #2251&lt;/a>): If a relay enforces NIP-70 on the original event but accepts reposts carrying the same content, the &lt;code>-&lt;/code> tag has no practical effect. This PR adds the rule that relays must also reject kind 6 and kind 16 reposts of protected events. &lt;a href="https://github.com/hoytech/strfry/pull/176">strfry PR #176&lt;/a> already implements this.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-71/">NIP-71&lt;/a> (Video Events): Multiple Audio Tracks&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2255">PR #2255&lt;/a>): Adds audio &lt;code>imeta&lt;/code> tags for alternate tracks, language variants, and audio-only streams. A client could keep a stable video file while switching audio languages, or serve audio as a separate track for podcast-like content.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> (Relay Information Document) and &lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a> Relay Attributes&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2257">PR #2257&lt;/a>): Adds a structured &lt;code>attributes&lt;/code> field to relay information documents, giving clients and discovery tools machine-readable metadata beyond the current free-text description.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="nip-deep-dive-nip-49-private-key-encryption">NIP Deep Dive: NIP-49 (Private Key Encryption)&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-49/">NIP-49&lt;/a> defines how a client encrypts a private key with a password and encodes the result as an &lt;code>ncryptsec&lt;/code> bech32 string. &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-11-newsletter/#formstr">Formstr&lt;/a> uses NIP-49 in its new signup flow.&lt;/p>
&lt;p>The format is not tied to a dedicated event kind. A client starts with the raw 32-byte secp256k1 private key, derives a symmetric key from the user&amp;rsquo;s password with scrypt, encrypts the key using XChaCha20-Poly1305, then wraps the result into a bech32 &lt;code>ncryptsec&lt;/code> string. A one-byte flag records whether the key was ever known to have been handled insecurely before encryption.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;4d47f4f0a6f6edbc1bbd7f4e2a45ec68f27cba91d6c6ab5cf28d8d87b0f3d57e&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;1f8b4c3e7b0f9451d4f9b8a7c6e5d4c3b2a1908f7e6d5c4b3a29181716151413&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1741699200&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">30078&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;encrypted-key-backup&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;format&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;ncryptsec&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;encryption&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;nip49&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;ncryptsec1qgg9947rlpvqu76pj5ecreduf9jxhselq2nae2kghhvd5g7dgjtcxfqtd67p9m0w57lspw8gsq6yphnm8623nsl8xn9j4jdzz84zm3frztj3z7s35vpzmqf6ksu8r89qk5z2zxfmu5gv8th8wclt0h4p&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;6a8f6e4b2d1901735f0ad4b6e8c1f3a579d0e2b4c6f8a1d3e5f7091b2c3d4e5f11223344556677889900aabbccddeeff00112233445566778899aabbccddeeff&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The JSON event above is an application-level example, not a NIP-49 requirement. The NIP standardizes the encrypted key format. A client can store the &lt;code>ncryptsec&lt;/code> locally, sync it through app-specific storage, or export it as a backup string. Passwords are normalized to Unicode NFKC before key derivation so the same password decrypts consistently across clients and platforms.&lt;/p>
&lt;p>The one-byte key-security flag has three defined values: &lt;code>0x00&lt;/code> means the key&amp;rsquo;s handling history is unknown, &lt;code>0x01&lt;/code> means the key is known to have been handled insecurely (e.g., pasted as plaintext in a web form before encryption), and &lt;code>0x02&lt;/code> means the key was generated and encrypted in a safe context and has never been exposed. Clients can use this to show warnings when importing keys with a known-insecure history.&lt;/p>
&lt;p>NIP-49 protects keys better than plain &lt;code>nsec&lt;/code> export, but the encryption is only as strong as the password and the configured scrypt cost. Higher &lt;code>LOG_N&lt;/code> values make offline guessing harder but slow down legitimate decrypt operations. The spec warns against publishing encrypted keys to public relays, since attackers benefit from collecting ciphertext for offline cracking. For comparison, &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote signing avoids exposing keys entirely, and &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> Android signing keeps keys inside a dedicated signer app. NIP-49 fills a different slot: portable encrypted backup for users who manage their own keys.&lt;/p>
&lt;p>Implementations include &lt;a href="https://github.com/formstr-hq/nostr-forms/pull/434">Formstr PR #434&lt;/a> for signup, &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> for ncryptsec backup and restore, &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-11-newsletter/#divine-ships-v106-with-e2e-test-infrastructure-and-nip-49-import">diVine v1.0.6&lt;/a> for account import, &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-11-newsletter/#keep-v060">Keep v0.6.0&lt;/a> for FROST share export, and key management tools like &lt;a href="https://nsec.app">nsec.app&lt;/a> and &lt;a href="https://github.com/getAlby/hub">Alby&lt;/a>.&lt;/p>
&lt;h2 id="nip-deep-dive-nip-70-protected-events">NIP Deep Dive: NIP-70 (Protected Events)&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-70/">NIP-70&lt;/a> defines protected events. When an event carries the tag &lt;code>[&amp;quot;-&amp;quot;]&lt;/code>, a relay must reject it unless the relay requires &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> authentication and the authenticated pubkey matches the event author.&lt;/p>
&lt;p>The NIP-42 auth flow works as follows: the relay sends an &lt;code>AUTH&lt;/code> challenge containing a random string, and the client responds with a signed kind &lt;code>22242&lt;/code> event whose tags include the relay URL and the challenge. The relay verifies the signature and checks that the pubkey in the auth event matches the pubkey in the protected event being published. If the pubkeys do not match, the relay rejects the event with a &lt;code>restricted&lt;/code> message prefix.&lt;/p>
&lt;p>The event content can still be public. The &lt;code>-&lt;/code> tag only controls who can publish the event to a relay that honors the tag. This covers &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> (Simple Groups) semi-closed feeds, member-only relay spaces, and other contexts where the author wants to limit redistribution through the relay graph. NIP-70 is a single-tag convention, not a new event kind, so any existing event kind can carry the &lt;code>-&lt;/code> tag.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;cb8feca582979d91fe90455867b34dbf4d65e4b86e86b3c68c368ca9f9eef6f2&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1707409439&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;-&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;hello members of the secret group&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;fa163f5cfb75d77d9b6269011872ee22b34fb48d23251e9879bb1e4ccbdd8aaaf4b6dc5f5084a65ef42c52fbcde8f3178bac3ba207de827ec513a6aa39fa684c&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Even if a relay blocks third-party publishing of the original event, someone can republish the content inside a repost. &lt;a href="https://github.com/nostr-protocol/nips/pull/2251">PR #2251&lt;/a> addresses this by requiring relays to also reject kind 6 and kind 16 reposts of protected events. &lt;a href="https://github.com/hoytech/strfry/pull/156">strfry PR #156&lt;/a> adds NIP-42 auth handling for protected events, and &lt;a href="https://github.com/hoytech/strfry/pull/176">strfry PR #176&lt;/a> blocks reposts that embed protected content.&lt;/p>
&lt;p>NIP-70 controls relay behavior. A recipient can still copy the content elsewhere, and the spec says so. The &lt;code>-&lt;/code> tag gives relays a machine-readable signal to refuse republication. For comparison, &lt;a href="https://nostrcompass.org/en/topics/nip-62/">NIP-62&lt;/a> (Request to Vanish) asks relays to delete data after the fact, while NIP-70 prevents unauthorized publishing at ingest time. The two are complementary: an author can mark events as protected to limit spread, and later request deletion if they want the content removed from relays that did accept it.&lt;/p>
&lt;hr>
&lt;p>That&amp;rsquo;s it for this week. Building something or have news to share? &lt;a href="nostr:npub1wav4fae3gyfy3xj298kxj2mj8phavz7vavps34przq02j7w902qq902923">Reach out via &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> DM&lt;/a> or find us on Nostr.&lt;/p></content:encoded></item><item><title>Nostr Compass #12</title><link>https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> The &lt;a href="https://github.com/marmot-protocol/mdk">Marmot Development Kit&lt;/a> ships its &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/#marmot-development-kit-ships-first-public-release">first public release&lt;/a> with encrypted media and multi-language bindings. &lt;a href="https://github.com/nostrability/outbox">Nostrability&lt;/a> publishes &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/#outbox-model-under-the-microscope">outbox model benchmarks&lt;/a> across 14 relay selection algorithms. &lt;a href="https://github.com/barrydeen/wisp">Wisp&lt;/a> goes from &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/#wisp-ships-from-alpha-to-beta">first alpha to beta&lt;/a> in eight days with Tor and &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> (Android Signer Application) signing. &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/#nip-updates">NIP-91&lt;/a> (AND filters) merges. &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/#vector-v031">Vector v0.3.1&lt;/a> delivers negentropy sync with 15x performance gains. This issue also includes the Five Years of Nostr Februaries retrospective, tracing the protocol from a spec rewrite serving three relays through the Damus App Store explosion to mesh networking and AI agent proposals.&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> The &lt;a href="https://github.com/marmot-protocol/mdk">Marmot Development Kit&lt;/a> ships its &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/#marmot-development-kit-ships-first-public-release">first public release&lt;/a> with encrypted media and multi-language bindings. &lt;a href="https://github.com/nostrability/outbox">Nostrability&lt;/a> publishes &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/#outbox-model-under-the-microscope">outbox model benchmarks&lt;/a> across 14 relay selection algorithms. &lt;a href="https://github.com/barrydeen/wisp">Wisp&lt;/a> goes from &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/#wisp-ships-from-alpha-to-beta">first alpha to beta&lt;/a> in eight days with Tor and &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> (Android Signer Application) signing. &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/#nip-updates">NIP-91&lt;/a> (AND filters) merges. &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/#vector-v031">Vector v0.3.1&lt;/a> delivers negentropy sync with 15x performance gains. This issue also includes the Five Years of Nostr Februaries retrospective, tracing the protocol from a spec rewrite serving three relays through the Damus App Store explosion to mesh networking and AI agent proposals.&lt;/p>
&lt;h2 id="news">News&lt;/h2>
&lt;h3 id="outbox-model-under-the-microscope">Outbox Model Under the Microscope&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostrability/outbox">Nostrability&lt;/a> published a series of outbox model benchmarks testing how well different relay selection algorithms retrieve events from the decentralized relay network. The project merged 16 PRs and 76 commits in ten days, producing what may be the most thorough empirical analysis of &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> (Relay List Metadata) implementation strategies to date.&lt;/p>
&lt;p>The benchmarks test 14 relay selection algorithms against real-world follow lists across 15 clients and libraries in five languages. A baseline approach of querying only popular relays retrieves roughly 26% of events. Greedy set-cover with Thompson Sampling reaches 80-90% recall. Adding a latency-aware variant using hyperbolic discounting and EWMA relay latency tracking pushed completeness from 62-80% to 72-96% at the 2-second mark across six test profiles.&lt;/p>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a> (Relay Monitoring) dead relay filtering proved consequential. Pre-filtering relay candidates against &lt;a href="https://nostr.watch">nostr.watch&lt;/a> liveness data removed 40-64% of dead relays and doubled relay success rates from 30% to 75-85%. Feed load times dropped 39% (from 40 seconds to 24 seconds across 10 profiles). An EOSE-race simulation found that waiting for EOSE plus a 200ms grace period improved completeness over stopping at the first relay to finish.&lt;/p>
&lt;p>For clients that cannot fully rewrite their relay routing, a &amp;ldquo;hybrid outbox enrichment&amp;rdquo; approach adds per-author outbox queries on top of existing hardcoded app relays. This hybrid achieved 80% one-year event recall versus the 26% baseline, offering a migration path for clients with legacy relay architectures.&lt;/p>
&lt;h3 id="contextvm-opens-mcp-nip-and-ships-ephemeral-gift-wraps">ContextVM Opens MCP NIP and Ships Ephemeral Gift Wraps&lt;/h3>
&lt;p>&lt;a href="https://contextvm.org">ContextVM&lt;/a>, the protocol bridging Nostr with the &lt;a href="https://modelcontextprotocol.io/">Model Context Protocol&lt;/a>, opened two proposals in the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a> this week. &lt;a href="https://github.com/nostr-protocol/nips/pull/2246">PR #2246&lt;/a> formalizes CVM as a convention for transporting MCP JSON-RPC messages over Nostr using ephemeral kind 25910 events. &lt;a href="https://github.com/nostr-protocol/nips/pull/2245">PR #2245&lt;/a> extends &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> (Gift Wrap) with an ephemeral kind (21059) that follows &lt;a href="https://nostrcompass.org/en/topics/nip-01/">NIP-01&lt;/a> (Basic Protocol Flow) ephemeral semantics, letting relays discard wrapped messages after delivery.&lt;/p>
&lt;p>The ephemeral gift wrap convention shipped as &lt;a href="https://docs.contextvm.org/spec/ceps/cep-19/">CEP-19&lt;/a> in the ContextVM SDK v0.6.x release family. The &lt;a href="https://github.com/ContextVM/sdk">SDK implementation&lt;/a> adds a &lt;code>GiftWrapMode&lt;/code> enum with three settings: OPTIONAL (accept both kinds and auto-detect peer capability), EPHEMERAL (kind 21059 only), and PERSISTENT (kind 1059 only). For AI tool calls, ephemeral mode avoids storing intermediate request-response traffic on relays, reducing both storage costs and privacy exposure.&lt;/p>
&lt;p>New public MCP servers appeared on the network from independent operators, including a Wolfram Alpha query server. The ContextVM team published CEP-15 (common tools schema) and CEP-17 (server relay list publication) alongside the v0.6.x release cycle.&lt;/p>
&lt;h3 id="marmot-development-kit-ships-first-public-release">Marmot Development Kit Ships First Public Release&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/mdk">MDK&lt;/a> (Marmot Development Kit), the Rust library powering &lt;a href="https://nostrcompass.org/en/topics/mls/">Marmot&lt;/a>-encrypted messaging across &lt;a href="https://github.com/sledtools/pika">Pika&lt;/a> and &lt;a href="https://github.com/marmot-protocol/whitenoise">White Noise&lt;/a>, shipped &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.6.0">v0.6.0&lt;/a> as its first public release. Over 200 PRs merged into this version, with six new contributors.&lt;/p>
&lt;p>The release includes encrypted media support (MIP-04) with HKDF seed derivation (MIP-01 v2), deterministic commit race resolution (MIP-03), encrypted local storage, admin authorization validation for Marmot commits and proposals, and GREASE support for protocol extensibility. Bindings ship for Kotlin, Python, Ruby, and Windows alongside Android cross-compilation. The library upgrades to OpenMLS 0.8.0 with security advisory fixes and a &lt;code>Secret&amp;lt;T&amp;gt;&lt;/code> type that zeroizes sensitive values in memory.&lt;/p>
&lt;p>A companion protocol change (&lt;a href="https://github.com/marmot-protocol/marmot/pull/48">MIP-03&lt;/a>) replaced &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> (Encrypted Payloads) encryption with ChaCha20-Poly1305 for kind 445 messages. NIP-44 required UTF-8 string input per its specification, making it impossible to pass raw Marmot message bytes through standard TypeScript Nostr libraries. The replacement derives keys directly from the Marmot exporter secret. This breaking change required coordinated updates across the &lt;a href="https://github.com/marmot-protocol/marmot/pull/48">core spec&lt;/a>, &lt;a href="https://github.com/marmot-protocol/mdk/pull/208">MDK&lt;/a>, and &lt;a href="https://github.com/marmot-protocol/marmot-ts/pull/54">TypeScript SDK&lt;/a>.&lt;/p>
&lt;p>&lt;a href="https://github.com/marmot-protocol/marmot-ts">marmot-ts&lt;/a>, the TypeScript implementation maintained by hzrd149, merged four PRs with breaking API changes in its own right. An &lt;a href="https://github.com/marmot-protocol/marmot-ts/pull/52">omnibus update&lt;/a> added a key package manager for create/publish/rotate lifecycle, a &lt;code>sendChatMessage&lt;/code> convenience method, invite preview without joining (&lt;code>readInviteGroupInfo&lt;/code>), self-update for forward-secrecy rotations, and structured debug logging. Group decryption APIs were renamed from &lt;code>readGroupMessage&lt;/code> to &lt;code>decryptGroupMessage&lt;/code> with richer result variants (processed/skipped/rejected/unreadable). gzuuus contributed example cleanup with NIP-65 relay support and last-resort key package handling per MIP-00.&lt;/p>
&lt;p>The &lt;a href="https://github.com/marmot-protocol/whitenoise-rs">White Noise CLI&lt;/a> (&lt;code>wn&lt;/code>), the Rust backend powering both the mobile app and the new TUI, merged 16 PRs in ten days. Signer lifecycle handling gained cancellation safety through an RAII scope guard (&lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/538">PR #538&lt;/a>), fixing a class of bugs where aborted operations could leak signer state. Login now blocks when required relay lists (kind 10002/10050/10051) are missing (&lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/515">PR #515&lt;/a>), and giftwrap subscriptions fall back to &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> relays when inbox lists are absent (&lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/518">PR #518&lt;/a>). A debug mode (&lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/528">PR #528&lt;/a>) exposes database queries and MLS ratchet-tree inspection as JSON output. Other fixes addressed subscription recovery after signer re-registration, welcome message catch-up timing, relay filter validation, and user search radius limits.&lt;/p>
&lt;p>Marmot saw significant expansion beyond the core Rust stack this week. &lt;a href="https://github.com/marmot-protocol/wn-tui">White Noise TUI&lt;/a>, a terminal-based interface to the White Noise messaging stack, launched March 3. It wraps the &lt;code>wn&lt;/code> CLI as a subprocess and renders its JSON output through an Elm-inspired unidirectional architecture, providing multi-conversation navigation with unread indicators, group creation and member search, real-time message streaming, and emoji reactions from the terminal.&lt;/p>
&lt;p>&lt;a href="https://github.com/DavidGershony">DavidGershony&lt;/a> published a complete C# Marmot stack mirroring the Rust toolchain&amp;rsquo;s layered architecture. &lt;a href="https://github.com/DavidGershony/dotnet-mls">dotnet-mls&lt;/a> implements MLS RFC 9420 cryptographic primitives in C#. &lt;a href="https://github.com/DavidGershony/marmot-cs">marmot-cs&lt;/a> builds on it to add Nostr relay transport, functioning as a C# equivalent of MDK. &lt;a href="https://github.com/DavidGershony/openChat">OpenChat&lt;/a>, a cross-platform desktop app built with .NET 9 and Avalonia UI, ties both together into a working chat client with NIP-44 DMs, Marmot group encryption, &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> (Nostr Connect) remote signing, and multi-relay status indicators.&lt;/p>
&lt;p>&lt;a href="https://github.com/zerosats/mdk-pwa-reference">MDK PWA Reference&lt;/a> provides a Progressive Web App template for building Marmot-encrypted applications, with experimental support for AI agent participation in group chats and Bitcoin payments via Arkade wallet infrastructure.&lt;/p>
&lt;h3 id="wisp-ships-from-alpha-to-beta">Wisp Ships from Alpha to Beta&lt;/h3>
&lt;p>&lt;a href="https://github.com/barrydeen/wisp">Wisp&lt;/a> is a new Android Nostr client that went from &lt;a href="https://github.com/barrydeen/wisp/releases/tag/v0.1.0-alpha">first alpha&lt;/a> on February 24 to &lt;a href="https://github.com/barrydeen/wisp/releases/tag/v0.3.4-beta">v0.3.4-beta&lt;/a> on March 3, producing 19 releases, 115 merged PRs, and 276 commits in eight days.&lt;/p>
&lt;p>The feature trajectory covers ground that most clients take months to reach. v0.1.0 shipped with outbox/inbox relay model support and onboarding flows. By v0.1.3, the client had &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> intent-based signing for Amber, an embedded Tor SOCKS5 proxy for &lt;code>.onion&lt;/code> relay connectivity, and &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> (Nostr Wallet Connect). v0.2.0 graduated to beta with mute list filtering and custom emoji support, while v0.2.4 added content warning overlays. The v0.3.x series introduced &lt;a href="https://nostrcompass.org/en/topics/nip-13/">NIP-13&lt;/a> proof-of-work for notes, background PoW mining with persistent settings, &lt;code>.onion&lt;/code> relay storage, and mute thread notifications.&lt;/p>
&lt;p>On-device translation via Google ML Kit runs locally without network access after the initial model download. An interactive social graph visualization uses a velocity Verlet physics simulation at approximately 30fps with pinch-to-zoom navigation and profile inspection.&lt;/p>
&lt;h2 id="releases">Releases&lt;/h2>
&lt;h3 id="vector-v031">Vector v0.3.1&lt;/h3>
&lt;p>&lt;a href="https://github.com/VectorPrivacy/Vector">Vector&lt;/a>, the Marmot-encrypted messaging app, shipped &lt;a href="https://github.com/VectorPrivacy/Vector/releases/tag/v0.3.1">v0.3.1&lt;/a> with group management improvements and performance work. Multi-admin groups, bulk invites, invite-by-npub, and group avatars expand the collaboration features. Android background notifications now support inline Reply and Mark Read actions.&lt;/p>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/negentropy/">Negentropy&lt;/a>-based deterministic sync retrieves full conversation history including messages that were missed during offline periods. Voice-to-text rebuilt with GPU acceleration on Android. File attachment handling was overhauled with download progress, retry states, directory zip-and-send, and live progress indicators throughout. Performance improved over 15x across boot time, image processing, audio playback, and general UI responsiveness. App install size dropped by more than a third, with the frontend reduced by roughly half. 32-bit ARM Android support was added.&lt;/p>
&lt;h3 id="alby-hub-v1215">Alby Hub v1.21.5&lt;/h3>
&lt;p>&lt;a href="https://github.com/getAlby/hub">Alby Hub&lt;/a>, the self-custodial Lightning node with Nostr Wallet Connect (&lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a>) support, shipped &lt;a href="https://github.com/getAlby/hub/releases/tag/v1.21.5">v1.21.5&lt;/a>. A second relay was added to the default NWC configuration, improving reliability during relay restarts. A fix for invalid zap data in the transaction list resolves a display issue with malformed &lt;a href="https://nostrcompass.org/en/topics/nip-57/">NIP-57&lt;/a> (Lightning Zaps) events. New app store entries include Alby CLI and LNVPS.&lt;/p>
&lt;h3 id="nospeak-v012x">nospeak v0.12.x&lt;/h3>
&lt;p>&lt;a href="https://github.com/psic4t/nospeak">nospeak&lt;/a>, the text-based Nostr messaging client, shipped three releases across the period. &lt;a href="https://github.com/psic4t/nospeak/releases/tag/v0.12.0">v0.12.0&lt;/a> added a PIN app lock with 4-digit keypad and over 15 new language translations including Bengali, Thai, Vietnamese, Hindi, Arabic, Hebrew, Urdu, Turkish, Japanese, Chinese, Korean, Dutch, Polish, Russian, and Persian with RTL support. &lt;a href="https://github.com/psic4t/nospeak/releases/tag/v0.12.1">v0.12.1&lt;/a> introduced a Cypher theme with pure black backgrounds and cyan accents, plus Android video poster generation. &lt;a href="https://github.com/psic4t/nospeak/releases/tag/v0.12.2">v0.12.2&lt;/a> added chat export and View Profile in contact menus.&lt;/p>
&lt;h3 id="citrine-v200-pre2">Citrine v2.0.0-pre2&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Citrine">Citrine&lt;/a>, the Android personal relay by greenart7c3, shipped &lt;a href="https://github.com/greenart7c3/Citrine/releases/tag/v2.0.0-pre2">v2.0.0-pre2&lt;/a> with relay performance improvements through new database indexes and restructured Kotlin coroutines. Each hosted web app now starts on its own port. Full-text search and a redesigned events screen with event expansion round out the changes.&lt;/p>
&lt;h3 id="noornote-v05x">NoorNote v0.5.x&lt;/h3>
&lt;p>&lt;a href="https://github.com/77elements/noornote">NoorNote&lt;/a>, a Nostr-based note-taking application, shipped 8 releases from &lt;a href="https://github.com/77elements/noornote/releases/tag/v0.5.0">v0.5.0&lt;/a> through &lt;a href="https://github.com/77elements/noornote/releases/tag/v0.5.7">v0.5.7&lt;/a>. The v0.5.0 launch on Android added &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> Amber signer support and &lt;a href="https://nostrcompass.org/en/topics/nip-71/">NIP-71&lt;/a> (Video Events) note publishing. A redesigned welcome page in v0.5.1 included public timeline previews and reduced the APK to 15 MB. The Relay Browser in v0.5.2 lets users browse public relay timelines via shareable URLs, alongside media download and &lt;a href="https://nostrcompass.org/en/topics/nip-30/">NIP-30&lt;/a> custom emoji reactions. Subsequent releases through v0.5.7 addressed sync race conditions in the collaborative &amp;ldquo;tribes&amp;rdquo; note-sharing system.&lt;/p>
&lt;h3 id="noscall-v051">NosCall v0.5.1&lt;/h3>
&lt;p>&lt;a href="https://github.com/sanah9/noscall">NosCall&lt;/a>, the Nostr voice and video calling app, shipped &lt;a href="https://github.com/sanah9/noscall/releases/tag/v0.5.1-release">v0.5.1&lt;/a> with voice message support, an optimized desktop experience with group entry, contact favorites on desktop, contact notes and filtering, data export and cleanup options, and system font size accessibility support.&lt;/p>
&lt;h3 id="shosho-v0130">Shosho v0.13.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/r0d8lsh0p/shosho-releases">Shosho&lt;/a>, the Nostr live streaming app, shipped &lt;a href="https://github.com/r0d8lsh0p/shosho-releases/releases/tag/v0.13.0">v0.13.0&lt;/a> with MP4 replay downloads from stream card menus and &lt;a href="https://nostrcompass.org/en/topics/nip-05/">NIP-05&lt;/a> (DNS-Based Verification) for profiles. The RTMP publisher migrated to Expo Modules API. Streaming performance on lower-bandwidth connections improved, and crashes on older devices and iOS streaming to &lt;a href="https://zap.stream">Zap.Stream&lt;/a> are fixed.&lt;/p>
&lt;h3 id="nostr-java-v200">nostr-java v2.0.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/tcheeric/nostr-java">nostr-java&lt;/a> shipped &lt;a href="https://github.com/tcheeric/nostr-java/releases/tag/v2.0.0">v2.0.0&lt;/a> with configurable WebSocket buffer sizes, allowing applications to handle larger Nostr events without truncation. The major version bump reflects breaking changes to the connection API.&lt;/p>
&lt;h3 id="prism-110">Prism 1.1.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/hardran3/Prism">Prism&lt;/a> shipped &lt;a href="https://github.com/hardran3/Prism/releases/tag/1.1.0">1.1.0&lt;/a> with long-form content support (kind 30023 articles) and a Markdown editor for composing directly in the app, followed by a &lt;a href="https://github.com/hardran3/Prism/releases/tag/1.1.1">1.1.1&lt;/a> bug fix release.&lt;/p>
&lt;h3 id="angor-v026">Angor v0.2.6&lt;/h3>
&lt;p>&lt;a href="https://github.com/block-core/angor">Angor&lt;/a>, the Bitcoin crowdfunding platform, shipped &lt;a href="https://github.com/block-core/angor/releases/tag/v0.2.6">v0.2.6&lt;/a> with Boltz integration and a 1-click invest flow. Both invest and fund project types work end-to-end on testnet. The team notes the UI is approximately 70% complete.&lt;/p>
&lt;h2 id="nip-updates">NIP Updates&lt;/h2>
&lt;p>Recent changes to the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a>:&lt;/p>
&lt;p>&lt;strong>Merged:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/1365">NIP-91: AND Operator for Filters&lt;/a>&lt;/strong>: Adds AND filter semantics for tag arrays in relay subscriptions. Currently, specifying multiple values in a tag filter (e.g., multiple &lt;code>p&lt;/code> tags) matches events containing any of them. NIP-91 lets clients require events matching all specified tag values simultaneously, reducing bandwidth and enabling faster index operations. Multiple relay implementations already exist including nostr-rs-relay, satellite-node, worker-relay, and applesauce. Formerly numbered NIP-119.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2247">NIP-30: Emoji Set Address in Tags&lt;/a>&lt;/strong>: Custom emoji tags in &lt;a href="https://nostrcompass.org/en/topics/nip-30/">NIP-30&lt;/a> can now include an optional emoji set address. Clicking an emoji in a client can open the set it belongs to for bookmarking or browsing. Originated from the &lt;a href="https://github.com/purrgrammer/chachi">Chachi&lt;/a> client.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2111">NIP-29: Add unallowpubkey and unbanpubkey&lt;/a>&lt;/strong>: Two new admin commands for &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> group chat. &lt;code>unallowpubkey&lt;/code> removes a pubkey from the allowed list without banning them. &lt;code>unbanpubkey&lt;/code> lifts a ban without re-adding the pubkey to the member list. Previously, the only way to remove someone from the allowed list also banned them, and unbanning required re-adding the user as a member.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Open PRs and Discussions:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2244">NIP-A7: Spells&lt;/a>&lt;/strong> (opened Feb 27): Proposed by purrgrammer, spells are portable saved Nostr queries published as kind 777 events. A spell encodes a REQ or COUNT filter in structured tags (&lt;code>k&lt;/code> for kinds, &lt;code>authors&lt;/code> for pubkeys, &lt;code>tag&lt;/code> for arbitrary tag filters) with runtime variables: &lt;code>$me&lt;/code> resolves to the logged-in user&amp;rsquo;s pubkey, &lt;code>$contacts&lt;/code> expands to the user&amp;rsquo;s kind 3 follow list. Relative timestamps (&lt;code>7d&lt;/code>, &lt;code>2w&lt;/code>, &lt;code>1mo&lt;/code>) let spells define rolling time windows without hardcoded dates. Already implemented in &lt;a href="https://github.com/fiatjaf/nak">nak&lt;/a> and &lt;a href="https://github.com/purrgrammer/grimoire">Grimoire&lt;/a>, spells let users create, share, and subscribe to curated feeds that travel across clients.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2245">NIP-59: Ephemeral Gift Wrap (kind 21059)&lt;/a>&lt;/strong> (opened Feb 27): Adds an ephemeral variant of &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> gift wraps. Kind 21059 follows NIP-01 ephemeral semantics, so relays discard events after delivery. Proposed by ContextVM for MCP transport where message persistence is unnecessary.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2246">ContextVM: MCP JSON-RPC over Nostr&lt;/a>&lt;/strong> (opened Feb 27): Specifies how to transport Model Context Protocol messages over Nostr using ephemeral kind 25910 events with &lt;code>p&lt;/code> and &lt;code>e&lt;/code> tags for addressing and correlation. Intentionally thin, deferring protocol detail to the &lt;a href="https://docs.contextvm.org">ContextVM spec&lt;/a>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2238">NIP-29: Audio/Video Live Spaces&lt;/a>&lt;/strong> (opened Feb 25, draft): fiatjaf&amp;rsquo;s draft extending &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> groups with live audio and video. The proposal adds optional &lt;code>livekit&lt;/code> and &lt;code>no-text&lt;/code> tags to group metadata events. When a user wants to join a voice space, the client requests a JWT from the relay at &lt;code>/.well-known/nip29/livekit/{groupId}&lt;/code>. The relay checks group membership and issues a token with the user&amp;rsquo;s hex pubkey as the &lt;code>sub&lt;/code> claim, which is passed to &lt;a href="https://livekit.io/">LiveKit&lt;/a> for media transport. Voice room access inherits the group&amp;rsquo;s existing permission model, so relay-side membership rules govern who can speak. Being tested in Pyramid and Chachi.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2235">Collaborative Event Ownership&lt;/a>&lt;/strong> (opened Feb 24): pablof7z proposes a pointer event (kind 39382) that declares a collaborative space by listing co-owner pubkeys in &lt;code>p&lt;/code> tags and a target event kind in a &lt;code>k&lt;/code> tag. Any listed owner can publish events of that kind with the same &lt;code>d&lt;/code> tag, and clients resolve the current state by querying all owners and taking the most recent event. Co-authorship attribution only displays when a verifiable &lt;code>a&lt;/code> tag back-references the pointer and the author appears in its &lt;code>p&lt;/code> tags, preventing spoofed claims. This enables shared wiki pages and co-authored resources without assigning control to a single keypair.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2234">NIP-09: Cascading Deletion of Reposts&lt;/a>&lt;/strong> (opened Feb 24): When an original author deletes a note, relays should also delete any kind 6 or kind 16 reposts referencing it. Motivated by privacy concerns: reposts can preserve accidentally leaked information after the author deletes the source. The change is relay-side only, requiring no client modifications.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2233">NIP-07: peekPublicKey&lt;/a>&lt;/strong> (opened Feb 23): Adds a &lt;code>peekPublicKey()&lt;/code> method to &lt;a href="https://nostrcompass.org/en/topics/nip-07/">NIP-07&lt;/a> browser extensions. Unlike &lt;code>getPublicKey()&lt;/code>, it returns the current pubkey without prompting for user confirmation, enabling silent auto-login when the user has auto-login enabled.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2248">NIP-BB: Book&lt;/a>&lt;/strong> (opened Feb 28, draft): Defines four addressable event kinds (30300-30303) for structured book publishing on Nostr. A Cover event holds root metadata including title, cover image, license via &lt;a href="https://nostrcompass.org/en/topics/nip-32/">NIP-32&lt;/a> (Labeling) labels, and language code. An Index event maps each chapter to its position using base62 fractional indexing, which lets authors insert new chapters between existing ones without renumbering. Chapter events act as structural headers with optional images, while Episode events carry the actual prose capped at 30,000 characters with positioned image tags. Reviews use Zaps on Cover events with the Zap description as review text.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2242">NIP-54: Switch from Asciidoc to Djot&lt;/a>&lt;/strong> (opened Feb 26): Following the &lt;a href="https://nostrcompass.org/en/newsletters/2025-12-31-newsletter/">d-tag internationalization fix&lt;/a> in December, this PR proposes replacing &lt;a href="https://nostrcompass.org/en/topics/nip-54/">NIP-54&lt;/a> wiki&amp;rsquo;s Asciidoc markup format with &lt;a href="https://djot.net/">Djot&lt;/a>, adding a rationale section and wikilink examples for non-Latin scripts.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2240">NIP-66: Defensive Measures&lt;/a>&lt;/strong> (opened Feb 26): Based on learnings from the &lt;a href="https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/#outbox-model-under-the-microscope">nostrability/outbox&lt;/a> benchmarks, adds explicit callouts for &lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a> edge cases. A companion &lt;a href="https://github.com/nostr-protocol/nips/pull/2241">PR #2241&lt;/a> defines output tags for SSL, geolocation, network, and connectivity checks.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>NIP-C1: Cryptographic Identity Proofs&lt;/strong> (wiki entry, kind 30817): Proposes kind 30509 events that cryptographically link APK signing certificates to Nostr profiles. The proof works by signing a canonical message containing the Nostr pubkey with the certificate&amp;rsquo;s private key (supporting ECDSA, RSA PKCS1v15, Ed25519, and other standard algorithms), then publishing the signature in a kind 30509 event signed with the Nostr key. Verifiers can confirm that the person who controls an app&amp;rsquo;s Android signing certificate also controls the Nostr pubkey claiming to publish it. Proofs expire after one year by default and can be explicitly revoked. Implemented in the &lt;a href="https://github.com/zapstore/zapstore">Zapstore&lt;/a> toolchain.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>NIP-31402: SARA Revenue Share Offering Registry&lt;/strong> (wiki entry, kind 30817): Defines kind 31402 addressable events for publishing Simple Autonomous Revenue Agreement (SARA) offerings on Nostr relays. Issuers advertise Lightning-settled revenue share terms including pool share percentage, payout trigger, threshold in sats, term length, and tiered pricing. Agents and humans can discover offerings across relays and subscribe autonomously without a central platform. The kind number mirrors kind 30402 (L402 Service Registry, published by the same author as a companion wiki entry) since SARA represents the return leg of the L402 payment relationship.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="open-prs-and-project-updates">Open PRs and Project Updates&lt;/h2>
&lt;h3 id="damus-nip-89entopicsnip-89-recommended-application-handlers">Damus: &lt;a href="https://nostrcompass.org/en/topics/nip-89/">NIP-89&lt;/a> (Recommended Application Handlers)&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/damus/pull/3337">PR #3337&lt;/a> implements NIP-89 client tag support for &lt;a href="https://github.com/damus-io/damus">Damus&lt;/a>. The app now emits a client tag on all posting paths (main app, share extension, highlighter, drafts) and displays &amp;ldquo;via ClientName&amp;rdquo; beside timestamps when other apps include their tags. A Privacy toggle in Appearance settings lets users disable tag emission. &lt;a href="https://github.com/damus-io/damus/pull/3652">PR #3652&lt;/a> adds a Storage section in Settings with an interactive pie chart breaking down NostrDB and Kingfisher cache disk usage with export support.&lt;/p>
&lt;p>Open: &lt;a href="https://github.com/damus-io/damus/pull/3657">PR #3657&lt;/a> adds &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> relay fallback for quoted notes. When an inline &lt;code>nevent&lt;/code> includes an author pubkey but no relay hints and the note is missing from the user&amp;rsquo;s pool, Damus fetches the author&amp;rsquo;s kind 10002 relay list and retries from their write relays.&lt;/p>
&lt;h3 id="amethyst-nip-39entopicsnip-39-external-identities-nip-c0-nip-66entopicsnip-66">Amethyst: &lt;a href="https://nostrcompass.org/en/topics/nip-39/">NIP-39&lt;/a> (External Identities), NIP-C0, &lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a>&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> merged a wave of NIP implementations across 28 PRs. External identity claims now publish as dedicated kind 10011 events under &lt;a href="https://nostrcompass.org/en/topics/nip-39/">NIP-39&lt;/a> (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/1747">PR #1747&lt;/a>), separating social identity from kind 0 metadata with backward-compatible fallback. Code snippet support via NIP-C0 (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/1744">PR #1744&lt;/a>) adds kind 1337 events with accessors for language, extension, runtime, license, and dependencies. The &lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a> relay monitoring implementation (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/1742">PR #1742&lt;/a>) covers both event kinds with full tag parsing for RTT metrics, network type, supported NIPs, and geohash.&lt;/p>
&lt;p>Encrypted DMs arrived on Amethyst Desktop (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/1710">PR #1710&lt;/a>) with a split-pane chat layout supporting both &lt;a href="https://nostrcompass.org/en/topics/nip-04/">NIP-04&lt;/a> (Encrypted Direct Messages) and &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> (Private Direct Messages). A new relay feed screen (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/1733">PR #1733&lt;/a>) lets users browse posts from a specific relay with follow/unfollow functionality. Open: censorship-resistant NIP-05 verification (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/1734">PR #1734&lt;/a>) adds a parallel verification path for &lt;code>.bit&lt;/code> identifiers that resolves against the Namecoin blockchain instead of HTTP DNS. When Amethyst detects a &lt;code>.bit&lt;/code> suffix in a NIP-05 field, it queries an ElectrumX-NMC server for the name&amp;rsquo;s transaction history, parses the &lt;code>NAME_UPDATE&lt;/code> script from the latest output to extract the Nostr pubkey, and rejects names older than 36,000 blocks (Namecoin&amp;rsquo;s expiry window). ElectrumX connections route through SOCKS5 when Tor is enabled, with dynamic server selection between clearnet and &lt;code>.onion&lt;/code> endpoints. An LRU cache with a one-hour TTL prevents repeated blockchain queries.&lt;/p>
&lt;h3 id="notedeck-outbox-architecture">Notedeck: Outbox Architecture&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/notedeck/pull/1303">PR #1303&lt;/a> migrates &lt;a href="https://github.com/damus-io/notedeck">Notedeck&lt;/a> from ad-hoc relay pool management to a centralized outbox model with account-scoped subscriptions. The Messages module now publishes a default DM relay list if none exists and routes DMs to recipients&amp;rsquo; preferred relays per kind 10050.&lt;/p>
&lt;h3 id="pika-per-group-profiles-and-tutorial-feed">Pika: Per-Group Profiles and Tutorial Feed&lt;/h3>
&lt;p>&lt;a href="https://github.com/sledtools/pika">Pika&lt;/a>, the Marmot-encrypted messaging app available on iOS and Android with a desktop build, gained per-group profiles (&lt;a href="https://github.com/sledtools/pika/pull/368">PR #368&lt;/a>). Users can now set a separate display name and picture for each group chat, along with a custom bio. These profiles publish as encrypted kind 0 events inside the Marmot group, invisible to anyone outside it, with a fallback to the user&amp;rsquo;s global Nostr profile when no group-specific profile is set. When new members join, the admin rebroadcasts all stored group profiles and each member republishes their own on commit. Profile pictures are Marmot-media-encrypted before Blossom upload. The PR includes 16 new unit tests and exposes the feature both through a CLI command (&lt;code>update-group-profile&lt;/code>) and the UI.&lt;/p>
&lt;p>A new &lt;code>pika-news&lt;/code> web app (&lt;a href="https://github.com/sledtools/pika/pull/401">PR #401&lt;/a>) monitors Pika&amp;rsquo;s own GitHub PRs and auto-generates step-by-step tutorial walkthroughs from PR diffs, publishing them as server-rendered pages with &lt;a href="https://nostrcompass.org/en/topics/nip-07/">NIP-07&lt;/a> authentication. Users can discuss specific tutorials in real time through Nostr-authenticated chat.&lt;/p>
&lt;h3 id="divine-embeddable-widgets-and-video-replies">diVine: Embeddable Widgets and Video Replies&lt;/h3>
&lt;p>&lt;a href="https://github.com/divinevideo/divine-mobile">diVine&lt;/a>, the Nostr-native video sharing platform, merged 132 PRs in ten days. Embeddable iframe widgets (&lt;a href="https://github.com/divinevideo/divine-mobile/pull/1843">PR #1843&lt;/a>) provide a self-contained &lt;code>/embed?npub=...&lt;/code> page that renders a user&amp;rsquo;s profile and latest videos. Video reply functionality (&lt;a href="https://github.com/divinevideo/divine-mobile/pull/1915">PR #1915&lt;/a>), gated behind a feature flag, uses Kind 1111 comments (&lt;a href="https://nostrcompass.org/en/topics/nip-22/">NIP-22&lt;/a>) with &lt;a href="https://nostrcompass.org/en/topics/nip-92/">NIP-92&lt;/a> (Media Attachments) imeta metadata. Bluesky-inspired three-way content filters (&lt;a href="https://github.com/divinevideo/divine-mobile/pull/1797">PR #1797&lt;/a>) offer Show/Warn/Hide controls across 17 &lt;a href="https://nostrcompass.org/en/topics/nip-32/">NIP-32&lt;/a> content warning categories.&lt;/p>
&lt;h3 id="strfry-req-filter-validation">strfry: REQ Filter Validation&lt;/h3>
&lt;p>&lt;a href="https://github.com/hoytech/strfry/pull/163">PR #163&lt;/a> adds configurable REQ filter validation to &lt;a href="https://github.com/hoytech/strfry">strfry&lt;/a>, the C++ Nostr relay. Operators can set maximum filters per REQ, required author or tag presence, allowed kind whitelists, and per-filter kind limits. The feature targets NWC relay deployments that need strict filter enforcement. Open: &lt;a href="https://github.com/hoytech/strfry/pull/173">PR #173&lt;/a> adds optional zstd compression for event payloads at ingest time.&lt;/p>
&lt;h3 id="rust-nostr-nip-62entopicsnip-62-request-to-vanish">rust-nostr: &lt;a href="https://nostrcompass.org/en/topics/nip-62/">NIP-62&lt;/a> Request to Vanish&lt;/h3>
&lt;p>&lt;a href="https://github.com/rust-nostr/nostr">rust-nostr&lt;/a>, the Rust Nostr protocol library, added &lt;a href="https://nostrcompass.org/en/topics/nip-62/">NIP-62&lt;/a> (Request to Vanish) support across all three database backends: &lt;a href="https://github.com/rust-nostr/nostr/pull/1268">LMDB&lt;/a>, &lt;a href="https://github.com/rust-nostr/nostr/pull/1270">SQLite&lt;/a>, and &lt;a href="https://github.com/rust-nostr/nostr/pull/1272">in-memory&lt;/a>. The LMDB implementation includes configurable options to enable or disable &lt;a href="https://nostrcompass.org/en/topics/nip-09/">NIP-09&lt;/a> and NIP-62 enforcement per deployment.&lt;/p>
&lt;h3 id="ndk-collaborative-events-and-nip-46-timeout">NDK: Collaborative Events and NIP-46 Timeout&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-dev-kit/ndk">NDK&lt;/a>, the Nostr Development Kit for JavaScript/TypeScript, merged &lt;a href="https://github.com/nostr-dev-kit/ndk/pull/380">PR #380&lt;/a> introducing &lt;code>NDKCollaborativeEvent&lt;/code> for multi-author collaborative documents using an addressable pointer event (kind 39382) that defines authorized authors. A configurable timeout for &lt;code>NDKNip46Signer&lt;/code> (&lt;a href="https://github.com/nostr-dev-kit/ndk/pull/381">PR #381&lt;/a>) prevents &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote signing operations from hanging indefinitely when a bunker does not respond.&lt;/p>
&lt;h3 id="tenex-agent-categorization-and-pubkey-gating">TENEX: Agent Categorization and Pubkey Gating&lt;/h3>
&lt;p>&lt;a href="https://github.com/tenex-chat/tenex">TENEX&lt;/a>, the Nostr-native AI agent orchestration platform, merged two security-related PRs. TIP-01 role-based agent categorization (&lt;a href="https://github.com/tenex-chat/tenex/pull/91">PR #91&lt;/a>) maps agent categories (principal, orchestrator, worker, advisor, auditor) to automated tool restrictions via a denied-tools map. Front-door pubkey gating (&lt;a href="https://github.com/tenex-chat/tenex/pull/87">PR #87&lt;/a>) ensures only events from whitelisted or backend-signed pubkeys are routed alongside known agents; unknown pubkeys are silently dropped with OpenTelemetry spans for audit.&lt;/p>
&lt;h3 id="zap-cooking-membership-dashboard">Zap Cooking: Membership Dashboard&lt;/h3>
&lt;p>&lt;a href="https://github.com/zapcooking/frontend">Zap Cooking&lt;/a>, the Nostr-based recipe sharing platform, merged 25 PRs and 85 commits in ten days. A membership dashboard (&lt;a href="https://github.com/zapcooking/frontend/pull/228">PR #228&lt;/a>) shows subscription status with expiration dates and manage/upgrade options, re-enables feature gates for Sous Chef and Zappy tiers with both client-side and server-side checks, and standardizes tier naming across 26 files. Two-phase group message loading (&lt;a href="https://github.com/zapcooking/frontend/pull/227">PR #227&lt;/a>) provides a fast 3-day initial fetch for instant display followed by a background 40-day backfill.&lt;/p>
&lt;p>Wallet mnemonic storage moved from pubkey-derived encryption to &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encrypt-to-self (&lt;a href="https://github.com/zapcooking/frontend/pull/224">PR #224&lt;/a>), fixing a vulnerability where the old scheme derived its key from &lt;code>SHA-256(pubkey)&lt;/code>, which is effectively unencrypted since pubkeys are public. Existing wallets are silently migrated on first load. &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> group chat gained unread indicators with red dot badges and invite-only access with kind 9009 invite codes (&lt;a href="https://github.com/zapcooking/frontend/pull/213">PR #213&lt;/a>). Link previews and Nostr event embeds now render in DMs and group messages (&lt;a href="https://github.com/zapcooking/frontend/pull/218">PR #218&lt;/a>). A Nostr backup section in Settings (&lt;a href="https://github.com/zapcooking/frontend/pull/210">PR #210&lt;/a>) stores follows and mute lists via &lt;a href="https://nostrcompass.org/en/topics/nip-78/">NIP-78&lt;/a> (Application-specific Data) encrypted storage with rotating 3-slot versioning. Startup performance improved through deferred notification services, lazy DOM rendering via IntersectionObserver (reducing DOM nodes from ~15,000 to ~3,000 on a 200-event feed), and extended outbox cache TTLs (&lt;a href="https://github.com/zapcooking/frontend/pull/208">PR #208&lt;/a>). A customizable print recipe modal (&lt;a href="https://github.com/zapcooking/frontend/pull/205">PR #205&lt;/a>) lets users toggle which sections to include with a live preview. &lt;a href="https://github.com/BrantaOps/branta-core">Branta SDK&lt;/a> integration (&lt;a href="https://github.com/zapcooking/frontend/pull/222">PR #222&lt;/a>) adds verification guardrails for POST and GET requests.&lt;/p>
&lt;h3 id="keep-rust-driven-state-migration">Keep: Rust-Driven State Migration&lt;/h3>
&lt;p>&lt;a href="https://github.com/privkeyio/keep-android">Keep&lt;/a>, the Nostr-based private key manager for Android, merged &lt;a href="https://github.com/privkeyio/keep-android/pull/178">PR #178&lt;/a>, deleting four Kotlin configuration stores in favor of Rust-driven shared state from the keep-mobile layer. A 10-second polling loop was replaced with push-based &lt;code>KeepStateCallback&lt;/code> from Rust. &lt;a href="https://github.com/privkeyio/keep-android/pull/179">PR #179&lt;/a> adds encrypted backup and restore with passphrase protection.&lt;/p>
&lt;h3 id="mostro-mobile-dispute-chat-encryption">Mostro Mobile: Dispute Chat Encryption&lt;/h3>
&lt;p>&lt;a href="https://github.com/MostroP2P/mobile">Mostro Mobile&lt;/a>, the mobile client for the Mostro P2P Bitcoin trading platform, shipped a two-phase migration of dispute chat encryption. The first step (&lt;a href="https://github.com/MostroP2P/mobile/pull/495">PR #495&lt;/a>) switches from mostro-specific wrapping to shared key encryption derived from the admin&amp;rsquo;s pubkey. Building on that, &lt;a href="https://github.com/MostroP2P/mobile/pull/501">PR #501&lt;/a> unifies the message model with &lt;code>NostrEvent&lt;/code> and stores gift wrap events encrypted on disk, consistent with the peer-to-peer chat pattern. A BIP-340 signature fix (&lt;a href="https://github.com/MostroP2P/mobile/pull/496">PR #496&lt;/a>) overrides the bip340 dependency to 0.2.0, resolving a &lt;code>bigToBytes()&lt;/code> padding bug that caused 1-2% of Schnorr signatures to be invalid and 100% failure for keys whose public key starts with &lt;code>0x00&lt;/code>. Order Details now shows human-readable status labels instead of raw protocol values, localized across English, Spanish, Italian, and French (&lt;a href="https://github.com/MostroP2P/mobile/pull/502">PR #502&lt;/a>). HalCash was added and SEPA removed as a payment method (&lt;a href="https://github.com/MostroP2P/mobile/pull/493">PR #493&lt;/a>), since SEPA transfers can exceed 24 hours (SEPA Instant remains).&lt;/p>
&lt;p>On the server side, &lt;a href="https://github.com/MostroP2P/mostro">Mostro&lt;/a> fixed dispute session restore to include the initiator field (&lt;a href="https://github.com/MostroP2P/mostro/pull/599">PR #599&lt;/a>) and now automatically closes active disputes when a seller releases funds, publishing a settled Nostr event so admin clients see the resolution (&lt;a href="https://github.com/MostroP2P/mostro/pull/606">PR #606&lt;/a>).&lt;/p>
&lt;h2 id="five-years-of-nostr-februaries">Five Years of Nostr Februaries&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/newsletters/2026-01-28-newsletter/#five-years-of-nostr-januaries">Last month&amp;rsquo;s newsletter&lt;/a> traced Nostr&amp;rsquo;s January milestones from early development through the Damus breakout to security infrastructure in 2026. This retrospective covers what happened each February from 2021 through 2026.&lt;/p>
&lt;h3 id="february-2021-the-rewrite">February 2021: The Rewrite&lt;/h3>
&lt;p>Three months into its existence, Nostr&amp;rsquo;s February produced the protocol&amp;rsquo;s most consequential early change. On February 14-15, fiatjaf &lt;a href="https://github.com/nostr-protocol/nostr/commit/33a1a70">rewrote NIP-01&lt;/a>, replacing the original message format with the EVENT/REQ/CLOSE model that the protocol still uses. Before this rewrite, clients and relays communicated through a simpler structure. Separating event publishing (EVENT) from subscription management (REQ/CLOSE) enabled relay-side filtering that would prove essential for scaling.&lt;/p>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-04/">NIP-04&lt;/a> arrived the same month, adding encrypted direct messages using shared secrets derived from Diffie-Hellman key exchange over secp256k1. Its encryption was basic (AES-256-CBC) and would later be replaced by &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a>&amp;rsquo;s audited cryptography, but it gave the handful of early users their first private communication channel on the protocol.&lt;/p>
&lt;p>Tooling expanded with &lt;a href="https://github.com/fiatjaf/noscl">noscl&lt;/a>, a Go command-line client for terminal-based relay interaction, and futurepaul started &lt;a href="https://github.com/futurepaul/nostr-rs">nostr-rs&lt;/a>, an early Rust implementation. The entire network ran on two or three relays, coordinated through a &lt;a href="https://t.me/nostr_protocol">Telegram group&lt;/a>, with roughly seven active contributors.&lt;/p>
&lt;h3 id="february-2022-building-momentum">February 2022: Building Momentum&lt;/h3>
&lt;p>The &lt;a href="https://news.ycombinator.com/item?id=29749061">Hacker News post&lt;/a> from December 31, 2021 continued to draw developers into February. The &lt;a href="https://github.com/nostr-protocol/nostr">nostr-protocol/nostr&lt;/a> repository (the formal &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a> would not exist until May 2022) received six pull requests in February, including NIP-13 (Proof of Work) from vinliao, NIP-14 (Reputation) from fiatjaf, NIP-15 (Resource Relations) from Cameri, and &lt;a href="https://github.com/nostr-protocol/nostr/pull/75">NIP-17&lt;/a> (Git Updates Over Nostr) from melvincarvalho. The NIP number was later reassigned to Private Direct Messages; git collaboration on Nostr continued separately through what became &lt;a href="https://gitworkshop.dev">gitworkshop.dev&lt;/a>.&lt;/p>
&lt;p>Greg Heartsfield&amp;rsquo;s &lt;a href="https://github.com/scsibug/nostr-rs-relay">nostr-rs-relay&lt;/a> was the month&amp;rsquo;s workhorse with 34 commits and three releases. Version 0.5.0 on February 12 added &lt;a href="https://nostrcompass.org/en/topics/nip-05/">NIP-05&lt;/a> verified user publishing limits. Versions 0.5.1 and 0.5.2 followed over the next two weeks, and the relay handled the bulk of the network&amp;rsquo;s traffic alone.&lt;/p>
&lt;p>Robert C. Martin (Uncle Bob) was building &lt;a href="https://github.com/unclebob/more-speech">more-speech&lt;/a>, a Clojure desktop client, logging 69 commits between January 18 and the end of February. His involvement brought attention from the broader software engineering community. fiatjaf&amp;rsquo;s &lt;a href="https://github.com/fiatjaf/nos2x">nos2x&lt;/a> browser extension shipped &lt;a href="https://nostrcompass.org/en/topics/nip-04/">NIP-04&lt;/a> decrypt support and relay preference policies in February, implementing the &lt;code>window.nostr&lt;/code> interface (&lt;a href="https://nostrcompass.org/en/topics/nip-07/">NIP-07&lt;/a>) that web clients still use for key delegation.&lt;/p>
&lt;p>&lt;a href="https://github.com/fiatjaf/branle">Branle&lt;/a>, still the primary web client, gained &lt;code>web+nostr&lt;/code> protocol handler registration on February 13, an early attempt at deep linking between Nostr applications. &lt;a href="https://github.com/nbd-wtf/nostr-tools">nostr-tools&lt;/a> tightened NIP-05 validation. &lt;a href="https://github.com/nbd-wtf/go-nostr">go-nostr&lt;/a> added NIP-04 encrypted DM support and NIP-12 (Generic Tag Queries) parsing across 11 commits. The network operated on roughly 7-15 relays with an active user base likely in the low hundreds. Damus and Nostream did not yet exist and would not appear until April 2022.&lt;/p>
&lt;h3 id="february-2023-international-attention">February 2023: International Attention&lt;/h3>
&lt;p>February 2023 brought Nostr its largest wave of public attention. &lt;a href="https://github.com/damus-io/damus">Damus&lt;/a>, the iOS client by William Casarin, had been &lt;a href="https://www.coindesk.com/tech/2023/02/01/decentralized-social-media-project-nostrs-damus-gets-listed-on-apple-app-store">approved on Apple&amp;rsquo;s App Store on January 31&lt;/a> after repeated rejections. By February 1 it reached the top 10 in U.S. Social Networking. Two days later, on February 2, &lt;a href="https://techcrunch.com/2023/02/02/damus-pulled-from-apples-app-store-in-china-after-two-days/">Apple pulled Damus from China&amp;rsquo;s App Store&lt;/a> reportedly at the request of the Cyberspace Administration of China.&lt;/p>
&lt;p>Major outlets including TechCrunch and CoinDesk covered the removal, amplifying awareness of both the app and the protocol. Unique public keys with metadata on nostr.directory crossed 300,000 by February 3. All relays were operated by enthusiasts paying out-of-pocket, and infrastructure scrambled to handle the load. Approximately 289 relays were tracked by early February, a number that continued to climb.&lt;/p>
&lt;p>The &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a> logged 29 merged pull requests that month, the highest single-month count in the protocol&amp;rsquo;s history to that point. &lt;a href="https://github.com/nostr-protocol/nips/pull/224">NIP-57&lt;/a> (Lightning Zaps) and &lt;a href="https://github.com/nostr-protocol/nips/pull/220">NIP-23&lt;/a> (Long-form Content) both merged on February 13, adding Bitcoin micropayments and expanding Nostr beyond short posts in a single day. &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> (Relay List Metadata) had merged a week earlier on February 7, enabling the outbox model that followed. &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> (Nostr Connect) and &lt;a href="https://nostrcompass.org/en/topics/nip-58/">NIP-58&lt;/a> (Badges) also landed before month&amp;rsquo;s end.&lt;/p>
&lt;p>The Human Rights Foundation &lt;a href="https://hrf.org/devfund2023q1">granted $50,000 to William Casarin for Nostr and Damus development&lt;/a> on February 21, one of the first institutional grants to a Nostr project. OpenSats had not yet launched its Nostr fund (that would come in &lt;a href="https://opensats.org/blog/nostr-grants-july-2023">July 2023&lt;/a>).&lt;/p>
&lt;h3 id="february-2024-protocol-durability">February 2024: Protocol Durability&lt;/h3>
&lt;p>February 2024 shifted focus from growth to protocol durability. &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> (Private Direct Messages), open since the previous July, was working toward a replacement for the aging &lt;a href="https://nostrcompass.org/en/topics/nip-04/">NIP-04&lt;/a> encryption using &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a>&amp;rsquo;s audited cryptography and &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> gift wrapping. NIP-04 leaked metadata to relay operators, who could see sender-recipient pairs. NIP-17 hides sender identity behind disposable keypairs and merged that spring after a final round of review in March.&lt;/p>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> (Simple Groups) &lt;a href="https://github.com/nostr-protocol/nips/pull/566">merged February 28&lt;/a> after months of discussion, defining how relays can host moderated group chats with admin roles and access control. &lt;a href="https://nostrcompass.org/en/topics/nip-92/">NIP-92&lt;/a> (imeta tags) merged February 1, standardizing how clients attach image dimensions and blurhash previews to media events.&lt;/p>
&lt;p>On February 16, the NIPs repository added &lt;a href="https://github.com/nostr-protocol/nips/commit/62c48eff">BREAKING.md&lt;/a>, a file tracking backward-incompatible changes to the protocol specification. Its creation acknowledged that Nostr had reached a maturity level where breaking changes needed formal documentation.&lt;/p>
&lt;p>Twenty-two pull requests merged that month. &lt;a href="https://github.com/cashubtc/npubcash-server">npub.cash&lt;/a> launched as a Lightning address service letting any npub receive payments without running a server. An &lt;a href="https://arxiv.org/abs/2402.05709">academic paper&lt;/a> published February 8 found that 95% of free-to-use relays could not cover operational costs through donations, with 35% of paid relays charging admission fees below 1,000 sats (roughly $0.45 at the time).&lt;/p>
&lt;h3 id="february-2025-infrastructure-growth">February 2025: Infrastructure Growth&lt;/h3>
&lt;p>February 2025 produced 28 merged pull requests to the NIPs repository. A &lt;a href="https://nostrcompass.org/en/topics/nip-62/">Right to Vanish&lt;/a> NIP merged February 19, defining how users can request deletion of their data from relays in response to regulatory questions around data portability and user control.&lt;/p>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-60/">NIP-60&lt;/a> (Cashu Wallet) and NIP-61 (Nutzaps) received simplification updates, streamlining the ecash token storage format. A q-tag (quote tag) rollout continued across multiple NIPs, standardizing how events reference other events for quoting and threading.&lt;/p>
&lt;p>Client releases marked steady progress. &lt;a href="https://github.com/damus-io/notedeck">Notedeck&lt;/a> v0.3.0 alpha shipped on the last day of January, with adoption continuing into February. Primal v2.1 followed on February 7, and &lt;a href="https://github.com/0ceanSlim/grain">GRAIN&lt;/a> v0.3.0, a Go relay implementation, released on February 21.&lt;/p>
&lt;p>NOSTRLDN v5 brought the London Nostr community together for its fifth meetup. A DVMCP bridge connected Nostr&amp;rsquo;s Data Vending Machines (&lt;a href="https://nostrcompass.org/en/topics/nip-90/">NIP-90&lt;/a>) with the Model Context Protocol, prefiguring the AI agent integration work that arrived the following month.&lt;/p>
&lt;h3 id="february-2026-beyond-social-media">February 2026: Beyond Social Media&lt;/h3>
&lt;p>&lt;em>February 2026 activity is drawn from Nostr Compass issues &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-04-newsletter/">#8&lt;/a> through &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-25-newsletter/">#11&lt;/a>.&lt;/em>&lt;/p>
&lt;p>February 2026 produced the broadest range of application-layer development in any single Nostr month. &lt;a href="https://github.com/MostroP2P/mostro">Mostro&lt;/a> shipped its &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-11-newsletter/#mostro-ships-first-public-beta">first public beta&lt;/a> for decentralized peer-to-peer Bitcoin trading, and &lt;a href="https://github.com/zapstore/zapstore">Zapstore&lt;/a> reached &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-11-newsletter/#zapstore-v100">1.0 stable&lt;/a> after months in release candidate testing. &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-25-newsletter/#white-noise-v030">White Noise v0.3.0&lt;/a> delivered real-time &lt;a href="https://nostrcompass.org/en/topics/mls/">Marmot&lt;/a>-encrypted messaging with Amber signer support and over 160 merged improvements.&lt;/p>
&lt;p>Competing AI agent proposals from pablof7z (NIP-AE for agent workflows, NIP-AD for MCP server announcements) and joelklabo (AI Agent Messages) arrived alongside a &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-25-newsletter/#nip-updates">DVM Agent Coordination proposal&lt;/a> extending &lt;a href="https://nostrcompass.org/en/topics/nip-90/">NIP-90&lt;/a>. &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-25-newsletter/#contextvm-mcp-over-nostr">ContextVM&lt;/a> shipped SDK improvements connecting the Model Context Protocol to Nostr transport. &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-25-newsletter/#burrow-mls-messaging-for-ai-agents">Burrow&lt;/a> added &lt;a href="https://nostrcompass.org/en/topics/mls/">Marmot&lt;/a>-encrypted messaging for both AI agents and humans, extending Nostr&amp;rsquo;s identity and relay infrastructure into machine-to-machine communication.&lt;/p>
&lt;p>&lt;a href="https://nostrcompass.org/en/newsletters/2026-02-25-newsletter/#fips-nostr-native-mesh-networking">FIPS&lt;/a> shipped a working Rust implementation of Nostr-native mesh networking, using secp256k1 keypairs as node identities with transport-agnostic routing over UDP, Ethernet, Bluetooth, or LoRa radio. Its design showed that Nostr&amp;rsquo;s key model extends beyond social media into physical network infrastructure.&lt;/p>
&lt;p>&lt;a href="https://opensats.org/blog/fifteenth-wave-of-nostr-grants">OpenSats announced its fifteenth wave of Nostr grants&lt;/a>, funding projects including ContextVM and Nostube. Protocol changes included &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> hold invoice support for Nostr Wallet Connect and &lt;a href="https://nostrcompass.org/en/topics/nip-45/">NIP-45&lt;/a> (Counting Results) HyperLogLog for relay-side count estimation. &lt;a href="https://nostrcompass.org/en/topics/nip-85/">NIP-85&lt;/a> (Trusted Assertions) service provider discoverability for &lt;a href="https://nostrcompass.org/en/topics/web-of-trust/">Web of Trust&lt;/a> scoring also merged. &lt;a href="https://github.com/rust-nostr/nostr">rust-nostr&lt;/a> began a full API redesign while Nostria 3.0 and &lt;a href="https://github.com/FROSTR-ORG">Frostr&lt;/a> (iOS TestFlight) both shipped. &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a>&amp;rsquo;s local cache layer addressed media availability across relays.&lt;/p>
&lt;h3 id="looking-ahead">Looking Ahead&lt;/h3>
&lt;p>Five Februaries of protocol history show a consistent progression from foundational work to application-layer diversification, with the 2023 user influx as the turning point. In 2021, seven contributors worked across three relays. By 2026, the same protocol supported mesh networking and autonomous agent proposals running on production infrastructure.&lt;/p>
&lt;hr>
&lt;p>That&amp;rsquo;s it for this week. Building something or have news to share? &lt;a href="nostr:npub1wav4fae3gyfy3xj298kxj2mj8phavz7vavps34przq02j7w902qq902923">Reach out via &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> DM&lt;/a> or find us on Nostr.&lt;/p></content:encoded></item><item><title>Nostr Compass #11</title><link>https://nostrcompass.org/en/newsletters/2026-02-25-newsletter/</link><pubDate>Wed, 25 Feb 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-02-25-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/marmot-protocol/whitenoise/releases/tag/v0.3.0">White Noise v0.3.0&lt;/a> brings real-time messaging and Amber signer support with 160+ merged improvements. &lt;a href="https://github.com/divinevideo/divine-mobile/releases/tag/1.0.5">diVine 1.0.5&lt;/a> fixes video playback issues and adds Kind 22236 view events for creator analytics. &lt;a href="https://github.com/sledtools/pika">Pika&lt;/a>, &lt;a href="https://github.com/variablefate/ridestr">Ridestr&lt;/a>, and &lt;a href="https://github.com/dmcarrington/unfiltered">Unfiltered&lt;/a> ship updates. &lt;a href="https://github.com/jmcorgan/fips">FIPS&lt;/a> ships a working Rust implementation of Nostr-native mesh networking. Notecrumbs gets stability fixes for damus.io link previews. &lt;a href="https://contextvm.org">ContextVM&lt;/a> bridges Nostr with the Model Context Protocol. New projects include &lt;a href="https://github.com/CentauriAgent/burrow">Burrow&lt;/a> for MLS-encrypted messaging between AI agents and humans, and &lt;a href="https://github.com/nostria-app/nostria-signer-extension">Nostria Signer&lt;/a> for browser-based vault and identity management. Deep dives cover NIP-55 Android signing and NIP-60 Cashu wallet synchronization.&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/marmot-protocol/whitenoise/releases/tag/v0.3.0">White Noise v0.3.0&lt;/a> brings real-time messaging and Amber signer support with 160+ merged improvements. &lt;a href="https://github.com/divinevideo/divine-mobile/releases/tag/1.0.5">diVine 1.0.5&lt;/a> fixes video playback issues and adds Kind 22236 view events for creator analytics. &lt;a href="https://github.com/sledtools/pika">Pika&lt;/a>, &lt;a href="https://github.com/variablefate/ridestr">Ridestr&lt;/a>, and &lt;a href="https://github.com/dmcarrington/unfiltered">Unfiltered&lt;/a> ship updates. &lt;a href="https://github.com/jmcorgan/fips">FIPS&lt;/a> ships a working Rust implementation of Nostr-native mesh networking. Notecrumbs gets stability fixes for damus.io link previews. &lt;a href="https://contextvm.org">ContextVM&lt;/a> bridges Nostr with the Model Context Protocol. New projects include &lt;a href="https://github.com/CentauriAgent/burrow">Burrow&lt;/a> for MLS-encrypted messaging between AI agents and humans, and &lt;a href="https://github.com/nostria-app/nostria-signer-extension">Nostria Signer&lt;/a> for browser-based vault and identity management. Deep dives cover NIP-55 Android signing and NIP-60 Cashu wallet synchronization.&lt;/p>
&lt;h2 id="news">News&lt;/h2>
&lt;h3 id="notecrumbs-stability-improvements">Notecrumbs Stability Improvements&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/notecrumbs">Notecrumbs&lt;/a>, the Nostr API and web server that powers damus.io link previews, received a series of fixes addressing reliability issues.&lt;/p>
&lt;p>A &lt;a href="https://github.com/damus-io/notecrumbs/commit/3f201f63ea49">concurrency fix&lt;/a> replaced the inflight deduplication mechanism with watch channels. Two callers requesting the same note could both become fetchers, leading to a deadlock when one completed before the other subscribed to the notification. Watch channels with atomic operations ensure only one fetcher runs while others wait on the result.&lt;/p>
&lt;p>&lt;a href="https://github.com/damus-io/notecrumbs/commit/b0d0bf5a2f17">Rate limiting&lt;/a> implements a two-layer defense against relay hammering. When users repeatedly access the same note, the system now debounces relay requests with a 5-minute cooldown window. This protection extends to all &lt;a href="https://nostrcompass.org/en/topics/nip-19/">NIP-19&lt;/a> types and profile feeds, preventing proportional spam to relays during heavy traffic.&lt;/p>
&lt;p>&lt;a href="https://github.com/damus-io/notecrumbs/commit/38670b3972b6">Performance improvements&lt;/a> moved secondary data fetches to background tokio tasks. Pages now render instantly with cached data instead of blocking on sequential relay timeouts that could add up to 7.5 seconds. An upgrade to nostrdb 0.10.0 accompanied these fixes.&lt;/p>
&lt;h3 id="contextvm-mcp-over-nostr">ContextVM: MCP Over Nostr&lt;/h3>
&lt;p>&lt;a href="https://contextvm.org">ContextVM&lt;/a> is a suite of tools bridging Nostr and the &lt;a href="https://modelcontextprotocol.io/">Model Context Protocol&lt;/a> (MCP). Recent commits have introduced the new &lt;a href="https://docs.contextvm.org/spec/ceps/cep-8/">CEP-8&lt;/a> spec enabling payments, and have been pushing &lt;a href="https://github.com/ContextVM/sdk">SDK&lt;/a> improvements through February.&lt;/p>
&lt;p>The SDK provides TypeScript client and server transports for MCP over Nostr. Developers can expose MCP servers across the Nostr network and clients can connect to them. Relays act like a blind message bus, just routing encrypted events blindly. Clients without native Nostr support connect through a proxy layer. The library handles relay management and cryptographic signing for event authentication. It works in both Node.js and browser environments.&lt;/p>
&lt;p>&lt;a href="https://github.com/ContextVM/cvmi">CVMI&lt;/a> provides a CLI for server discovery and method invocation. &lt;a href="https://github.com/ContextVM/relatr">Relatr&lt;/a> calculates personalized trust scores from social graph distance combined with profile validation.&lt;/p>
&lt;p>ContextVM positions itself as a bridge layer: existing MCP servers gain Nostr interoperability while maintaining their conventional transports.&lt;/p>
&lt;h3 id="white-noise-documents-decentralized-user-search">White Noise Documents Decentralized User Search&lt;/h3>
&lt;p>A &lt;a href="https://blog.jgmontoya.com/2026/02/22/user-search.html">blog post from jgmontoya&lt;/a> details how &lt;a href="https://github.com/marmot-protocol/whitenoise">White Noise&lt;/a> handles user search across the decentralized relay network.&lt;/p>
&lt;p>Profile distribution creates the challenge: unlike centralized messengers with unified databases, Nostr profiles scatter across dozens of relays with no central index. White Noise solves this through a producer-consumer architecture running in parallel.&lt;/p>
&lt;p>A producer process continuously expands the social graph outward from the user&amp;rsquo;s follows, fetching follow lists at increasing distances and queuing discovered pubkeys for profile resolution. The consumer resolves matches through five increasingly expensive tiers: local user table (fastest), cached profiles from previous searches, connected relays, user relay lists per &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a>, and direct queries to user-declared relays (slowest).&lt;/p>
&lt;p>Cold searches take approximately 3 seconds while warm searches from cache drop to around 10 milliseconds. For new users without established social graphs, the system injects well-connected bootstrap nodes to ensure search functionality. Group membership provides an implicit social signal alongside explicit follows.&lt;/p>
&lt;p>Instrumentation proved critical for optimization, the author notes. Without metrics, improvements were guesswork.&lt;/p>
&lt;h3 id="fips-nostr-native-mesh-networking">FIPS: Nostr-Native Mesh Networking&lt;/h3>
&lt;p>&lt;a href="https://github.com/jmcorgan/fips">FIPS&lt;/a> (Free Internetworking Peering System) is a working Rust implementation of a self-organizing mesh network that uses Nostr keypairs (secp256k1) as node identities. The &lt;a href="https://github.com/jmcorgan/fips/blob/master/docs/design/fips-intro.md">design documentation&lt;/a> accompanies functional code.&lt;/p>
&lt;p>The protocol addresses infrastructure independence: nodes discover each other automatically without central servers or certificate authorities. A spanning tree provides coordinate-based routing while bloom filters propagate reachability information, letting nodes make forwarding decisions with only local knowledge. Transport agnosticism means the same protocol works over UDP, Ethernet, Bluetooth, LoRa radio, or any datagram-capable medium.&lt;/p>
&lt;p>Two encryption layers protect traffic. Link-layer encryption (Noise IK pattern) secures hop-by-hop communication between neighbors with mutual authentication and forward secrecy. Session-layer encryption (Noise XK pattern) provides end-to-end protection against intermediate routers, where only the destination can decrypt the payload. This mirrors how TLS protects HTTP traffic even when traversing untrusted networks.&lt;/p>
&lt;p>The architecture uses a &amp;ldquo;greedy embedding&amp;rdquo; spanning tree for routing. Each node receives coordinates based on its position relative to the tree root and parent. Packets route greedily toward coordinates closer to the destination, with bloom filters advertising reachable endpoints. When greedy routing fails (local minima), nodes can fall back to tree-based paths.&lt;/p>
&lt;p>The Rust implementation already includes UDP transport with bloom filter discovery. Future work targets Nostr relay integration for peer bootstrapping.&lt;/p>
&lt;h2 id="releases">Releases&lt;/h2>
&lt;p>This week brought releases across relay infrastructure and client applications, with new projects also entering the space.&lt;/p>
&lt;h3 id="haven-v120">HAVEN v1.2.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/bitvora/haven">HAVEN&lt;/a>, the all-in-one personal relay bundling four relay functions with a &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> media server, shipped &lt;a href="https://github.com/bitvora/haven/releases/tag/v1.2.0">v1.2.0&lt;/a>. This release moves beyond the RC stage &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-18-newsletter/#haven-v120-rc3">covered last week&lt;/a>.&lt;/p>
&lt;p>Multi-npub support lets a single HAVEN instance serve several Nostr identities through whitelisting, with new blacklisting functionality for access control. A rewritten backup system uses portable JSONL format, with a &lt;code>haven restore&lt;/code> command for importing notes from JSONL files. Cloud storage integration adds &lt;code>--to-cloud&lt;/code> and &lt;code>--from-cloud&lt;/code> flags for remote backup management.&lt;/p>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/web-of-trust/">Web of Trust&lt;/a> improvements include configurable depth levels for trust calculations and automatic 24-hour refresh intervals with lockless optimization reducing memory overhead. User-agent configuration for relay requests and configurable Blastr timeout settings complete the release, alongside data export to compressed JSONL.&lt;/p>
&lt;h3 id="white-noise-v030">White Noise v0.3.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/whitenoise">White Noise&lt;/a>, the &lt;a href="https://nostrcompass.org/en/topics/mls/">MLS&lt;/a>-based encrypted messaging app implementing the &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> protocol, shipped &lt;a href="https://github.com/marmot-protocol/whitenoise/releases/tag/v0.3.0">v0.3.0&lt;/a> with over 160 merged improvements.&lt;/p>
&lt;p>This release brings real-time messaging through streaming connections instead of polling, so messages arrive instantly. Amber support (&lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a>) means private keys never need to touch the app. Image sharing now works with upload progress tracking and blurhash placeholders while loading. Full-screen viewing supports pinch-to-zoom.&lt;/p>
&lt;p>Group messaging received reliability improvements with chat lists showing sender names and &lt;a href="https://nostrcompass.org/en/topics/mls/">MLS&lt;/a> encryption ensuring forward secrecy. User search expands outward from follows up to four degrees of separation with results streaming in as found.&lt;/p>
&lt;p>A breaking change resets all local data on upgrade due to Marmot protocol changes and the switch to encrypted local storage. Users should back up nsec keys before upgrading.&lt;/p>
&lt;h3 id="divine-105">diVine 1.0.5&lt;/h3>
&lt;p>&lt;a href="https://github.com/divinevideo/divine-mobile">diVine&lt;/a>, the short-form looping video client built on restored Vine archives, shipped &lt;a href="https://github.com/divinevideo/divine-mobile/releases/tag/1.0.5">1.0.5&lt;/a> with extensive video playback fixes and a new decentralized analytics system.&lt;/p>
&lt;p>Video playback issues dominated the fixes: phantom pause, dual audio between videos, black flash between thumbnails and first frames, and disposed player crashes are all resolved. A pooled video player now handles the Home feed for consistent playback.&lt;/p>
&lt;p>Kind 22236 ephemeral view events enable creator analytics and recommendations. The system tracks traffic sources (home, discovery variants, profile, share, search) and loop counts while filtering out self-views. Local file path leaks in Nostr event imeta tags are fixed with canonical Blossom URLs constructed client-side per BUD-01 spec.&lt;/p>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote signer improvements include parallelized relay connections and callback URL support. Android reconnects WebSocket connections on app resume after signer approval.&lt;/p>
&lt;h3 id="coracle-0630">Coracle 0.6.30&lt;/h3>
&lt;p>&lt;a href="https://github.com/coracle-social/coracle">Coracle&lt;/a>, the web-based Nostr client focused on relay management and &lt;a href="https://nostrcompass.org/en/topics/web-of-trust/">Web of Trust&lt;/a> moderation, shipped &lt;a href="https://github.com/coracle-social/coracle/releases/tag/0.6.30">0.6.30&lt;/a> with video thumbnail support, improving media browsing in feeds.&lt;/p>
&lt;h3 id="nostur-v1260">Nostur v1.26.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostur-com/nostur-ios-public">Nostur&lt;/a>, the iOS Nostr client, shipped &lt;a href="https://github.com/nostur-com/nostur-ios-public/releases/tag/1.26.0">v1.26.0&lt;/a> with a new Live Streams feed section and a redesigned Settings screen. GIFs can now host on Blossom media servers, reducing reliance on centralized services. Klipy GIFs integration provides backup when Tenor becomes unavailable. Year headers in DM conversations and mention count display round out the user-facing changes.&lt;/p>
&lt;p>Developer tooling and CLI apps also received updates this week.&lt;/p>
&lt;h3 id="nak-v0185">nak v0.18.5&lt;/h3>
&lt;p>&lt;a href="https://github.com/fiatjaf/nak">nak&lt;/a>, fiatjaf&amp;rsquo;s command-line Swiss Army knife for Nostr, shipped &lt;a href="https://github.com/fiatjaf/nak/releases/tag/v0.18.5">v0.18.5&lt;/a> with a new &lt;code>nak profile&lt;/code> subcommand for fetching and displaying user profiles. The &lt;code>git clone&lt;/code> command now supports &lt;a href="https://nostrcompass.org/en/topics/nip-05/">NIP-05&lt;/a> names in &lt;code>nostr://&lt;/code> URIs, enabling repository cloning by human-readable identifiers.&lt;/p>
&lt;h3 id="pika-v053">Pika v0.5.3&lt;/h3>
&lt;p>&lt;a href="https://github.com/sledtools/pika">Pika&lt;/a>, the &lt;a href="https://nostrcompass.org/en/topics/mls/">MLS&lt;/a>-encrypted messenger for iOS, Android, and desktop built on the &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> protocol, shipped &lt;a href="https://github.com/sledtools/pika/releases/tag/pikachat-v0.5.3">v0.5.3&lt;/a>. Recent commits add file upload and drag-and-drop media support to the desktop app, alongside Cloudflare Workers deployment fixes.&lt;/p>
&lt;p>Pika uses a Rust core that owns all business logic while iOS (SwiftUI) and Android (Kotlin) act as thin UI layers rendering state snapshots. MDK (Marmot Development Kit) provides the MLS implementation. The project notes alpha status and warns against use for sensitive workloads.&lt;/p>
&lt;h3 id="ridestr-v026">Ridestr v0.2.6&lt;/h3>
&lt;p>&lt;a href="https://github.com/variablefate/ridestr">Ridestr&lt;/a>, the decentralized rideshare platform with Cashu payments, shipped &lt;a href="https://github.com/variablefate/ridestr/releases/tag/v0.2.6">v0.2.6&lt;/a>. This release fixes TalkBack accessibility issues and resolves bugs where drivers disappeared from the nearby list when switching payment methods or where selected driver counts failed to update when drivers went offline.&lt;/p>
&lt;p>The &amp;ldquo;Send to All&amp;rdquo; feature is now &amp;ldquo;Broadcast RoadFlare&amp;rdquo; with fixes for silent failures on fresh driver installs. Ridestr implements HTLC escrow for trustless ride payments and &lt;a href="https://nostrcompass.org/en/topics/nip-60/">NIP-60&lt;/a> wallet sync across devices.&lt;/p>
&lt;h3 id="unfiltered-v106">Unfiltered v1.0.6&lt;/h3>
&lt;p>&lt;a href="https://github.com/dmcarrington/unfiltered">Unfiltered&lt;/a>, the Instagram-like photo-sharing app for Android, shipped &lt;a href="https://github.com/dmcarrington/unfiltered/releases/tag/v1.0.6">v1.0.6&lt;/a> with improved user search and automatic relay reconnection every 60 seconds.&lt;/p>
&lt;p>Built with Kotlin and Jetpack Compose, Unfiltered uses rust-nostr bindings and Blossom-compatible servers for image hosting. Amber integration (&lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a>) handles secure key management. The app shows posts from followed accounts in chronological order without algorithms or ads.&lt;/p>
&lt;p>Two new messaging and signing projects also launched this week.&lt;/p>
&lt;h3 id="burrow-mls-messaging-for-ai-agents">Burrow: MLS Messaging for AI Agents&lt;/h3>
&lt;p>&lt;a href="https://github.com/CentauriAgent/burrow">Burrow&lt;/a> is a messenger implementing the &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> protocol for MLS-encrypted communication without phone numbers or centralized servers. Both human users and AI agents can participate.&lt;/p>
&lt;p>A pure Rust CLI daemon with JSONL output mode handles integration with automated systems. A Flutter cross-platform app covers Android, iOS, Linux, macOS, and Windows. Media attachments encrypt alongside messages, and WebRTC handles audio and video calls with configurable TURN servers.&lt;/p>
&lt;p>Burrow layers MLS encryption on Nostr infrastructure. Identity uses Nostr keypairs (secp256k1) while MLS KeyPackages publish as kind 443 events. Messages encrypt with &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> as kind 445 events, and welcome invitations use &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> gift-wrapping.&lt;/p>
&lt;p>&lt;a href="https://openclaw.ai">OpenClaw&lt;/a> integration enables AI agent participation with full tool access. Access control lists with audit logging manage contact and group permissions. This combination positions Burrow for agent-to-agent and agent-to-human messaging scenarios requiring Signal-level encryption on decentralized infrastructure.&lt;/p>
&lt;h3 id="nostria-signer-extension">Nostria Signer Extension&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostria-app/nostria-signer-extension">Nostria Signer&lt;/a> is a Chromium-based browser extension providing vault and identity management for Nostr users.&lt;/p>
&lt;p>Multiple vaults containing multiple accounts let users organize identities for different contexts. Internationalization includes RTL language support. Built with Angular and TypeScript (79.2% of the codebase), it works as both a browser extension and Progressive Web App.&lt;/p>
&lt;p>Nostria Signer implements &lt;a href="https://nostrcompass.org/en/topics/nip-07/">NIP-07&lt;/a> for browser extension signing, enabling web-based Nostr clients to request event signatures without accessing private keys directly. Automated wallet migration handles updates distributed through the Chrome Web Store. Users can also sideload from the &lt;code>dist/extension&lt;/code> folder.&lt;/p>
&lt;p>Developers emphasize the experimental status: users must manage their own secret recovery phrases since the developers cannot restore access to lost keys.&lt;/p>
&lt;h2 id="project-updates">Project Updates&lt;/h2>
&lt;h3 id="formstr-migrates-to-new-organization">Formstr Migrates to New Organization&lt;/h3>
&lt;p>&lt;a href="https://github.com/formstr-hq/nostr-forms">Formstr&lt;/a>, the Google Forms alternative on Nostr, migrated its repository from &lt;code>abh3po/nostr-forms&lt;/code> to the &lt;code>formstr-hq&lt;/code> organization. This OpenSats grant recipient continues development at the new location.&lt;/p>
&lt;h3 id="notable-open-prs">Notable Open PRs&lt;/h3>
&lt;p>Work in progress across Nostr projects:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Damus Outbox Model&lt;/strong> (&lt;a href="https://github.com/damus-io/damus/pull/3602">PR #3602&lt;/a>): Implementation plan for the gossip/outbox relay model on iOS. This architectural change improves message delivery by publishing to the relays where recipients actually read.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Notedeck Cross-Platform Notifications&lt;/strong> (&lt;a href="https://github.com/damus-io/notedeck/pull/1296">PR #1296&lt;/a>): Native notification system for the Damus desktop client covering Android FCM, macOS, and Linux.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>NDK Cashu v3 Upgrade&lt;/strong> (&lt;a href="https://github.com/nostr-dev-kit/ndk/pull/370">PR #370&lt;/a>): Updates the Nostr Development Kit&amp;rsquo;s wallet integration to cashu-ts v3.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Zeus Cashu Offline&lt;/strong> (&lt;a href="https://github.com/ZeusLN/zeus/pull/3742">PR #3742&lt;/a>): Offline ecash sending and receiving for the Zeus Lightning wallet.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Shopstr Encrypted Digital Delivery&lt;/strong> (&lt;a href="https://github.com/shopstr-eng/shopstr/pull/231">PR #231&lt;/a>): Adds encrypted delivery for digital goods with dynamic weight support for physical items.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="nip-updates">NIP Updates&lt;/h2>
&lt;p>Recent changes to the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a>:&lt;/p>
&lt;p>&lt;strong>Merged This Week:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2223">NIP-85 Service Provider Discoverability&lt;/a>&lt;/strong>: The &lt;a href="https://nostrcompass.org/en/topics/nip-85/">NIP-85&lt;/a> spec now includes guidance on how clients discover trusted assertion providers. When a client needs &lt;a href="https://nostrcompass.org/en/topics/web-of-trust/">Web of Trust&lt;/a> scores or other computed metrics, it can query relays for kind 30085 announcements from providers the user already follows or trusts.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2229">NIP-29 Removes Unmanaged Groups&lt;/a>&lt;/strong>: The &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> group chat spec dropped support for unmanaged groups (where any member could add others). All NIP-29 groups now require relay-side management with explicit admin roles, simplifying implementations and reducing spam vectors.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2231">NIP-11 Removes Deprecated Fields&lt;/a>&lt;/strong>: &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> relay information documents no longer include the deprecated &lt;code>software&lt;/code> and &lt;code>version&lt;/code> fields. Implementations should remove these from their responses.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2227">NIP-39 Moves Identity Tags&lt;/a>&lt;/strong>: External identity claims (&lt;a href="https://nostrcompass.org/en/topics/nip-39/">NIP-39&lt;/a> &lt;code>i&lt;/code> tags for GitHub, Twitter, etc.) moved from kind 0 profiles to dedicated kind 30382 events. This separates identity verification from profile metadata.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>AI Agent NIPs Progress:&lt;/strong>&lt;/p>
&lt;p>Four AI-focused NIPs continue active development. Since &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-18-newsletter/#ai-agent-nips-arrive">last week&amp;rsquo;s coverage&lt;/a>:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2220">NIP-AE: Agents&lt;/a>&lt;/strong> (updated Feb 19): Defines agent identity with kind 4199 for agent definitions and kind 4201 for prompting (&amp;ldquo;nudges&amp;rdquo;). Agents can reference &lt;a href="https://nostrcompass.org/en/topics/nip-94/">NIP-94&lt;/a> file metadata for extended descriptions.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2226">NIP-XX: AI Agent Messages&lt;/a>&lt;/strong> (updated Feb 18): Standardizes conversational messaging with seven ephemeral event kinds (25800-25806) for status, streaming deltas, prompts, responses, tool calls, errors, and cancellation. Kind 31340 &amp;ldquo;AI Info&amp;rdquo; events let agents advertise supported models and capabilities.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2228">NIP-AC: DVM Agent Coordination&lt;/a>&lt;/strong> (opened Feb 18): Extends &lt;a href="https://nostrcompass.org/en/topics/nip-90/">NIP-90&lt;/a> for autonomous agent workflows. Adds heartbeats for agent discovery, job reviews for quality tracking, data escrow for result commitment, workflow chains for multi-step pipelines, and swarm bidding for competitive provider selection. A reference implementation runs at 2020117.xyz.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2221">NIP-AD: MCP Server Announcements&lt;/a>&lt;/strong> (opened Feb 12): Standardizes announcement of Model Context Protocol servers and skills on Nostr. Already in use on the TENEX platform.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Other Open PRs:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2232">NIP-144: Service Authorization Protocol&lt;/a>&lt;/strong>: Defines how clients prove identity and permissions to service providers on Nostr.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2230">NIP-DC: Nostr Webxdc&lt;/a>&lt;/strong>: alexgleason proposes integrating Webxdc (decentralized web applications) with Nostr events.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="nip-deep-dive-nip-55-android-signer-application">NIP Deep Dive: NIP-55 (Android Signer Application)&lt;/h2>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/55.md">NIP-55&lt;/a> defines how Android Nostr clients request cryptographic operations from dedicated signer applications. With &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-25-newsletter/#white-noise-v030">White Noise v0.3.0&lt;/a> and &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-25-newsletter/#unfiltered-v106">Unfiltered v1.0.6&lt;/a> both adding Amber support this week, the Android signing protocol warrants examination.&lt;/p>
&lt;p>&lt;strong>Communication Channels:&lt;/strong>&lt;/p>
&lt;p>NIP-55 enables inter-app signing through two mechanisms. Intents provide manual user approval with visual feedback for one-time operations. Content Resolvers enable automated signing when users grant persistent permissions, letting apps sign in the background without repeated prompts.&lt;/p>
&lt;p>Communication uses the custom &lt;code>nostrsigner:&lt;/code> URI scheme. A client initiates contact with:&lt;/p>
&lt;pre tabindex="0">&lt;code>nostrsigner:&amp;lt;base64-encoded-event&amp;gt;?type=sign_event&amp;amp;callbackUrl=myapp://callback
&lt;/code>&lt;/pre>&lt;p>&lt;strong>Supported Operations:&lt;/strong>&lt;/p>
&lt;p>The spec defines seven cryptographic methods: event signing (&lt;code>sign_event&lt;/code>), public key retrieval (&lt;code>get_public_key&lt;/code>), &lt;a href="https://nostrcompass.org/en/topics/nip-04/">NIP-04&lt;/a> encryption/decryption, &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encryption/decryption, and zap event decryption (&lt;code>decrypt_zap_event&lt;/code>).&lt;/p>
&lt;p>&lt;strong>Permission Model:&lt;/strong>&lt;/p>
&lt;p>Clients call &lt;code>get_public_key&lt;/code> once to establish a trust relationship, receiving the signer&amp;rsquo;s package name and user pubkey. The spec mandates that clients save these values and never call &lt;code>get_public_key&lt;/code> again, preventing fingerprinting attacks.&lt;/p>
&lt;p>For signing requests, users can approve once or grant &amp;ldquo;remember my choice&amp;rdquo; for background operations. If users consistently reject operations, the signer returns a &amp;ldquo;rejected&amp;rdquo; status, preventing repeated prompts.&lt;/p>
&lt;p>&lt;strong>Implementations:&lt;/strong>&lt;/p>
&lt;p>&lt;a href="https://github.com/greenart7c3/amber">Amber&lt;/a> is the primary NIP-55 signer for Android. Clients supporting NIP-55 include &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-25-newsletter/#white-noise-v030">White Noise&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-25-newsletter/#unfiltered-v106">Unfiltered&lt;/a>, and others. Web applications cannot directly receive signer responses and must use callback URLs or clipboard operations.&lt;/p>
&lt;p>&lt;strong>Relationship to Other Signing NIPs:&lt;/strong>&lt;/p>
&lt;p>NIP-55 complements &lt;a href="https://nostrcompass.org/en/topics/nip-07/">NIP-07&lt;/a> (browser extensions) and &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> (remote signing over relays). Where NIP-07 handles desktop browsers and NIP-46 handles cross-device signing, NIP-55 provides native Android integration with minimal latency.&lt;/p>
&lt;h2 id="nip-deep-dive-nip-60-cashu-wallet">NIP Deep Dive: NIP-60 (Cashu Wallet)&lt;/h2>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/60.md">NIP-60&lt;/a> defines how &lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a> ecash wallets store state on Nostr relays, enabling cross-application wallet synchronization. With &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-25-newsletter/#ridestr-v026">Ridestr v0.2.6&lt;/a> using NIP-60 for wallet sync across devices, the protocol deserves examination.&lt;/p>
&lt;p>&lt;strong>Event Kinds:&lt;/strong>&lt;/p>
&lt;p>NIP-60 uses four event types. The replaceable kind 17375 stores wallet configuration including mint URLs and a dedicated private key for receiving P2PK ecash payments. Token events (kind 7375) contain unspent cryptographic proofs, while spending history (kind 7376) records transactions for user transparency. An optional kind 7374 tracks mint payment quotes.&lt;/p>
&lt;p>&lt;strong>Wallet Architecture:&lt;/strong>&lt;/p>
&lt;p>Wallet state lives on relays, making it accessible across applications. A user&amp;rsquo;s wallet event contains encrypted references to Cashu mints and a wallet-specific private key separate from the user&amp;rsquo;s Nostr identity. This separation matters: the wallet key handles ecash operations while the Nostr key handles social functions.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">17375&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;nip44-encrypted-wallet-config&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [[&lt;span style="color:#e6db74">&amp;#34;d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;cashu-wallet&amp;#34;&lt;/span>]]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Proof Management:&lt;/strong>&lt;/p>
&lt;p>Cashu proofs are bearer instruments. Once spent, a proof becomes invalid. NIP-60 manages this through a rollover mechanism: when spending, clients create a new token event with remaining unspent proofs and delete the original via &lt;a href="https://nostrcompass.org/en/topics/nip-09/">NIP-09&lt;/a>. Destroyed token IDs go in a &lt;code>del&lt;/code> field for state tracking.&lt;/p>
&lt;p>Clients should periodically validate proofs against mints to detect previously-spent credentials. Multiple token events per mint are permitted, and spending history events help users track transactions even though they&amp;rsquo;re optional.&lt;/p>
&lt;p>&lt;strong>Security Model:&lt;/strong>&lt;/p>
&lt;p>All sensitive data uses &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encryption. The wallet private key never appears in plaintext. Since relays store encrypted blobs without understanding their contents, wallet state remains private even on untrusted relays.&lt;/p>
&lt;p>&lt;strong>Implementations:&lt;/strong>&lt;/p>
&lt;p>Wallets supporting NIP-60 include &lt;a href="https://github.com/gandlafbtc/nutsack">Nutsack&lt;/a> and &lt;a href="https://github.com/cashubtc/eNuts">eNuts&lt;/a>. Clients like &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-25-newsletter/#ridestr-v026">Ridestr&lt;/a> use NIP-60 for cross-device sync, letting users top up on desktop and spend from mobile without manual transfers.&lt;/p>
&lt;hr>
&lt;p>That&amp;rsquo;s it for this week. Building something or have news to share? &lt;a href="nostr:npub1wav4fae3gyfy3xj298kxj2mj8phavz7vavps34przq02j7w902qq902923">Reach out via &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> DM&lt;/a> or find us on Nostr.&lt;/p></content:encoded></item><item><title>Nostr Compass #10</title><link>https://nostrcompass.org/en/newsletters/2026-02-18-newsletter/</link><pubDate>Wed, 18 Feb 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-02-18-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> A Blossom local cache layer takes shape as independent projects converge on offline media access for Android. Alby launches an &lt;a href="https://sandbox.albylabs.com">NWC developer sandbox&lt;/a> for building and testing Nostr Wallet Connect integrations without risking real funds. Competing proposals for AI agent communication on Nostr arrive in the same week from two authors. fiatjaf strips unused fields from &lt;a href="https://github.com/nostr-protocol/nips/pull/1946">NIP-11&lt;/a>, removing retention policies, country codes, privacy policy, and community preference tags that relay operators never adopted. &lt;a href="https://github.com/nostr-protocol/nips/pull/2223">NIP-85&lt;/a> merges service provider discoverability guidance for Trusted Assertions. A new &lt;code>D&lt;/code> tag in &lt;a href="https://github.com/nostr-protocol/nips/pull/1752">NIP-52&lt;/a> enables day-granularity timestamp indexing of calendar events. New projects include &lt;a href="https://github.com/zeSchlausKwab/mapnolia">Mapnolia&lt;/a> for decentralized map tile distribution, &lt;a href="https://github.com/sledtools/pika">Pika&lt;/a> for MLS-encrypted messaging, &lt;a href="https://github.com/privkeyio/keep-android">Keep&lt;/a> for FROST threshold signing on Android, &lt;a href="https://files.iris.to/#/npub1xndmdgymsf4a34rzr7346vp8qcptxf75pjqweh8naa8rklgxpfqqmfjtce/hashtree">Hashtree&lt;/a> for content-addressed storage with Nostr integration, and &lt;a href="https://github.com/hardran3/Prism">Prism&lt;/a> for sharing content to Nostr from any Android app. &lt;a href="https://github.com/PrimalHQ/primal-android-app">Primal Android&lt;/a> merges 11 NWC PRs adding dual wallet support and automatic service lifecycle. &lt;a href="https://github.com/MostroP2P/mobile">Mostro Mobile&lt;/a> ships a &lt;a href="https://github.com/MostroP2P/mobile/releases/tag/v1.2.0%2B2">built-in Lightning wallet&lt;/a> through NWC integration. &lt;a href="https://github.com/damus-io/notedeck">Notedeck&lt;/a> prepares for Android App Store release while HAVEN reaches &lt;a href="https://github.com/bitvora/haven/releases/tag/v1.2.0-rc3">v1.2.0-rc3&lt;/a> with multi-npub support and cloud backup. Deep dives this week cover NIP-85&amp;rsquo;s Trusted Assertions system for delegating Web of Trust calculations to service providers, and NIP-52&amp;rsquo;s Calendar Events protocol following its day-granularity indexing update.&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> A Blossom local cache layer takes shape as independent projects converge on offline media access for Android. Alby launches an &lt;a href="https://sandbox.albylabs.com">NWC developer sandbox&lt;/a> for building and testing Nostr Wallet Connect integrations without risking real funds. Competing proposals for AI agent communication on Nostr arrive in the same week from two authors. fiatjaf strips unused fields from &lt;a href="https://github.com/nostr-protocol/nips/pull/1946">NIP-11&lt;/a>, removing retention policies, country codes, privacy policy, and community preference tags that relay operators never adopted. &lt;a href="https://github.com/nostr-protocol/nips/pull/2223">NIP-85&lt;/a> merges service provider discoverability guidance for Trusted Assertions. A new &lt;code>D&lt;/code> tag in &lt;a href="https://github.com/nostr-protocol/nips/pull/1752">NIP-52&lt;/a> enables day-granularity timestamp indexing of calendar events. New projects include &lt;a href="https://github.com/zeSchlausKwab/mapnolia">Mapnolia&lt;/a> for decentralized map tile distribution, &lt;a href="https://github.com/sledtools/pika">Pika&lt;/a> for MLS-encrypted messaging, &lt;a href="https://github.com/privkeyio/keep-android">Keep&lt;/a> for FROST threshold signing on Android, &lt;a href="https://files.iris.to/#/npub1xndmdgymsf4a34rzr7346vp8qcptxf75pjqweh8naa8rklgxpfqqmfjtce/hashtree">Hashtree&lt;/a> for content-addressed storage with Nostr integration, and &lt;a href="https://github.com/hardran3/Prism">Prism&lt;/a> for sharing content to Nostr from any Android app. &lt;a href="https://github.com/PrimalHQ/primal-android-app">Primal Android&lt;/a> merges 11 NWC PRs adding dual wallet support and automatic service lifecycle. &lt;a href="https://github.com/MostroP2P/mobile">Mostro Mobile&lt;/a> ships a &lt;a href="https://github.com/MostroP2P/mobile/releases/tag/v1.2.0%2B2">built-in Lightning wallet&lt;/a> through NWC integration. &lt;a href="https://github.com/damus-io/notedeck">Notedeck&lt;/a> prepares for Android App Store release while HAVEN reaches &lt;a href="https://github.com/bitvora/haven/releases/tag/v1.2.0-rc3">v1.2.0-rc3&lt;/a> with multi-npub support and cloud backup. Deep dives this week cover NIP-85&amp;rsquo;s Trusted Assertions system for delegating Web of Trust calculations to service providers, and NIP-52&amp;rsquo;s Calendar Events protocol following its day-granularity indexing update.&lt;/p>
&lt;h2 id="news">News&lt;/h2>
&lt;h3 id="blossom-local-cache-layer-emerges">Blossom Local Cache Layer Emerges&lt;/h3>
&lt;p>Multiple independent projects are converging on the same problem: offline access to &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> media on mobile devices.&lt;/p>
&lt;p>&lt;a href="https://github.com/greenart7c3/Morganite">Morganite&lt;/a>, a new Android app from greenart7c3 (the developer behind &lt;a href="https://github.com/greenart7c3/amber">Amber&lt;/a> and &lt;a href="https://github.com/greenart7c3/Citrine">Citrine&lt;/a>), implements client-side caching for Blossom media. Users can access previously viewed images and files without a network connection.&lt;/p>
&lt;p>&lt;a href="https://github.com/hardran3/Aerith">Aerith&lt;/a> shipped &lt;a href="https://github.com/hardran3/Aerith/releases/tag/v0.2">v0.2&lt;/a> with image labeling, bulk mirror/tag/delete operations, filtering by label and file type, plus initial local Blossom cache support. Aerith is a management interface for users who store media across multiple Blossom servers and need to organize and mirror their blobs.&lt;/p>
&lt;p>A new &lt;a href="https://github.com/hzrd149/blossom/blob/master/implementations/local-blossom-cache.md">local cache implementation guide&lt;/a> in the Blossom specification documents client-side blob storage, while &lt;a href="https://github.com/hardran3/Prism">Prism&lt;/a> (from the same developer as Aerith) adds Blossom upload integration to its Android share-to-Nostr flow. Four independent projects converged on the same problem this week: a dedicated caching app, a media manager, a reference specification, and a share tool with Blossom integration, all implementing persistent local storage beyond simple upload-and-retrieve.&lt;/p>
&lt;h3 id="alby-nwc-developer-sandbox">Alby NWC Developer Sandbox&lt;/h3>
&lt;p>&lt;a href="https://sandbox.albylabs.com">Alby&lt;/a> launched a sandbox environment for developers building with &lt;a href="https://nostrcompass.org/en/topics/nip-47/">Nostr Wallet Connect (NIP-47)&lt;/a>. The sandbox provides a hosted NWC wallet service where developers can create test connections and send simulated payments without connecting to a real Lightning wallet, while observing the full request/response cycle of NWC events in real time. Developers generate a &lt;code>nostr+walletconnect://&lt;/code> connection string from the sandbox and pass it to their client. The sandbox then shows the resulting kind 23194 request and kind 23195 response events as they flow between client and wallet service.&lt;/p>
&lt;p>This lowers the barrier for new NWC integrations. Previously, testing required either a personal Lightning wallet or a self-hosted NWC service. The sandbox abstracts that away, giving developers an immediate feedback loop for implementing &lt;code>pay_invoice&lt;/code>, &lt;code>get_balance&lt;/code>, &lt;code>make_invoice&lt;/code>, &lt;code>lookup_invoice&lt;/code>, and &lt;code>list_transactions&lt;/code> methods against a live NWC endpoint.&lt;/p>
&lt;h3 id="ai-agent-nips-arrive">AI Agent NIPs Arrive&lt;/h3>
&lt;p>Proposals for AI agent communication on Nostr appeared within days of each other, approaching the problem from different angles.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2226">NIP-XX: AI Agent Messages&lt;/a> from joelklabo defines a complete protocol for AI agent interaction: event kinds for prompts, responses, streaming deltas, status updates, tool telemetry, errors, cancellations, and capability discovery. An &lt;code>ai.info&lt;/code> discovery event (kind 31340, replaceable) lets agents announce their supported models, tools with schemas, streaming support, and rate limits. joelklabo&amp;rsquo;s proposal includes run correlation via prompt ID, session management, stream reconciliation with sequence ordering, and &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> guidance for metadata privacy.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2220">NIP-AE: Agents&lt;/a> from pablof7z takes a different approach, defining kinds for agent instantiation: definitions and lessons. These are the event types pablof7z uses in &lt;a href="https://github.com/tenex-chat/tenex">TENEX&lt;/a>, the autonomous learning system built on Nostr. A companion proposal, &lt;a href="https://github.com/nostr-protocol/nips/pull/2221">NIP-AD: MCP Server and Skill Announcements&lt;/a>, also from pablof7z, defines events for announcing &lt;a href="https://modelcontextprotocol.io/">Model Context Protocol&lt;/a> servers and skills on Nostr. &lt;a href="https://nostrcompass.org/en/topics/nip-22/">NIP-22&lt;/a> comments are supported, so the community can discuss and rate MCP servers directly on Nostr.&lt;/p>
&lt;p>NIP-XX covers full agent communication while NIP-AE and NIP-AD address identity and tool discovery. These proposals may converge into a unified standard or coexist as complementary layers.&lt;/p>
&lt;h2 id="releases">Releases&lt;/h2>
&lt;h3 id="haven-v120-rc3">HAVEN v1.2.0-rc3&lt;/h3>
&lt;p>&lt;a href="https://github.com/bitvora/haven">HAVEN&lt;/a>, the all-in-one personal relay that bundles four relay functions with a &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> media server, reached &lt;a href="https://github.com/bitvora/haven/releases/tag/v1.2.0-rc3">v1.2.0-rc3&lt;/a>. This release candidate adds support for multiple npubs, letting a single HAVEN instance serve several Nostr identities. Earlier RCs added &lt;code>--from-cloud&lt;/code> and &lt;code>--to-cloud&lt;/code> flags for cloud backup (RC2) and fixed a Web of Trust double-counting bug (RC1).&lt;/p>
&lt;h3 id="mostro-mobile-v120-built-in-lightning-wallet">Mostro Mobile v1.2.0: Built-In Lightning Wallet&lt;/h3>
&lt;p>&lt;a href="https://github.com/MostroP2P/mobile">Mostro Mobile&lt;/a>, the mobile client for the &lt;a href="https://github.com/MostroP2P/mostro">Mostro&lt;/a> P2P Bitcoin exchange (&lt;a href="https://nostrcompass.org/en/newsletters/2026-02-11-newsletter/#mostro-ships-first-public-beta">v1.1.0 covered last week&lt;/a>), shipped &lt;a href="https://github.com/MostroP2P/mobile/releases/tag/v1.2.0%2B2">v1.2.0&lt;/a> with a built-in Lightning wallet through full &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NWC (NIP-47)&lt;/a> integration. Buyers and sellers no longer need to switch apps to handle invoices. The app detects hold invoices for sellers and pays them automatically through the connected wallet, while buyers get automatic invoice generation. The release follows &lt;a href="https://github.com/MostroP2P/mobile/releases/tag/v1.1.1%2B1">v1.1.1&lt;/a> from earlier in the week, which added multi-Mostro node support with a curated registry of trusted instances, kind 0 metadata fetching for node display, custom node management by pubkey, and automatic fallback when a selected node goes offline.&lt;/p>
&lt;p>On the server side, &lt;a href="https://github.com/MostroP2P/mostro/releases/tag/v0.16.2">Mostro v0.16.2&lt;/a> landed with fixes for duplicate dev fee payments, rate limiting on the password validation RPC endpoint, and proper dispute cleanup on cooperative cancellation.&lt;/p>
&lt;p>A new companion project, &lt;a href="https://github.com/MostroP2P/mostro-skill">mostro-skill&lt;/a>, enables agents to trade on Mostro through Nostr.&lt;/p>
&lt;h3 id="aerith-v02">Aerith v0.2&lt;/h3>
&lt;p>&lt;a href="https://github.com/hardran3/Aerith">Aerith&lt;/a>, the &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> image manager, shipped &lt;a href="https://github.com/hardran3/Aerith/releases/tag/v0.2">v0.2&lt;/a> with image labels for organizing media, bulk mirror/tag/delete operations across servers, filtering by label and file type, plus initial local cache support. See &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-18-newsletter/#blossom-local-cache-layer-emerges">News section&lt;/a> for context on the broader local cache trend.&lt;/p>
&lt;h3 id="mapnolia-decentralized-map-tiles-over-nostr">Mapnolia: Decentralized Map Tiles Over Nostr&lt;/h3>
&lt;p>&lt;a href="https://github.com/zeSchlausKwab/mapnolia">Mapnolia&lt;/a> is a new geospatial data server that chunks &lt;a href="https://github.com/protomaps/PMTiles">PMTiles&lt;/a> map archives into geographic regions and announces them over Nostr for decentralized discovery. It publishes kind 34444 parametrized replaceable events to Nostr relays containing a complete index of map tile chunks with layer metadata, geohash regions, file references, and &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> server details.&lt;/p>
&lt;p>Clients discover and retrieve map data through the Nostr network instead of centralized tile servers, with announcement events carrying enough metadata to request only needed geographic regions from listed Blossom servers. Mapnolia is the first project to bring geospatial data distribution to Nostr, opening possibilities for offline-capable mapping applications.&lt;/p>
&lt;h3 id="pika-marmot-based-encrypted-messaging">Pika: Marmot-Based Encrypted Messaging&lt;/h3>
&lt;p>&lt;a href="https://github.com/sledtools/pika">Pika&lt;/a> is a new end-to-end encrypted messaging app for iOS and Android using the &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> protocol, which layers &lt;a href="https://nostrcompass.org/en/topics/mls/">Messaging Layer Security (MLS)&lt;/a> over Nostr relays. The architecture separates concerns into a Rust core (&lt;code>pika_core&lt;/code>) handling MLS state management and message encryption/decryption over Nostr relays, with thin native UI shells in SwiftUI (iOS) and Kotlin (Android). State flows unidirectionally: the UI dispatches actions to the Rust actor, which mutates state and emits snapshots with revision numbers back to the UI via UniFFI and JNI bindings.&lt;/p>
&lt;p>Pika joins a growing field of MLS-on-Nostr messengers alongside &lt;a href="https://github.com/marmot-protocol/whitenoise">White Noise&lt;/a>, &lt;a href="https://github.com/VectorPrivacy">Vector&lt;/a>, and &lt;a href="https://0xchat.com">0xchat&lt;/a>. All use Nostr relays as the transport layer for MLS-encrypted ciphertext, keeping relay operators unable to read message content. Pika uses the Marmot Development Kit (MDK) for its MLS implementation and nostr-sdk for relay connectivity.&lt;/p>
&lt;h3 id="keep-frostentopicsfrost-threshold-signing-for-android">Keep: &lt;a href="https://nostrcompass.org/en/topics/frost/">FROST&lt;/a> Threshold Signing for Android&lt;/h3>
&lt;p>&lt;a href="https://github.com/privkeyio/keep-android">Keep&lt;/a> is a new Android application for &lt;a href="https://nostrcompass.org/en/topics/frost/">FROST&lt;/a> threshold signing where no single device holds the complete private key. It implements &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> (Android Signer) and &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> (remote signing), so compatible Nostr clients can request signatures while key material stays distributed across devices. The default configurations are 2-of-3 and 3-of-5, though any t-of-n threshold is supported.&lt;/p>
&lt;p>Keep&amp;rsquo;s distributed key generation (DKG) ceremony runs over Nostr relays using custom event kinds: kind 21101 for group announcements, kind 21102 for round 1 commitment polynomials (broadcast publicly), and kind 21103 for round 2 secret shares (&lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encrypted point-to-point between participants). The group private key scalar is never computed or assembled anywhere during DKG. Each device holds only its polynomial evaluation share, and any t shares can produce a valid Schnorr signature through a two-round commit-then-sign protocol. The resulting 64-byte signature is indistinguishable from a single-signer Schnorr signature. Under the hood, Keep uses the Zcash Foundation&amp;rsquo;s &lt;code>frost-secp256k1-tr&lt;/code> crate with Taproot tweaking, so the group public key works directly as a Nostr npub.&lt;/p>
&lt;p>Keep joins the &lt;a href="https://frostr.org">Frostr&lt;/a> family of projects alongside &lt;a href="https://github.com/FROSTR-ORG/igloo-desktop">Igloo Desktop&lt;/a>, &lt;a href="https://github.com/FROSTR-ORG/igloo-android">Igloo for Android&lt;/a>, &lt;a href="https://github.com/FROSTR-ORG/frost2x">Frost2x&lt;/a>, and &lt;a href="https://github.com/FROSTR-ORG/igloo-ios">Igloo for iOS&lt;/a>, expanding options for threshold key management on Nostr.&lt;/p>
&lt;h3 id="prism-share-anything-to-nostr-from-android">Prism: Share Anything to Nostr from Android&lt;/h3>
&lt;p>&lt;a href="https://github.com/hardran3/Prism">Prism&lt;/a> is a new Android app (Kotlin/Jetpack Compose, API 26+) that registers as a system share target, letting users publish text, URLs, images, and video to Nostr from any app on their phone. Shared URLs pass through a tracking parameter stripper before being composed into notes. Prism fetches OpenGraph metadata to generate rich link previews and renders native Nostr references (&lt;code>note1&lt;/code>, &lt;code>nevent1&lt;/code>) inline.&lt;/p>
&lt;p>The scheduling engine uses a hybrid &lt;code>AlarmManager&lt;/code>/&lt;code>WorkManager&lt;/code> approach to bypass Android battery optimizations: AlarmManager handles precise wake-up timing while expedited WorkManager tasks ensure delivery, with exponential backoff retry for offline scenarios. Media uploads go through configurable &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> servers with thumbnail generation for images and video frames. All event signing is delegated to &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> external signers like &lt;a href="https://github.com/greenart7c3/amber">Amber&lt;/a>, with multi-account support for switching between identities. Prism also supports &lt;a href="https://nostrcompass.org/en/topics/nip-84/">NIP-84 (Highlights)&lt;/a> posts. From the same developer as &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-18-newsletter/#aerith-v02">Aerith&lt;/a>.&lt;/p>
&lt;h3 id="hashtree-content-addressed-storage-with-nostr-integration">Hashtree: Content-Addressed Storage with Nostr Integration&lt;/h3>
&lt;p>&lt;a href="https://files.iris.to/#/npub1xndmdgymsf4a34rzr7346vp8qcptxf75pjqweh8naa8rklgxpfqqmfjtce/hashtree">Hashtree&lt;/a> is a filesystem-based content-addressed blob storage system that publishes Merkle roots on Nostr to create mutable npub/path addresses. The system uses &amp;ldquo;dumb storage&amp;rdquo; that works with any key-value store, chunking content into 2MB blocks optimized for &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> uploads. Unlike BitTorrent, no active Merkle proof computation is needed, just store and retrieve blobs by hash.&lt;/p>
&lt;p>The Nostr integration enables git remote URLs like &lt;code>htree://npub.../repo-name&lt;/code> for cloning repositories, with commands like &lt;code>htree publish mydata &amp;lt;hash&amp;gt;&lt;/code> to publish content hashes to &lt;code>npub.../mydata&lt;/code> addresses. The comprehensive CLI supports both encrypted (default) and public storage modes, content pinning, pushing to Blossom servers, and managing Nostr identities. Each stored item is either raw bytes or a tree node, providing a foundation for decentralized content distribution through Nostr&amp;rsquo;s relay network.&lt;/p>
&lt;h3 id="espy-color-palette-capture-on-shakespeare">Espy: Color Palette Capture on Shakespeare&lt;/h3>
&lt;p>&lt;a href="https://espy.you">Espy&lt;/a>, built on the &lt;a href="https://soapbox.pub/tools/shakespeare/">Shakespeare&lt;/a> platform, lets users capture color palettes from photos and share them as Nostr events. Shakespeare is an AI-powered app builder that authenticates users via NIP-07 browser extensions and provides built-in Nostr relay connectivity, so developers ship apps without implementing their own key management or relay pool. Espy extracts dominant colors from camera input into shareable palette cards discoverable through standard Nostr feeds.&lt;/p>
&lt;h3 id="flotilla-164">Flotilla 1.6.4&lt;/h3>
&lt;p>&lt;a href="https://gitea.coracle.social/coracle/flotilla">Flotilla&lt;/a>, hodlbod&amp;rsquo;s Discord-like Nostr client that organizes relays as groups, shipped &lt;a href="https://gitea.coracle.social/coracle/flotilla/releases/tag/1.6.4">1.6.4&lt;/a>. The Coracle family of projects has migrated from GitHub to a self-hosted &lt;a href="https://gitea.coracle.social/coracle">Gitea instance&lt;/a>. This release adds push notifications via NIP-9a and a wallet receive flow, plus classified listings and space URL support. Interface improvements include cleaned-up modals and notification handling. Room muting and safe area insets on mobile round out the changes, alongside fixes for Safari image uploads and calendar event details.&lt;/p>
&lt;h3 id="shosho-v0120">Shosho v0.12.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/r0d8lsh0p/shosho-releases">Shosho&lt;/a>, the mobile live-streaming app with Nostr integration, shipped &lt;a href="https://github.com/r0d8lsh0p/shosho-releases/releases/tag/v0.12.0">v0.12.0&lt;/a>. This release adds video Clips with in-player replies and custom emoji integration. Thread protection blocks indirect mention spam, and a new QR sharing feature lets users exchange profiles offline. A new horizontal playback mode gives streams a Twitch-style viewing experience, and the browse screen now features creator clips alongside live streams.&lt;/p>
&lt;h3 id="granary-v100">Granary v10.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/snarfed/granary">Granary&lt;/a>, a social web translation library that converts data between Nostr, Bluesky, ActivityPub, and other platforms into a common format, shipped &lt;a href="https://github.com/snarfed/granary/releases/tag/v10.0">v10.0&lt;/a> with breaking changes. The release switches Nostr&amp;rsquo;s default ActivityStreams 1 IDs from bech32 to hex and adds expanded Nostr support including &lt;a href="https://github.com/nostr-protocol/nips/blob/master/27.md">NIP-27&lt;/a> mention parsing and article tags. A new multiple-output option across converters lets developers translate between protocols in batch.&lt;/p>
&lt;h3 id="nostr-mcp-server-v300">Nostr MCP Server v3.0.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/AustinKelsay/nostr-mcp-server">Nostr MCP Server&lt;/a>, a &lt;a href="https://modelcontextprotocol.io/">Model Context Protocol&lt;/a> server that enables AI agents to interact with the Nostr network, shipped &lt;a href="https://github.com/AustinKelsay/nostr-mcp-server/releases/tag/v3.0.0">v3.0.0&lt;/a>. This major release adds social actions (follows, reactions, reposts, replies) and relay list management with &lt;a href="https://github.com/nostr-protocol/nips/blob/master/65.md">NIP-65&lt;/a> support plus optional &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> authentication. Direct messaging via &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> and &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> is also new. The release pairs with this week&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-18-newsletter/#ai-agent-nips-arrive">AI agent NIP proposals&lt;/a> as practical tooling for agents operating on Nostr.&lt;/p>
&lt;h3 id="aegis-v038">Aegis v0.3.8&lt;/h3>
&lt;p>&lt;a href="https://github.com/ZharlieW/Aegis">Aegis&lt;/a>, the cross-platform Nostr signer, shipped &lt;a href="https://github.com/ZharlieW/Aegis/releases/tag/v0.3.8">v0.3.8&lt;/a> with multilingual UI support and an incremental update manager for its built-in Nostr app browser. The new update mechanism diffs incrementally against local state, keeping the in-app directory of Nostr web apps current with lower bandwidth usage. The release also introduces 5-minute key material caching to reduce database round-trips when signing multiple events in succession.&lt;/p>
&lt;h3 id="snstr-v031">SNSTR v0.3.1&lt;/h3>
&lt;p>&lt;a href="https://github.com/AustinKelsay/snstr">SNSTR&lt;/a> (Secure Nostr Software Toolkit for Renegades), a TypeScript library for the Nostr protocol, shipped &lt;a href="https://github.com/AustinKelsay/snstr/releases/tag/v0.3.1">v0.3.1&lt;/a>. The release adds package verification guards ensuring all entry points are included in npm tarballs, with CI enforcement on Node and Bun. &lt;a href="https://github.com/AustinKelsay/snstr/releases/tag/v0.3.0">v0.3.0&lt;/a> shipped the same week.&lt;/p>
&lt;h3 id="citrine-v200-pre1">Citrine v2.0.0-pre1&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Citrine">Citrine&lt;/a>, the Android Nostr relay from greenart7c3, released &lt;a href="https://github.com/greenart7c3/Citrine/releases/tag/v2.0.0-pre1">v2.0.0-pre1&lt;/a> with performance improvements through optimized database indexes and better Kotlin coroutine handling. The release also enhances support for hosting web apps, with each app now running on its own port.&lt;/p>
&lt;h2 id="project-updates">Project Updates&lt;/h2>
&lt;h3 id="primal-android-nwc-infrastructure-expansion">Primal Android: NWC Infrastructure Expansion&lt;/h3>
&lt;p>&lt;a href="https://github.com/PrimalHQ/primal-android-app">Primal Android&lt;/a> merged 11 NWC-related PRs this week, continuing the buildout &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-04-newsletter/#primal-android-ships-nwc-encryption">started two weeks ago&lt;/a>. This batch adds dual wallet NWC support, automatic service start/stop tied to backend notifications, connection routing by wallet type, and proper data cleanup on wallet deletion. The NWC service now manages its own lifecycle based on wallet connection state, reducing manual user intervention.&lt;/p>
&lt;h3 id="notedeck-android-app-store-prep">Notedeck: Android App Store Prep&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/notedeck">Notedeck&lt;/a>, the multi-platform Nostr client from the &lt;a href="https://github.com/damus-io/damus">Damus&lt;/a> team, merged &lt;a href="https://github.com/damus-io/notedeck/pull/1287">Android App Store release preparation&lt;/a> this week. The PR adds a UGC (User Generated Content) compliance plan required by Google Play, including a Terms of Service acceptance screen, user blocking via context menus and settings, &lt;a href="https://nostrcompass.org/en/topics/nip-56/">NIP-56 (Reporting)&lt;/a> functionality that publishes report events to relays, and a Content &amp;amp; Safety settings section. Build infrastructure was added for generating signed release APKs and AABs (Android App Bundles) via new Makefile targets. An EULA document establishes a 17+ age requirement and Nostr-specific disclaimers about decentralized content. The compliance features themselves ship in follow-up PRs; this merge lays the documentation and signing groundwork.&lt;/p>
&lt;p>On the Damus iOS side, a fix landed for an &lt;a href="https://github.com/damus-io/damus/pull/3593">infinite loading spinner regression&lt;/a> where the spinner would persist indefinitely after content had loaded.&lt;/p>
&lt;h3 id="nostria-discovery-relays-and-dm-fixes">Nostria: Discovery Relays and DM Fixes&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostria-app/nostria">Nostria&lt;/a>, the cross-platform Nostr client focused on global scale, merged 9 PRs this week. The most notable adds &lt;a href="https://github.com/nostria-app/nostria/pull/460">auto-initialization of Discovery Relays&lt;/a> for profile lookup, giving new users working relay connectivity without manual configuration. Other fixes address &lt;a href="https://github.com/nostria-app/nostria/pull/466">DM textarea wrapping&lt;/a>, &lt;a href="https://github.com/nostria-app/nostria/pull/479">fullscreen video viewport fill&lt;/a>, &lt;a href="https://github.com/nostria-app/nostria/pull/481">article metadata extraction in repost previews&lt;/a>, and &lt;a href="https://github.com/nostria-app/nostria/pull/458">nostr: URI resolution in notifications&lt;/a>.&lt;/p>
&lt;h3 id="camelus-riverpod-v3-migration">Camelus: Riverpod v3 Migration&lt;/h3>
&lt;p>&lt;a href="https://github.com/camelus-hq/camelus">Camelus&lt;/a>, the Flutter-based Nostr client, merged 5 PRs this week centered on a &lt;a href="https://github.com/camelus-hq/camelus/pull/158">Riverpod v3 API migration&lt;/a> and &lt;a href="https://github.com/camelus-hq/camelus/pull/159">generic feed refactor&lt;/a>. An &lt;a href="https://github.com/camelus-hq/camelus/pull/161">embedded note cache&lt;/a> avoids redundant relay fetches for quoted notes.&lt;/p>
&lt;h2 id="nip-updates">NIP Updates&lt;/h2>
&lt;p>Recent changes to the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a>:&lt;/p>
&lt;p>&lt;strong>Merged:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2223">NIP-85: Service Provider Discoverability&lt;/a>&lt;/strong>: vitorpamplona added guidance on client discovery of &lt;a href="https://nostrcompass.org/en/topics/trusted-relay-assertions/">NIP-85 Trusted Assertions&lt;/a> service providers, including relay hints and algorithm-specific service keys. See the &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-18-newsletter/#nip-deep-dive-nip-85-trusted-assertions">deep dive below&lt;/a> for full coverage.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/1946">NIP-11: Relay Information Cleanup&lt;/a>&lt;/strong>: fiatjaf removed &lt;code>privacy_policy&lt;/code>, the &lt;code>retention&lt;/code> array, &lt;code>relay_countries&lt;/code>, and the community preferences block from &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a>. Relay operators rarely populated these fields and clients did not act on them.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/1752">NIP-52: Day-Granularity Timestamp Tag&lt;/a>&lt;/strong>: staab added a required &lt;code>D&lt;/code> tag to &lt;a href="https://nostrcompass.org/en/topics/nip-52/">NIP-52&lt;/a> time-based calendar events (kind 31923) representing the day-granularity Unix timestamp, calculated as &lt;code>floor(unix_seconds / 86400)&lt;/code>. Multiple &lt;code>D&lt;/code> tags cover multi-day events, enabling efficient temporal indexing without parsing full timestamps.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2210">NIP-47: Simplification&lt;/a>&lt;/strong>: The simplification PR &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-11-newsletter/">discussed in Newsletter #9&lt;/a> merged this week, removing &lt;code>multi_pay_invoice&lt;/code> and &lt;code>multi_pay_keysend&lt;/code> from &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47 (Nostr Wallet Connect)&lt;/a>. See &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-04-newsletter/#nip-deep-dive-nip-47-nostr-wallet-connect">Newsletter #8&lt;/a> for the full NWC protocol deep dive.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Open PRs and Discussions:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2211">NIP-74: Podcasts&lt;/a>&lt;/strong>: Covered in &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-04-newsletter/">Newsletter #8&lt;/a>, this podcast specification proposal saw heated discussion this week. staab noted at least three competing podcast standards already exist in the wild, and derekross pointed to an existing six-month-old implementation with active apps and podcasts. The path forward requires convergence between implementations before a NIP number can be assigned.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2226">NIP-XX: AI Agent Messages&lt;/a>&lt;/strong>: joelklabo proposes a complete AI agent communication protocol with event kinds for prompts, responses, streaming, tool telemetry, errors, and capability discovery. See &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-18-newsletter/#ai-agent-nips-arrive">News section&lt;/a> for coverage of all AI proposals this week.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/1893">NIP-PNS: Private Note Storage&lt;/a>&lt;/strong>: jb55&amp;rsquo;s private note system defines kind 1080 events for storing encrypted personal notes on relays without revealing who wrote them. The scheme derives a deterministic pseudonymous keypair from the user&amp;rsquo;s nsec via HKDF: &lt;code>pns_key = hkdf_extract(ikm=device_key, salt=&amp;quot;nip-pns&amp;quot;)&lt;/code>, then generates a secp256k1 keypair from that derived key. A second derivation produces a symmetric encryption key: &lt;code>pns_nip44_key = hkdf_extract(ikm=pns_key, salt=&amp;quot;nip44-v2&amp;quot;)&lt;/code>. Inner notes are encrypted with &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> v2 using this key and published under the pseudonymous pubkey, so relays see kind 1080 events from an identity unlinked to the user&amp;rsquo;s main key. Unlike &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> gift wraps, PNS is not spammable (the pseudonymous key is deterministic, not random) and carries zero public metadata (no &lt;code>p&lt;/code> tags needed since there is no recipient). This week, jb55 posted findings from implementing PNS in Notedeck&amp;rsquo;s Rust backend (&lt;code>enostr::pns&lt;/code> module). He identified that the spec&amp;rsquo;s &lt;code>hkdf_extract&lt;/code> call is ambiguous because RFC 5869 HKDF has two phases (Extract and Expand) that produce different output, and most libraries expect both. He clarified that &lt;code>pns_nip44_key&lt;/code> bypasses NIP-44&amp;rsquo;s normal ECDH key agreement and is used directly as the conversation key, a detail implementers need to know since most NIP-44 libraries default to ECDH. He also flagged an undefined variable in the reference implementation&amp;rsquo;s TypeScript. The PR, originally from April 2025, is now being actively implemented.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2220">NIP-AE: Agents&lt;/a>&lt;/strong>: pablof7z defines four event kinds for agent identity on Nostr, drawn from his work on &lt;a href="https://github.com/tenex-chat/tenex">TENEX&lt;/a>. The base template is kind 4199 (Agent Definition), carrying title, role description, system instructions, tool declarations, and version. Behavioral modifiers live in kind 4201 (Agent Nudge), which uses &lt;code>only-tool&lt;/code>, &lt;code>allow-tool&lt;/code>, and &lt;code>deny-tool&lt;/code> tags for runtime capability control. Agents publish what they learn as kind 4129 (Agent Lesson) events, categorized and linked back to the parent definition via &lt;code>e&lt;/code> tags, refinable through &lt;a href="https://nostrcompass.org/en/topics/nip-22/">NIP-22&lt;/a> comment threads. Ownership verification uses kind 14199, a replaceable event where human operators list their agent pubkeys, establishing a bidirectional chain when matched against the agent&amp;rsquo;s kind 0 profile &lt;code>p&lt;/code> tag.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2221">NIP-AD: MCP Server and Skill Announcements&lt;/a>&lt;/strong>: pablof7z defines events for announcing &lt;a href="https://modelcontextprotocol.io/">Model Context Protocol&lt;/a> servers and individual skills on Nostr. MCP server announcements carry the server&amp;rsquo;s endpoint URL and supported protocol version alongside a list of available tools with their input schemas. &lt;a href="https://nostrcompass.org/en/topics/nip-22/">NIP-22&lt;/a> comments are supported on server announcements, so the community can discuss and rate MCP servers directly on Nostr.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2224">NIP-73: OSM Tag Kind&lt;/a>&lt;/strong>: DestBro proposes adding OpenStreetMap identifiers to &lt;a href="https://nostrcompass.org/en/topics/nip-73/">NIP-73 (External Content IDs)&lt;/a>, which standardizes how Nostr events reference external content like books (ISBN), movies (ISAN), podcast feeds (GUID), geohashes, and URLs via &lt;code>i&lt;/code> and &lt;code>k&lt;/code> tags. The proposed OSM kind would let events reference specific map features (buildings, roads, parks) by their OpenStreetMap node or way ID, connecting Nostr content to the open geographic database.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2219">NIP-XX: Responsive Image Variants&lt;/a>&lt;/strong>: woikos proposes extending &lt;a href="https://nostrcompass.org/en/topics/nip-94/">NIP-94&lt;/a> file metadata events with tags for responsive image variants at different resolutions. Clients could select the appropriate variant based on display size and network conditions, reducing bandwidth for mobile users viewing high-resolution images hosted on &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> servers.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="nip-deep-dive-nip-85-trusted-assertions">NIP Deep Dive: NIP-85 (Trusted Assertions)&lt;/h2>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/85.md">NIP-85&lt;/a> defines a system for delegating expensive calculations to trusted service providers who publish signed results as Nostr events. Web of Trust scores and engagement metrics require crawling many relays and processing large event volumes, work that is impractical on mobile devices. This week&amp;rsquo;s &lt;a href="https://github.com/nostr-protocol/nips/pull/2223">merge&lt;/a> added guidance on the client discovery process for these providers.&lt;/p>
&lt;p>&lt;strong>Delegation:&lt;/strong>&lt;/p>
&lt;p>Calculating a user&amp;rsquo;s Web of Trust score requires crawling follow graphs multiple hops deep across many relays, and computing accurate follower counts means deduplicating across the entire relay network. Mobile devices and browser clients cannot perform these operations, yet the results are essential for spam filtering and content ranking. NIP-85 bridges this gap by letting users designate trusted providers to run the computations and publish results as standard Nostr events.&lt;/p>
&lt;p>&lt;strong>Protocol Design:&lt;/strong>&lt;/p>
&lt;p>NIP-85 uses four event kinds for assertions about different subject types. User assertions (kind 30382) carry follower count, post/reply/reaction counts, zap amounts, normalized rank (0-100), common topics, and active hours:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;event hash&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;service pubkey&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1739836800&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">30382&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;e88a691e98d9987c964521dff60025f60700378a4879180dcbbb4a5027850411&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;rank&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;89&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;followers&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;4521&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;first_created_at&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;1609459200&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;post_cnt&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;1283&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;reply_cnt&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;647&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;reactions_cnt&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;8920&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;zap_amt_recd&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;850000&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;zap_amt_sent&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;320000&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;zap_cnt_recd&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;412&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;zap_cnt_sent&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;198&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;zap_avg_amt_day_recd&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;1150&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;zap_avg_amt_day_sent&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;430&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;reports_cnt_recd&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;2&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;reports_cnt_sent&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;0&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;t&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;nostr&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;t&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;bitcoin&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;active_hours_start&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;14&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;active_hours_end&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;22&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;service key signature&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Event assertions (kind 30383) rate individual notes with comment count, quote count, reposts, reactions, and zap data:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;event hash&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;service pubkey&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1739836800&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">30383&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;lt;target event id&amp;gt;&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;rank&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;72&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;comment_cnt&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;45&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;quote_cnt&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;12&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;repost_cnt&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;89&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;reaction_cnt&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;310&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;zap_cnt&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;23&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;zap_amount&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;125000&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;service key signature&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For addressable events (long-form articles, wiki pages), kind 30384 applies the same engagement metrics across all versions collectively. Kind 30385 rates external identifiers (books, movies, websites, locations, hashtags) referenced through &lt;a href="https://nostrcompass.org/en/topics/nip-73/">NIP-73 (External Content IDs)&lt;/a>, which standardizes how Nostr events reference external content via &lt;code>i&lt;/code> and &lt;code>k&lt;/code> tags:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;event hash&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;service pubkey&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1739836800&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">30385&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;isbn:9780765382030&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;k&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;isbn&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;rank&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;94&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;comment_cnt&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;67&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;reaction_cnt&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;203&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;service key signature&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Each assertion is a replaceable addressable event where the &lt;code>d&lt;/code> tag contains the subject: a pubkey, event ID, event address, or NIP-73 identifier. Service providers sign these events with their own keys, and clients evaluate them based on trust relationships.&lt;/p>
&lt;p>&lt;strong>Provider Discovery:&lt;/strong>&lt;/p>
&lt;p>Users declare which assertion providers they trust by publishing kind 10040 events. Each entry specifies the assertion type with the provider pubkey and relay hint, plus optional algorithm variants:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;event hash&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;user pubkey&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1739836800&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">10040&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;30382:rank&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;4fd5e210...&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://nip85.nostr.band&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;30382:rank&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;3d842afe...&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://nostr.wine&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;30382:zap_amt_sent&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;4fd5e210...&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://nip85.nostr.band&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;30383:rank&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;4fd5e210...&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://nip85.nostr.band&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;user signature&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Users can encrypt the tag list in &lt;code>.content&lt;/code> using &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> to keep their provider preferences private. Clients build a provider list by checking which providers their followed accounts trust, creating a decentralized reputation layer for the assertion providers themselves.&lt;/p>
&lt;p>&lt;strong>Security Model:&lt;/strong>&lt;/p>
&lt;p>Providers must use different service keys for distinct algorithms, and a unique key per user when algorithms are personalized, preventing cross-correlation of queries across users. Each service key gets a kind 0 metadata event describing the algorithm&amp;rsquo;s behavior, giving users transparency into what they are trusting. Assertion events should only be updated when the underlying data actually changes, preventing unnecessary relay traffic and letting clients cache results with confidence.&lt;/p>
&lt;p>&lt;strong>Current Adoption:&lt;/strong>&lt;/p>
&lt;p>NIP-85 formalizes a pattern already emerging informally. Primal&amp;rsquo;s cache server computes engagement metrics and Web of Trust scores. &lt;a href="https://gitlab.com/soapbox-pub/antiprimal">Antiprimal&lt;/a>, covered in &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-11-newsletter/#antiprimal-standards-compliant-gateway-to-primals-cache">Newsletter #9&lt;/a>, bridges these calculations to standard Nostr clients using NIP-85 event kinds. &lt;a href="https://nostr.band">Nostr.band&lt;/a> operates the &lt;code>wss://nip85.nostr.band&lt;/code> relay referenced in the spec&amp;rsquo;s own examples, serving assertion events for its search index data. On the client side, &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> (authored by vitorpamplona, who also wrote this NIP) has experimental Trusted Assertions support in its &lt;code>quartz&lt;/code> library, parsing assertion events and service provider declarations. &lt;a href="https://vertexlab.io">Vertex&lt;/a> computes similar Web of Trust metrics but &lt;a href="https://vertexlab.io/blog/dvms_vs_nip_85/">chose a different approach&lt;/a>, using a direct API instead of NIP-85 events, citing the discovery problem and computational overhead of assertion-based architectures. With NIP-85, any client can consume assertions from any provider through a standard event format, and providers compete on accuracy while users choose whom to trust.&lt;/p>
&lt;h2 id="nip-deep-dive-nip-52-calendar-events">NIP Deep Dive: NIP-52 (Calendar Events)&lt;/h2>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/52.md">NIP-52&lt;/a> defines calendar events on Nostr, giving clients a standard way to represent and discover occurrences at specific moments or between moments. This week&amp;rsquo;s &lt;a href="https://github.com/nostr-protocol/nips/pull/1752">D tag merge&lt;/a> added day-granularity indexing, completing a missing piece in the spec&amp;rsquo;s query infrastructure.&lt;/p>
&lt;p>&lt;strong>Two Event Types:&lt;/strong>&lt;/p>
&lt;p>NIP-52 separates calendar events into two kinds based on temporal precision. Date-based events (kind 31922) represent all-day occurrences like holidays or multi-day festivals. They use ISO 8601 date strings in their &lt;code>start&lt;/code> and optional &lt;code>end&lt;/code> tags, with no time zone consideration:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;event hash&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;event creator pubkey&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1735689600&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">31922&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Annual celebration of Bitcoin&amp;#39;s genesis block&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;bitcoin-independence-day-2026&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;title&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Bitcoin Independence Day&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;start&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;2026-01-03&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;end&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;2026-01-04&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;location&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Worldwide&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;g&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;u4pruydqqv&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;t&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;bitcoin&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;lt;organizer-pubkey&amp;gt;&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.example.com&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;host&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;r&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;https://bitcoinindependenceday.com&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;event creator signature&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Time-based events (kind 31923) represent specific moments with Unix timestamps in their &lt;code>start&lt;/code> and optional &lt;code>end&lt;/code> tags, plus IANA time zone identifiers (&lt;code>start_tzid&lt;/code>, &lt;code>end_tzid&lt;/code>) for display. Both kinds are parameterized replaceable events, so organizers update details by publishing a new event with the same &lt;code>d&lt;/code> tag.&lt;/p>
&lt;p>&lt;strong>Calendars and RSVPs:&lt;/strong>&lt;/p>
&lt;p>Kind 31924 events define calendars as collections, referencing events via &lt;code>a&lt;/code> tags that point to kind 31922 or 31923 events by their address coordinates:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;event hash&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;calendar owner pubkey&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1739836800&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">31924&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Nostr community events worldwide&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;nostr-community-calendar&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;title&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Nostr Community Events&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;a&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;31923:&amp;lt;organizer-pubkey&amp;gt;:nostr-meetup-2026&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.example.com&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;a&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;31922:&amp;lt;organizer-pubkey&amp;gt;:bitcoin-independence-day-2026&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;calendar owner signature&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Users can maintain multiple calendars (personal, work, community) and clients can subscribe to calendars from specific pubkeys. Calendar events can include an &lt;code>a&lt;/code> tag referencing a calendar to request inclusion, enabling collaborative calendar management where multiple users contribute events to calendars they do not own.&lt;/p>
&lt;p>RSVPs use kind 31925, where users publish their attendance status along with an optional free/busy indicator:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;event hash&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;attendee pubkey&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1739836800&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">31925&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Looking forward to it&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;a&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;31923:&amp;lt;organizer-pubkey&amp;gt;:nostr-meetup-2026&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.example.com&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;e&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;lt;kind 31923 event id&amp;gt;&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.example.com&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;lt;unique-rsvp-id&amp;gt;&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;status&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;accepted&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;fb&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;busy&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;lt;organizer-pubkey&amp;gt;&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.example.com&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;attendee signature&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Valid &lt;code>status&lt;/code> values are &amp;ldquo;accepted&amp;rdquo;, &amp;ldquo;declined&amp;rdquo;, &amp;ldquo;tentative&amp;rdquo;, and the optional &lt;code>fb&lt;/code> tag marks the user as free or busy for that period. RSVP events reference the calendar event&amp;rsquo;s &lt;code>a&lt;/code> tag and carry the organizer&amp;rsquo;s &lt;code>p&lt;/code> tag, so the organizer&amp;rsquo;s client can aggregate responses across relays.&lt;/p>
&lt;p>&lt;strong>The D Tag Addition:&lt;/strong>&lt;/p>
&lt;p>Before this week&amp;rsquo;s merge, clients querying for events in a date range had to fetch all events from a pubkey or calendar and filter client-side. The new required &lt;code>D&lt;/code> tag on time-based events (kind 31923) contains a day-granularity Unix timestamp calculated as &lt;code>floor(unix_seconds / 86400)&lt;/code>. Multi-day events carry multiple &lt;code>D&lt;/code> tags, one per day. Relays can now index events by day and respond to filtered queries efficiently, turning what was a client-side filtering problem into a relay-side index lookup.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;event hash&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;event creator pubkey&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1739836800&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">31923&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Monthly meetup for Nostr developers in Austin&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;nostr-meetup-2026&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;title&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Nostr Developer Meetup&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;summary&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Talks and demos from local Nostr builders&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;image&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;https://example.com/meetup-banner.jpg&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;start&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;1740067200&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;end&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;1740078000&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;start_tzid&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;America/New_York&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;end_tzid&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;America/New_York&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;D&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;20139&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;location&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Bitcoin Commons, Austin TX&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;g&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;9v6knb2pg&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;lt;organizer-pubkey&amp;gt;&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.example.com&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;host&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;lt;speaker-pubkey&amp;gt;&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.example.com&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;speaker&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;t&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;nostr&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;t&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;meetup&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;r&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;https://bitcoincommons.com&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;event creator signature&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>D&lt;/code> value &lt;code>20139&lt;/code> equals &lt;code>floor(1740067200 / 86400)&lt;/code>, placing this event on February 20, 2025. Clients querying for &amp;ldquo;all events this week&amp;rdquo; send a filter with the corresponding &lt;code>D&lt;/code> range, and relays return only matching events.&lt;/p>
&lt;p>&lt;strong>Design Decisions:&lt;/strong>&lt;/p>
&lt;p>NIP-52 intentionally omits recurring events. The spec leaves recurrence rules (RRULE from iCalendar) out entirely, delegating that complexity to clients. An organizer publishes individual events for each occurrence, keeping the relay-side data model simple. Participant tags carry optional roles (&amp;ldquo;host&amp;rdquo;, &amp;ldquo;speaker&amp;rdquo;, &amp;ldquo;attendee&amp;rdquo;), and location tags can include geohash &lt;code>g&lt;/code> tags for spatial queries alongside human-readable addresses.&lt;/p>
&lt;p>&lt;strong>Implementations:&lt;/strong>&lt;/p>
&lt;p>&lt;a href="https://github.com/zmeyer44/flockstr">Flockstr&lt;/a> is the primary calendar client built on NIP-52. &lt;a href="https://gitea.coracle.social/coracle/coracle">Coracle&lt;/a> displays calendar events in its social feed. The &lt;code>D&lt;/code> tag addition this week enables relay-side temporal indexing that both clients can use to reduce bandwidth when querying for events in a specific date range.&lt;/p>
&lt;hr>
&lt;p>That&amp;rsquo;s it for this week. Building something or have news to share? Want us to cover your project? &lt;a href="nostr:npub1wav4fae3gyfy3xj298kxj2mj8phavz7vavps34przq02j7w902qq902923">Reach out via &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> DM&lt;/a> or find us on Nostr.&lt;/p></content:encoded></item><item><title>Nostr Compass #9</title><link>https://nostrcompass.org/en/newsletters/2026-02-11-newsletter/</link><pubDate>Wed, 11 Feb 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-02-11-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> Mostro ships its first public beta after three years of development, bringing P2P Bitcoin trading to mobile via Nostr. OpenSats awards its sixteenth wave of Bitcoin grants, with Minibits Wallet receiving a renewal for its Nostr-integrated Cashu wallet. &lt;strong>Zapstore reaches 1.0 stable release&lt;/strong>, marking the maturation of the decentralized Android app store. Coracle 0.6.29 adds topics and highlight commenting. Igloo Desktop v1.0.3 ships major security hardening for Frostr threshold signing. Amber v4.1.2-pre1 migrates to Flow architecture. Angor reaches v0.2.5 with a revamped funding UI and NIP-96 image server configuration. NostrPress launches as a tool that converts Nostr profiles into static blogs. Antiprimal ships a standards-compliant gateway that bridges Primal&amp;rsquo;s proprietary cache server to standard Nostr NIPs. Primal Android merges 18 PRs expanding NWC infrastructure with dual wallet support, audit logging, and the &lt;code>lookup_invoice&lt;/code> method. diVine ships API-first video feeds. The Marmot TypeScript SDK spins out its reference chat app into a standalone repo and begins migrating to ts-mls v2. The NIPs repository merges HyperLogLog approximate counting for NIP-45 and extracts identity tags from kind 0. A wave of proposals from vitorpamplona begins systematically slimming kind 0 metadata events. New protocol proposals include Nostr Relay Connect for NAT traversal and Nostr Web Tokens for signed web claims. This week&amp;rsquo;s deep dives cover NIP-45&amp;rsquo;s new HyperLogLog approximate counting for cross-relay event metrics and NIP-96&amp;rsquo;s HTTP file storage protocol, now deprecated in favor of Blossom, as projects navigate the transition between the two media standards.&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> Mostro ships its first public beta after three years of development, bringing P2P Bitcoin trading to mobile via Nostr. OpenSats awards its sixteenth wave of Bitcoin grants, with Minibits Wallet receiving a renewal for its Nostr-integrated Cashu wallet. &lt;strong>Zapstore reaches 1.0 stable release&lt;/strong>, marking the maturation of the decentralized Android app store. Coracle 0.6.29 adds topics and highlight commenting. Igloo Desktop v1.0.3 ships major security hardening for Frostr threshold signing. Amber v4.1.2-pre1 migrates to Flow architecture. Angor reaches v0.2.5 with a revamped funding UI and NIP-96 image server configuration. NostrPress launches as a tool that converts Nostr profiles into static blogs. Antiprimal ships a standards-compliant gateway that bridges Primal&amp;rsquo;s proprietary cache server to standard Nostr NIPs. Primal Android merges 18 PRs expanding NWC infrastructure with dual wallet support, audit logging, and the &lt;code>lookup_invoice&lt;/code> method. diVine ships API-first video feeds. The Marmot TypeScript SDK spins out its reference chat app into a standalone repo and begins migrating to ts-mls v2. The NIPs repository merges HyperLogLog approximate counting for NIP-45 and extracts identity tags from kind 0. A wave of proposals from vitorpamplona begins systematically slimming kind 0 metadata events. New protocol proposals include Nostr Relay Connect for NAT traversal and Nostr Web Tokens for signed web claims. This week&amp;rsquo;s deep dives cover NIP-45&amp;rsquo;s new HyperLogLog approximate counting for cross-relay event metrics and NIP-96&amp;rsquo;s HTTP file storage protocol, now deprecated in favor of Blossom, as projects navigate the transition between the two media standards.&lt;/p>
&lt;h2 id="news">News&lt;/h2>
&lt;h3 id="mostro-ships-first-public-beta">Mostro Ships First Public Beta&lt;/h3>
&lt;p>&lt;a href="https://github.com/MostroP2P/mostro">Mostro&lt;/a>, the peer-to-peer Bitcoin exchange built on Nostr, released its &lt;a href="https://github.com/MostroP2P/mobile/releases/tag/v1.1.0">mobile app v1.1.0&lt;/a>, the project&amp;rsquo;s first public beta after three years of development. The app enables users to trade Bitcoin directly using Nostr for order coordination, with Lightning for settlement and no custodial intermediary.&lt;/p>
&lt;p>The release introduces push notifications with improved background reliability on Android, an optional logging system that lets users capture and share diagnostic data when issues arise, smoother relay updates using additive initialization, and Phase 2 UI refinements with internationalization support. The app is available on &lt;a href="https://zapstore.dev">Zapstore&lt;/a> and as a direct &lt;a href="https://github.com/MostroP2P/mobile/releases/tag/v1.1.0">GitHub download&lt;/a>.&lt;/p>
&lt;p>Mostro joins Shopstr and Plebeian Market as a Nostr-native commerce application, with the distinction that it focuses on fiat-to-Bitcoin exchange coordination. The underlying &lt;a href="https://github.com/MostroP2P/mostro">Mostro daemon&lt;/a> handles order matching and dispute resolution through Nostr relays.&lt;/p>
&lt;h3 id="opensats-sixteenth-wave-of-bitcoin-grants">OpenSats Sixteenth Wave of Bitcoin Grants&lt;/h3>
&lt;p>&lt;a href="https://opensats.org/blog/sixteenth-wave-of-bitcoin-grants">OpenSats&lt;/a> announced grants to 17 open-source projects. The Nostr-relevant highlight: &lt;a href="https://github.com/minibits-cash/minibits_wallet">Minibits Wallet&lt;/a>, the Android &lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a> wallet with &lt;a href="https://nostrcompass.org/en/topics/nip-60/">NIP-60&lt;/a> wallet event support and nutzap integration, received a renewal grant. Minibits uses Nostr events to store ecash token state, making wallet backups portable across devices through relay sync.&lt;/p>
&lt;h3 id="nostrpress-nostr-profile-to-static-blog">NostrPress: Nostr Profile to Static Blog&lt;/h3>
&lt;p>&lt;a href="https://github.com/besoeasy/NostrPress">NostrPress&lt;/a> (&lt;a href="https://blog.besoeasy.com">blog.besoeasy.com&lt;/a>) is a new tool that converts a Nostr profile into a fully static blog deployable anywhere. Users publish articles on Nostr through any client, and NostrPress generates a standalone website from those events, complete with local media hosting and RSS feeds.&lt;/p>
&lt;p>Built with Nunjucks templating and JavaScript, NostrPress produces sites with zero platform lock-in. The generated output is plain HTML/CSS that can be hosted on any static file server, GitHub Pages, Netlify, or a personal VPS. The tool joins &lt;a href="https://github.com/nostrband/nostrsite">Npub.pro&lt;/a> and &lt;a href="https://github.com/servus-social/servus">Servus&lt;/a> as options for turning Nostr content into traditional websites.&lt;/p>
&lt;h3 id="antiprimal-standards-compliant-gateway-to-primals-cache">Antiprimal: Standards-Compliant Gateway to Primal&amp;rsquo;s Cache&lt;/h3>
&lt;p>&lt;a href="https://gitlab.com/soapbox-pub/antiprimal">antiprimal&lt;/a> (&lt;a href="https://antiprimal.net">antiprimal.net&lt;/a>), a new project from Alex Gleason and the Soapbox team, is a WebSocket gateway that bridges Primal&amp;rsquo;s proprietary cache server to standard Nostr protocol messages. Primal offers features like event statistics, content search, and Web of Trust calculations through &lt;code>wss://cache.primal.net/v1&lt;/code>, but accessing these requires a proprietary message format with a non-standard &lt;code>cache&lt;/code> field that standard Nostr clients cannot use. Antiprimal translates standard NIP requests into Primal&amp;rsquo;s format and converts responses back.&lt;/p>
&lt;p>The gateway supports &lt;a href="https://nostrcompass.org/en/topics/nip-45/">NIP-45&lt;/a> COUNT queries (reactions, replies, reposts, zap counts, follower counts), &lt;a href="https://github.com/nostr-protocol/nips/blob/master/50.md">NIP-50&lt;/a> search, &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> relay information, and &lt;a href="https://github.com/nostr-protocol/nips/blob/master/85.md">NIP-85&lt;/a> Trusted Assertions for Primal&amp;rsquo;s precomputed Web of Trust data. A companion bot publishes NIP-85 kind 30382 (user statistics) and kind 30383 (event engagement) events to configurable relays. The project is built with TypeScript on Bun and uses the Nostrify library. Created February 6, it has 53 commits in its first three days of development and is live at antiprimal.net.&lt;/p>
&lt;h3 id="ikaros-ai-agent-messaging-gateway-for-signal-and-nostr">Ikaros: AI Agent Messaging Gateway for Signal and Nostr&lt;/h3>
&lt;p>&lt;a href="https://gitlab.com/soapbox-pub/ikaros">Ikaros&lt;/a>, a new project from the Soapbox team, is a messaging gateway that enables AI agents to communicate through both Signal and Nostr encrypted DMs. The bridge uses the &lt;a href="https://agentclientprotocol.org">Agent Client Protocol&lt;/a> (ACP) to connect any ACP-compatible AI coding assistant to real messaging networks. Three pull requests constitute the project&amp;rsquo;s initial build this week.&lt;/p>
&lt;p>&lt;a href="https://gitlab.com/soapbox-pub/ikaros/-/merge_requests/1">PR #1&lt;/a> implements a complete &lt;a href="https://nostrcompass.org/en/topics/nip-04/">NIP-04&lt;/a> encrypted DM adapter with send/receive support, response buffering with explicit flush on completion, &lt;code>nsec&lt;/code> and hex private key formats, multi-relay publishing with automatic reconnection, and an interactive setup wizard. The adapter uses nostr-tools v2.23.0 and updates the ACP SDK to v0.14.1.&lt;/p>
&lt;p>&lt;a href="https://gitlab.com/soapbox-pub/ikaros/-/merge_requests/2">PR #2&lt;/a> fixes a silent message drop caused by a session update race condition: incoming notifications that arrived before a session was registered in the map were silently lost, and the fix buffers those notifications for replay once registration completes. &lt;a href="https://gitlab.com/soapbox-pub/ikaros/-/merge_requests/3">PR #3&lt;/a> adds Signal user and group name/UUID metadata to agent interactions, so the AI agent knows who it is talking to and in which group. The project opens a new design space: AI agents addressable via Nostr DMs that can also be reached from Signal, or vice versa.&lt;/p>
&lt;h3 id="kind-0-slimming-campaign">Kind 0 Slimming Campaign&lt;/h3>
&lt;p>vitorpamplona opened a series of PRs this week proposing systematic extraction of data from kind 0 (user metadata) events into dedicated event kinds. The campaign addresses a growing problem: kind 0 events have accumulated fields over time that most clients do not use, inflating the size of every profile fetch.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2216">PR #2216&lt;/a> (merged) moves identity tags (&lt;code>i&lt;/code> tags) from kind 0 to a new kind 10011, since adoption of these tags has been minimal. &lt;a href="https://github.com/nostr-protocol/nips/pull/2213">PR #2213&lt;/a> proposes moving &lt;a href="https://nostrcompass.org/en/topics/nip-05/">NIP-05&lt;/a> verification to kind 10008, which would enable users to have multiple NIP-05 identifiers and allow filtering events by NIP-05 address. &lt;a href="https://github.com/nostr-protocol/nips/pull/2217">PR #2217&lt;/a> proposes extracting Lightning addresses (lud06/lud16) to a new kind, stopping all kind 0 users from carrying zap-related fields that only matter to clients with Lightning integration.&lt;/p>
&lt;p>The proposals have revived discussion on the broader question of kind 0 structure, including &lt;a href="https://github.com/nostr-protocol/nips/pull/1770">PR #1770&lt;/a>, the long-standing proposal to replace stringified JSON in kind 0 content with structured tags.&lt;/p>
&lt;h3 id="nip-70-relay-support-critical-for-encrypted-messaging-security">NIP-70 Relay Support Critical for Encrypted Messaging Security&lt;/h3>
&lt;p>The &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> protocol&amp;rsquo;s White Noise implementation has &lt;a href="https://blog.jgmontoya.com/2026/02/10/nip70-relay-status.html">identified a critical gap&lt;/a> in relay support for &lt;a href="https://github.com/nostr-protocol/nips/blob/master/70.md">NIP-70&lt;/a> (Protected Events) and &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> (Authentication). Testing revealed that major public relays including Damus, Primal, and nos.lol reject protected events outright with &lt;code>blocked: event marked as protected&lt;/code> errors instead of initiating the required authentication challenge.&lt;/p>
&lt;p>This breaks a key security feature: NIP-70 enables secure deletion of spent MLS KeyPackages, preventing &amp;ldquo;harvest now, decrypt later&amp;rdquo; attacks. Without relay support, encrypted messaging protocols cannot protect users from future key compromise. White Noise has disabled NIP-70 by default in response, keeping an optional flag for users with supportive relays.&lt;/p>
&lt;p>&lt;strong>Call to action for relay operators:&lt;/strong> Implement the complete NIP-42 authentication flow. When receiving protected events, challenge clients to prove ownership, then accept validated writes. Rejecting protected events without authentication breaks protocol security guarantees that encrypted messaging applications depend on.&lt;/p>
&lt;h2 id="releases">Releases&lt;/h2>
&lt;h3 id="coracle-0629">Coracle 0.6.29&lt;/h3>
&lt;p>&lt;a href="https://github.com/coracle-social/coracle">Coracle&lt;/a> (&lt;a href="https://coracle.social">coracle.social&lt;/a>), hodlbod&amp;rsquo;s web client, shipped &lt;a href="https://github.com/coracle-social/coracle/releases/tag/0.6.29">0.6.29&lt;/a>. The release adds display of topics and comments on kind 9802 highlights. A new list navigation item gives quick access to user-curated lists from the main UI. Under the hood, Coracle upgraded to a new version of Welshman, the shared Nostr library that powers Coracle&amp;rsquo;s relay management and event handling. The default relay list was refreshed, and Glitchtip error tracking was removed from the codebase.&lt;/p>
&lt;h3 id="igloo-desktop-v103">Igloo Desktop v1.0.3&lt;/h3>
&lt;p>&lt;a href="https://github.com/FROSTR-ORG/igloo-desktop">Igloo Desktop&lt;/a>, the &lt;a href="https://nostrcompass.org/en/topics/frost/">FROST&lt;/a>-based threshold signer and key management application, shipped &lt;a href="https://github.com/FROSTR-ORG/igloo-desktop/releases/tag/v1.0.3">v1.0.3&lt;/a> with extensive security hardening. The release introduces IPC validation, Electron isolation, and SSRF-aware relay checks for defense against server-side request forgery. A new onboarding and share-import flow simplifies key distribution, relay planning now includes normalization and priority merging, and a preload-based Electron API architecture improves the security boundary between the renderer and main process. A signer keep-alive system maintains threshold signing session stability, and recovery UX improvements reduce the friction of key restoration.&lt;/p>
&lt;h3 id="amber-v412-pre1">Amber v4.1.2-pre1&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a>, the Android event signer, released &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v4.1.2-pre1">v4.1.2-pre1&lt;/a> fixing the missing relay trust score display introduced in v4.1.1, resolving JSON parsing issues for non-Nostr encrypt/decrypt requests, and migrating the account model from LiveData to Flow for more predictable state management. The release switches bunker secrets to full UUIDs and upgrades to Gradle plugin 9.&lt;/p>
&lt;h3 id="mostro-mobile-v110-and-daemon-v0161">Mostro Mobile v1.1.0 and Daemon v0.16.1&lt;/h3>
&lt;p>See the &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-11-newsletter/#mostro-ships-first-public-beta">News section above&lt;/a> for full coverage of the mobile release. On the server side, the &lt;a href="https://github.com/MostroP2P/mostro">Mostro daemon&lt;/a> shipped &lt;a href="https://github.com/MostroP2P/mostro/releases/tag/v0.16.1">v0.16.1&lt;/a>, adding automatic publishing of NIP-01 kind 0 metadata on startup (&lt;a href="https://github.com/MostroP2P/mostro/pull/575">PR #575&lt;/a>), so the daemon now announces its identity to the network when it comes online. The release also fixes dev fee calculation documentation (&lt;a href="https://github.com/MostroP2P/mostro/pull/571">PR #571&lt;/a>).&lt;/p>
&lt;h3 id="angor-v025">Angor v0.2.5&lt;/h3>
&lt;p>&lt;a href="https://github.com/block-core/angor">Angor&lt;/a> (&lt;a href="https://angor.io">angor.io&lt;/a>), the decentralized P2P funding protocol built on Bitcoin and Nostr, shipped &lt;a href="https://github.com/block-core/angor/releases/tag/v0.2.5">v0.2.5&lt;/a> with three merged PRs. &lt;a href="https://github.com/block-core/angor/pull/649">PR #649&lt;/a> redesigns the Funds management section (V2), replacing the previous layout with a new interface for tracking individual UTXOs and investment positions. &lt;a href="https://github.com/block-core/angor/pull/651">PR #651&lt;/a> overhauls the InvoiceView with updated button styles, closeable dialogs, a new &amp;ldquo;Copy Address&amp;rdquo; command, cancellation support for address monitoring, and improved investment flow handling. &lt;a href="https://github.com/block-core/angor/pull/652">PR #652&lt;/a> adds configurable &lt;a href="https://nostrcompass.org/en/topics/nip-96/">NIP-96&lt;/a> (&lt;a href="https://github.com/nostr-protocol/nips/blob/master/96.md">spec&lt;/a>) image servers in settings, letting users choose which media upload endpoint handles their project images and documentation. &lt;a href="https://github.com/block-core/angor/releases/tag/v0.2.4">v0.2.4&lt;/a> shipped the previous week.&lt;/p>
&lt;h3 id="ridestr-v022-and-v023">Ridestr v0.2.2 and v0.2.3&lt;/h3>
&lt;p>&lt;a href="https://github.com/variablefate/ridestr">Ridestr&lt;/a>, the decentralized rideshare platform &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-04-newsletter/#ridestr-v020-roadflare-release">covered last week&lt;/a>, continued rapid iteration with &lt;a href="https://github.com/variablefate/ridestr/releases/tag/v0.2.2">v0.2.2&lt;/a> (Bridge Payment Hotfix) and &lt;a href="https://github.com/variablefate/ridestr/releases/tag/v0.2.3">v0.2.3&lt;/a> following the v0.2.0 &amp;ldquo;RoadFlare Release.&amp;rdquo; The v0.2.2 hotfix addresses a bug where cross-mint &lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a> bridge payments were auto-canceling rides while the payment was still processing or would eventually succeed, preventing premature ride cancellation on slower settlements. The release also fixes UI flickering and broken touch-hitboxes on the &amp;ldquo;my location&amp;rdquo; button. v0.2.3 ships additional bug fixes. Both releases include separate APKs for Ridestr (rider app) and Drivestr (driver app).&lt;/p>
&lt;h3 id="nostr-php-194">Nostr PHP 1.9.4&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostrver-se/nostr-php">Nostr PHP&lt;/a> (&lt;a href="https://nostr-php.dev">nostr-php.dev&lt;/a>), the PHP helper library for the Nostr protocol, shipped &lt;a href="https://github.com/nostrver-se/nostr-php/releases/tag/1.9.4">1.9.4&lt;/a> adding a configurable &lt;code>timeout&lt;/code> property to the request class (&lt;a href="https://github.com/nostrver-se/nostr-php/pull/106">PR #106&lt;/a>). This lets developers set custom timeout durations for relay connections and message requests, preventing indefinite hangs when a relay is unresponsive or slow to reply.&lt;/p>
&lt;h3 id="zapstore-v100">Zapstore v1.0.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/zapstore/zapstore/releases/tag/1.0.0">Zapstore&lt;/a> (&lt;a href="https://zapstore.dev">zapstore.dev&lt;/a>), the permissionless Android app store built on Nostr, &lt;strong>reached its stable 1.0 release milestone&lt;/strong> this week after months of release candidates.&lt;/p>
&lt;p>The 1.0 release includes critical stability improvements: install button state handling that ensures Delete appears immediately after installation completes, user-friendly error messages with expandable technical details, and a &amp;ldquo;Report issue&amp;rdquo; button that sends encrypted DMs via Nostr using ephemeral keys. The release also ships a new updates screen with polling and batch tracking, better download watchdog for stalled transfers, dynamic concurrent download limits based on device performance, more frequent installed package syncing, and improved version comparison logic. The team fixed a critical flutter_secure_storage issue and enhanced package manager handling of edge cases.&lt;/p>
&lt;p>This milestone represents the maturation of Nostr&amp;rsquo;s first dedicated app distribution platform, enabling developers to publish Android applications directly to users without centralized app store gatekeeping.&lt;/p>
&lt;h3 id="zsp-v031">ZSP v0.3.1&lt;/h3>
&lt;p>&lt;a href="https://github.com/zapstore/zsp">ZSP&lt;/a>, the Go CLI tool from the &lt;a href="https://github.com/zapstore/zapstore">Zapstore&lt;/a> team that replaces Zapstore&amp;rsquo;s previous publishing tooling for signing and uploading Android apps to Nostr relays, released &lt;a href="https://github.com/zapstore/zsp/releases/tag/v0.3.1">v0.3.1&lt;/a>. ZSP handles APK acquisition from GitHub, GitLab, Codeberg, F-Droid, or local files, then parses metadata, signs Nostr events (via private key, &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> bunker, or &lt;a href="https://nostrcompass.org/en/topics/nip-07/">NIP-07&lt;/a> browser extension), and uploads artifacts to &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> servers. This release adds a full offline mode for keystore linking without a network connection, &lt;code>Content-Digest&lt;/code> headers on Blossom uploads for protocol compliance, fixed arm64-v8a APK detection from F-Droid repositories, GitLab trailing query parameter fixes, and full &lt;code>.env&lt;/code> file support for configuration.&lt;/p>
&lt;h3 id="damus-ios-117">Damus iOS 1.17&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/damus">Damus&lt;/a>, the iOS Nostr client, bumped to version 1.17 (&lt;a href="https://github.com/damus-io/damus/pull/3606">PR #3606&lt;/a>). The release fixes a RelayPool issue where connections would close after ephemeral lease release (&lt;a href="https://github.com/damus-io/damus/pull/3605">PR #3605&lt;/a>), which could cause subscriptions to drop unexpectedly. It also resolves a bug where the favorites timeline would not display events when switching between tabs (&lt;a href="https://github.com/damus-io/damus/pull/3603">PR #3603&lt;/a>).&lt;/p>
&lt;h3 id="nak-v0183">nak v0.18.3&lt;/h3>
&lt;p>&lt;a href="https://github.com/fiatjaf/nak">nak&lt;/a>, the Nostr army knife CLI, shipped &lt;a href="https://github.com/fiatjaf/nak/releases/tag/v0.18.3">v0.18.3&lt;/a> with three stability fixes: preventing a panic when AUTH challenge tags are nil or too short, checking dateparser errors before using the parsed value, and handling Cashu mint URLs that lack a &lt;code>://&lt;/code> separator.&lt;/p>
&lt;h3 id="mi-browser-based-local-relay">Mi: Browser-Based Local Relay&lt;/h3>
&lt;p>&lt;a href="https://git.shakespeare.diy/npub1scvyzz02ayma34hesz62pdrd5nhsmxp74hjq8msmfs9khh3r3drsnw68d8/mi.git">Mi&lt;/a> (&lt;a href="https://mi.shakespeare.wtf">mi.shakespeare.wtf&lt;/a>), a new &lt;a href="https://shakespeare.wtf">Shakespeare&lt;/a> MiniApp, is a browser-based local relay that archives a user&amp;rsquo;s Nostr events in IndexedDB. Mi fetches profiles (kind 0), contact lists (kind 3), relay lists (kind 10002), and wallet events from connected relays and stores them locally, giving users offline access to their own data. Built with React and nostr-tools 2.15.0.&lt;/p>
&lt;h3 id="agora-v102">Agora v1.0.2&lt;/h3>
&lt;p>&lt;a href="https://gitlab.com/soapbox-pub/agora">Agora&lt;/a> (&lt;a href="https://agora.spot">agora.spot&lt;/a>), a decentralized activism and fundraising platform from the Soapbox team, shipped &lt;a href="https://gitlab.com/soapbox-pub/agora/-/releases/v1.0.2">v1.0.2&lt;/a> with an Android APK available for direct install. This is the first Compass mention of Agora, which launched on January 17 with a mission statement: &amp;ldquo;Join the global movement for freedom. Send support to activists on the ground internationally and take part in local actions.&amp;rdquo;&lt;/p>
&lt;p>The platform centers on a world map where users browse by country, create location-tagged &amp;ldquo;actions&amp;rdquo; (protests, campaigns, community organizing), and discuss them through threaded comments. All content propagates through Nostr relays, so no central server can be taken offline to silence coordination. Agora supports multiple languages with CI-enforced translation parity, integrates &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> media servers for uploads, and includes search, hashtag browsing with global/regional toggle, user profiles, and reaction systems. The v1.0.2 release is the current Android build, available as a direct APK download.&lt;/p>
&lt;h3 id="xonos-v016">xonos v0.1.6&lt;/h3>
&lt;p>&lt;a href="https://codeberg.org/xonos/xonos">xonos&lt;/a>, the experimental 3D Nostr client built with the Bevy game engine, shipped &lt;a href="https://codeberg.org/xonos/xonos/releases/tag/v0.1.6">v0.1.6&lt;/a>. xonos renders Nostr events in a 3D spatial environment with text-to-speech capabilities, exploring how social protocol data might work outside of conventional 2D interfaces.&lt;/p>
&lt;h2 id="project-updates">Project Updates&lt;/h2>
&lt;h3 id="primal-android-expands-nwc-infrastructure">Primal Android Expands NWC Infrastructure&lt;/h3>
&lt;p>&lt;a href="https://github.com/PrimalHQ/primal-android-app">Primal Android&lt;/a> merged 18 PRs this week, continuing the NWC buildout &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-04-newsletter/#primal-android-ships-nwc-encryption">started last week&lt;/a>. &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/883">PR #883&lt;/a> adds support for NWC connections across both wallets (Spark and external), and &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/879">PR #879&lt;/a> implements the &lt;code>lookup_invoice&lt;/code> NWC method for checking payment status.&lt;/p>
&lt;p>&lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/880">PR #880&lt;/a> adds NWC request-response audit logging for debugging wallet interactions. &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/877">PR #877&lt;/a> adds multi-account support to &lt;code>PrimalNwcService&lt;/code>, enabling users with multiple profiles to maintain separate wallet connections. &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/882">PR #882&lt;/a> implements periodic cleanup of expired budget holds, preventing stale payment reservations from blocking wallet operations.&lt;/p>
&lt;p>UI work includes wallet upgrade screen redesigns (&lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/889">PR #889&lt;/a>), a wallet upgrade FAQ (&lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/885">PR #885&lt;/a>), Lightning address setting during onboarding (&lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/888">PR #888&lt;/a>), and a fix for zap transactions appearing as regular payments for non-Lightning types (&lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/887">PR #887&lt;/a>).&lt;/p>
&lt;h3 id="divine-ships-api-first-video-feeds">diVine Ships API-First Video Feeds&lt;/h3>
&lt;p>&lt;a href="https://github.com/divinevideo/divine-mobile">diVine&lt;/a>, the short-form video client, merged 19 PRs this week, shifting toward an API-first architecture. &lt;a href="https://github.com/divinevideo/divine-mobile/pull/1468">PR #1468&lt;/a> introduces API-first video feeds, and &lt;a href="https://github.com/divinevideo/divine-mobile/pull/1466">PR #1466&lt;/a> adds trending, recent, and home API endpoints. &lt;a href="https://github.com/divinevideo/divine-mobile/pull/1433">PR #1433&lt;/a> indexes specific video controllers for efficient feed rendering.&lt;/p>
&lt;p>Profile handling improved with &lt;a href="https://github.com/divinevideo/divine-mobile/pull/1440">PR #1440&lt;/a> implementing a cache-plus-fresh pattern for viewing other profiles, reducing load times while ensuring data freshness. The team also shipped notification fixes (&lt;a href="https://github.com/divinevideo/divine-mobile/pull/1437">PR #1437&lt;/a>), comment flow refactoring (&lt;a href="https://github.com/divinevideo/divine-mobile/pull/1431">PR #1431&lt;/a>), and tab swiping on the Notifications screen (&lt;a href="https://github.com/divinevideo/divine-mobile/pull/1388">PR #1388&lt;/a>).&lt;/p>
&lt;h3 id="white-noise-keyring-unification-and-user-search">White Noise: Keyring Unification and User Search&lt;/h3>
&lt;p>The &lt;a href="https://github.com/marmot-protocol/whitenoise-rs">White Noise&lt;/a> backend for the &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> protocol merged 4 PRs this week. Two PRs improved keyring handling: &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/468">PR #468&lt;/a> makes the keyring service identifier configurable via &lt;code>WhitenoiseConfig&lt;/code>, and &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/475">PR #475&lt;/a> unifies the implementation on a single &lt;code>keyring-core&lt;/code> crate with platform-native stores, replacing fragmented platform-specific code. Separately, &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/470">PR #470&lt;/a> adds user search functionality.&lt;/p>
&lt;h3 id="marmot-ts-extracts-reference-chat-app">Marmot TS Extracts Reference Chat App&lt;/h3>
&lt;p>The &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> TypeScript SDK (&lt;a href="https://github.com/marmot-protocol/marmot-ts">marmot-ts&lt;/a>) merged &lt;a href="https://github.com/marmot-protocol/marmot-ts/pull/40">PR #40&lt;/a>, removing the built-in reference chat application and spinning it out into a standalone repo: &lt;a href="https://github.com/marmot-protocol/marmots-web-chat">marmots-web-chat&lt;/a>. The new repo, created February 6, is a reference implementation of the Marmot TypeScript SDK with its own CI pipeline, tabbed chat view, and independent build system. The separation lets the SDK focus on library concerns while the chat app iterates on UX independently.&lt;/p>
&lt;p>An open PR (&lt;a href="https://github.com/marmot-protocol/marmot-ts/pull/41">#41&lt;/a>) migrates marmot-ts to ts-mls v2.0.0, bringing a redesigned API with unified context objects, new message handling utilities (event creation, reading, deserialization), key package metadata helpers, and deletion event support.&lt;/p>
&lt;h3 id="alby-hub-updates">Alby Hub Updates&lt;/h3>
&lt;p>&lt;a href="https://github.com/getAlby/hub">Alby Hub&lt;/a> merged 5 PRs this week. &lt;a href="https://github.com/getAlby/hub/pull/2049">PR #2049&lt;/a> adds an Alby CLI to the app store interface. &lt;a href="https://github.com/getAlby/hub/pull/2033">PR #2033&lt;/a> fixes handling of invalid zap data in the transaction list, and &lt;a href="https://github.com/getAlby/hub/pull/2046">PR #2046&lt;/a> removes the unused &lt;code>ListTransactions&lt;/code> method from the LNClient interface.&lt;/p>
&lt;h3 id="notedeck-ships-dashboard-and-agentium">Notedeck Ships Dashboard and Agentium&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/notedeck">Notedeck&lt;/a>, the cross-platform Nostr client from Damus, merged 6 PRs this week. &lt;a href="https://github.com/damus-io/notedeck/pull/1247">PR #1247&lt;/a> adds an initial dashboard app. &lt;a href="https://github.com/damus-io/notedeck/pull/1293">PR #1293&lt;/a> introduces Agentium, a multi-agent development environment that transforms the Dave AI assistant into a system with dual AI modes and scene-based agent management. &lt;a href="https://github.com/damus-io/notedeck/pull/1276">PR #1276&lt;/a> adds a multiline message composer with Signal-style keybindings, and &lt;a href="https://github.com/damus-io/notedeck/pull/1278">PR #1278&lt;/a> delivers media performance improvements. Open PRs of note include &lt;a href="https://github.com/damus-io/notedeck/pull/1288">outbox infrastructure&lt;/a> and &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> &lt;a href="https://github.com/damus-io/notedeck/pull/1289">Git App planning&lt;/a>.&lt;/p>
&lt;h3 id="agora-ships-major-ui-overhaul">Agora Ships Major UI Overhaul&lt;/h3>
&lt;p>&lt;a href="https://gitlab.com/soapbox-pub/agora">Agora&lt;/a> merged 7 PRs this week alongside its v1.0.2 release. &lt;a href="https://gitlab.com/soapbox-pub/agora/-/merge_requests/106">PR #106&lt;/a> is the largest, closing 11 UI tasks across settings, profile editing, map interactions, search results, comment filtering, and Blossom server management. The merge disabled reaction buttons for unauthenticated users (who previously got silent failures when trying to react to posts on the map), fixed date-line map panning, and added bold matching text in search results.&lt;/p>
&lt;p>&lt;a href="https://gitlab.com/soapbox-pub/agora/-/merge_requests/108">PR #108&lt;/a> adds comment counts under feed posts and on thread pages. &lt;a href="https://gitlab.com/soapbox-pub/agora/-/merge_requests/107">PR #107&lt;/a> adds automatic retry on event load failures with an explicit reload button when retries exhaust. &lt;a href="https://gitlab.com/soapbox-pub/agora/-/merge_requests/104">PR #104&lt;/a> changes hashtag browsing to default to a global scope, since the previous country-scoped default often returned zero results.&lt;/p>
&lt;p>&lt;a href="https://gitlab.com/soapbox-pub/agora/-/merge_requests/109">PR #109&lt;/a> adds a CI step that checks translation parity across all languages, failing the build if any key is missing a value. &lt;a href="https://gitlab.com/soapbox-pub/agora/-/merge_requests/110">PR #110&lt;/a> clips large notes in feeds to preserve scroll rhythm, and &lt;a href="https://gitlab.com/soapbox-pub/agora/-/merge_requests/111">PR #111&lt;/a> fixes an iOS mobile zoom issue when commenting on actions caused by small font sizes.&lt;/p>
&lt;h3 id="clawstr-ships-cli-and-lightning-zap-buttons">Clawstr Ships CLI and Lightning Zap Buttons&lt;/h3>
&lt;p>&lt;a href="https://gitlab.com/soapbox-pub/clawstr">Clawstr&lt;/a>, the Reddit-inspired platform where AI agents create and manage communities on Nostr, merged 3 PRs this week. &lt;a href="https://gitlab.com/soapbox-pub/clawstr/-/merge_requests/11">PR #11&lt;/a> replaces all manual nak commands in the AI agent skill definitions with the new &lt;code>@clawstr/cli&lt;/code> package (&lt;code>npx -y @clawstr/cli@latest&lt;/code>), removing manual JSON event construction in favor of CLI commands and adding wallet operations (init, balance, zap, npc) and &lt;a href="https://nostrcompass.org/en/topics/nip-50/">NIP-50&lt;/a> full-text search.&lt;/p>
&lt;p>&lt;a href="https://gitlab.com/soapbox-pub/clawstr/-/merge_requests/13">PR #13&lt;/a> adds a &amp;ldquo;For Humans&amp;rdquo; documentation page and a &lt;code>ProfileZapDialog&lt;/code> component. The zap button appears on profile pages when a user has a Lightning address configured and works without login, using LNURL-pay directly with preset sats amounts and QR code display. &lt;a href="https://gitlab.com/soapbox-pub/clawstr/-/merge_requests/12">PR #12&lt;/a> documents the &lt;code>wallet sync&lt;/code> command, explaining how payments to Lightning addresses are held by NPC until agents explicitly sync their wallets.&lt;/p>
&lt;h2 id="nip-updates">NIP Updates&lt;/h2>
&lt;p>Recent changes to the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a>:&lt;/p>
&lt;p>&lt;strong>Merged:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/1561">NIP-45: HyperLogLog Relay Response&lt;/a>&lt;/strong> - &lt;a href="https://nostrcompass.org/en/topics/nip-45/">NIP-45 (Event Counting)&lt;/a> now supports HyperLogLog (HLL) approximate counting. Relays can return 256-byte HLL register values alongside COUNT responses. Clients merge these registers from multiple relays to compute approximate cardinality without downloading full event sets. The primary use case is follower and reaction counts without relying on a single relay as the authoritative source. Even two reaction events consume more bandwidth than the 256-byte HLL payload. Clients can apply HyperLogLog++ corrections for improved accuracy on small cardinalities.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2216">NIP-39: Identity Tags Moved from Kind 0&lt;/a>&lt;/strong> - &lt;a href="https://nostrcompass.org/en/topics/nip-39/">NIP-39&lt;/a> identity claim tags (&lt;code>i&lt;/code> tags) have been extracted from kind 0 metadata events to a new dedicated kind 10011. The rationale: almost no clients support these tags, so they add size to every kind 0 fetch without providing value. This is the first in a series of kind 0 extraction PRs from vitorpamplona (see &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-11-newsletter/#kind-0-slimming-campaign">News section&lt;/a>).&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Open PRs and Discussions:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2214">NIP-XX: Nostr Relay Connect (NRC)&lt;/a>&lt;/strong> - woikos proposes a protocol for accessing Nostr relays through encrypted tunneling via a public rendezvous relay. The mechanism enables access to relays behind NAT or firewalls, including personal relays running on home servers or mobile devices. The tunneling uses kind 24891/24892 events with &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encryption through a rendezvous relay that cannot decrypt the traffic. One practical application: any Nostr client can expose local storage (IndexedDB, SQLite) as a relay endpoint for cross-device sync. Standard NIP-01 semantics (REQ, EVENT, CLOSE, COUNT) pass through the tunnel transparently. Reference implementations exist in Go (ORLY Relay) and TypeScript (Smesh).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2187">Nostr Web Tokens (NWT)&lt;/a>&lt;/strong> - pippellia-btc proposes Nostr Web Tokens, a Nostr event format for conveying signed claims between web parties, inspired by JSON Web Tokens (JWTs). NWT can represent both &lt;a href="https://github.com/nostr-protocol/nips/blob/master/98.md">NIP-98&lt;/a> (HTTP Auth) and &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom authorization events&lt;/a>, giving clients flexibility in how and how long tokens remain valid. A reference Go library is available. A &lt;a href="https://github.com/pippellia-btc/nostr-web-tokens">video explanation&lt;/a> and &lt;a href="https://github.com/pippellia-btc/nostr-web-tokens?tab=readme-ov-file#comparisons">detailed comparison&lt;/a> with NIP-98 and Blossom Auth are linked in the PR.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2210">NIP-47 Simplification&lt;/a>&lt;/strong> - rolznz proposes removing the &lt;code>multi_&lt;/code> methods from &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47 (Nostr Wallet Connect)&lt;/a>, which were complex to implement and did not gain adoption. The PR also reduces duplication in encryption and backward compatibility handling, cleaning up the spec after &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-04-newsletter/#nip-updates">last week&amp;rsquo;s hold invoice addition&lt;/a>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2213">NIP-05: Move to Own Event Kind&lt;/a>&lt;/strong> - vitorpamplona proposes moving NIP-05 verification from kind 0 to a new kind 10008, enabling multiple NIP-05 identifiers per user and filtering by NIP-05 address. Part of the kind 0 slimming campaign.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2217">NIP-57: Lightning Addresses from Kind 0&lt;/a>&lt;/strong> - vitorpamplona proposes extracting lud06/lud16 (Lightning addresses) from kind 0 to a dedicated event kind per &lt;a href="https://nostrcompass.org/en/topics/nip-57/">NIP-57&lt;/a>, continuing the kind 0 slimming effort.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2165">Profile Hypercustomization&lt;/a>&lt;/strong> - fiatjaf proposes extended profile customization capabilities beyond what kind 0 currently supports.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="nip-deep-dive-nip-45-event-counting-and-hyperloglog">NIP Deep Dive: NIP-45 (Event Counting) and HyperLogLog&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-45/">NIP-45&lt;/a> (&lt;a href="https://github.com/nostr-protocol/nips/blob/master/45.md">spec&lt;/a>) defines how clients can ask relays to count events matching a filter without transferring the events themselves. This week&amp;rsquo;s merge of &lt;a href="https://github.com/nostr-protocol/nips/pull/1561">HyperLogLog support&lt;/a> adds a probabilistic data structure that solves a fundamental problem: how to count things across multiple independent relays.&lt;/p>
&lt;p>&lt;strong>The Problem:&lt;/strong>&lt;/p>
&lt;p>Counting events on a single relay is simple: send a COUNT request, get a number back. Counting across the network is harder. If relay A reports 50 reactions and relay B reports 40, the total is not 90 because many events exist on both relays. Without downloading all events to deduplicate, clients cannot compute the true count.&lt;/p>
&lt;p>&lt;strong>HyperLogLog:&lt;/strong>&lt;/p>
&lt;p>HyperLogLog (HLL) is a probabilistic algorithm that estimates the number of distinct elements in a set using a fixed amount of memory. The NIP-45 implementation uses 256 registers of one byte each, consuming exactly 256 bytes regardless of how many events are counted. The algorithm works by examining the binary representation of each event ID and tracking the position of the leading zeros. Events whose IDs start with many zeros are statistically rare, so their occurrence indicates a large set.&lt;/p>
&lt;p>&lt;strong>How It Works in NIP-45:&lt;/strong>&lt;/p>
&lt;p>A relay responding to a COUNT request can include an &lt;code>hll&lt;/code> field containing base64-encoded register values:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>[&lt;span style="color:#e6db74">&amp;#34;COUNT&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;lt;subscription_id&amp;gt;&amp;#34;&lt;/span>, {&lt;span style="color:#f92672">&amp;#34;count&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">4527&lt;/span>, &lt;span style="color:#f92672">&amp;#34;hll&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;base64 encoded 256 bytes&amp;gt;&amp;#34;&lt;/span>}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The client collects HLL values from multiple relays and merges them by taking the maximum value at each register position. This merged HLL represents the union of all event sets across relays, automatically handling deduplication. The final cardinality estimate is computed from the merged registers.&lt;/p>
&lt;p>&lt;strong>Accuracy:&lt;/strong>&lt;/p>
&lt;p>With 256 registers, the standard error is approximately 5.2%. For a true count of 1,000, the estimate will typically fall between 948 and 1,052. For larger counts, the relative error stays constant: a true count of 100,000 will estimate to roughly 94,800-105,200. HyperLogLog++ corrections improve accuracy for small cardinalities (under ~200), where the basic algorithm tends to overestimate.&lt;/p>
&lt;p>&lt;strong>Why It Matters:&lt;/strong>&lt;/p>
&lt;p>Social metrics (follower counts, reaction counts, repost counts) are a core feature of social media clients. Without HLL, clients must either query a single &amp;ldquo;trusted&amp;rdquo; relay (centralizing the count) or download all events from all relays (wasting bandwidth). HLL lets clients get a good approximate count from multiple relays with a total overhead of 256 bytes per relay, regardless of the actual count. Even two reaction events consume more bandwidth than a full HLL payload.&lt;/p>
&lt;p>The spec fixes the number of registers at 256 for interoperability. All relays produce HLL values that clients can merge, regardless of which relay implementation they run. This standardization means clients can implement HLL support once and benefit from every relay that supports it.&lt;/p>
&lt;p>&lt;strong>Current Status:&lt;/strong>&lt;/p>
&lt;p>The PR was opened by fiatjaf and had been under discussion for several months before merging this week. Relay implementations will need to add HLL computation to their COUNT handlers. Client implementations will need to add HLL merging to their count aggregation logic.&lt;/p>
&lt;h2 id="nip-deep-dive-nip-96-http-file-storage-and-the-transition-to-blossom">NIP Deep Dive: NIP-96 (HTTP File Storage) and the Transition to Blossom&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-96/">NIP-96&lt;/a> (&lt;a href="https://github.com/nostr-protocol/nips/blob/master/96.md">spec&lt;/a>) defined how Nostr clients upload, download, and manage files on HTTP media servers. Now marked as &amp;ldquo;unrecommended&amp;rdquo; in favor of &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> (BUD-based media hosting), NIP-96 remains relevant this week because Angor v0.2.5 &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-11-newsletter/#angor-v025">added NIP-96 server configuration&lt;/a> and ZSP v0.3.1 &lt;a href="https://nostrcompass.org/en/newsletters/2026-02-11-newsletter/#zsp-v031">uploads to Blossom servers&lt;/a>, illustrating a protocol transition in progress.&lt;/p>
&lt;p>&lt;strong>How NIP-96 Works:&lt;/strong>&lt;/p>
&lt;p>A client discovers a file server&amp;rsquo;s capabilities by fetching &lt;code>/.well-known/nostr/nip96.json&lt;/code>, which returns the API URL, supported content types, size limits, and available media transformations:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;api_url&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;https://file-server.example/api&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;download_url&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;https://cdn.example/files&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content_types&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;image/jpeg&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;video/webm&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;audio/*&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;plans&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;free&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;is_nip98_required&amp;#34;&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;max_byte_size&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">10485760&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;media_transformations&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;image&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;resizing&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>To upload, the client sends a &lt;code>multipart/form-data&lt;/code> POST to the API URL with a &lt;a href="https://github.com/nostr-protocol/nips/blob/master/98.md">NIP-98&lt;/a> authorization header (a signed Nostr event proving the uploader&amp;rsquo;s identity). The server returns a &lt;a href="https://nostrcompass.org/en/topics/nip-94/">NIP-94&lt;/a> file metadata structure containing the file URL, original and transformed SHA-256 hashes, MIME type, and dimensions:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;status&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;success&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;nip94_event&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;url&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;https://cdn.example/files/&amp;lt;hash&amp;gt;.png&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;ox&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;lt;original-file-hash&amp;gt;&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;x&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;lt;transformed-file-hash&amp;gt;&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;m&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;image/png&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;dim&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;800x600&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Downloads use GET requests to &lt;code>&amp;lt;api_url&amp;gt;/&amp;lt;sha256-hash&amp;gt;&lt;/code>, with optional query parameters for server-side transforms like image resizing (&lt;code>?w=320&lt;/code>). Deletion uses DELETE with NIP-98 auth, and only the original uploader can delete their files. A file listing endpoint returns paginated results of a user&amp;rsquo;s uploads.&lt;/p>
&lt;p>Users publish kind 10096 events to declare their preferred upload servers, letting clients automatically select the right server without manual configuration.&lt;/p>
&lt;p>&lt;strong>Why It Was Deprecated:&lt;/strong>&lt;/p>
&lt;p>NIP-96 tied file URLs to specific servers. If &lt;code>files.example.com&lt;/code> went down, every Nostr note referencing that server&amp;rsquo;s URLs lost its media. The server was the address, and the address was fragile.&lt;/p>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> (Blobs Stored Simply on Mediaservers) inverts this by making the SHA-256 hash of the file content the canonical identifier. A Blossom URL looks like &lt;code>https://blossom.example/&amp;lt;sha256&amp;gt;.png&lt;/code>, but any Blossom server hosting the same file serves it at the same hash path. If one server disappears, clients query another server for the same hash. Content addressing makes the data portable across servers by default.&lt;/p>
&lt;p>Blossom also simplifies the API. NIP-96 used multipart form uploads with JSON responses, transform policies, and a discovery endpoint. Blossom uses plain PUT for uploads, GET for downloads, and signed Nostr events (not HTTP headers) for authorization. The blossom specification is split into modular documents: BUD-01 covers server protocol, authorization, and retrieval, BUD-02 covers blob upload, BUD-03 covers users servers, and BUD-04 covers mirroring between servers.&lt;/p>
&lt;p>The deprecation happened in September 2025 via &lt;a href="https://github.com/nostr-protocol/nips/pull/2047">PR #2047&lt;/a>, which marked NIP-96 as &amp;ldquo;unrecommended&amp;rdquo; in the NIPs index.&lt;/p>
&lt;p>&lt;strong>The Transition in Practice:&lt;/strong>&lt;/p>
&lt;p>Servers like nostr.build and void.cat supported NIP-96 and have added or migrated to Blossom endpoints. Clients are at various stages: Angor&amp;rsquo;s v0.2.5 release this week added NIP-96 server configuration for project images, while ZSP&amp;rsquo;s v0.3.1 release uploads artifacts exclusively to Blossom servers with &lt;code>Content-Digest&lt;/code> headers for protocol compliance. Amethyst and Primal support Blossom uploads. The coexistence will likely continue until the remaining NIP-96 implementations complete their migration.&lt;/p>
&lt;p>&lt;strong>What Carries Over:&lt;/strong>&lt;/p>
&lt;p>Kind 10096 server preference events remain useful for Blossom server selection. NIP-94 file metadata (kind 1063 events) still describes file properties regardless of which upload protocol created them. The SHA-256 hashing that NIP-96 used for download URLs became the foundation of Blossom&amp;rsquo;s content addressing. NIP-96&amp;rsquo;s design informed what Blossom simplified: the lesson was that media hosting on a decentralized network requires content-addressed storage to match the censorship resistance of the relay layer.&lt;/p>
&lt;hr>
&lt;p>That&amp;rsquo;s it for this week. Building something? Have news to share? Want us to cover your project? &lt;a href="nostr:npub1wav4fae3gyfy3xj298kxj2mj8phavz7vavps34przq02j7w902qq902923">Reach out via NIP-17 DM&lt;/a> or find us on Nostr.&lt;/p></content:encoded></item><item><title>Nostr Compass #8</title><link>https://nostrcompass.org/en/newsletters/2026-02-04-newsletter/</link><pubDate>Wed, 04 Feb 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-02-04-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> rust-nostr ships a major API redesign with 21 PRs overhauling the SDK&amp;rsquo;s architecture. Nostria 3.0 launches with dual pane navigation, lists management, and a complete UI overhaul. Vector adds SIMD acceleration achieving 65x-184x speedups and ships &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> protocol support for encrypted group messaging. Frostr brings threshold signing to iOS via TestFlight. Damus implements &lt;a href="https://nostrcompass.org/en/topics/nip-19/">NIP-19 (Bech32 Encoded Entities)&lt;/a> relay hints for cross-relay content discovery. Primal Android adds NWC encryption and wallet transaction exports. nostr-tools and NDK receive reliability improvements. NIP-82 (Software Applications) expands to cover 98% of device platforms. The NIPs repository merges hold invoice support for &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47 (Nostr Wallet Connect)&lt;/a>. New protocol proposals include NIP-74 for podcasting, NIP-DB for browser event databases, and a TRUSTed Filters suite for decentralized content curation. New projects include Instagram to Nostr v2 for content migration, Pod21 launching a decentralized 3D printing marketplace, Clawstr introducing AI agent-managed communities, and Shosho and NosCall expanding live streaming and video calling capabilities.&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> rust-nostr ships a major API redesign with 21 PRs overhauling the SDK&amp;rsquo;s architecture. Nostria 3.0 launches with dual pane navigation, lists management, and a complete UI overhaul. Vector adds SIMD acceleration achieving 65x-184x speedups and ships &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> protocol support for encrypted group messaging. Frostr brings threshold signing to iOS via TestFlight. Damus implements &lt;a href="https://nostrcompass.org/en/topics/nip-19/">NIP-19 (Bech32 Encoded Entities)&lt;/a> relay hints for cross-relay content discovery. Primal Android adds NWC encryption and wallet transaction exports. nostr-tools and NDK receive reliability improvements. NIP-82 (Software Applications) expands to cover 98% of device platforms. The NIPs repository merges hold invoice support for &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47 (Nostr Wallet Connect)&lt;/a>. New protocol proposals include NIP-74 for podcasting, NIP-DB for browser event databases, and a TRUSTed Filters suite for decentralized content curation. New projects include Instagram to Nostr v2 for content migration, Pod21 launching a decentralized 3D printing marketplace, Clawstr introducing AI agent-managed communities, and Shosho and NosCall expanding live streaming and video calling capabilities.&lt;/p>
&lt;h2 id="news">News&lt;/h2>
&lt;h3 id="rust-nostr-ships-major-api-redesign">rust-nostr Ships Major API Redesign&lt;/h3>
&lt;p>The &lt;a href="https://github.com/rust-nostr/nostr">rust-nostr&lt;/a> SDK underwent a significant architecture overhaul this week with 21 merged PRs introducing breaking changes across the library. The redesign affects core APIs that most Rust developers rely on.&lt;/p>
&lt;p>&lt;a href="https://github.com/rust-nostr/nostr/pull/1245">PR #1245&lt;/a> redesigns notification APIs, while &lt;a href="https://github.com/rust-nostr/nostr/pull/1244">PR #1244&lt;/a> replaces &lt;code>RelayNotification::Shutdown&lt;/code> with &lt;code>RelayStatus::Shutdown&lt;/code> for cleaner state handling. The signer APIs now align with other SDK patterns via &lt;a href="https://github.com/rust-nostr/nostr/pull/1243">PR #1243&lt;/a>. Client and Relay methods received cleanup in &lt;a href="https://github.com/rust-nostr/nostr/pull/1242">PR #1242&lt;/a>, and client options now use a builder pattern (&lt;a href="https://github.com/rust-nostr/nostr/pull/1241">PR #1241&lt;/a>).&lt;/p>
&lt;p>Message sending APIs were redesigned in &lt;a href="https://github.com/rust-nostr/nostr/pull/1240">PR #1240&lt;/a>, REQ unsubscription in &lt;a href="https://github.com/rust-nostr/nostr/pull/1239">PR #1239&lt;/a>, and relay removal in &lt;a href="https://github.com/rust-nostr/nostr/pull/1229">PR #1229&lt;/a>. An &lt;a href="https://github.com/rust-nostr/nostr/pull/1246">open PR #1246&lt;/a> adds support for blocking APIs to round out the redesign.&lt;/p>
&lt;p>The changes bring consistency to the SDK but will require migration effort from existing projects. Developers building on rust-nostr should review the changelog carefully before upgrading.&lt;/p>
&lt;h3 id="instagram-to-nostr-v2-enables-content-migration">Instagram to Nostr v2 Enables Content Migration&lt;/h3>
&lt;p>A new tool enables creators to migrate their existing content from centralized platforms to Nostr. &lt;a href="https://github.com/primalpaul1/instagram-to-nostr-v2">Instagram to Nostr v2&lt;/a> supports importing from Instagram, TikTok, Twitter, and Substack without requiring access to the user&amp;rsquo;s private keys.&lt;/p>
&lt;p>The tool addresses a common onboarding barrier: users hesitant to start fresh on a new platform can now preserve their content history. It also supports gifting Nostr accounts to new users or proposing content to existing accounts, making it useful for helping others transition to the protocol.&lt;/p>
&lt;h3 id="pod21-decentralized-3d-printing-network">Pod21: Decentralized 3D Printing Network&lt;/h3>
&lt;p>&lt;a href="https://github.com/gobrrrme/Pod21">Pod21&lt;/a> (&lt;a href="https://pod21.com">pod21.com&lt;/a>) connects 3D printer operators with buyers using Nostr for marketplace coordination. The platform includes a &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17 (Private Direct Messages)&lt;/a> compatible DM bot that handles marketplace interactions, allowing buyers to request prints and negotiate with makers through encrypted direct messages.&lt;/p>
&lt;p>Makers list their printing capacity and capabilities; buyers browse listings and initiate orders via the bot. The architecture follows a similar pattern to other Nostr commerce applications: relay-based discovery, encrypted messaging for order coordination, and Lightning for settlement. Pod21 joins Ridestr and Shopstr as Nostr applications coordinating real-world transactions through the protocol.&lt;/p>
&lt;h3 id="clawstr-ai-agent-social-network">Clawstr: AI Agent Social Network&lt;/h3>
&lt;p>&lt;a href="https://github.com/clawstr/clawstr">Clawstr&lt;/a> launches as a Reddit-inspired platform where AI agents create and manage communities on Nostr. The platform enables autonomous agents to establish topical communities, curate content, and engage with users. Communities function like subreddits but with AI moderators and curators guiding discussions. The architecture uses Nostr&amp;rsquo;s open protocol for agent-to-agent and agent-to-human interactions, establishing a new model for community formation on decentralized social media.&lt;/p>
&lt;h2 id="releases">Releases&lt;/h2>
&lt;h3 id="ridestr-v020-roadflare-release">Ridestr v0.2.0: RoadFlare Release&lt;/h3>
&lt;p>&lt;a href="https://github.com/variablefate/ridestr">Ridestr&lt;/a> shipped &lt;a href="https://github.com/variablefate/ridestr/releases/tag/v0.2.0">v0.2.0&lt;/a>, dubbed the &amp;ldquo;RoadFlare Release,&amp;rdquo; introducing personal rideshare networks. The feature lets riders add favorite drivers to a trusted network. Drivers approve followers and share encrypted locations, enabling riders to see when trusted drivers are online and nearby. Ride requests go directly to known drivers.&lt;/p>
&lt;p>Payment reliability improved with automatic escrow recovery, better wallet sync across devices, and faster payment processing via progressive polling. &lt;a href="https://github.com/variablefate/ridestr/pull/37">PR #37&lt;/a> adds the Phase 5-6 infrastructure supporting these features. &lt;a href="https://github.com/variablefate/ridestr/releases/tag/v0.2.1">v0.2.1&lt;/a> followed with hotfixes for payment dialog bugs and the post-ride &amp;ldquo;Add to Favorites&amp;rdquo; flow.&lt;/p>
&lt;h3 id="nostria-30">Nostria 3.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostria-app/nostria">Nostria&lt;/a>, sondreb&amp;rsquo;s cross-platform client built for global scale, shipped version 3.0 with a complete UI overhaul, new logo, and hundreds of fixes. The release represents an intensive six-week development cycle.&lt;/p>
&lt;p>Dual pane navigation is the biggest UX change, allowing desktop users to reduce context switching when moving between lists, details, and threads. A new Home section provides an overview of all available features, and all screens share a unified toolbar, layout, and functionality.&lt;/p>
&lt;p>Lists management is the most significant feature update, integrating throughout the application. Users can manage profile lists and filter content in any feature: Streams, Music, or Feeds. Tired of spam in threads? Filter by favorites to see only their replies. Quick Zaps adds one-tap zapping with configurable values. Copy/Screenshot generates clipboard screenshots for sharing events anywhere. Muted Words now filters on profile fields (name, display_name, NIP-05), enabling users to block all bridged profiles with a single banned word. Settings became searchable for faster configuration changes.&lt;/p>
&lt;p>The release adds BOLT11 and BOLT12 payment request rendering, text-size and font selection, and &amp;ldquo;Note-to-Self&amp;rdquo; messaging in the Messages section with rendering of referenced content like articles and events. The new Share dialog enables quick sharing via email, websites, or direct messages to multiple recipients. Additional features include custom emoji sets, Interests (hashtag lists as dynamic feeds), Bookmarks, Public Relay Feeds, and full menu customization including which option the Nostria icon opens.&lt;/p>
&lt;p>Available on Android, iOS, Windows, and web at &lt;a href="https://www.nostria.app/">nostria.app&lt;/a>.&lt;/p>
&lt;h3 id="applesauce-v510">Applesauce v5.1.0&lt;/h3>
&lt;p>hzrd149&amp;rsquo;s &lt;a href="https://github.com/hzrd149/applesauce">Applesauce&lt;/a> library suite released v5.1.0 across all packages. &lt;a href="https://github.com/hzrd149/applesauce/releases/tag/applesauce-signers%405.1.0">applesauce-signers&lt;/a> adds support for &lt;code>switch_relays&lt;/code> and &lt;code>ping&lt;/code> methods on Nostr Connect remote signers, useful for managing signer connections programmatically. &lt;a href="https://github.com/hzrd149/applesauce/releases/tag/applesauce-loaders%405.1.0">applesauce-loaders&lt;/a> introduces &lt;code>loadAsyncMap&lt;/code> for parallel async loading. &lt;a href="https://github.com/hzrd149/applesauce/releases/tag/applesauce-react%405.1.0">applesauce-react&lt;/a> adds padding arguments to &lt;code>useAction().run()&lt;/code>. &lt;a href="https://github.com/hzrd149/applesauce/releases/tag/applesauce-core%405.1.0">applesauce-core&lt;/a> updates event-to-store mapping to handle strings directly without requiring &lt;code>onlyEvents&lt;/code>.&lt;/p>
&lt;h3 id="nak-v0183">nak v0.18.3&lt;/h3>
&lt;p>fiatjaf&amp;rsquo;s &lt;a href="https://github.com/fiatjaf/nak">nak&lt;/a> (Nostr Army Knife) reached &lt;a href="https://github.com/fiatjaf/nak/releases/tag/v0.18.3">v0.18.3&lt;/a> with stability fixes from mattn. The release prevents panics when mint URLs lack the &lt;code>://&lt;/code> separator, validates dateparser errors before using date values, and handles edge cases in AUTH challenge tag parsing. These defensive fixes make the CLI more resilient when processing malformed inputs.&lt;/p>
&lt;h3 id="aegis-v037">Aegis v0.3.7&lt;/h3>
&lt;p>&lt;a href="https://github.com/ZharlieW/Aegis">Aegis&lt;/a>, the cross-platform desktop signer, shipped &lt;a href="https://github.com/ZharlieW/Aegis/releases/tag/v0.3.7">v0.3.7&lt;/a> adding Nostr App Browser support with &lt;a href="https://nostrcompass.org/en/topics/nip-07/">NIP-07 (Browser Extension Interface)&lt;/a> signing. The release records &lt;a href="https://nostrcompass.org/en/topics/nip-04/">NIP-04 (Encrypted Direct Messages)&lt;/a> and &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44 (Versioned Encryption)&lt;/a> encryption events, allowing users to track which applications request encryption operations. The browser segment now filters by platform to show only web apps.&lt;/p>
&lt;h3 id="bitchat-v151-ios">Bitchat v1.5.1 (iOS)&lt;/h3>
&lt;p>&lt;a href="https://github.com/permissionlesstech/bitchat">Bitchat&lt;/a>, the offline-capable messaging app using Nostr and Bluetooth mesh, released &lt;a href="https://github.com/permissionlesstech/bitchat/releases/tag/v1.5.1">v1.5.1&lt;/a> with iOS security hardening. &lt;a href="https://github.com/permissionlesstech/bitchat/pull/1012">PR #1012&lt;/a> validates Nostr event signatures before processing, rejects invalid giftwraps and embedded packets, caps oversized payloads, and blocks spoofed BLE announce sender IDs. &lt;a href="https://github.com/permissionlesstech/bitchat/pull/998">PR #998&lt;/a> fixes iOS BLE mesh authentication by binding sender IDs to connection UUIDs, preventing identity spoofing in the mesh network. &lt;a href="https://github.com/permissionlesstech/bitchat/pull/972">PR #972&lt;/a> adds notification rate limiting to prevent peer discovery floods when multiple mesh devices are nearby.&lt;/p>
&lt;h3 id="keychat-v1392">KeyChat v1.39.2&lt;/h3>
&lt;p>&lt;a href="https://github.com/keychat-io/keychat-app">KeyChat&lt;/a> released &lt;a href="https://github.com/keychat-io/keychat-app/releases/tag/v1.39.2%2B6495">v1.39.2&lt;/a> adding &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> Nostr Wallet Connect support via &lt;a href="https://github.com/keychat-io/keychat-app/pull/148">PR #148&lt;/a>. Users can now connect external Lightning wallets for payments within the messaging app. The release also adds macOS desktop notifications.&lt;/p>
&lt;h3 id="nostrmo-v350">Nostrmo v3.5.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/haorendashu/nostrmo">Nostrmo&lt;/a>, the cross-platform Flutter client, shipped &lt;a href="https://github.com/haorendashu/nostrmo/releases/tag/3.5.0">v3.5.0&lt;/a> overhauling its feed system. The update replaces fixed feeds with customizable alternatives: General Feed, Mentioned Feed, and Relay Feed, each configurable through new edit pages. The release implements outbox model support for better event routing and expands local relay functionality with configurable size limits and subscription support.&lt;/p>
&lt;h3 id="shosho-v0111">Shosho v0.11.1&lt;/h3>
&lt;p>&lt;a href="https://github.com/r0d8lsh0p/shosho-releases">Shosho&lt;/a>, the live streaming app for Nostr, released &lt;a href="https://github.com/r0d8lsh0p/shosho-releases/releases/tag/v0.11.1">v0.11.1&lt;/a> with recording and VOD capabilities. The update adds room presence indicators showing who is watching streams, threaded chat conversations for better discussion organization, and Nostr Connect support on iOS via &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a>. Streamers can now save their broadcasts for later viewing while maintaining real-time chat interactions with their audience.&lt;/p>
&lt;h3 id="noscall-v050">NosCall v0.5.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/sanah9/noscall">NosCall&lt;/a>, the audio and video calling app for Nostr, shipped &lt;a href="https://github.com/sanah9/noscall/releases/tag/v0.5.0-release">v0.5.0&lt;/a> with contact groups for organizing calls by category, relay management for connection optimization, and configurable ICE server settings for improved NAT traversal. The release also adds dark mode support. NosCall uses Nostr for call signaling and coordination, enabling peer-to-peer calls without centralized servers.&lt;/p>
&lt;h3 id="divine-104">diVine 1.0.4&lt;/h3>
&lt;p>&lt;a href="https://github.com/divinevideo/divine-mobile">diVine&lt;/a>, rabble&amp;rsquo;s short-form looping video client, released &lt;a href="https://github.com/divinevideo/divine-mobile/releases/tag/1.0.4">1.0.4&lt;/a> as an Android pre-release alpha ahead of its Zapstore submission. The release focuses on testing Nostr key management, including nsec import, &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46 (Nostr Connect)&lt;/a> remote signing with nsecBunker and Amber, and nostrconnect:// URL handling. The team is soliciting feedback on relay compatibility and video interoperability with other clients. &lt;a href="https://github.com/divinevideo/divine-mobile/pull/1265">PR #1265&lt;/a> fixes iOS file path handling that caused video clips to become unusable after app updates by storing relative paths instead of absolute container paths. &lt;a href="https://github.com/divinevideo/divine-mobile/pull/1251">PR #1251&lt;/a> fixes navigation issues when viewing profiles from comments.&lt;/p>
&lt;h3 id="zeus-v0122">Zeus v0.12.2&lt;/h3>
&lt;p>&lt;a href="https://github.com/ZeusLN/zeus">Zeus&lt;/a> shipped &lt;a href="https://github.com/ZeusLN/zeus/releases/tag/v0.12.2">v0.12.2&lt;/a> as a stable release, consolidating the &lt;a href="https://nostrcompass.org/en/newsletters/2026-01-28-newsletter/#zeus-v0122-beta---nwc-fixes">NWC fixes covered in previous editions&lt;/a>.&lt;/p>
&lt;h3 id="frostr-igloo-ios-testflight">Frostr Igloo iOS TestFlight&lt;/h3>
&lt;p>&lt;a href="https://github.com/FROSTR-ORG">Frostr&lt;/a> (&lt;a href="https://frostr.org/">frostr.org&lt;/a>) launched &lt;a href="https://github.com/FROSTR-ORG/igloo-ios">Igloo for iOS&lt;/a> on &lt;a href="https://testflight.apple.com/join/72hjQe3J">TestFlight&lt;/a>, expanding threshold signing to Apple devices. Frostr uses FROST (Flexible Round-Optimized Schnorr Threshold) signatures to split nsec keys into shares distributed across devices, enabling k-of-n signing with fault tolerance. Users joining in &amp;ldquo;demo mode&amp;rdquo; participate in a live 2-of-2 threshold signature experiment, demonstrating the protocol&amp;rsquo;s real-time coordination capabilities. The iOS release joins &lt;a href="https://github.com/FROSTR-ORG/igloo-android">Igloo for Android&lt;/a> (v0.1.2), which shipped in December with &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55 (Android Signer)&lt;/a> support for cross-app signing requests. Both mobile clients complement &lt;a href="https://github.com/FROSTR-ORG/igloo-desktop">Igloo desktop&lt;/a> and the &lt;a href="https://github.com/FROSTR-ORG/frost2x">Frost2x&lt;/a> browser extension.&lt;/p>
&lt;h2 id="project-updates">Project Updates&lt;/h2>
&lt;h3 id="damus-implements-nip-19-relay-hints">Damus Implements NIP-19 Relay Hints&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/damus">Damus&lt;/a> merged &lt;a href="https://github.com/damus-io/damus/pull/3477">PR #3477&lt;/a>, implementing &lt;a href="https://nostrcompass.org/en/topics/nip-19/">NIP-19&lt;/a> relay hint consumption for event fetching. The feature enables viewing notes on relays not in the user&amp;rsquo;s configured pool by extracting hints from &lt;a href="https://nostrcompass.org/en/topics/nip-10/">NIP-10 (Reply Threads)&lt;/a>, &lt;a href="https://nostrcompass.org/en/topics/nip-18/">NIP-18 (Reposts)&lt;/a>, and NIP-19 references. The implementation uses ephemeral relay connections with reference-counted cleanup, avoiding permanent relay pool expansion.&lt;/p>
&lt;p>Additional fixes include Lightning invoice parsing (&lt;a href="https://github.com/damus-io/damus/pull/3566">PR #3566&lt;/a>), wallet view loading (&lt;a href="https://github.com/damus-io/damus/pull/3554">PR #3554&lt;/a>), relay list timing (&lt;a href="https://github.com/damus-io/damus/pull/3553">PR #3553&lt;/a>), and profile preloading to reduce visual &amp;ldquo;popping&amp;rdquo; (&lt;a href="https://github.com/damus-io/damus/pull/3550">PR #3550&lt;/a>). A &lt;a href="https://github.com/damus-io/damus/pull/3590">draft PR #3590&lt;/a> shows &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> private DM support in progress.&lt;/p>
&lt;h3 id="primal-android-ships-nwc-encryption">Primal Android Ships NWC Encryption&lt;/h3>
&lt;p>&lt;a href="https://github.com/PrimalHQ/primal-android-app">Primal Android&lt;/a> had a very active week with 18 merged PRs focused on wallet infrastructure. The app now integrates with Spark, Lightspark&amp;rsquo;s self-custodial Lightning protocol. &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/874">PR #874&lt;/a> adds NWC encryption support, while &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/872">PR #872&lt;/a> sends NWC info events when connections establish.&lt;/p>
&lt;p>&lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/870">PR #870&lt;/a> enables CSV export for wallet transactions, useful for accounting and tax purposes. &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/716">PR #716&lt;/a> adds a local account switcher in the Note Editor. Multiple wallet restore fixes (&lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/876">PR #876&lt;/a>, &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/875">PR #875&lt;/a>, &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/873">PR #873&lt;/a>) address edge cases for users with non-Spark wallet configurations.&lt;/p>
&lt;h3 id="marmot-typescript-sdk-adds-message-history">Marmot TypeScript SDK Adds Message History&lt;/h3>
&lt;p>The &lt;a href="https://github.com/marmot-protocol/marmot">Marmot&lt;/a> protocol&amp;rsquo;s TypeScript implementation continues development. &lt;a href="https://github.com/marmot-protocol/marmot-ts/pull/38">PR #38&lt;/a> by hzrd149 implements message history persistence with pagination for the reference chat application, while &lt;a href="https://github.com/marmot-protocol/marmot-ts/pull/39">PR #39&lt;/a> improves library ergonomics.&lt;/p>
&lt;p>On the Rust side, &lt;a href="https://github.com/marmot-protocol/mdk/pull/161">PR #161&lt;/a> implements retryable state handling to preserve message context on failure, and &lt;a href="https://github.com/marmot-protocol/mdk/pull/164">PR #164&lt;/a> switches to std::sync::Mutex to avoid tokio panics with SQLite. The whitenoise-rs backend adds &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/418">Amber integration&lt;/a> (&lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/418">PR #418&lt;/a>), &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/467">upgrades to MDK and nostr-sdk 0.44&lt;/a> (&lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/467">PR #467&lt;/a>), and introduces real-time notification streaming via &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/460">PR #460&lt;/a> with NewMessage and GroupInvite event types.&lt;/p>
&lt;h3 id="haven-adds-periodic-wot-refresh">HAVEN Adds Periodic WoT Refresh&lt;/h3>
&lt;p>&lt;a href="https://github.com/bitvora/haven">HAVEN&lt;/a>, the personal relay, merged &lt;a href="https://github.com/bitvora/haven/pull/108">PR #108&lt;/a> adding periodic &lt;a href="https://nostrcompass.org/en/topics/web-of-trust/">Web of Trust&lt;/a> refresh. The feature ensures trust scores stay current as users&amp;rsquo; social graphs evolve, improving spam filtering accuracy over time.&lt;/p>
&lt;h3 id="nostr-tools">nostr-tools&lt;/h3>
&lt;p>&lt;a href="https://github.com/nbd-wtf/nostr-tools">nostr-tools&lt;/a>, the core JavaScript library, received multiple improvements this week. Commits include a &lt;a href="https://github.com/nbd-wtf/nostr-tools/commit/c2423f7f31853d97fef2e3d649204cec328e81d5">fix for hashtag parsing after newlines&lt;/a> in &lt;a href="https://nostrcompass.org/en/topics/nip-27/">NIP-27 (Text Note References)&lt;/a> mentions, &lt;a href="https://github.com/nbd-wtf/nostr-tools/commit/ab802c8dbe35d29feb732ba54e82a346c21c32e2">automatic pruning of broken relay objects with idle tracking&lt;/a> for connection cleanup, &lt;a href="https://github.com/nbd-wtf/nostr-tools/commit/be9b91318fea6a0cb154b8734a15b50a4c1e7638">message queue removal&lt;/a> for single-threaded performance optimization, and &lt;a href="https://github.com/nbd-wtf/nostr-tools/commit/05b1fba5113182ac0aa3c72d1f511cd956a7c139">source file exports&lt;/a> for better TypeScript imports.&lt;/p>
&lt;h3 id="ndk">NDK&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-dev-kit/ndk">NDK&lt;/a> shipped &lt;a href="https://github.com/nostr-dev-kit/ndk/commit/26abea24726ed844fdd091744ac9f768f1a530a0">beta.71&lt;/a> with a &lt;a href="https://github.com/nostr-dev-kit/ndk/commit/33e759508bc656dc45d3d77c741edf581af323f3">fix for reconnection after device sleep/wake cycles and stale connection handling&lt;/a>, addressing reliability issues for mobile applications.&lt;/p>
&lt;h3 id="notedeck">Notedeck&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/notedeck">Notedeck&lt;/a>, the Damus team&amp;rsquo;s desktop client, has an &lt;a href="https://github.com/damus-io/notedeck/pull/1279">open PR #1279&lt;/a> adding a &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34 (Git Collaboration)&lt;/a> viewer. This would enable browsing git repositories, patches, and issues published to Nostr relays directly within the client, making Notedeck a potential front-end for ngit-based workflows.&lt;/p>
&lt;h3 id="njump">njump&lt;/h3>
&lt;p>&lt;a href="https://github.com/fiatjaf/njump">njump&lt;/a>, the Nostr web gateway, added support for two &lt;a href="https://nostrcompass.org/en/topics/nip-51/">NIP-51 (Lists)&lt;/a> event types via &lt;a href="https://github.com/fiatjaf/njump/pull/152">PR #152&lt;/a>. The gateway now renders kind:30000 Follow Sets, which are categorized groupings of users that clients can display in different contexts, and kind:39089 Starter Packs, which are curated profile collections designed for sharing and group following. These additions let njump display community-curated lists when users share nevent links.&lt;/p>
&lt;h3 id="amethyst">Amethyst&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a>, the Android client, fixed a bug preventing video sharing from the player view (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/1695">PR #1695&lt;/a>). The &amp;ldquo;Share video&amp;rdquo; option was failing to appear because the content parameter was not being passed to the control buttons component. Users can now share Nostr video content to other apps directly from the player. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/1693">PR #1693&lt;/a> fixes Jackson JSON deserialization crashes that occurred when parsing certain malformed events.&lt;/p>
&lt;h3 id="jumble">Jumble&lt;/h3>
&lt;p>&lt;a href="https://github.com/CodyTseng/jumble">Jumble&lt;/a>, the web client focused on relay feed browsing, added audio file uploads via clipboard in &lt;a href="https://github.com/CodyTseng/jumble/pull/743">PR #743&lt;/a>. Users can now paste audio files directly into the post editor, which uploads them to configured media servers and embeds the URL in the note. The feature mirrors existing image paste functionality.&lt;/p>
&lt;h3 id="flotilla">Flotilla&lt;/h3>
&lt;p>&lt;a href="https://github.com/coracle-social/flotilla">Flotilla&lt;/a>, hodlbod&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29 (Relay-Based Groups)&lt;/a> communities client, shipped notifications via &lt;a href="https://github.com/coracle-social/flotilla/pull/270">PR #270&lt;/a>. The update refactors the alert system from anchor-based polling to local pull notifications for web and push notifications for mobile. The architecture implements the proposed NIP-9a standard (see &lt;a href="https://github.com/nostr-protocol/nips/pull/2194">PR #2194&lt;/a> below), where users register webhook callbacks with relays and receive encrypted event payloads when filters match.&lt;/p>
&lt;h3 id="formstr">Formstr&lt;/h3>
&lt;p>&lt;a href="https://github.com/abh3po/nostr-forms">Formstr&lt;/a>, the Nostr-native forms application, added form import and encrypted form support in &lt;a href="https://github.com/abh3po/nostr-forms/pull/422">PR #422&lt;/a>. Users can now import existing forms via a response link, making it easy to pull in form structures from other Formstr instances. The encryption feature allows form creators to restrict responses so only designated recipients can read submissions, useful for surveys collecting sensitive information.&lt;/p>
&lt;h3 id="pollerama">Pollerama&lt;/h3>
&lt;p>&lt;a href="https://github.com/abh3po/nostr-polls">Pollerama&lt;/a> (&lt;a href="https://pollerama.fun">pollerama.fun&lt;/a>), built on &lt;a href="https://github.com/nbd-wtf/nostr-tools">nostr-tools&lt;/a>, added &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> DM sharing for polls via &lt;a href="https://github.com/abh3po/nostr-polls/pull/141">PR #141&lt;/a> and &lt;a href="https://github.com/abh3po/nostr-polls/pull/142">PR #142&lt;/a>. Users can now share polls directly to contacts through encrypted direct messages.&lt;/p>
&lt;h3 id="nostrability-schemata">Nostrability Schemata&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostrability/schemata">Nostrability schemata&lt;/a>, the JSON verification schema collection for Nostr events, added &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59 (Gift Wrap)&lt;/a> coverage via &lt;a href="https://github.com/nostrability/schemata/pull/59">PR #59&lt;/a>. The update includes schemas for kind 13 (seal) and kind 1059 (gift wrap) events, complementing existing &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> schema coverage.&lt;/p>
&lt;h3 id="vector">Vector&lt;/h3>
&lt;p>&lt;a href="https://github.com/VectorPrivacy/Vector">Vector&lt;/a>, the privacy-focused desktop messenger using &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a>, &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a>, and &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> for zero-metadata encryption, merged &lt;a href="https://github.com/VectorPrivacy/Vector/pull/39">PR #39&lt;/a> introducing SIMD-accelerated performance optimizations. Hex encoding runs 65x faster, image preview generation up to 38x faster, and message lookups 184x faster via binary search indexing. The PR adds ARM64 NEON intrinsics for Apple Silicon and x86_64 AVX2/SSE2 with runtime detection for Windows and Linux. Memory usage dropped with message structs reduced from 472 to 128 bytes and npub storage cut by 99.6% through interning.&lt;/p>
&lt;p>Vector v0.3.0 (December 2025) integrated &lt;a href="https://github.com/marmot-protocol/mdk">MDK (Marmot Development Kit)&lt;/a> for MLS protocol-based group messaging, bringing end-to-end encrypted groups with forward secrecy to the client. MIP-04 file sharing now handles imeta attachments for MLS groups, designed for interoperability with &lt;a href="https://nostrcompass.org/en/newsletters/2026-01-28-newsletter/#marmot-protocol-updates">White Noise&lt;/a>. The release also introduced a Mini Apps platform with WebXDC-based P2P multiplayer games, a decentralized app store called The Nexus, PIVX wallet integration for in-app payments, message editing with full history tracking, and 4x memory reduction during image uploads.&lt;/p>
&lt;h2 id="nip-updates">NIP Updates&lt;/h2>
&lt;p>Recent changes to the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a>:&lt;/p>
&lt;p>&lt;strong>Merged:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/1913">NIP-47: Hold Invoice Support&lt;/a>&lt;/strong> - &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47 (Nostr Wallet Connect)&lt;/a> now supports hold invoices, enabling advanced payment workflows where receivers must explicitly settle or cancel payments. The PR adds three new RPC methods: &lt;code>make_hold_invoice&lt;/code> creates a hold invoice using a pre-generated preimage and payment hash, &lt;code>settle_hold_invoice&lt;/code> claims payment by providing the original preimage, and &lt;code>cancel_hold_invoice&lt;/code> rejects payment using its payment hash. A new &lt;code>hold_invoice_accepted&lt;/code> notification fires when a payer locks in payment. This enables use cases like pay-to-unlock content, marketplace escrow systems, and payment gating. Implementations are already underway in &lt;a href="https://github.com/getAlby/hub/pull/1298">Alby Hub&lt;/a>, &lt;a href="https://github.com/getAlby/js-sdk/pull/382">Alby JS-SDK&lt;/a>, and &lt;a href="https://github.com/relaystr/ndk/pull/147">dart NDK&lt;/a>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2208">NIP-05: Lowercase Requirement&lt;/a>&lt;/strong> - &lt;a href="https://nostrcompass.org/en/topics/nip-05/">NIP-05 (Domain Verification)&lt;/a> now explicitly requires lowercase for both hex public keys and local names in the &lt;code>nostr.json&lt;/code> file. This was implicit in the spec but not stated, causing interoperability issues when some implementations used mixed case while others normalized to lowercase. Clients validating NIP-05 identifiers should now reject any &lt;code>nostr.json&lt;/code> responses containing uppercase characters in keys or names.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2205">NIP-73: Country Codes&lt;/a>&lt;/strong> - &lt;a href="https://nostrcompass.org/en/topics/nip-73/">NIP-73 (Geotags)&lt;/a> now supports ISO 3166 country codes as an alternative to geohashes. Events can include &lt;code>[&amp;quot;g&amp;quot;, &amp;quot;US&amp;quot;, &amp;quot;countryCode&amp;quot;]&lt;/code> tags to indicate country-level location without requiring precise coordinates. This enables country-based content filtering and discovery for applications where exact location is unnecessary or undesirable. The PR also added a missing geohash example to the spec documentation.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Open PRs and Discussions:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/1336">NIP-82: Software Applications&lt;/a>&lt;/strong> - franzap announced a major update to this draft specification, which defines how software applications are distributed via Nostr using kind 30063 release events. The update now covers approximately 98% of device platforms globally, including macOS, Linux, Windows, FreeBSD, WASM environments, VS Code extensions, Chrome extensions, and Web Bundles/PWAs. The team is focusing next on Android, PWA, and iOS support, inviting developers to converge on this shared standard. Zapstore plans to migrate to the new format in the coming weeks.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2211">NIP-74: Podcasts&lt;/a>&lt;/strong> - Defines addressable events for podcast shows (kind 30074) and episodes (kind 30075). Shows include metadata like title, description, categories, and cover images. Episodes reference their parent show and include enclosure URLs, durations, and chapter markers. The spec integrates with Podcasting 2.0 metadata standards and includes value tags for V4V (value-for-value) monetization via Lightning. Platforms like &lt;a href="https://transmit.fm">transmit.fm&lt;/a>, a Nostr-native podcast publishing platform, can publish directly to relays using this format, enabling podcasters to distribute content without intermediaries.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2207">NIP-FR: Friends-Only Notes&lt;/a>&lt;/strong> - Proposes a mechanism for publishing notes visible only to a user-defined friends list using a shared symmetric key called a ViewKey. The author encrypts notes (kind 2044) with the ViewKey using NIP-44. The ViewKey itself is distributed to each friend once via &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59 (Gift Wrap)&lt;/a>. Friends who possess the ViewKey can decrypt and read the notes; everyone else sees only ciphertext. When the author removes a friend, the ViewKey is rotated: a new key is generated and redistributed to all remaining friends via gift wrap, ensuring the removed friend loses access to future posts. This approach separates content encryption (symmetric, efficient) from key distribution (asymmetric, per-friend), keeping the protocol lightweight while enabling a frequently requested privacy feature.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrhub.io/e/1a451c1581888215ae5c311d36c8a7c7d9e5e81f1f4010de4afaf7fcbd553e90">NIP-DB: Browser Nostr Event Database Interface&lt;/a>&lt;/strong> (&lt;a href="https://github.com/hzrd149/nostr-bucket/blob/master/nip.md">spec&lt;/a>) - Proposes a standard &lt;code>window.nostrdb&lt;/code> interface for browser extensions that provide local Nostr event storage. The API includes methods for adding events, querying by ID or filter, counting matches, and subscribing to updates. Web applications can use this interface to read from locally cached events without making relay requests, reducing bandwidth and latency. hzrd149&amp;rsquo;s &lt;a href="https://github.com/hzrd149/nostr-bucket">nostr-bucket&lt;/a> browser extension provides a reference implementation, injecting the interface into all browser tabs. A companion &lt;a href="https://github.com/hzrd149/window.nostrdb.js">polyfill library&lt;/a> implements the same API using IndexedDB for environments without the extension.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrhub.io/e/237667820943d1c8bbe7ab7732623ae51b337f177776ece439d4a8be84708eb7">TRUSTed Filters&lt;/a>&lt;/strong> - A suite of five related proposals for decentralized content curation, building on vitorpamplona&amp;rsquo;s merged &lt;a href="https://github.com/nostr-protocol/nips/pull/1534">Trusted Assertions PR #1534&lt;/a>. The core specification introduces kind 17570 events for declaring Trust Provider Preferences, allowing users to specify which services they trust for event filtering and ranking. Trust providers publish assertions (kind 37571), statistics (kind 37572), and rankings (kind 37573) that clients can subscribe to. The system uses a plugin architecture with W/w tags to specify filter types and transformations. This enables computationally expensive operations like spam detection, reputation scoring, and content ranking to run on dedicated infrastructure while users maintain control over which providers they trust. The suite includes separate specs for filter presets, user rankings, trusted events, and plugin definitions.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2194">NIP-9a: Push Notifications&lt;/a>&lt;/strong> - hodlbod proposes a standard for relay-based push notifications using kind 30390 registration events. Users create a registration containing filters for events they want to receive and a webhook callback URL. The registration is encrypted to the relay&amp;rsquo;s pubkey (from its NIP-11 &lt;code>self&lt;/code> field). When matching events occur, relays POST to the callback with the event ID (plaintext for deduplication) and the event itself (NIP-44 encrypted to the user). This architecture lets relays push notifications while protecting event content from intermediary push servers. Flotilla&amp;rsquo;s &lt;a href="https://github.com/coracle-social/flotilla/pull/270">PR #270&lt;/a> implements this standard.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/SigmaEnterprise/Catallax">Catallax&lt;/a>&lt;/strong> - Proposes a decentralized contract work protocol with escrow using kind 33400 events. The system defines three roles: arbiters announce availability and terms, patrons create funded tasks with escrowed Bitcoin, and free agents complete work to claim payment. Arbiters resolve disputes when needed. The protocol enables trustless freelance work coordination where funds are locked until deliverables are accepted or arbitration concludes.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="nip-deep-dive-nip-47-nostr-wallet-connect">NIP Deep Dive: NIP-47 (Nostr Wallet Connect)&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> defines Nostr Wallet Connect (NWC), a protocol for remote Lightning wallet control using Nostr as the communication layer. With this week&amp;rsquo;s hold invoice support addition, NWC now covers the full range of Lightning operations.&lt;/p>
&lt;p>The protocol works through a simple exchange. A wallet application publishes a &amp;ldquo;wallet info&amp;rdquo; event (kind 13194) describing its capabilities. Client applications send encrypted requests (kind 23194) asking the wallet to perform operations like paying invoices, creating invoices, or checking balances. The wallet responds with encrypted results (kind 23195).&lt;/p>
&lt;p>NWC uses &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encryption between the client and wallet, with a dedicated keypair for wallet operations, keeping it separate from the user&amp;rsquo;s main identity. This separation means compromising an NWC connection does not expose the user&amp;rsquo;s Nostr identity.&lt;/p>
&lt;p>&lt;strong>Supported Methods:&lt;/strong>&lt;/p>
&lt;p>The spec defines methods for core Lightning operations: &lt;code>pay_invoice&lt;/code> sends payments, &lt;code>make_invoice&lt;/code> generates invoices for receiving, &lt;code>lookup_invoice&lt;/code> checks payment status, &lt;code>get_balance&lt;/code> returns the wallet balance, and &lt;code>list_transactions&lt;/code> provides payment history. The newly merged &lt;code>pay_keysend&lt;/code> enables payments without invoices, and &lt;code>hold_invoice&lt;/code> supports conditional payments.&lt;/p>
&lt;p>&lt;strong>Example Events:&lt;/strong>&lt;/p>
&lt;p>The wallet service publishes an info event (kind 13194) advertising its capabilities:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">13194&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;wallet service pubkey&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;pay_invoice get_balance make_invoice lookup_invoice list_transactions notifications&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;encryption&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;nip44_v2&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;notifications&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;payment_received payment_sent&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;unix timestamp&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;event hash&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;wallet service signature&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>A client sends an encrypted request (kind 23194) to pay an invoice:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">23194&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;client ephemeral pubkey from connection URI secret&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;NIP-44 encrypted: {\&amp;#34;method\&amp;#34;: \&amp;#34;pay_invoice\&amp;#34;, \&amp;#34;params\&amp;#34;: {\&amp;#34;invoice\&amp;#34;: \&amp;#34;lnbc50n1...\&amp;#34;}}&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;lt;wallet service pubkey&amp;gt;&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;encryption&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;nip44_v2&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;unix timestamp&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;event hash&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;client ephemeral key signature&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The wallet service responds (kind 23195) with the payment result:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">23195&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;wallet service pubkey&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;NIP-44 encrypted: {\&amp;#34;result_type\&amp;#34;: \&amp;#34;pay_invoice\&amp;#34;, \&amp;#34;result\&amp;#34;: {\&amp;#34;preimage\&amp;#34;: \&amp;#34;...\&amp;#34;}, \&amp;#34;error\&amp;#34;: null}&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;lt;client ephemeral pubkey&amp;gt;&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;e&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;lt;request event id&amp;gt;&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;unix timestamp&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;event hash&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;wallet service signature&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>e&lt;/code> tag in the response references the original request, allowing clients to match responses to their requests.&lt;/p>
&lt;p>&lt;strong>Hold Invoices:&lt;/strong>&lt;/p>
&lt;p>This week&amp;rsquo;s &lt;a href="https://github.com/nostr-protocol/nips/pull/1913">PR #1913&lt;/a> added hold invoice support, enabling escrow-style payments. Unlike standard invoices where the recipient immediately claims payment by releasing the preimage, hold invoices let the recipient defer this decision. When a payer sends to a hold invoice, funds lock along the payment route. The recipient then chooses to either settle (release the preimage and claim funds) or cancel (reject payment, returning funds to the payer). If neither action occurs, the payment times out and funds return automatically. The PR adds three NWC methods: &lt;code>make_hold_invoice&lt;/code>, &lt;code>settle_hold_invoice&lt;/code>, and &lt;code>cancel_hold_invoice&lt;/code>, plus a &lt;code>hold_invoice_accepted&lt;/code> notification. This mechanism powers applications like Ridestr&amp;rsquo;s rideshare escrow and marketplace dispute resolution.&lt;/p>
&lt;p>&lt;strong>Current Implementations:&lt;/strong>&lt;/p>
&lt;p>Major wallets support NWC: Zeus, Alby, and Primal (as of this week&amp;rsquo;s &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/874">PR #874&lt;/a>) all implement wallet-side support. On the client side, Damus, Amethyst, and most major Nostr clients can connect to NWC wallets for zapping and payments.&lt;/p>
&lt;p>The protocol enables a separation of concerns: users can run their wallet on one device while interacting with Nostr from another, with Nostr relays serving as the communication channel. This architecture means mobile clients do not need to hold funds directly, improving security by keeping wallet infrastructure separate from social clients.&lt;/p>
&lt;p>&lt;strong>Security Considerations:&lt;/strong>&lt;/p>
&lt;p>NWC connections should be treated as sensitive. While the encryption protects message content, the wallet pubkey and connection secret must be guarded. Applications should allow users to revoke connections and set spending limits. The protocol supports capability restrictions, so wallets can limit what operations a particular connection can perform.&lt;/p>
&lt;h2 id="nip-deep-dive-nip-59-gift-wrap">NIP Deep Dive: NIP-59 (Gift Wrap)&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> defines a protocol for encapsulating any Nostr event in multiple layers of encryption, hiding the sender&amp;rsquo;s identity from relays and observers. This week&amp;rsquo;s proposals for friends-only notes (NIP-FR) and push notifications (NIP-9a) both rely on gift wrapping, making it a foundational privacy primitive worth understanding.&lt;/p>
&lt;p>&lt;strong>The Three Layers:&lt;/strong>&lt;/p>
&lt;p>Gift wrapping uses three nested structures:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Rumor&lt;/strong> (unsigned event): The original content as a Nostr event without a signature. The rumor cannot be sent directly to relays because relays reject unsigned events.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Seal&lt;/strong> (kind 13): The rumor is encrypted using &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> and placed in a kind 13 event. The seal IS signed by the actual author&amp;rsquo;s key. This is the cryptographic proof of authorship.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Gift Wrap&lt;/strong> (kind 1059): The seal is encrypted and placed in a kind 1059 event signed by a random, one-time keypair. The gift wrap includes a &lt;code>p&lt;/code> tag for routing to the recipient.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>A Common Misconception: Deniability&lt;/strong>&lt;/p>
&lt;p>The spec mentions that unsigned rumors provide &amp;ldquo;deniability,&amp;rdquo; but this is misleading. The seal layer IS signed by the real author. When the recipient decrypts the gift wrap and then the seal, they have cryptographic proof of who sent the message. The recipient could even construct a zero-knowledge proof revealing the sender&amp;rsquo;s identity without exposing their own private key.&lt;/p>
&lt;p>What gift wrap actually provides is &lt;strong>sender privacy from observers&lt;/strong>: relays and third parties cannot determine who sent the message because they only see the gift wrap signed by a random key. But the recipient always knows, and can prove it.&lt;/p>
&lt;p>&lt;strong>Example Events:&lt;/strong>&lt;/p>
&lt;p>Here is the complete three-layer structure from the spec (sending &amp;ldquo;Are you going to the party tonight?&amp;rdquo;):&lt;/p>
&lt;p>The rumor (unsigned, cannot be published to relays):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1691518405&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Are you going to the party tonight?&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;611df01bfcf85c26ae65453b772d8f1dfd25c264621c0277e1fc1518686faef9&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;9dd003c6d3b73b74a85a9ab099469ce251653a7af76f523671ab828acd2a0ef9&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The seal (kind 13, signed by real author, contains encrypted rumor):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">13&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;611df01bfcf85c26ae65453b772d8f1dfd25c264621c0277e1fc1518686faef9&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;AqBCdwoS7/tPK+QGkPCadJTn8FxGkd24iApo3BR9/M0uw6n4RFAFSPAKKMgkzVMo...&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1703015180&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;28a87d7c074d94a58e9e89bb3e9e4e813e2189f285d797b1c56069d36f59eaa7&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;02fc3facf6621196c32912b1ef53bac8f8bfe9db51c0e7102c073103586b0d29...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The gift wrap (kind 1059, signed by random ephemeral key, contains encrypted seal):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1059&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;18b1a75918f1f2c90c23da616bce317d36e348bcf5f7ba55e75949319210c87c&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;AhC3Qj/QsKJFWuf6xroiYip+2yK95qPwJjVvFujhzSguJWb/6TlPpBW0CGFwfuf...&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1703021488&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [[&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;166bf3765ebd1fc55decfe395beff2ea3b2a4e0a8946e7eb578512b555737c99&amp;#34;&lt;/span>]],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;5c005f3ccf01950aa8d131203248544fb1e41a0d698e846bd419cec3890903ac&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;35fabdae4634eb630880a1896a886e40fd6ea8a60958e30b89b33a93e6235df7...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Notice: the seal&amp;rsquo;s &lt;code>pubkey&lt;/code> is the real author (&lt;code>611df01...&lt;/code>), while the gift wrap&amp;rsquo;s &lt;code>pubkey&lt;/code> is a random one-time key (&lt;code>18b1a75...&lt;/code>). Relays only see the gift wrap, so they cannot attribute the message to the real author.&lt;/p>
&lt;p>&lt;strong>What Each Layer Protects:&lt;/strong>&lt;/p>
&lt;p>The rumor is unsigned and cannot be published to relays directly. The seal is signed by the real author and proves authorship to the recipient. The gift wrap is signed by a random one-time key, hiding the real author from relays and observers. Only the recipient can decrypt through both layers to reach the original content and verify the author&amp;rsquo;s signature on the seal.&lt;/p>
&lt;p>&lt;strong>Current Applications:&lt;/strong>&lt;/p>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17 (Private Direct Messages)&lt;/a> uses gift wrap for encrypted DMs, replacing the older NIP-04 scheme. The proposed NIP-FR (friends-only notes) uses gift wrapping to distribute ViewKeys to friends, who then decrypt notes encrypted with those keys. NIP-9a (push notifications) encrypts notification payloads using gift wrap principles.&lt;/p>
&lt;p>&lt;strong>Metadata Protection:&lt;/strong>&lt;/p>
&lt;p>Timestamps should be randomized to thwart timing analysis. Relays should require AUTH before serving kind 1059 events and only serve them to the marked recipient. When sending to multiple recipients, create separate gift wraps for each.&lt;/p>
&lt;hr>
&lt;p>That&amp;rsquo;s it for this week. Building something? Have news to share? Want us to cover your project? &lt;a href="nostr:npub1wav4fae3gyfy3xj298kxj2mj8phavz7vavps34przq02j7w902qq902923">Reach out via NIP-17 DM&lt;/a> or find us on Nostr.&lt;/p></content:encoded></item><item><title>Nostr Compass #7</title><link>https://nostrcompass.org/en/newsletters/2026-01-28-newsletter/</link><pubDate>Wed, 28 Jan 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-01-28-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> Ridestr brings decentralized ridesharing to Nostr with &lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a> payments and encrypted location sharing. Pomade introduces email-based recovery for multisig signers. Damus ships &lt;a href="https://nostrcompass.org/en/topics/negentropy/">negentropy&lt;/a> for reliable DM syncing. Amethyst&amp;rsquo;s desktop app adds search, bookmarks, and zaps. Amber v4.1.1 displays relay trust scores. Marmot merges MIP-03 and builds a TypeScript reference chat app. diVine adds &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> QR authentication and mentions support. New NIP proposals address community management, sequence-based sync, and encrypted file storage. We also take a look back at five years of Nostr Januaries, tracing the protocol&amp;rsquo;s evolution from a handful of early adopters in 2021 through Damus&amp;rsquo;s explosive App Store launch in 2023 to the maturing client ecosystem of 2025.&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> Ridestr brings decentralized ridesharing to Nostr with &lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a> payments and encrypted location sharing. Pomade introduces email-based recovery for multisig signers. Damus ships &lt;a href="https://nostrcompass.org/en/topics/negentropy/">negentropy&lt;/a> for reliable DM syncing. Amethyst&amp;rsquo;s desktop app adds search, bookmarks, and zaps. Amber v4.1.1 displays relay trust scores. Marmot merges MIP-03 and builds a TypeScript reference chat app. diVine adds &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> QR authentication and mentions support. New NIP proposals address community management, sequence-based sync, and encrypted file storage. We also take a look back at five years of Nostr Januaries, tracing the protocol&amp;rsquo;s evolution from a handful of early adopters in 2021 through Damus&amp;rsquo;s explosive App Store launch in 2023 to the maturing client ecosystem of 2025.&lt;/p>
&lt;h2 id="news">News&lt;/h2>
&lt;h3 id="ridestr-brings-decentralized-ridesharing-to-nostr">Ridestr Brings Decentralized Ridesharing to Nostr&lt;/h3>
&lt;p>&lt;a href="https://github.com/variablefate/ridestr">Ridestr&lt;/a> is developing a peer-to-peer rideshare application built entirely on Nostr, enabling direct driver-rider transactions with Bitcoin and &lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a> payments. The protocol uses custom event kinds (30173, 3173-3175, 30180/30181) to coordinate rides while maintaining privacy through progressive location disclosure and &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encryption.&lt;/p>
&lt;p>The system works through a carefully choreographed flow: drivers broadcast availability using geohash-encoded locations (~5km precision) via kind 30173 events, riders request rides with fare estimates through kind 3173, and payments are secured using HTLC escrow tokens before the ride begins. Location privacy is preserved through progressive disclosure, where pickup details are only revealed when drivers arrive and destinations are shared after PIN verification. All communication between parties uses &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encryption for privacy.&lt;/p>
&lt;p>Ridestr implements payment security through HTLC escrow with P2PK signatures. When a rider accepts a driver&amp;rsquo;s offer, they lock &lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a> tokens with a payment hash that only the driver can claim after ride completion. The protocol currently operates with single-mint architecture, requiring riders and drivers to use the same &lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a> mint. The project&amp;rsquo;s Kotlin-based Android implementation handles proof verification and recovery of stale proofs through NUT-07 state checks.&lt;/p>
&lt;p>Ridestr tackles challenges that most Nostr applications avoid: real-time location coordination, payment escrow with dispute resolution, and reputation systems for physical-world interactions. The project is in beta and demonstrates that Nostr&amp;rsquo;s event model can support peer-to-peer service marketplaces, not just content sharing.&lt;/p>
&lt;h3 id="pomade-launches-alpha-recovery-system-for-multisig-signers">Pomade Launches Alpha Recovery System for Multisig Signers&lt;/h3>
&lt;p>&lt;a href="https://github.com/coracle-social/pomade">Pomade&lt;/a>, developed by hodlbod, builds on the existing &lt;a href="https://github.com/FROSTR-ORG">FROSTR&lt;/a> ecosystem to provide a recovery-focused threshold signing service. Using &lt;a href="https://nostrcompass.org/en/topics/frost/">FROST&lt;/a> (Flexible Round-Optimized Schnorr Threshold) signatures via the @frostr/bifrost library, Pomade adds email-based recovery flows on top of the threshold cryptography. The system shards a user&amp;rsquo;s secret key using Shamir Secret Sharing, distributing shares across multiple independent signers with a configurable threshold (2-of-3, 3-of-5, etc.).&lt;/p>
&lt;p>The protocol operates entirely over Nostr using a single event kind (28350) with &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encrypted payloads. When signing, the client requests partial signatures from at least &lt;code>threshold&lt;/code> signers, then aggregates these into a valid Schnorr signature. For encryption, signers collaborate to derive shared secrets via ECDH without any single party learning the full key.&lt;/p>
&lt;p>Recovery works through two authentication methods: password-based (using argon2id with the signer&amp;rsquo;s pubkey as salt) or email OTP. To prevent MITM attacks during OTP recovery, each signer generates its own verification code with a client-provided prefix, requiring users to authenticate independently with each signer. The protocol requires proof-of-work on registration events (20+ bits per &lt;a href="https://nostrcompass.org/en/topics/nip-13/">NIP-13&lt;/a>) to prevent spam.&lt;/p>
&lt;p>The trust model is explicit: if &lt;code>threshold&lt;/code> signers collude, they can steal the key. Email providers are fully trusted since they can intercept OTPs. Users cannot independently recover their full secret key; doing so requires cooperation from &lt;code>threshold&lt;/code> signers. The protocol is designed for onboarding new users unfamiliar with key management, with the explicit recommendation that users migrate to self-custody once comfortable. Pomade warns about potential &amp;ldquo;key loss, theft, denial of service, or metadata leakage&amp;rdquo; given its unaudited alpha status.&lt;/p>
&lt;h2 id="releases">Releases&lt;/h2>
&lt;h3 id="damus-ships-negentropy-for-reliable-dm-syncing">Damus Ships Negentropy for Reliable DM Syncing&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/damus/tree/v1.13">Damus v1.13&lt;/a> ships the negentropy implementation &lt;a href="https://nostrcompass.org/en/newsletters/2026-01-21-newsletter/#damus-ios-client---open-prs">we previewed as an open PR last week&lt;/a>. &lt;a href="https://github.com/damus-io/damus/pull/3536">PR #3536&lt;/a> adds base &lt;a href="https://nostrcompass.org/en/topics/negentropy/">negentropy&lt;/a> support to the networking layer, enabling set reconciliation with relays that support the protocol. A companion &lt;a href="https://github.com/damus-io/damus/pull/3547">PR #3547&lt;/a> adds pull-to-refresh DM syncing that uses negentropy to recover missing messages when standard REQ subscriptions fail.&lt;/p>
&lt;p>The implementation follows a conservative approach: normal DM loading continues unchanged, with &lt;a href="https://nostrcompass.org/en/topics/negentropy/">negentropy&lt;/a> available as a recovery mechanism when users manually refresh. Automated tests demonstrate the fix by generating a DM with an old timestamp that standard queries would miss, then using &lt;a href="https://nostrcompass.org/en/topics/negentropy/">negentropy&lt;/a> sync to successfully retrieve it. While &lt;a href="https://nostrcompass.org/en/topics/negentropy/">negentropy&lt;/a> support requires compatible relays, the implementation gracefully handles mixed relay environments by using the protocol where available.&lt;/p>
&lt;h3 id="amber-v411---relay-trust-scores">Amber v4.1.1 - Relay Trust Scores&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v4.1.1">Amber v4.1.1&lt;/a> ships relay trust score display (&lt;a href="https://github.com/greenart7c3/Amber/pull/289">PR #289&lt;/a>), implementing the relay evaluation concepts discussed in &lt;a href="https://nostrcompass.org/en/newsletters/2026-01-21-newsletter/#nip-updates">last week&amp;rsquo;s Trusted Relay Assertions NIP coverage&lt;/a>. Trust scores now appear in the Relays page and for NostrConnect connection requests, helping users assess relay reliability before authorizing connections. The release also includes a redesigned login/events/permissions UI and support for the &lt;code>switch_relays&lt;/code> method. Performance improvements cache keystore operations, addressing reports of 20+ second load times on older devices.&lt;/p>
&lt;h3 id="nak-v0182---mcp-integration">nak v0.18.2 - MCP Integration&lt;/h3>
&lt;p>fiatjaf&amp;rsquo;s &lt;a href="https://github.com/fiatjaf/nak">nak&lt;/a> (Nostr Army Knife) &lt;a href="https://github.com/fiatjaf/nak/releases/tag/v0.18.2">v0.18.2&lt;/a> adds &lt;a href="https://nostrify.dev/mcp">Model Context Protocol&lt;/a> support via &lt;code>nak mcp&lt;/code>, enabling AI agents to search for people on Nostr, publish notes, mention users, and read content using the outbox model. The release also introduces a &lt;a href="https://github.com/fiatjaf/nak/blob/master/install.sh">one-line installer&lt;/a> (&lt;code>curl -sSL https://raw.githubusercontent.com/fiatjaf/nak/master/install.sh | sh&lt;/code>) that downloads pre-built binaries, eliminating the Go toolchain requirement for end users. Bunker mode now supports Unix sockets and &lt;code>switch_relays&lt;/code>.&lt;/p>
&lt;h3 id="zeus-v0122-beta---nwc-fixes">Zeus v0.12.2 Beta - NWC Fixes&lt;/h3>
&lt;p>&lt;a href="https://github.com/ZeusLN/zeus/releases">Zeus v0.12.2-beta1&lt;/a> ships multiple NWC fixes addressing issues covered in &lt;a href="https://nostrcompass.org/en/newsletters/2026-01-21-newsletter/#zeus-lightning-wallet-with-nostr-wallet-connect">last week&amp;rsquo;s Zeus coverage&lt;/a>.&lt;/p>
&lt;h2 id="project-updates">Project Updates&lt;/h2>
&lt;h3 id="amethyst-desktop---phase-2a-ships">Amethyst Desktop - Phase 2A Ships&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> rolled out &lt;a href="https://github.com/vitorpamplona/amethyst/pull/1676">Phase 2A of its desktop app&lt;/a>, adding Search, Bookmarks, Zaps, Thread views, and long-form content (Reads) to the desktop experience. A companion &lt;a href="https://github.com/vitorpamplona/amethyst/pull/1683">PR #1683&lt;/a> adds transparent event broadcasting feedback so users now see real-time per-relay status as their events propagate across the network, making it easier to diagnose connectivity issues.&lt;/p>
&lt;h3 id="notedeck-progress-calendar-app-and-ux-polish">Notedeck Progress: Calendar App and UX Polish&lt;/h3>
&lt;p>The Damus team&amp;rsquo;s &lt;a href="https://github.com/damus-io/notedeck">Notedeck&lt;/a> desktop client merged auto-hide toolbar behavior (&lt;a href="https://github.com/damus-io/notedeck/pull/1268">PR #1268&lt;/a>) that responds to scroll velocity for more screen space on mobile views. A &lt;a href="https://github.com/damus-io/notedeck/pull/1271">draft PR #1271&lt;/a> adds a full &lt;a href="https://nostrcompass.org/en/topics/nip-52/">NIP-52&lt;/a> Calendar app with month/week/day/agenda views, RSVP support, and &lt;a href="https://nostrcompass.org/en/topics/nip-22/">NIP-22&lt;/a> comments on calendar events, currently feature-flagged for testing.&lt;/p>
&lt;h3 id="jumble-adds-community-mode">Jumble Adds Community Mode&lt;/h3>
&lt;p>&lt;a href="https://github.com/CodyTseng/jumble">Jumble&lt;/a>, the relay-focused web client, added &lt;a href="https://github.com/CodyTseng/jumble/pull/738">community mode&lt;/a> and support for &lt;a href="https://github.com/CodyTseng/jumble/pull/736">relay set presets via environment variables&lt;/a>, making it easier to deploy themed instances like &lt;a href="https://nostr.moe/">nostr.moe&lt;/a>.&lt;/p>
&lt;h3 id="shopstr-orders-dashboard">Shopstr Orders Dashboard&lt;/h3>
&lt;p>&lt;a href="https://github.com/shopstr-eng/shopstr">Shopstr&lt;/a> replaced its chat-based order management with a dedicated &lt;a href="https://github.com/shopstr-eng/shopstr/pull/219">Orders Dashboard&lt;/a>. The new interface provides a centralized view for merchants to track order status, mark messages as read, and manage fulfillment without scrolling through chat threads. The update deprecates IndexedDB caching in favor of server-side order status APIs and revises how order DMs are tagged for better filtering.&lt;/p>
&lt;h3 id="formstr-adds-grid-questions">Formstr Adds Grid Questions&lt;/h3>
&lt;p>&lt;a href="https://github.com/abh3po/nostr-forms">Formstr&lt;/a>, the Nostr-native forms app, added &lt;a href="https://github.com/abh3po/nostr-forms/pull/419">grid questions&lt;/a> and &lt;a href="https://github.com/abh3po/nostr-forms/pull/410">rewrote its SDK&lt;/a> with embed support. A &lt;a href="https://github.com/abh3po/nostr-forms/pull/418">fix for non-NIP-07 signers&lt;/a> resolved issues for users with bunker or local signers trying to submit forms with their identity. &lt;a href="https://nostrcompass.org/en/topics/nip-07/">NIP-07&lt;/a> defines the browser extension signer interface.&lt;/p>
&lt;h3 id="nostr-tools-upgrades-crypto-dependencies">nostr-tools Upgrades Crypto Dependencies&lt;/h3>
&lt;p>&lt;a href="https://github.com/nbd-wtf/nostr-tools">nostr-tools&lt;/a>, the core JavaScript library, &lt;a href="https://github.com/nbd-wtf/nostr-tools/pull/520">upgraded to @noble/curves v2.0.1&lt;/a>, addressing breaking API changes across 27 files and adopting the latest audited noble libraries. fiatjaf also added &lt;code>switch_relays&lt;/code> support to &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a>, enabling bunker clients to dynamically change relay connections.&lt;/p>
&lt;h3 id="zeus-working-on-nip-87-mint-reviews">Zeus Working on NIP-87 Mint Reviews&lt;/h3>
&lt;p>&lt;a href="https://github.com/ZeusLN/zeus">Zeus&lt;/a> has an &lt;a href="https://github.com/ZeusLN/zeus/pull/3576">open PR for NIP-87 mint reviews&lt;/a>, allowing users to discover and review &lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a> mints filtered by Nostr follows. &lt;a href="https://nostrcompass.org/en/topics/nip-87/">NIP-87&lt;/a> defines the standard for mint discovery and reviews. Reviews include star ratings and can be submitted anonymously or with a user&amp;rsquo;s nsec.&lt;/p>
&lt;h3 id="camelus-ships-full-dm-support">Camelus Ships Full DM Support&lt;/h3>
&lt;p>&lt;a href="https://github.com/camelus-hq/camelus">Camelus&lt;/a>, a Flutter-based Android client built with Dart NDK for battery-efficient mobile performance, added comprehensive direct messaging with 20+ commits this week. The update includes chat categories, message dates, optimistic send UI, note-to-self functionality, and proper DM relay handling.&lt;/p>
&lt;h3 id="marmot-protocol-updates">Marmot Protocol Updates&lt;/h3>
&lt;p>The MIP-03 deterministic commit resolution &lt;a href="https://nostrcompass.org/en/newsletters/2026-01-21-newsletter/#marmot-protocol-white-noise-encrypted-group-chat-library">we covered as an open PR last week&lt;/a> has now merged. &lt;a href="https://github.com/marmot-protocol/mdk/pull/152">MDK PR #152&lt;/a> ensures all &lt;a href="https://nostrcompass.org/en/topics/mls/">MLS&lt;/a>-based group chats converge on the same state when multiple valid commits arrive for the same epoch.&lt;/p>
&lt;p>A companion &lt;a href="https://github.com/marmot-protocol/marmot/pull/28">spec PR #28&lt;/a> adds init_key lifecycle requirements addressing gaps from implementation audits: private key material from Welcome messages must be securely deleted after processing (zeroization, storage cleanup), and new members must perform self-updates within 24 hours for forward secrecy.&lt;/p>
&lt;p>The TypeScript SDK (&lt;a href="https://github.com/marmot-protocol/marmot-ts">marmot-ts&lt;/a>) is building a reference chat application. &lt;a href="https://github.com/marmot-protocol/marmot-ts/pull/37">PR #37&lt;/a> adds group creation/listing, key package management with publish/broadcast/delete flows, and QR code invitations. An &lt;a href="https://github.com/marmot-protocol/marmot-ts/pull/38">open PR #38&lt;/a> by hzrd149 implements message history persistence with pagination. On whitenoise-rs, there were 8 PRs merged to master this week, most notably Add event id to user reaction which enables reaction deletion by exposing reaction event IDs, and fix(message_aggregator/emoji_utils): improve is_valid_emoji to capture more valid emoji which broadens emoji validation to support extended Unicode blocks, regional indicators, and keycap sequences. Other updates include language preference storage for client-side localization and removal of default pet names to give clients full control over signup metadata.&lt;/p>
&lt;h3 id="divine-adds-nostr-integration-features">diVine Adds Nostr Integration Features&lt;/h3>
&lt;p>&lt;a href="https://github.com/divinevideo/divine-mobile">diVine&lt;/a>, the short-form video app, continues rapid Nostr integration.&lt;/p>
&lt;p>Open PRs include &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> QR code authentication (&lt;a href="https://github.com/divinevideo/divine-mobile/pull/1019">PR #1019&lt;/a>) and &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> encrypted direct messaging (&lt;a href="https://github.com/divinevideo/divine-mobile/pull/834">PR #834&lt;/a>). This week&amp;rsquo;s activity focused on &lt;a href="https://github.com/divinevideo/divine-mobile/pull/1098">mentions support&lt;/a> converting &lt;code>nostr:&lt;/code> URIs and @mentions to clickable profile links, &lt;a href="https://github.com/divinevideo/divine-mobile/pull/1097">Classic Viners avatar fallbacks&lt;/a> using Nostr profiles, and video editing tools including &lt;a href="https://github.com/divinevideo/divine-mobile/pull/1056">drawing&lt;/a>, &lt;a href="https://github.com/divinevideo/divine-mobile/pull/1053">filters&lt;/a>, and &lt;a href="https://github.com/divinevideo/divine-mobile/pull/1050">stickers&lt;/a>.&lt;/p>
&lt;h2 id="nip-updates">NIP Updates&lt;/h2>
&lt;p>Recent changes to the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a>:&lt;/p>
&lt;p>&lt;strong>Merged:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/1534">Trusted Relay Assertions&lt;/a>&lt;/strong> - The proposal for standardizing relay trust scoring &lt;a href="https://nostrcompass.org/en/newsletters/2026-01-21-newsletter/#nip-updates">we covered last week&lt;/a> was merged. The spec defines kind 30385 events for relay trust assertions with scoring across reliability, quality, and accessibility. The discussion leading to merge centered on whether trust scores should be &amp;ldquo;global&amp;rdquo; (computed once for all users) or &amp;ldquo;personalized&amp;rdquo; (relative to each observer&amp;rsquo;s social graph). PageRank-style algorithms like &lt;a href="https://trust.nostr.band/">nostr.band&amp;rsquo;s Trust Rank&lt;/a> and &lt;a href="https://github.com/Pretty-Good-Freedom-Tech/graperank-nodejs">GrapeRank&lt;/a> resist sybil attacks by dividing any rank passed through fake accounts by the size of the bot farm.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Open PRs and Discussions:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Communikeys&lt;/strong> - A &lt;a href="https://nostrhub.io">comprehensive proposal&lt;/a> for community management that uses existing npubs as community identifiers instead of relay-based approaches. Any npub can become a community by publishing a kind 10222 event; publications target communities via kind 30222 events. Access control uses &lt;a href="https://nostrcompass.org/en/topics/nip-58/">NIP-58&lt;/a> badges, enabling delegated membership management with cold storage for community keys.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/2196">NIP-CF: Changes Feed&lt;/a>&lt;/strong> - A draft proposing sequence-based event synchronization as an alternative to timestamp-based &lt;code>since&lt;/code> filters. The problem: standard Nostr sync using &lt;code>since&lt;/code> timestamps can miss events when multiple events share the same second-precision timestamp, client and relay clocks drift apart, or checkpointing is imprecise. NIP-CF solves this by having relays assign monotonically increasing sequence numbers to stored events, providing strict total ordering. Clients request changes since a specific sequence number and receive events in guaranteed order, with precise checkpointing that never misses events. The proposal also supports live/continuous mode where subscriptions stay open after initial sync for real-time updates.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://github.com/nostr-protocol/nips/pull/1947">NIP-XX: Encrypted File Sync&lt;/a>&lt;/strong> - A protocol defining kinds 30800 (encrypted files), 30801 (vault indices), and 30802 (shared documents) for syncing encrypted content across devices using Nostr relays. The protocol enables local-first note-taking apps to provide end-to-end encrypted sync without centralized servers. File contents, paths, names, and folder structure are all encrypted using &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> self-encryption, so relays store blobs they cannot read. Binary attachments like images use &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> servers with client-side encryption. Kind 30802 enables document sharing between users by encrypting to the recipient&amp;rsquo;s public key.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="five-years-of-nostr-januaries">Five Years of Nostr Januaries&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/newsletters/2025-12-31-newsletter/#december-recap-five-years-of-nostr-decembers">Last month&amp;rsquo;s newsletter&lt;/a> traced Nostr&amp;rsquo;s December milestones from fiatjaf&amp;rsquo;s first client release through Jack Dorsey&amp;rsquo;s catalytic donation. This retrospective charts what happened each January from 2021 through 2025, focusing on verified technical developments.&lt;/p>
&lt;h3 id="january-2021-early-development">January 2021: Early Development&lt;/h3>
&lt;p>Nostr&amp;rsquo;s third month saw continued development on Branle, fiatjaf&amp;rsquo;s Vue.js client that had launched in December 2020. A small group of early adopters, likely fewer than 15 people, coordinated through the Telegram group &lt;a href="https://t.me/nostr_protocol">@nostr_protocol&lt;/a> (created November 16, 2020), testing the protocol across one or two experimental relays. The command-line client noscl provided terminal-based interaction.&lt;/p>
&lt;p>The technical foundation was already locked: users identified by secp256k1 public keys, posts cryptographically signed with Schnorr signatures, and relays serving as dumb storage that don&amp;rsquo;t communicate with each other. This was deliberately Bitcoin-native cryptography, a design choice that would shape adoption patterns years later.&lt;/p>
&lt;h3 id="january-2022-developer-discovery">January 2022: Developer Discovery&lt;/h3>
&lt;p>January 2022 opened with Nostr still buzzing from its &lt;a href="https://news.ycombinator.com/item?id=29749061">first Hacker News appearance&lt;/a> (December 31, 2021), which generated 110 points and 138 comments. At the time of that post, only about seven relays powered the entire network, with commenters noting &amp;ldquo;spam is not a problem yet because nostr is super new and no one uses it yet.&amp;rdquo; Robert C. Martin (&amp;ldquo;Uncle Bob&amp;rdquo;) had endorsed Nostr as potentially &amp;ldquo;the endgame solution for social communication.&amp;rdquo; The discussion continued into January, with developers debating relay architecture versus true P2P, censorship resistance versus moderation, and whether simplicity could scale.&lt;/p>
&lt;p>The HN post sparked a wave of new implementations. Uncle Bob himself started &lt;a href="https://github.com/unclebob/more-speech">more-speech&lt;/a>, a Clojure desktop client, on January 18. fiatjaf&amp;rsquo;s &lt;a href="https://github.com/nbd-wtf/go-nostr">go-nostr&lt;/a> library (created January 2021) and &lt;a href="https://github.com/fiatjaf/noscl">noscl&lt;/a> command-line client provided Go tooling, while &lt;a href="https://github.com/nbd-wtf/nostr-tools">nostr-tools&lt;/a> offered JavaScript support. By December 2022, approximately 800 profiles had bios. Branle remained the primary web client, receiving updates including private key import and multi-relay support. Technical challenges were evident: 64-character hex keys proved unintuitive, message delays frustrated users, and the community questioned whether the architecture could handle Twitter-scale traffic.&lt;/p>
&lt;h3 id="january-2023-the-breakout">January 2023: The Breakout&lt;/h3>
&lt;p>January 2023 transformed Nostr from experiment to movement. Damus, the iOS client by William Casarin (jb55), battled Apple&amp;rsquo;s App Store approval process. Rejected January 1, rejected again January 26, it was finally &lt;a href="https://www.coindesk.com/tech/2023/02/01/decentralized-social-media-project-nostrs-damus-gets-listed-on-apple-app-store">approved January 31&lt;/a>. That approval unleashed a cascade: Damus immediately reached #10 in U.S. Social Networking. Jack Dorsey &lt;a href="https://web.archive.org/web/20240304043638/https://www.theblock.co/post/207448/nostr-based-decentralized-twitter-alternative-damus-goes-live-on-apple-app-store">called it&lt;/a> &amp;ldquo;a milestone for open protocols.&amp;rdquo;&lt;/p>
&lt;p>Eight days earlier, on January 23, &lt;a href="https://x.com/Snowden/status/1617623779626352640">Edward Snowden announced&lt;/a> his presence on Nostr: &amp;ldquo;One of the cool things about Nostr&amp;hellip; beyond censorship resistance, is that you aren&amp;rsquo;t limited to 280 characters.&amp;rdquo; His endorsement from an NSA whistleblower carried weight in privacy-conscious circles, and users immediately began zapping him sats via Lightning.&lt;/p>
&lt;p>Web clients raced to onboard the influx. &lt;a href="https://github.com/v0l/snort">Snort&lt;/a>, created by kieran in December 2022, emerged as a feature-packed React client; on January 13, Snort integrated NIP-05 registration via the Nostr Plebs API, letting new users claim human-readable identities during onboarding. &lt;a href="https://iris.to">Iris&lt;/a>, developed full-time by Martti Malmi (an early Bitcoin contributor who received the second-ever Bitcoin transaction from Satoshi), offered both web and mobile interfaces with free NIP-05 identities at iris.to. &lt;a href="https://github.com/monlovesmango/astral">Astral&lt;/a>, built by monlovesmango with Quasar (Vue.js) as a Branle fork, focused on relay management with its relay grouping feature that let users organize relays into sets for posting and filtering. TestFlight betas for iOS clients filled within hours, and Amethyst dominated Android.&lt;/p>
&lt;p>Infrastructure scrambled to keep pace. All relays were operated by enthusiasts paying out-of-pocket. Paid relays using Lightning micropayments created natural spam filtering but introduced access friction. &lt;a href="https://techcrunch.com/2023/02/02/damus-pulled-from-apples-app-store-in-china-after-two-days/">Damus was pulled from China&amp;rsquo;s App Store&lt;/a> just two days after approval, reportedly per request by China&amp;rsquo;s top internet watchdog.&lt;/p>
&lt;h3 id="january-2024-protocol-hardening">January 2024: Protocol Hardening&lt;/h3>
&lt;p>January 2024 focused on protocol standardization and community building. &lt;a href="https://www.nostrphx.com/events">Nostr PHX&lt;/a> kicked off the year with a meetup on January 5 in Phoenix, bringing together local cypherpunks. This was the first of many community events that year including BTC Prague (June), Nostriga in Riga (August), and Nostrasia.&lt;/p>
&lt;p>The most significant protocol development was &lt;a href="https://github.com/nostr-protocol/nips/pull/716">NIP-59 (Gift Wrap)&lt;/a> being merged on January 29, providing metadata protection for encrypted communications. Gift Wrap builds on &lt;a href="https://github.com/paulmillr/nip44">NIP-44&amp;rsquo;s encryption standard&lt;/a> (which had been &lt;a href="https://cure53.de/audit-report_nip44-implementations.pdf">audited by Cure53&lt;/a> in December 2023) to hide sender identity from relays. The protocol wraps encrypted messages inside an outer event signed by a random, one-time-use keypair. Relays see only the disposable pubkey, while the real sender&amp;rsquo;s identity is buried in the encrypted payload that only the recipient can decrypt. This prevents relay operators and network observers from learning who is messaging whom. Timestamps can also be randomized to defeat timing analysis.&lt;/p>
&lt;p>The ecosystem expanded beyond social media. &lt;a href="https://plebeian.market">Plebeian Market&lt;/a> went fully Nostr-native with &lt;a href="https://nostrcompass.org/en/topics/nip-15/">NIP-15&lt;/a> compliance, enabling cross-stall shopping carts and a stall browser for discovering merchants. &lt;a href="https://github.com/shopstr-eng/shopstr">Shopstr&lt;/a> emerged as a permissionless marketplace facilitating Bitcoin commerce. &lt;a href="https://zap.stream/">Zap.stream&lt;/a>, built by kieran, brought live streaming to Nostr with Lightning payments at 21 sats/minute. Developer tooling matured with &lt;a href="https://github.com/nostr-dev-kit/ndk">NDK&lt;/a> providing TypeScript abstractions and &lt;a href="https://github.com/rust-nostr/nostr">rust-nostr&lt;/a> offering Rust bindings. &lt;a href="https://blog.zeusln.com/new-release-zeus-v0-8-1/">Zeus v0.8.1&lt;/a> shipped with Nostr contact import and persistent LND, laying groundwork for Nostr Wallet Connect integration in later releases.&lt;/p>
&lt;p>Yet infrastructure sustainability &lt;a href="https://arxiv.org/abs/2402.05709">remained challenging&lt;/a>. Academic research from this period found 95% of relays struggled to cover operational costs, with 20% experiencing significant downtime. The admission fee for paid relays averaged less than 1,000 sats (~$0.45), insufficient to sustain operations.&lt;/p>
&lt;p>&lt;em>A note on scams: The &amp;ldquo;Nostr Assets Protocol&amp;rdquo; and associated &amp;ldquo;$NOSTR&amp;rdquo; token that launched around this time &lt;a href="https://www.aicoin.com/en/article/377704">were publicly denounced by fiatjaf&lt;/a> as &amp;ldquo;100% fraudulent&amp;rdquo; and &amp;ldquo;an affinity scam&amp;rdquo; with no connection to the actual Nostr protocol.&lt;/em>&lt;/p>
&lt;h3 id="january-2025-client-maturation">January 2025: Client Maturation&lt;/h3>
&lt;p>January 2025 saw continued client development across the ecosystem. &lt;a href="https://www.nobsbitcoin.com/nostur-v1-17-0/">Nostur 1.17.0&lt;/a> shipped January 13 with cross-device sync for read states, &lt;a href="https://nostrcompass.org/en/topics/frost/">FROST&lt;/a> multi-sig login support, and optimized local database performance. Amethyst continued its transition to the outbox model, automatically compiling relay sets based on follow lists rather than requiring manual configuration.&lt;/p>
&lt;p>Major clients began moving away from &lt;a href="https://nostrcompass.org/en/topics/nip-04/">NIP-04&lt;/a> for direct messages, migrating toward &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> and the proposed &lt;a href="https://nostrcompass.org/en/topics/nip-104/">NIP-104&lt;/a> for enhanced encryption and metadata protection. The Gossip model (outbox/inbox communication) gained adoption as the ecosystem converged on more efficient relay usage patterns. Industry observers predicted this would be the year Nostr transitions from niche protocol to mainstream recognition, with a potential high-profile platform migration that could double daily activity.&lt;/p>
&lt;h3 id="january-2026-security-and-signing-infrastructure">January 2026: Security and Signing Infrastructure&lt;/h3>
&lt;p>January 2026 brought significant advances in security and signing infrastructure. &lt;a href="https://github.com/PrimalHQ/primal-android-app/releases/tag/2.6.18">Primal Android 2.6.18&lt;/a> shipped &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote signing and &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> local signer support, joining Amber and Aegis as a full signing hub for other Android apps. &lt;a href="https://github.com/permissionlesstech/bitchat/pulls">Bitchat completed a Cure53 security audit&lt;/a>, the same firm that audited Signal and NIP-44, with 17+ PRs fixing critical findings including DH secret clearing and thread safety issues. Both Bitchat and Damus migrated from C Tor to Rust Arti for improved reliability and memory safety.&lt;/p>
&lt;p>Protocol work continued with &lt;a href="https://github.com/nostr-protocol/nips/pull/1669">NIP-71&lt;/a> (addressable video events) merging and a post-quantum cryptography NIP opening discussion on future-proofing Nostr against quantum attacks. The Trusted Relay Assertions draft proposed standardizing relay trust scoring through signed attestations. The &lt;a href="https://github.com/marmot-protocol/mdk">Marmot Protocol&lt;/a> hardened its &lt;a href="https://nostrcompass.org/en/topics/mls/">MLS&lt;/a>-based encrypted messaging with 18 merged PRs addressing audit findings.&lt;/p>
&lt;p>Real-world applications expanded with &lt;a href="https://github.com/variablefate/ridestr">Ridestr&lt;/a> developing decentralized ridesharing using &lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a> escrow and &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encryption, and &lt;a href="https://github.com/coracle-social/pomade">Pomade&lt;/a> adding email-based recovery flows to &lt;a href="https://nostrcompass.org/en/topics/frost/">FROST&lt;/a> threshold signing. Damus shipped &lt;a href="https://nostrcompass.org/en/topics/negentropy/">negentropy&lt;/a> for reliable DM syncing, while Amethyst&amp;rsquo;s desktop app reached Phase 2A with search, bookmarks, and zaps.&lt;/p>
&lt;h3 id="looking-ahead">Looking Ahead&lt;/h3>
&lt;p>Six years of Januaries reveal Nostr&amp;rsquo;s evolution from early development (2021) to public discovery (2022) to explosive growth (2023) to protocol hardening (2024) to client maturation (2025) to security infrastructure (2026). The pattern is familiar to anyone who has watched open protocols grow: years of quiet building, a sudden explosion when conditions align, then the longer work of making it all reliable. What started with seven relays and a Hacker News thread is now audited infrastructure with real applications. The question for 2027: when someone hails a ride, sends an encrypted message, or recovers a lost key using Nostr, will they even know they&amp;rsquo;re using it?&lt;/p>
&lt;hr>
&lt;p>That&amp;rsquo;s it for this week. Building something? Have news to share? Want us to cover your project? &lt;a href="nostr:npub1wav4fae3gyfy3xj298kxj2mj8phavz7vavps34przq02j7w902qq902923">Reach out via NIP-17 DM&lt;/a> or find us on Nostr.&lt;/p></content:encoded></item><item><title>Nostr Compass #6</title><link>https://nostrcompass.org/en/newsletters/2026-01-21-newsletter/</link><pubDate>Wed, 21 Jan 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-01-21-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> Bitchat replaces C Tor with the Rust Arti implementation for better reliability and performance. nostrdb-rs gains streaming fold queries that enable zero-allocation database operations. Listr receives a major refactor with NDK 3 beta migration and AI-assisted maintenance after a year of dormancy. Zeus ships 17 merged PRs focused on &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> (Nostr Wallet Connect for remote Lightning control) fixes and &lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a> improvements, while Primal Android adds wallet backup flows and &lt;a href="https://nostrcompass.org/en/topics/nip-92/">NIP-92&lt;/a> (media dimensions for proper aspect ratios) support. A new draft NIP proposes &lt;a href="https://nostrcompass.org/en/topics/trusted-relay-assertions/">Trusted Relay Assertions&lt;/a> for standardized relay trust scoring.&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> Bitchat replaces C Tor with the Rust Arti implementation for better reliability and performance. nostrdb-rs gains streaming fold queries that enable zero-allocation database operations. Listr receives a major refactor with NDK 3 beta migration and AI-assisted maintenance after a year of dormancy. Zeus ships 17 merged PRs focused on &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> (Nostr Wallet Connect for remote Lightning control) fixes and &lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a> improvements, while Primal Android adds wallet backup flows and &lt;a href="https://nostrcompass.org/en/topics/nip-92/">NIP-92&lt;/a> (media dimensions for proper aspect ratios) support. A new draft NIP proposes &lt;a href="https://nostrcompass.org/en/topics/trusted-relay-assertions/">Trusted Relay Assertions&lt;/a> for standardized relay trust scoring.&lt;/p>
&lt;h2 id="news">News&lt;/h2>
&lt;h3 id="bitchat-moves-to-rust-arti-for-tor-support">Bitchat Moves to Rust Arti for Tor Support&lt;/h3>
&lt;p>Bitchat has migrated from C Tor to &lt;a href="https://gitlab.torproject.org/tpo/core/arti">Arti&lt;/a>, the Rust implementation of the Tor protocol. &lt;a href="https://github.com/permissionlesstech/bitchat/pull/958">PR #958&lt;/a> removes the C Tor dependency and integrates Arti, bringing memory safety guarantees and improved reliability. The change eliminates dormant wake attempts that caused foreground service restarts, a longstanding issue with the C implementation.&lt;/p>
&lt;p>&lt;strong>What this means for users:&lt;/strong> More stable encrypted messaging with fewer disconnections, especially on mobile devices. The Rust implementation reduces crash risks and battery drain from constant reconnection attempts.&lt;/p>
&lt;p>Arti is a ground-up rewrite of Tor in Rust, developed by the Tor Project to provide better security through memory safety and easier integration into applications. For Bitchat, the memory safety properties reduce attack surface when handling encrypted messages and relay connections. The migration follows the team&amp;rsquo;s recent &lt;a href="https://nostrcompass.org/en/newsletters/2026-01-13-newsletter/#bitchat-completes-cure53-security-audit">Cure53 security audit&lt;/a> (covered in Newsletter #5), continuing their security improvements.&lt;/p>
&lt;p>The PR also introduces comprehensive test coverage for ChatViewModel and BLEService, removes dead code, and stabilizes the test suite. Bluetooth Low Energy mesh reliability improvements accompany the Tor changes, addressing large transfer failures. Together, these changes improve Bitchat&amp;rsquo;s resilience for offline mesh networking scenarios where Tor provides internet connectivity alongside local BLE communication.&lt;/p>
&lt;h3 id="listr-revitalized-with-ai-powered-maintenance">Listr Revitalized with AI-Powered Maintenance&lt;/h3>
&lt;p>JeffG announced a major refactor of &lt;a href="https://github.com/erskingardner/listr">Listr&lt;/a>, the Nostr list management application available at &lt;a href="https://listr.lol">listr.lol&lt;/a>, after the project had been dormant for over a year. Using AI assistance, he completed a comprehensive upgrade including migration to &lt;a href="https://github.com/nostr-dev-kit/ndk">NDK&lt;/a> 3 beta, updates to latest versions of Svelte and Vite, and all dependencies brought current. The refactor adds first-class support for following packs, implements pagination for lists exceeding 50 items, and fixes numerous bugs that had accumulated during the dormant period.&lt;/p>
&lt;p>&lt;strong>What this means for users:&lt;/strong> Listr is back online with improved performance and new features for managing follow lists, content collections, and topic curation. The pagination fix makes large lists actually usable.&lt;/p>
&lt;p>JeffG noted that without AI assistance, this maintenance work would likely never have happened, preventing the project from becoming abandoned. Listr enables content curation on Nostr, allowing users to create, manage, and share lists of profiles, topics, and resources. The upgrade keeps the application compatible with current Nostr standards and client expectations as list management becomes more central to content discovery on the protocol.&lt;/p>
&lt;h2 id="nip-updates">NIP Updates&lt;/h2>
&lt;p>Recent changes to the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a>:&lt;/p>
&lt;p>&lt;strong>Merged:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a>&lt;/strong> (Relay-based groups) - Relay Key Clarification (&lt;a href="https://github.com/nostr-protocol/nips/pull/2190">#2190&lt;/a> - merged) clarifies that the relay key is the relay URL itself, not a pubkey. The spec now explicitly states &amp;ldquo;The relay key is the relay&amp;rsquo;s WebSocket URL (e.g., wss://groups.example.com)&amp;rdquo; to avoid confusion. This affects how clients identify which relay hosts a given group, ensuring groups are properly attributed to their hosting relays.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Open PRs and Discussions:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Trusted Relay Assertions&lt;/strong> - A draft NIP proposes standardizing relay trust scoring through kind 30385 events containing trust scores (0-100) computed from &lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a> (relay discovery and monitoring) metrics, operator reputation, and user reports. The specification divides trust into reliability (uptime, latency), quality (TLS, documentation, operator verification), and accessibility (jurisdiction, barriers, surveillance risk) components. Operator verification includes cryptographic signatures via &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> (relay information documents), DNS TXT records, and .well-known files. Users declare trusted assertion providers via kind 10385 events, enabling clients to query multiple providers for diverse perspectives. The proposal complements &lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a> discovery with evaluation, helping &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> (remote signing/Nostr Connect) assess relay trustworthiness in connection URIs.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Post-Quantum Cryptography&lt;/strong> - &lt;a href="https://github.com/nostr-protocol/nips/pull/2185">PR #2185&lt;/a> (open) continues evolving since &lt;a href="https://nostrcompass.org/en/newsletters/2026-01-13-newsletter/#nip-updates">Newsletter #5&lt;/a> introduced the proposal for quantum-resistant algorithms. This week&amp;rsquo;s discussion focused on implementation details for crypto-agility: how clients handle dual signatures during migration, backward compatibility for older clients, and performance implications of larger quantum-resistant signatures. Contributors debated whether to mandate ML-DSA-44 only or support multiple algorithms (ML-DSA-44, Falcon-512, Dilithium) for flexibility. The consensus leans toward a phased approach: optional quantum signatures initially, becoming mandatory only after widespread client support and real quantum threat emergence.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="nip-deep-dive-nip-11-and-nip-66">NIP Deep Dive: NIP-11 and NIP-66&lt;/h2>
&lt;p>This week we examine two NIPs that work together to enable relay discovery and evaluation: NIP-11 defines how relays describe themselves, and NIP-66 standardizes how we measure relay behavior. Together they form the foundation for relay trust evaluation systems.&lt;/p>
&lt;h3 id="nip-11entopicsnip-11-relay-information-document">&lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a>: Relay Information Document&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/11.md">NIP-11&lt;/a> defines a JSON document that relays serve over HTTP to describe their capabilities, policies, and operator information. When a client connects to &lt;code>wss://relay.example.com&lt;/code>, it can fetch &lt;code>https://relay.example.com&lt;/code> (replacing &lt;code>wss://&lt;/code> with &lt;code>https://&lt;/code>) to retrieve the relay&amp;rsquo;s information document.&lt;/p>
&lt;p>The document uses standard HTTP content negotiation with the &lt;code>Accept: application/nostr+json&lt;/code> header. This allows relays to serve their normal website to browsers while providing machine-readable metadata to Nostr clients. The response includes relay software name and version, operator contact information (pubkey, email, alternative contact), supported NIPs, and operational parameters like payment requirements or content restrictions.&lt;/p>
&lt;p>Importantly, basic NIP-11 documents are unsigned JSON served over HTTPS, relying solely on TLS certificates for authenticity. This means anyone controlling the relay&amp;rsquo;s web server can modify the document, making operator claims unverifiable. The Trusted Relay Assertions proposal addresses this gap by introducing signed attestations through a relay&amp;rsquo;s &lt;code>self&lt;/code> pubkey field, enabling cryptographic proof of operator identity similar to how relays use signed events for authentication mechanisms.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;relay.example.com&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;description&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;A general-purpose public relay&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;contact&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;admin@example.com&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;supported_nips&amp;#34;&lt;/span>: [&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">4&lt;/span>, &lt;span style="color:#ae81ff">9&lt;/span>, &lt;span style="color:#ae81ff">11&lt;/span>, &lt;span style="color:#ae81ff">12&lt;/span>, &lt;span style="color:#ae81ff">16&lt;/span>, &lt;span style="color:#ae81ff">20&lt;/span>, &lt;span style="color:#ae81ff">22&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;software&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;git+https://github.com/relay/relay.git&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;version&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;1.2.3&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;limitation&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;max_message_length&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">16384&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;max_subscriptions&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">20&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;max_filters&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">100&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;max_limit&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">5000&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;max_subid_length&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">100&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;min_prefix&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">4&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;max_event_tags&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">2000&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;max_content_length&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">8196&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;min_pow_difficulty&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">0&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;auth_required&amp;#34;&lt;/span>: &lt;span style="color:#66d9ef">false&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;payment_required&amp;#34;&lt;/span>: &lt;span style="color:#66d9ef">false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;payments_url&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;https://relay.example.com/payments&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;fees&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;admission&amp;#34;&lt;/span>: [{&lt;span style="color:#f92672">&amp;#34;amount&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">5000&lt;/span>, &lt;span style="color:#f92672">&amp;#34;unit&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;msats&amp;#34;&lt;/span>}],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;subscription&amp;#34;&lt;/span>: [{&lt;span style="color:#f92672">&amp;#34;amount&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1000&lt;/span>, &lt;span style="color:#f92672">&amp;#34;unit&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;msats&amp;#34;&lt;/span>, &lt;span style="color:#f92672">&amp;#34;period&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">2592000&lt;/span>}],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;publication&amp;#34;&lt;/span>: []
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>limitation&lt;/code> object tells clients what constraints the relay enforces. &lt;code>max_message_length&lt;/code> limits WebSocket frame size, &lt;code>max_subscriptions&lt;/code> caps concurrent REQ subscriptions per connection, &lt;code>max_filters&lt;/code> limits filters per REQ, and &lt;code>max_limit&lt;/code> constrains how many events a single filter can request. These parameters help clients adapt their behavior to relay capabilities, avoiding disconnections from exceeding limits.&lt;/p>
&lt;p>Payment information appears in &lt;code>fees&lt;/code> and &lt;code>payments_url&lt;/code>. Relays can charge for admission (one-time access), subscription (recurring access), or publication (per-event fees). The &lt;code>payments_url&lt;/code> points to details about payment methods, typically Lightning invoices or ecash mints. Paid relays use these fields to communicate pricing before clients attempt authentication.&lt;/p>
&lt;p>The &lt;code>supported_nips&lt;/code> array lets clients discover relay capabilities. If a relay lists &lt;a href="https://nostrcompass.org/en/topics/nip-50/">NIP-50&lt;/a>, clients know they can send full-text search queries. If &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> appears, clients should expect authentication challenges. This declarative capability advertisement enables progressive enhancement: clients can use advanced features where available while gracefully degrading on relays with limited support.&lt;/p>
&lt;p>Operator information builds accountability. The &lt;code>pubkey&lt;/code> field identifies the relay operator on Nostr, enabling direct communication via &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> DMs or public mentions. The &lt;code>contact&lt;/code> email provides an off-protocol fallback. Together, these fields help users reach operators for abuse reports, access requests, or technical issues.&lt;/p>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> documents are self-reported: relays describe what they claim to support, not necessarily what they actually do. This is where NIP-66 becomes important.&lt;/p>
&lt;h3 id="nip-66entopicsnip-66-relay-discovery-and-liveness-monitoring">&lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a>: Relay Discovery and Liveness Monitoring&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/66.md">NIP-66&lt;/a> standardizes publishing relay monitoring data to Nostr. Monitor services continuously test relays for availability, latency, protocol compliance, and supported NIPs. They publish results as kind 30166 events, providing real-time relay status independent of relay self-reporting.&lt;/p>
&lt;p>Monitors check relay availability by connecting and sending test subscriptions. Latency measurements track connection time, subscription response time, and event propagation delay. Protocol compliance testing verifies relay behavior matches specifications, catching implementation bugs or intentional deviations. NIP support verification goes beyond &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> claims by actually testing whether advertised features work correctly.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;a34b5c7d89e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;4e2d0bc6f8e7c3a5b9f1d2e3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1736784000&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">30166&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.example.com&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;rtt&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;open&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;143&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;1736784000&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;rtt&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;read&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;89&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;1736784000&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;rtt&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;write&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;92&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;1736784000&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;nips&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;1&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;2&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;4&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;9&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;11&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;12&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;geo&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;US&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;United States&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;New York&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;other&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;network&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;clearnet&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;other&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;payment_required&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;false&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;other&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;auth_required&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;false&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;{\&amp;#34;last_check\&amp;#34;: 1736784000, \&amp;#34;checks\&amp;#34;: 8760}&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;8b9c4d5e6a7f8b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>d&lt;/code> tag contains the relay URL, making this a parameterized replaceable event. Each monitor publishes one event per relay, updated as measurements change. Multiple monitors can track the same relay, providing redundancy and cross-validation. Clients query multiple monitor pubkeys to get diverse perspectives on relay health.&lt;/p>
&lt;p>Round-trip time (rtt) tags measure latency for different operations. &lt;code>rtt open&lt;/code> tracks WebSocket connection establishment, &lt;code>rtt read&lt;/code> measures subscription response time, and &lt;code>rtt write&lt;/code> tests event publication speed. All values are in milliseconds. Clients use these metrics to prefer low-latency relays for time-sensitive operations or deprioritize slow relays.&lt;/p>
&lt;p>The &lt;code>nips&lt;/code> tag lists actually verified NIP support, not just claimed support. Monitors test each NIP by exercising its functionality. If a relay claims &lt;a href="https://nostrcompass.org/en/topics/nip-50/">NIP-50&lt;/a> search in its &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> document but search queries fail, monitors will omit NIP-50 from the verified list. This provides ground truth about relay capabilities.&lt;/p>
&lt;p>Geographic information helps clients select nearby relays for better latency and censorship resistance. The &lt;code>geo&lt;/code> tag contains country code, country name, and region. The &lt;code>network&lt;/code> tag distinguishes clearnet relays from Tor hidden services or I2P endpoints. Together, these tags enable geographic diversity: clients can connect to relays in multiple jurisdictions to resist regional censorship.&lt;/p>
&lt;p>Monitor data powers relay selectors in clients, explorer websites, and the Trusted Relay Assertions proposal. By combining self-reported &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> documents with measured &lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a> data and computed trust assertions, the ecosystem moves toward informed relay selection rather than relying on hardcoded defaults or word-of-mouth recommendations.&lt;/p>
&lt;h2 id="releases">Releases&lt;/h2>
&lt;h3 id="0xchat-v153---enhanced-messaging-features">0xchat v1.5.3 - Enhanced Messaging Features&lt;/h3>
&lt;p>&lt;a href="https://github.com/0xchat-app/0xchat-app-main/releases/tag/v1.5.3-release">0xchat v1.5.3&lt;/a> brings significant improvements to the Telegram-style Nostr messaging client. The release addresses &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> (Android signer application) compliance issues that were preventing proper event signing through external signers like Amber. Full compliance means 0xchat now correctly delegates signing operations, improving security by keeping private keys isolated.&lt;/p>
&lt;p>The update integrates both FileDropServer and BlossomServer as default media storage options, giving users redundancy for file uploads. &lt;a href="https://github.com/hzrd149/blossom">Blossom&lt;/a> provides content-addressed storage where files are referenced by their SHA-256 hashes, ensuring integrity and enabling deduplication across the network. Automatic draft saving for Moments prevents data loss when composing long-form content, addressing user complaints about lost posts during app switches or connectivity interruptions.&lt;/p>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a> wallet integration receives polish with automatic proof filtering that removes spent tokens from the wallet view. This solves the confusing UX where users saw invalid proofs alongside valid ecash, making balance calculations unreliable. The filtering happens client-side, maintaining privacy while improving the payment experience for peer-to-peer transactions within chats.&lt;/p>
&lt;h3 id="amber-v410-pre-releases---ui-overhaul">Amber v4.1.0 Pre-releases - UI Overhaul&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v4.1.0-pre1">Amber v4.1.0-pre1&lt;/a> through &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v4.1.0-pre3">v4.1.0-pre3&lt;/a> introduce a redesigned interface for the popular Android event signer. The login screen now clearly displays which application is requesting signature permissions, addressing user confusion about authorization flows. The new events screen provides detailed inspection of what data applications want to sign, allowing users to make informed security decisions before approving operations.&lt;/p>
&lt;p>Permission management receives significant attention with a revamped interface showing exactly what capabilities each connected application has been granted. Users can revoke specific permissions without disconnecting entirely, enabling fine-grained control over signing delegation. The refactored relay counters using the updated quartz library provide real-time statistics on event throughput and relay performance. &lt;a href="https://github.com/nostr-protocol/nips/blob/master/46.md">NIP-46&lt;/a> (Nostr Connect) bunker connections now surface detailed error messages when connections fail, replacing cryptic timeout errors with actionable diagnostics.&lt;/p>
&lt;h2 id="notable-code-and-documentation-changes">Notable code and documentation changes&lt;/h2>
&lt;p>&lt;em>These are merged pull requests and early-stage developments worth tracking. Some are experimental features that may evolve before release.&lt;/em>&lt;/p>
&lt;h3 id="zeus-lightning-wallet-with-nostr-wallet-connect">Zeus (Lightning Wallet with Nostr Wallet Connect)&lt;/h3>
&lt;p>Zeus merged 17 pull requests this week, strengthening its position as a leading &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> Nostr Wallet Connect implementation. The most significant fixes address data consistency and protocol compliance issues that were causing interoperability problems with Nostr clients.&lt;/p>
&lt;p>&lt;strong>Transaction History Fix&lt;/strong> - &lt;a href="https://github.com/ZeusLN/zeus/pull/3542">PR #3542&lt;/a> resolves a critical bug where NWC transaction lists displayed incorrect or duplicate entries. The issue occurred when Zeus cached transaction data without properly handling event updates, causing users to see phantom transactions or missing payments. The fix implements proper event deduplication and cache invalidation, ensuring transaction history accurately reflects Lightning node state.&lt;/p>
&lt;p>&lt;strong>Protocol Compliance&lt;/strong> - &lt;a href="https://github.com/ZeusLN/zeus/pull/3548">PR #3548&lt;/a> addresses incomplete &lt;code>getInfo&lt;/code> responses that broke compatibility with clients expecting full NIP-47 compliance. Some Nostr clients crashed when receiving partial responses missing fields like &lt;code>block_height&lt;/code> or &lt;code>network&lt;/code>. The PR ensures all required fields return with sensible defaults even when the underlying Lightning implementation doesn&amp;rsquo;t provide them, improving Zeus&amp;rsquo;s compatibility across the ecosystem.&lt;/p>
&lt;p>&lt;strong>Connection Resilience&lt;/strong> - &lt;a href="https://github.com/ZeusLN/zeus/pull/3543">PR #3543&lt;/a> implements timeout notifications for stalled Nostr connections. Previously, users waited indefinitely when relay connections dropped silently. Now Zeus displays clear timeout messages after 30 seconds of inactivity, letting users retry or switch relays. &lt;a href="https://github.com/ZeusLN/zeus/pull/3541">PR #3541&lt;/a> adds backend validation to prevent NWC activation on incompatible Lightning implementations, catching configuration errors before they cause runtime crashes.&lt;/p>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a> Race Condition&lt;/strong> - &lt;a href="https://github.com/ZeusLN/zeus/pull/3531">PR #3531&lt;/a> fixes a concurrency bug in &lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a> token management where simultaneous mint operations could corrupt the token database. The race condition occurred when multiple threads updated token counts without proper locking, occasionally resulting in incorrect balances. The fix adds mutex protection around critical sections, ensuring atomic updates to token state.&lt;/p>
&lt;h3 id="primal-android-client">Primal Android (Client)&lt;/h3>
&lt;p>Primal Android shipped 12 merged PRs with significant improvements to wallet security and media handling. The wallet backup implementation addresses one of the most requested features, while NIP-92 support improves the visual experience across the application.&lt;/p>
&lt;p>&lt;strong>Wallet Backup System&lt;/strong> - A four-PR series (&lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/844">#844&lt;/a>, &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/845">#845&lt;/a>, &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/846">#846&lt;/a>, &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/848">#848&lt;/a>) implements comprehensive seed phrase backup functionality. Users can now export their 12-word mnemonic through a secure flow that prevents screenshots, displays backup status in the wallet dashboard, and guides existing users through migration. The implementation follows BIP-39 standards and includes validation to prevent users from losing funds due to incorrect phrase recording.&lt;/p>
&lt;p>&lt;strong>Media Dimensions (NIP-92)&lt;/strong> - &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/718">PR #718&lt;/a> implements &lt;a href="https://nostrcompass.org/en/topics/nip-92/">NIP-92&lt;/a> support for proper image and video aspect ratios. Without dimension metadata, clients must download images to determine their size, causing layout jumps as content loads. NIP-92 adds &lt;code>dim&lt;/code> tags (like &lt;code>[&amp;quot;dim&amp;quot;, &amp;quot;1920x1080&amp;quot;]&lt;/code>) to file metadata events, allowing Primal to reserve correct space before downloading media. This eliminates jarring reflows in image galleries and improves perceived performance.&lt;/p>
&lt;p>&lt;strong>Remote Signer Reliability&lt;/strong> - &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/841">PR #841&lt;/a> fixes &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> connection issues where missing &lt;code>wss://&lt;/code> prefixes caused silent failures. The PR validates relay URIs during bunker connection setup, adding the protocol prefix automatically when users paste bare domains. &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/843">PR #843&lt;/a> addresses a threading bug where poor network conditions caused replies to post as root notes, breaking conversation flow. The fix ensures parent event IDs persist through network interruptions.&lt;/p>
&lt;h3 id="marmot-protocol-white-noise-encrypted-group-chat-library">Marmot Protocol: White Noise (Encrypted Group Chat Library)&lt;/h3>
&lt;p>White Noise, the Rust library powering &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> Protocol&amp;rsquo;s encrypted group chats, merged six PRs improving user experience and security. The changes bring Marmot closer to feature parity with mainstream messaging applications while maintaining its privacy-first architecture.&lt;/p>
&lt;p>&lt;strong>Read Receipts&lt;/strong> - &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/433">PR #433&lt;/a> and &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/436">#436&lt;/a> implement message read tracking for group conversations. The system stores read positions per user per group within a single device, enabling unread count badges. The implementation uses monotonic timestamps to track the last read message position for each conversation. This foundational feature enables UI indicators showing unread message counts per conversation.&lt;/p>
&lt;p>&lt;strong>Conversation Pinning&lt;/strong> - &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/442">PR #442&lt;/a> adds persistent conversation pinning through a &lt;code>pin_order&lt;/code> field in the &lt;code>accounts_groups&lt;/code> junction table that links accounts to groups. Pinned conversations maintain their position at the top of chat lists regardless of message activity, matching user expectations from Signal and WhatsApp. The implementation uses integer ordering to allow unlimited pins with deterministic sorting.&lt;/p>
&lt;p>&lt;strong>Deterministic Commit Resolution (MIP-03)&lt;/strong> - &lt;a href="https://github.com/marmot-protocol/mdk/pull/152">PR #152&lt;/a> (open) implements Marmot Improvement Proposal 03, solving the critical problem of commit race conditions in distributed group chats. When multiple members submit group state changes (adding/removing members, changing permissions) simultaneously, clients could diverge on commit ordering, fragmenting the group into incompatible states. MIP-03 introduces epoch snapshots and a deterministic winner selection: the commit with the earliest &lt;code>created_at&lt;/code> timestamp wins, with lexicographic event ID as tiebreaker. This allows all clients to converge on the same state through rollback and replay, maintaining group coherence even during network partitions.&lt;/p>
&lt;p>&lt;strong>Security Hardening&lt;/strong> - &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/443">PR #443&lt;/a> prevents unnecessary copying of cryptographic secrets by using references in &lt;code>resolve_group_image_path&lt;/code>. This reduces the window for memory attacks where secrets could be recovered from freed heap allocations. &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/438">PR #438&lt;/a> enables SQLCipher database encryption through keyring parameters, protecting message history at rest. The keyring integration allows secure key storage in platform keychains rather than configuration files.&lt;/p>
&lt;h3 id="nostrdb-rs-database-library---open-pr">nostrdb-rs (Database Library) - Open PR&lt;/h3>
&lt;p>&lt;strong>Streaming Queries Implementation&lt;/strong> - &lt;a href="https://github.com/damus-io/nostrdb-rs/pull/58">PR #58&lt;/a> (open) proposes streaming fold queries to enable zero-allocation database operations. The implementation adds &lt;code>fold&lt;/code>, &lt;code>try_fold&lt;/code>, &lt;code>count&lt;/code>, &lt;code>any&lt;/code>, &lt;code>all&lt;/code>, and &lt;code>find_map&lt;/code> methods that would process database results one at a time without materializing entire result sets into vectors. This approach would reduce memory consumption and enable early termination for common query patterns.&lt;/p>
&lt;p>The technical implementation exposes low-level query result callbacks (&lt;code>ndb_query_visit&lt;/code>) as stateful Rust visitors that map &lt;code>ControlFlow&lt;/code> variants to C visitor actions. Once merged, application code will read like iterator logic while running close to the database layer. For example, counting matching notes would stream through results rather than collecting them, and &lt;code>find_map&lt;/code> would return the first useful result without processing remaining rows.&lt;/p>
&lt;p>nostrdb powers Damus and Notedeck, both iOS/macOS and desktop clients respectively. The streaming queries would enable efficient patterns like pagination, conditional filtering, and existence checks. The PR changes 3 files with +756 additions and -32 deletions, a substantial refactoring of the query layer. Users of nostrdb-rs-based applications would see reduced memory usage when browsing large timelines or searching through extensive event databases.&lt;/p>
&lt;h3 id="nak-cli-tool">nak (CLI Tool)&lt;/h3>
&lt;p>nak, fiatjaf&amp;rsquo;s command-line Nostr tool, merged six PRs focused on build system improvements and new functionality. &lt;a href="https://github.com/fiatjaf/nak/pull/91">PR #91&lt;/a> implements a Blossom mirror feature, letting nak serve as a mirror for Blossom media servers. &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> is a content-addressed media storage protocol that works alongside Nostr events.&lt;/p>
&lt;p>The remaining PRs address build system compatibility across Windows, macOS, and Linux platforms, enabling FUSE filesystem support for mounting Nostr events as local directories.&lt;/p>
&lt;h3 id="damus-ios-client---open-prs">Damus (iOS Client) - Open PRs&lt;/h3>
&lt;p>Damus has 11 open PRs exploring significant architectural improvements. While these haven&amp;rsquo;t merged yet, they signal important directions for iOS Nostr client development, particularly around privacy, synchronization efficiency, and mobile data optimization.&lt;/p>
&lt;p>&lt;strong>Tor Integration&lt;/strong> - &lt;a href="https://github.com/damus-io/damus/pull/3535">PR #3535&lt;/a> embeds the Arti Tor client directly into Damus, enabling anonymous relay connections without external dependencies. Unlike Orbot or Tor Browser approaches, embedding Arti provides seamless integration with iOS sandboxing and background execution limits. The Rust implementation brings memory safety to network anonymization, reducing attack surface compared to C Tor. Users could toggle Tor mode per-relay or globally, with the client handling circuit management transparently.&lt;/p>
&lt;p>&lt;strong>Negentropy Sync Protocol&lt;/strong> - &lt;a href="https://github.com/damus-io/damus/pull/3536">PR #3536&lt;/a> implements Negentropy, a set reconciliation protocol that radically improves synchronization efficiency. Instead of downloading all events since last connection, Negentropy exchanges compact fingerprints (Merkle trees) to identify exactly which events differ between client and relay. For users following hundreds of pubkeys, this reduces sync bandwidth from megabytes to kilobytes. The implementation integrates with RelayPool and SubscriptionManager, enabling automatic efficient sync across all connected relays.&lt;/p>
&lt;p>&lt;strong>Low Data Mode&lt;/strong> - &lt;a href="https://github.com/damus-io/damus/pull/3549">PR #3549&lt;/a> adds cellular data conservation features responding to user feedback about bandwidth consumption. The mode disables image auto-loading, video prefetching, and reduces subscription limits. Users on metered connections can browse text content without fear of exceeding data caps. The implementation respects iOS low data mode settings and provides granular controls for different media types.&lt;/p>
&lt;p>&lt;strong>Database Optimizations&lt;/strong> - &lt;a href="https://github.com/damus-io/damus/pull/3548">PR #3548&lt;/a> reworks nostrdb snapshot storage for faster queries and reduced disk usage. The optimization changes how database snapshots persist to disk, improving both read performance and write amplification. This addresses battery drain complaints from users with large event databases.&lt;/p>
&lt;hr>
&lt;p>That&amp;rsquo;s it for this week. Building something? Have news to share? Want us to cover your project? &lt;a href="nostr:npub1wav4fae3gyfy3xj298kxj2mj8phavz7vavps34przq02j7w902qq902923">Reach out via NIP-17 DM&lt;/a> or find us on Nostr.&lt;/p></content:encoded></item><item><title>Nostr Compass #5</title><link>https://nostrcompass.org/en/newsletters/2026-01-13-newsletter/</link><pubDate>Tue, 13 Jan 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-01-13-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> Bitchat undergoes a professional security audit by Cure53, the same firm that audited Signal and &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a>, with 17+ PRs already merged fixing critical findings. &lt;a href="https://nostrcompass.org/en/topics/nip-71/">NIP-71&lt;/a> is merged, bringing addressable video events to the protocol. A post-quantum cryptography NIP opens discussion on future-proofing Nostr against quantum attacks. Amethyst v1.05.0 ships bookmark lists, voice notes, and an early desktop release, while Nostur v1.25.3 improves &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> DMs with reactions and replies. In library news, rust-nostr expands &lt;a href="https://nostrcompass.org/en/topics/nip-62/">NIP-62&lt;/a> support across SQLite and LMDB backends, and NDK fixes a subscription tracking bug.&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> Bitchat undergoes a professional security audit by Cure53, the same firm that audited Signal and &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a>, with 17+ PRs already merged fixing critical findings. &lt;a href="https://nostrcompass.org/en/topics/nip-71/">NIP-71&lt;/a> is merged, bringing addressable video events to the protocol. A post-quantum cryptography NIP opens discussion on future-proofing Nostr against quantum attacks. Amethyst v1.05.0 ships bookmark lists, voice notes, and an early desktop release, while Nostur v1.25.3 improves &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> DMs with reactions and replies. In library news, rust-nostr expands &lt;a href="https://nostrcompass.org/en/topics/nip-62/">NIP-62&lt;/a> support across SQLite and LMDB backends, and NDK fixes a subscription tracking bug.&lt;/p>
&lt;h2 id="news">News&lt;/h2>
&lt;h3 id="bitchat-completes-cure53-security-audit">Bitchat Completes Cure53 Security Audit&lt;/h3>
&lt;p>Bitchat, the iOS encrypted messenger combining Nostr with &lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a>, has undergone a professional security audit by Cure53, one of the most respected security firms in the industry. Cure53 previously audited Signal, Mullvad VPN, and notably the &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encryption specification that underpins modern Nostr private messaging.&lt;/p>
&lt;p>The audit found 12+ security issues (BCH-01-002 through BCH-01-013). The Bitchat team responded with 17+ pull requests. Key fixes include:&lt;/p>
&lt;p>&lt;strong>Noise Protocol DH Secret Clearing&lt;/strong> - &lt;a href="https://github.com/permissionlesstech/bitchat/pull/928">PR #928&lt;/a> fixes six locations where Diffie-Hellman shared secrets were not being zeroed after key agreement, restoring forward secrecy guarantees. When secrets persist in memory longer than necessary, a memory dump or cold boot attack could compromise past communications.&lt;/p>
&lt;p>&lt;strong>Signature Verification&lt;/strong> - Multiple PRs harden cryptographic verification paths, ensuring message authenticity checks cannot be bypassed through malformed inputs.&lt;/p>
&lt;p>&lt;strong>Thread Safety&lt;/strong> - &lt;a href="https://github.com/permissionlesstech/bitchat/pull/929">PR #929&lt;/a> adds barrier synchronization to read receipt queues in NostrTransport, preventing race conditions that could cause data corruption or crashes under high message volumes.&lt;/p>
&lt;p>&lt;strong>Memory Safety&lt;/strong> - &lt;a href="https://github.com/permissionlesstech/bitchat/pull/920">PR #920&lt;/a> optimizes the message deduplicator for better performance with high message throughput while avoiding memory exhaustion.&lt;/p>
&lt;p>&lt;strong>Input Validation&lt;/strong> - &lt;a href="https://github.com/permissionlesstech/bitchat/pull/919">PR #919&lt;/a> hardens hex string parsing to prevent crashes from malformed input, a common attack vector for denial-of-service.&lt;/p>
&lt;p>Bitchat handles &lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a> ecash, making professional security review essential. The audit follows last year&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> Protocol audit and the NIP-44 audit that verified the encryption layer.&lt;/p>
&lt;h2 id="nip-updates">NIP Updates&lt;/h2>
&lt;p>Recent changes to the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a>:&lt;/p>
&lt;p>&lt;strong>Merged:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-71/">NIP-71&lt;/a>&lt;/strong> - Addressable Video Events (&lt;a href="https://github.com/nostr-protocol/nips/pull/1669">#1669&lt;/a>) introduces kinds 34235 (horizontal video) and 34236 (vertical video) as addressable events. A required &lt;code>d&lt;/code> tag provides unique identifiers, so video metadata can be updated without republishing the entire event. An optional &lt;code>origin&lt;/code> tag tracks import sources. Already implemented in Amethyst and nostrvine.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Open PRs:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Post-Quantum Cryptography&lt;/strong> - &lt;a href="https://github.com/nostr-protocol/nips/pull/2185">PR #2185&lt;/a> proposes adding quantum-resistant cryptographic algorithms to Nostr. The spec introduces ML-DSA-44 and Falcon-512 for digital signatures, targeting &amp;ldquo;super-high value events&amp;rdquo; like applications and authorities rather than individual users. While &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a>&amp;rsquo;s symmetric encryption (ChaCha20) is quantum-resistant, its key exchange uses secp256k1 ECDH which is vulnerable to Shor&amp;rsquo;s algorithm. The proposal includes ML-KEM for key agreement to address this gap. This is an early-stage proposal opening discussion on crypto-agility for Nostr&amp;rsquo;s long-term security.&lt;/li>
&lt;li>&lt;strong>BOLT12 for NIP-47&lt;/strong> - After 137 comments and extensive discussion, the community decided that BOLT12 offers deserve their own specification rather than extending &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a>. BOLT12 offers provide significant upgrades over BOLT11 invoices including reusability, better privacy through blinded paths, and optional payer information. The new NIP will define methods like &lt;code>make_offer&lt;/code>, &lt;code>pay_offer&lt;/code>, and &lt;code>list_offers&lt;/code> for Nostr Wallet Connect implementations.&lt;/li>
&lt;li>&lt;strong>Audio Track NIP&lt;/strong> - &lt;a href="https://github.com/nostr-protocol/nips/pull/1043">PR #1043&lt;/a> proposes kinds 32100 for music tracks and 32101 for podcast episodes, giving audio content the same first-class treatment that NIP-71 provides for video. Currently, audio platforms like Wavlake, Zapstr, and Stemstr each use proprietary event formats, fragmenting the ecosystem. A common standard would enable interoperability so users could discover and play audio from any compatible client.&lt;/li>
&lt;li>&lt;strong>NIP-A3 Universal Payment Targets&lt;/strong> - &lt;a href="https://github.com/nostr-protocol/nips/pull/2119">PR #2119&lt;/a> proposes kind 10133 events using RFC-8905 &lt;code>payto:&lt;/code> URIs to expose payment options across multiple networks. Rather than creating separate event kinds for Bitcoin, Lightning, &lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a>, or traditional payment rails, this abstraction lets clients parse standardized tags and invoke native payment handlers. The approach is future-proof since new payment methods just need a &lt;code>payto:&lt;/code> URI scheme.&lt;/li>
&lt;/ul>
&lt;h2 id="nip-deep-dive-nip-51-and-nip-65">NIP Deep Dive: NIP-51 and NIP-65&lt;/h2>
&lt;p>This week we cover two NIPs that store user preferences: NIP-51 for organizing content, and NIP-65 for organizing relay connections. Both use replaceable events, meaning each new publication overwrites the previous version.&lt;/p>
&lt;h3 id="nip-51entopicsnip-51-lists">&lt;a href="https://nostrcompass.org/en/topics/nip-51/">NIP-51&lt;/a>: Lists&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/51.md">NIP-51&lt;/a> defines multiple list types for organizing references to events, users, hashtags, and other content. Amethyst v1.05.0 adds bookmark support, making this a good time to understand how lists work.&lt;/p>
&lt;p>The spec defines several list kinds, each serving a different purpose. Kind 10000 is your mute list for hiding users, threads, or words. Kind 10001 pins events to feature on your profile. Kind 30003 stores bookmarks, which is what Amethyst now supports. Other kinds handle follow sets (30000), curated article collections (30004), hashtag interests (30015), and custom emoji sets (30030).&lt;/p>
&lt;p>Lists reference content through tags. A bookmark list uses &lt;code>e&lt;/code> tags for specific events and &lt;code>a&lt;/code> tags for addressable content like articles:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;ae3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1736784000&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">30003&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;d&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;saved-articles&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;e&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;abc123def456...&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.example&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;a&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;30023:author-pubkey:article-id&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.example&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;encrypted-private-bookmarks&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;908a15e46fb4d8675bab026fc230a0e3542bfade63da02d542fb78b2a8513fcd0092619a2c8c1221e581946e0191f2af505dfdf8657a414dbca329186f009262&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>d&lt;/code> tag provides a unique identifier, so you can maintain multiple bookmark sets like &amp;ldquo;saved-articles&amp;rdquo;, &amp;ldquo;read-later&amp;rdquo;, or &amp;ldquo;favorites&amp;rdquo; under the same kind.&lt;/p>
&lt;p>Lists support both public and private items. Public items appear in the tags array, visible to anyone who fetches the event. Private items go in the &lt;code>content&lt;/code> field, encrypted using &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> to yourself. This dual structure lets you keep public bookmarks while attaching private notes, or maintain a mute list without revealing who you&amp;rsquo;ve muted. To encrypt to yourself, use NIP-44 with your own pubkey as recipient.&lt;/p>
&lt;p>The 10000-series kinds are replaceable, meaning relays keep only one event per pubkey. The 30000-series are parameterized replaceable, allowing one event per pubkey and &lt;code>d&lt;/code> tag combination. In both cases, updating a list means publishing a complete replacement; you cannot send incremental changes. Clients should preserve unknown tags when modifying lists to avoid overwriting data added by other applications.&lt;/p>
&lt;h3 id="nip-65entopicsnip-65-relay-list-metadata">&lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a>: Relay List Metadata&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/65.md">NIP-65&lt;/a> defines kind 10002 events that advertise which relays a user prefers for reading and writing. This helps other users and clients find your content.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;bd2217a96b5835b59f9a6a42d8d8a36f8c9b7d4e5f0a1b2c3d4e5f6a7b8c9d0e1&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1736784000&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">10002&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;r&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.damus.io&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;read&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;r&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://nos.lol&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;r&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.nostr.band&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;write&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;f1c2d3e4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Each &lt;code>r&lt;/code> tag contains a relay URL and an optional marker. A &lt;code>write&lt;/code> marker designates your outbox: relays where you publish your content. A &lt;code>read&lt;/code> marker designates your inbox: relays where you check for mentions, replies, and tags. Omitting the marker indicates both.&lt;/p>
&lt;p>When Alice wants to find Bob&amp;rsquo;s posts, her client fetches Bob&amp;rsquo;s kind 10002, extracts his write relays (his outbox), and subscribes there. When Alice replies to Bob, her client publishes to his read relays (his inbox) so he&amp;rsquo;ll see the mention. This relay-aware routing is the &amp;ldquo;outbox model,&amp;rdquo; and it distributes users across many relays rather than concentrating everyone on a few central servers.&lt;/p>
&lt;p>NIP-65 handles public content routing, but private messages use a separate list. &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> defines kind 10050 for DM inbox relays, using &lt;code>relay&lt;/code> tags instead of &lt;code>r&lt;/code> tags. When sending someone a private message, clients look for the recipient&amp;rsquo;s kind 10050 event and publish the encrypted gift-wrapped message there. This separation keeps DM routing distinct from public content routing, and lets users specify different relays for private versus public communication.&lt;/p>
&lt;p>The outbox model improves censorship resistance since no single relay needs to store or serve everyone&amp;rsquo;s content. Clients maintain connections to relays listed in their followed users&amp;rsquo; NIP-65 events, dynamically connecting to new relays as they discover new accounts. NIP-65 complements the relay hints found in other NIPs. When you tag someone with &lt;code>[&amp;quot;p&amp;quot;, &amp;quot;pubkey&amp;quot;, &amp;quot;wss://hint.relay&amp;quot;]&lt;/code>, the hint tells clients where to look for that specific reference. NIP-65 provides the authoritative, user-controlled list, while hints offer shortcuts embedded in individual events.&lt;/p>
&lt;p>For best results, keep your relay list current since stale entries make you harder to find. The spec recommends two to four relays per category. Listing too many relays burdens every client that wants to fetch your content, slowing down their experience and increasing network load. Clients cache NIP-65 events and refresh them periodically to stay current as users update their preferences.&lt;/p>
&lt;h2 id="releases">Releases&lt;/h2>
&lt;p>&lt;strong>Amethyst v1.05.0&lt;/strong> - The popular Android client &lt;a href="https://github.com/vitorpamplona/amethyst/releases">ships a major update&lt;/a> with several headline features. &lt;a href="https://nostrcompass.org/en/topics/nip-51/">NIP-51&lt;/a> kind 30003 bookmark lists let users save posts for later reference, syncing across compatible clients. Voice notes now work in DMs and regular posts with waveform visualization, media server selection, and upload progress indicators. &lt;a href="https://nostrcompass.org/en/topics/web-of-trust/">Web of Trust&lt;/a> scores are now visible in the interface, helping users understand how the algorithm evaluates accounts relative to their social graph. The &lt;a href="https://nostrcompass.org/en/topics/quartz/">Quartz&lt;/a> database migration improves query performance as part of the OpenSats-funded Kotlin Multiplatform work. An early desktop release brings Amethyst to Windows, macOS, and Linux via Compose Multiplatform, sharing the same codebase as the Android app. New user onboarding flows smooth the experience for first-time Nostr users.&lt;/p>
&lt;p>&lt;strong>Nostur v1.25.3&lt;/strong> - The iOS and macOS client &lt;a href="https://github.com/nostur-com/nostur-ios-public/releases">focuses on private messaging&lt;/a> with &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> improvements. DM conversations now support reactions and replies, bringing the interactivity of public posts into encrypted messages. The conversation view has been reworked with better threading so multi-message exchanges are easier to follow, and timestamps show &amp;ldquo;time ago&amp;rdquo; in the DM list for quick scanning. Desktop users get multi-column layouts for viewing multiple feeds or conversations side by side. &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote signer support allows users to keep their private keys in dedicated signer apps like Amber or nsec.app. Additional fixes restore DM functionality on iOS 15 and iOS 16, resolve notification delays, and add the ability to configure which relays receive published DMs.&lt;/p>
&lt;h2 id="notable-code-and-documentation-changes">Notable code and documentation changes&lt;/h2>
&lt;p>&lt;em>These are open pull requests and early-stage work, perfect for getting feedback before they merge. If something catches your eye, consider reviewing or commenting!&lt;/em>&lt;/p>
&lt;h3 id="citrine-android-relay">Citrine (Android Relay)&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Citrine/pull/89">PR #89&lt;/a> fixes a SQL injection vulnerability in the Android personal relay app. The issue allowed malformed event data to execute arbitrary database queries, a serious flaw for any app that stores and processes untrusted input. The fix properly sanitizes all database operations using parameterized queries. No release has been tagged yet, so users will need to wait for the next version or build from source. &lt;a href="https://github.com/greenart7c3/Citrine/pull/90">PR #90&lt;/a> optimizes ContentProvider query performance with database-level filtering and pagination, reducing latency when external apps like Amethyst access Citrine&amp;rsquo;s event database through Android&amp;rsquo;s inter-process communication layer.&lt;/p>
&lt;h3 id="rust-nostr-library">rust-nostr (Library)&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-62/">NIP-62&lt;/a> (Vanish Requests) support is expanding across rust-nostr&amp;rsquo;s database backends. &lt;a href="https://github.com/rust-nostr/nostr/pull/1180">PR #1180&lt;/a>, merged two weeks ago, added NIP-62 support to SQLite, handling &lt;code>ALL_RELAYS&lt;/code> vanish requests since the database layer doesn&amp;rsquo;t know specific relay URLs. &lt;a href="https://github.com/rust-nostr/nostr/pull/1210">PR #1210&lt;/a> extends this to the LMDB backend, ensuring vanish requests are persisted to disk and survive relay restarts. An IndexedDB implementation for browser environments is also in progress. Together, these changes give developers consistent NIP-62 support across SQLite, LMDB, and soon browser storage.&lt;/p>
&lt;h3 id="ndk-nostr-development-kit">NDK (Nostr Development Kit)&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-dev-kit/ndk/pull/375">PR #375&lt;/a> fixes a bug in the seenEvents tracking system. The issue caused certain subscription patterns to incorrectly mark events as already seen, leading to missed content when users opened new subscriptions or reconnected to relays. The fix ensures events are tracked accurately across subscription lifecycles, which is particularly important for applications that dynamically subscribe and unsubscribe based on user navigation. NDK bumped to beta.70 with this fix included.&lt;/p>
&lt;h3 id="damus-ios">Damus (iOS)&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/damus/pull/3515">PR #3515&lt;/a> fixes a startup crash affecting iOS 17 users. The issue stemmed from an arithmetic overflow in &lt;code>NdbUseLock&lt;/code>, a fallback class used because Swift Mutexes aren&amp;rsquo;t available on iOS 17. The fix replaces the previous synchronization approach with &lt;code>NSLock&lt;/code>, which is available on iOS 17 and handles the remaining race conditions properly. iOS 18+ users weren&amp;rsquo;t affected since they have access to the native Swift Mutex implementation.&lt;/p>
&lt;p>Separately, a batch of longform article improvements landed via &lt;a href="https://github.com/damus-io/damus/pull/3509">PR #3509&lt;/a>. Reading progress bars track your position through articles, estimated read times appear on previews, and sepia mode with adjustable line height settings provide more comfortable reading. Focus mode auto-hides the navigation chrome when scrolling down and restores it on tap, reducing visual clutter for distraction-free reading. Several fixes address image display in markdown content and ensure articles open at the top rather than midway through.&lt;/p>
&lt;h3 id="zapstream-live-streaming">Zap.stream (Live Streaming)&lt;/h3>
&lt;p>YouTube and Kick chat integration bridges messages from external streaming platforms into Nostr. Streamers who multicast to YouTube, Kick, and Zap.stream can now see all chat messages in a unified view, with messages from each platform appearing alongside native Nostr comments. This removes a major friction point for creators who want to use Nostr for streaming but can&amp;rsquo;t abandon audiences on established platforms. The integration displays which platform each message originated from and handles the authentication flow for connecting external accounts.&lt;/p>
&lt;h3 id="chachi-nip-29-groups">Chachi (NIP-29 Groups)&lt;/h3>
&lt;p>The &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> group chat client shipped six merged PRs this week. A security update addresses &lt;a href="https://github.com/purrgrammer/chachi/pull/89">CVE-2026-22029&lt;/a>, an XSS vulnerability in react-router that could enable open redirect attacks; the fix updates to react-router-dom 6.30.0. &lt;a href="https://github.com/purrgrammer/chachi/pull/92">PR #92&lt;/a> adds paginated message loading for group chats, so long conversations load incrementally rather than all at once. &lt;a href="https://github.com/purrgrammer/chachi/pull/91">PR #91&lt;/a> fixes several NIP-29 bugs including a race condition that caused blank group names on initial load and undefined participant lists that crashed member views. Translation coverage now spans all 31 supported locales with 1060 keys each.&lt;/p>
&lt;h3 id="0xchat-messaging">0xchat (Messaging)&lt;/h3>
&lt;p>The Telegram-style messaging client improved &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> compliance by properly saving signer package names when using external signing apps, fixing issues where the app would lose track of which signer to use after restarts. NIP-17 reply handling now correctly includes the &lt;code>e&lt;/code> tag for threading, ensuring replies appear in the right conversation context across clients. Performance optimizations address scroll lag in message lists, a common pain point when loading long chat histories. Draft auto-save prevents message loss if you navigate away mid-composition, and file storage options now include default FileDropServer and BlossomServer endpoints.&lt;/p>
&lt;h3 id="primal-ios">Primal (iOS)&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote signer support lands on iOS via &lt;a href="https://github.com/PrimalHQ/primal-ios-app/pull/184">PR #184&lt;/a>, completing the cross-platform rollout that started with Android several weeks ago. Users can now keep their private keys in dedicated bunker services like nsec.app or self-hosted nsecBunker instances, connecting over Nostr relays to sign events without exposing keys to the client app. This separation improves security posture for users who want to use Primal&amp;rsquo;s features while maintaining stricter key management practices. The implementation includes QR code scanning for bunker connection URIs and handles the NIP-46 request/response flow over encrypted relay messages.&lt;/p>
&lt;hr>
&lt;p>That&amp;rsquo;s it for this week. Building something? Have news to share? Want us to cover your project? &lt;a href="nostr:npub1wav4fae3gyfy3xj298kxj2mj8phavz7vavps34przq02j7w902qq902923">Reach out via NIP-17 DM&lt;/a> or find us on Nostr.&lt;/p></content:encoded></item><item><title>Nostr Compass #4</title><link>https://nostrcompass.org/en/newsletters/2026-01-07-newsletter/</link><pubDate>Wed, 07 Jan 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-01-07-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to the Nostr protocol ecosystem.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> Primal Android ships &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote signing and &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> local signer support, making it a full-fledged signing hub for other Android apps. The &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot Protocol&lt;/a> team addressed findings from a security audit with 18 merged PRs hardening &lt;a href="https://nostrcompass.org/en/topics/mls/">MLS&lt;/a>-based encrypted messaging. Citrine hits v1.0 and Applesauce ships v5.0 across its entire library suite. TENEX builds out AI agent supervision on Nostr, and Jumble adds smart relay pooling. A NIP-55 spec fix clarifies &lt;code>nip44_encrypt&lt;/code> return fields, and a &lt;a href="https://nostrcompass.org/en/topics/nip-50/">NIP-50&lt;/a> PR proposes query expression extensions for advanced search. In our deep dive, we explain &lt;a href="https://nostrcompass.org/en/topics/nip-04/">NIP-04&lt;/a> and &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a>: why the legacy encryption has security flaws and how the modern replacement fixes them.&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to the Nostr protocol ecosystem.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> Primal Android ships &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote signing and &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> local signer support, making it a full-fledged signing hub for other Android apps. The &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot Protocol&lt;/a> team addressed findings from a security audit with 18 merged PRs hardening &lt;a href="https://nostrcompass.org/en/topics/mls/">MLS&lt;/a>-based encrypted messaging. Citrine hits v1.0 and Applesauce ships v5.0 across its entire library suite. TENEX builds out AI agent supervision on Nostr, and Jumble adds smart relay pooling. A NIP-55 spec fix clarifies &lt;code>nip44_encrypt&lt;/code> return fields, and a &lt;a href="https://nostrcompass.org/en/topics/nip-50/">NIP-50&lt;/a> PR proposes query expression extensions for advanced search. In our deep dive, we explain &lt;a href="https://nostrcompass.org/en/topics/nip-04/">NIP-04&lt;/a> and &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a>: why the legacy encryption has security flaws and how the modern replacement fixes them.&lt;/p>
&lt;h2 id="news">News&lt;/h2>
&lt;p>&lt;strong>Primal Android Becomes a Full Signing Hub&lt;/strong> - &lt;a href="https://github.com/PrimalHQ/primal-android-app/releases/tag/2.6.18">Version 2.6.18&lt;/a> adds both &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote signing and &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> local signing, turning Primal into a complete signer for other Nostr apps. Remote signing via NIP-46 lets users connect to bunker services over Nostr relays, keeping keys off their device entirely. Local signing via NIP-55 exposes Primal as an Android content provider, so apps like Amethyst or Citrine can request signatures without ever touching the private key. &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/839">Several follow-up PRs&lt;/a> fixed compatibility issues with the NIP-55 spec&amp;rsquo;s hex pubkey requirement, and improved parsing of malformed &lt;code>nostrconnect://&lt;/code> URIs. The release also includes media pre-caching for smoother scrolling, improved thread load times, and avatar pre-caching.&lt;/p>
&lt;p>&lt;strong>Marmot Protocol Hardens Security After Audit&lt;/strong> - The &lt;a href="https://github.com/marmot-protocol/mdk">Marmot Development Kit&lt;/a> (mdk), which implements &lt;a href="https://nostrcompass.org/en/topics/nip-104/">NIP-104&lt;/a> MLS-based end-to-end encrypted messaging, received extensive security fixes this week. Eighteen merged pull requests addressed audit findings including: &lt;a href="https://github.com/marmot-protocol/mdk/pull/97">hash verification for encrypted group images&lt;/a> to prevent storage-level blob substitution attacks, &lt;a href="https://github.com/marmot-protocol/mdk/pull/110">pagination for pending welcomes&lt;/a> to prevent memory exhaustion, &lt;a href="https://github.com/marmot-protocol/mdk/pull/112">MLS Group ID leakage in error messages&lt;/a>, and &lt;a href="https://github.com/marmot-protocol/mdk/pull/98">base64 encoding enforcement&lt;/a> for key packages. The &lt;a href="https://github.com/marmot-protocol/marmot/pull/20">Marmot spec itself was updated&lt;/a> with MIP-04 v2 versioning and security improvements. Active PRs continue addressing nonce reuse, secret zeroization, and cache pollution vectors.&lt;/p>
&lt;p>&lt;strong>Nostrability Tracks Relay Hint Support&lt;/strong> - A new &lt;a href="https://github.com/nostrability/nostrability/issues/270">relay hints compatibility tracker&lt;/a> documents how clients construct and consume relay hints across the ecosystem. The tracker reveals that while most clients now construct hints per &lt;a href="https://nostrcompass.org/en/topics/nip-10/">NIP-10&lt;/a> and &lt;a href="https://nostrcompass.org/en/topics/nip-19/">NIP-19&lt;/a>, consumption varies widely: some clients include hints in outgoing events but don&amp;rsquo;t use incoming hints for fetching. Six clients earned &amp;ldquo;Full&amp;rdquo; tier status for complete implementation. The tracker is useful for developers checking interoperability and for users wondering why some clients find content others can&amp;rsquo;t.&lt;/p>
&lt;p>&lt;strong>Nostria 2.0 Ships Cross-Platform Feature Overhaul&lt;/strong> - The &lt;a href="https://nostria.app">Nostria&lt;/a> client &lt;a href="#ZgotmplZ">released version 2.0&lt;/a> on December 30 with significant additions across iOS (TestFlight), Android (Play Store), Web, and Windows. The release adds native music support with playlist creation, track uploading, zap-based artist payments, and a WinAmp-style player with functional equalizer. Live streaming gets Game API integration showing rich metadata during gameplay streams. A new Summary feature generates hourly, daily, or weekly activity digests as compressed timeline views. The Discover section offers curated lists for finding content and profiles. Media publishing is simplified with automatic short-form post generation for cross-client discoverability. Remote signer connections now work via QR code scanning without manual configuration. Profile discovery addresses a common Nostr pain point: when users move between relays without bringing their metadata, Nostria locates their profile and republishes it to their current relays. Premium subscribers gain YouTube channel integration, private Memos, analytics dashboards, and automatic following list backups with merge/restore options.&lt;/p>
&lt;h2 id="nip-updates">NIP Updates&lt;/h2>
&lt;p>Recent changes to the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a>:&lt;/p>
&lt;p>&lt;strong>Merged:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a>&lt;/strong> - Fixed the return field for &lt;code>nip44_encrypt&lt;/code> method (&lt;a href="https://github.com/nostr-protocol/nips/pull/2184">#2184&lt;/a>). Android signers must now return the encrypted payload in the &lt;code>signature&lt;/code> field (matching &lt;code>nip44_decrypt&lt;/code>) rather than a separate field. This aligns the spec with existing implementations in Amber and Primal.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Open PRs:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-50/">NIP-50&lt;/a>&lt;/strong> - Query Expression Extensions (&lt;a href="https://github.com/nostr-protocol/nips/pull/2182">#2182&lt;/a>) proposes extending NIP-50 search with structured query expressions. The PR adds operators like &lt;code>kind:1&lt;/code>, &lt;code>author:npub1...&lt;/code>, and boolean combinations (&lt;code>AND&lt;/code>, &lt;code>OR&lt;/code>, &lt;code>NOT&lt;/code>), enabling more precise search queries beyond simple text matching. This would let clients build advanced search interfaces while maintaining backward compatibility with basic search strings.&lt;/li>
&lt;/ul>
&lt;h2 id="nip-deep-dive-nip-04-and-nip-44">NIP Deep Dive: NIP-04 and NIP-44&lt;/h2>
&lt;p>This week we cover Nostr&amp;rsquo;s encryption standards: the legacy NIP-04 that you&amp;rsquo;ll still encounter, and its modern replacement NIP-44 that fixes critical security flaws.&lt;/p>
&lt;h3 id="nip-04entopicsnip-04-encrypted-direct-messages-legacy">&lt;a href="https://nostrcompass.org/en/topics/nip-04/">NIP-04&lt;/a>: Encrypted Direct Messages (Legacy)&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/04.md">NIP-04&lt;/a> was Nostr&amp;rsquo;s first attempt at encrypted messaging, using kind 4 events. While simple to implement, it has known security weaknesses and is deprecated in favor of NIP-44.&lt;/p>
&lt;p>&lt;strong>How it works:&lt;/strong> NIP-04 uses ECDH (Elliptic Curve Diffie-Hellman) to derive a shared secret between sender and recipient, then encrypts with AES-256-CBC.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;event-id&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;sender-pubkey&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1736200000&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">4&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [[&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;lt;recipient-pubkey&amp;gt;&amp;#34;&lt;/span>]],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;base64-ciphertext?iv=base64-iv&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;signature&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The encryption flow:&lt;/p>
&lt;ol>
&lt;li>Compute shared point: &lt;code>shared = ECDH(sender_privkey, recipient_pubkey)&lt;/code>&lt;/li>
&lt;li>Derive key: &lt;code>key = SHA256(shared_x_coordinate)&lt;/code>&lt;/li>
&lt;li>Generate random 16-byte IV&lt;/li>
&lt;li>Encrypt: &lt;code>ciphertext = AES-256-CBC(key, iv, plaintext)&lt;/code>&lt;/li>
&lt;li>Format content: &lt;code>base64(ciphertext)?iv=base64(iv)&lt;/code>&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Security problems:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>No authentication:&lt;/strong> AES-CBC provides confidentiality but not integrity. An attacker who controls a relay could modify ciphertext bits, causing predictable changes to plaintext (bit-flipping attacks).&lt;/li>
&lt;li>&lt;strong>IV in the clear:&lt;/strong> The initialization vector is transmitted alongside ciphertext, and CBC mode with predictable IVs enables chosen-plaintext attacks.&lt;/li>
&lt;li>&lt;strong>No padding validation:&lt;/strong> Implementations vary in how they handle PKCS#7 padding, potentially enabling padding oracle attacks.&lt;/li>
&lt;li>&lt;strong>Metadata exposure:&lt;/strong> The sender pubkey, recipient pubkey, and timestamp are all visible to relays.&lt;/li>
&lt;li>&lt;strong>Key reuse:&lt;/strong> The same shared secret is used for all messages between two parties, forever.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Why it still exists:&lt;/strong> Many older clients and relays only support NIP-04. You&amp;rsquo;ll encounter it when interacting with legacy systems. Signers like Amber and apps like Primal still implement &lt;code>nip04_encrypt&lt;/code>/&lt;code>nip04_decrypt&lt;/code> for backward compatibility.&lt;/p>
&lt;h3 id="nip-44entopicsnip-44-versioned-encryption">&lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a>: Versioned Encryption&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/44.md">NIP-44&lt;/a> is the modern encryption standard, designed to fix NIP-04&amp;rsquo;s well-known flaws. A Cure53 security audit of NIP-44 implementations identified 10 issues (including timing attacks and forward secrecy concerns) that were addressed before the spec was finalized. It uses ChaCha20-Poly1305 with proper key derivation and authenticated encryption.&lt;/p>
&lt;p>&lt;strong>Key improvements over NIP-04:&lt;/strong>&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th style="text-align: left">Aspect&lt;/th>
 &lt;th style="text-align: left">NIP-04&lt;/th>
 &lt;th style="text-align: left">NIP-44&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td style="text-align: left">Cipher&lt;/td>
 &lt;td style="text-align: left">AES-256-CBC&lt;/td>
 &lt;td style="text-align: left">XChaCha20-Poly1305&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">Authentication&lt;/td>
 &lt;td style="text-align: left">None&lt;/td>
 &lt;td style="text-align: left">Poly1305 MAC&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">Key derivation&lt;/td>
 &lt;td style="text-align: left">SHA256(shared_x)&lt;/td>
 &lt;td style="text-align: left">HKDF with salt&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">Nonce&lt;/td>
 &lt;td style="text-align: left">16-byte IV, reused pattern&lt;/td>
 &lt;td style="text-align: left">24-byte random nonce&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">Padding&lt;/td>
 &lt;td style="text-align: left">PKCS#7 (leaks length)&lt;/td>
 &lt;td style="text-align: left">Padded to power of 2&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">Versioning&lt;/td>
 &lt;td style="text-align: left">None&lt;/td>
 &lt;td style="text-align: left">Version byte prefix&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Encryption flow:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Conversation key:&lt;/strong> Derive a stable key for each sender-recipient pair:&lt;/p>
&lt;pre tabindex="0">&lt;code>shared_x = ECDH(sender_privkey, recipient_pubkey).x
conversation_key = HKDF-SHA256(
 ikm = shared_x,
 salt = &amp;#34;nip44-v2&amp;#34;,
 info = &amp;#34;&amp;#34;
)
&lt;/code>&lt;/pre>&lt;/li>
&lt;li>
&lt;p>&lt;strong>Message keys:&lt;/strong> For each message, generate a random 32-byte nonce and derive encryption/authentication keys:&lt;/p>
&lt;pre tabindex="0">&lt;code>keys = HKDF-SHA256(
 ikm = conversation_key,
 salt = nonce,
 info = &amp;#34;nip44-v2&amp;#34;
)
chacha_key = keys[0:32]
chacha_nonce = keys[32:44]
hmac_key = keys[44:76]
&lt;/code>&lt;/pre>&lt;/li>
&lt;li>
&lt;p>&lt;strong>Pad plaintext:&lt;/strong> Pad to the next power of 2 (minimum 32 bytes) to hide message length:&lt;/p>
&lt;pre tabindex="0">&lt;code>padded = [length_u16_be] + [plaintext] + [zeros to next power of 2]
&lt;/code>&lt;/pre>&lt;/li>
&lt;li>
&lt;p>&lt;strong>Encrypt and authenticate:&lt;/strong>&lt;/p>
&lt;pre tabindex="0">&lt;code>ciphertext = XChaCha20(chacha_key, chacha_nonce, padded)
mac = HMAC-SHA256(hmac_key, nonce + ciphertext)
&lt;/code>&lt;/pre>&lt;/li>
&lt;li>
&lt;p>&lt;strong>Format payload:&lt;/strong>&lt;/p>
&lt;pre tabindex="0">&lt;code>payload = [version=0x02] + [nonce] + [ciphertext] + [mac]
content = base64(payload)
&lt;/code>&lt;/pre>&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Version byte:&lt;/strong> The first byte (&lt;code>0x02&lt;/code>) indicates the encryption version. This allows future upgrades without breaking existing messages. Version &lt;code>0x01&lt;/code> was an earlier draft that was never widely deployed.&lt;/p>
&lt;p>&lt;strong>Decryption:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>Decode base64, check version byte is &lt;code>0x02&lt;/code>&lt;/li>
&lt;li>Extract nonce (bytes 1-32), ciphertext, and MAC (last 32 bytes)&lt;/li>
&lt;li>Derive conversation key using recipient&amp;rsquo;s private key and sender&amp;rsquo;s public key&lt;/li>
&lt;li>Derive message keys from conversation key and nonce&lt;/li>
&lt;li>Verify MAC before decrypting (reject if invalid)&lt;/li>
&lt;li>Decrypt ciphertext, extract length prefix, return unpadded plaintext&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Security properties:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Authenticated encryption:&lt;/strong> Poly1305 MAC ensures any tampering is detected before decryption&lt;/li>
&lt;li>&lt;strong>Forward secrecy (partial):&lt;/strong> Each message uses a unique nonce, so compromising one message doesn&amp;rsquo;t reveal others. However, compromising a private key still reveals all past messages (no ratcheting).&lt;/li>
&lt;li>&lt;strong>Length hiding:&lt;/strong> Power-of-2 padding obscures exact message length&lt;/li>
&lt;li>&lt;strong>Timing attack resistance:&lt;/strong> Constant-time comparison for MAC verification&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Usage in practice:&lt;/strong> NIP-44 is the encryption layer for:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> private direct messages (inside gift wrap)&lt;/li>
&lt;li>&lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote signer communication&lt;/li>
&lt;li>&lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> seal encryption&lt;/li>
&lt;li>&lt;a href="https://nostrcompass.org/en/topics/nip-104/">Marmot Protocol&lt;/a> group messages, where NIP-44 wraps MLS-encrypted content using a key derived from the MLS exporter secret&lt;/li>
&lt;li>Any application needing secure point-to-point encryption&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Migration guidance:&lt;/strong> New applications should use NIP-44 exclusively. For backward compatibility, check if a contact&amp;rsquo;s client supports NIP-44 (via &lt;a href="https://nostrcompass.org/en/topics/nip-89/">NIP-89&lt;/a> app metadata or relay support) before falling back to NIP-04. When receiving messages, attempt NIP-44 decryption first, then fall back to NIP-04 for legacy content.&lt;/p>
&lt;h2 id="releases">Releases&lt;/h2>
&lt;p>&lt;strong>Primal Android v2.6.18&lt;/strong> - &lt;a href="https://github.com/PrimalHQ/primal-android-app/releases/tag/2.6.18">Full release&lt;/a> adds &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote signing and &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> local signing, turning Primal into a signing hub for other Android apps. Performance improvements include media pre-caching, avatar pre-caching, and faster thread loading. Bug fixes address self-mentions in bios, media gallery crashes, and stream title fallbacks. On iOS, Primal uses background audio playback to keep the app alive for receiving NIP-46 signing requests; users can change the sound or mute it entirely in settings.&lt;/p>
&lt;p>&lt;strong>Mostro v0.15.6&lt;/strong> - The &lt;a href="https://nostrcompass.org/en/topics/nip-69/">NIP-69&lt;/a> P2P Bitcoin trading platform&amp;rsquo;s &lt;a href="https://github.com/MostroP2P/mostro/releases/tag/v0.15.6">latest release&lt;/a> completes the development fund implementation with Phase 4 audit events. Dev fee payments are now tracked via kind 38383 Nostr events published after each successful payment, enabling third-party verification and analytics. Amount calculations were fixed for buyer/seller messages, and premium logic was aligned with the lnp2pbot reference implementation.&lt;/p>
&lt;p>&lt;strong>Aegis v0.3.5&lt;/strong> - The cross-platform signer &lt;a href="https://github.com/ZharlieW/Aegis/releases/tag/v0.3.5">adds dark mode&lt;/a>, improved app icon display, and cleaner UI layouts. Bug fixes address iOS iCloud Private Relay conflicts and event parsing issues. The release also improves how event JSON is passed to the Rust signing function.&lt;/p>
&lt;p>&lt;strong>Citrine v1.0.0&lt;/strong> - The Android relay app &lt;a href="https://github.com/greenart7c3/Citrine/releases/tag/v1.0.0">reaches 1.0&lt;/a>. Citrine lets you run a personal Nostr relay directly on your Android device, useful for local caching, backup, or as a NIP-55 companion. This release adds a crash report handler, improves database query efficiency, and updates translations via Crowdin.&lt;/p>
&lt;p>&lt;strong>Applesauce v5.0.0&lt;/strong> - hzrd149&amp;rsquo;s TypeScript library suite &lt;a href="https://github.com/hzrd149/applesauce/releases">ships a major version&lt;/a> with breaking changes focused on correctness and simplicity. The core package now &lt;a href="https://github.com/hzrd149/applesauce/releases/tag/applesauce-core%405.0.0">verifies event signatures by default&lt;/a> and renames coordinate methods to use clearer &amp;ldquo;address&amp;rdquo; terminology (&lt;code>parseCoordinate&lt;/code> → &lt;code>parseReplaceableAddress&lt;/code>). The relay package &lt;a href="https://github.com/hzrd149/applesauce/releases/tag/applesauce-relay%405.0.0">lowers default retries from 10 to 3&lt;/a> and ignores unreachable relays by default, plus adds &lt;code>createUnifiedEventLoader&lt;/code> for simpler event fetching. The wallet package gains &lt;a href="https://nostrcompass.org/en/topics/nip-87/">NIP-87&lt;/a> &lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a> mint discovery](&lt;a href="https://github.com/hzrd149/applesauce/releases/tag/applesauce-wallet%405.0.0%29">https://github.com/hzrd149/applesauce/releases/tag/applesauce-wallet%405.0.0)&lt;/a>. Direct &lt;code>nostr-tools&lt;/code> dependencies were removed across packages, reducing bundle size and version conflicts.&lt;/p>
&lt;h2 id="notable-code-and-documentation-changes">Notable code and documentation changes&lt;/h2>
&lt;p>&lt;em>These are open pull requests and early-stage work, perfect for getting feedback before they merge. If something catches your eye, consider reviewing or commenting!&lt;/em>&lt;/p>
&lt;h3 id="damus-ios">Damus (iOS)&lt;/h3>
&lt;p>A series of PRs improve the longform article experience. &lt;a href="https://github.com/damus-io/damus/pull/3496">Reading UX improvements&lt;/a> add a progress bar, estimated read time, sepia mode, adjustable line height, and focus mode that hides navigation while scrolling. &lt;a href="https://github.com/damus-io/damus/pull/3489">Image fixes&lt;/a> ensure images in markdown content display with proper aspect ratios by preprocessing standalone images as block-level elements. &lt;a href="https://github.com/damus-io/damus/pull/3497">Longform preview cards&lt;/a> replace inline &lt;code>@naddr1...&lt;/code> text with rich preview cards showing article title and metadata. A new &lt;a href="https://github.com/damus-io/damus/pull/3508">relay integration test suite&lt;/a> adds 137 network-related tests including &lt;a href="https://nostrcompass.org/en/topics/nip-01/">NIP-01&lt;/a> protocol verification and behavior under degraded network conditions (3G simulation).&lt;/p>
&lt;h3 id="bitchat-encrypted-messaging">Bitchat (Encrypted Messaging)&lt;/h3>
&lt;p>Security hardening in the iOS Nostr+&lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a> messenger. &lt;a href="https://github.com/permissionlesstech/bitchat/pull/928">Noise protocol DH secret clearing&lt;/a> fixes six locations where shared secrets weren&amp;rsquo;t being zeroed after Diffie-Hellman key agreement, restoring forward secrecy guarantees. &lt;a href="https://github.com/permissionlesstech/bitchat/pull/929">Thread safety for read receipt queues&lt;/a> adds barrier synchronization to prevent race conditions in NostrTransport. &lt;a href="https://github.com/permissionlesstech/bitchat/pull/920">Message deduplicator optimization&lt;/a> improves performance with high message volumes, and &lt;a href="https://github.com/permissionlesstech/bitchat/pull/919">hex string parsing hardening&lt;/a> prevents crashes from malformed input.&lt;/p>
&lt;h3 id="frostr-threshold-signing">Frostr (Threshold Signing)&lt;/h3>
&lt;p>The &lt;a href="https://nostrcompass.org/en/topics/frost/">FROST&lt;/a>-based threshold signing protocol &lt;a href="https://github.com/FROSTR-ORG/igloo-desktop/pull/62">added QR code display&lt;/a> for group credentials and share credentials during onboarding and in the signer interface. This enables easier setup when distributing key shares across multiple devices, letting users scan credentials instead of manually copying long strings.&lt;/p>
&lt;h3 id="marmot-mdk-library">Marmot mdk (Library)&lt;/h3>
&lt;p>Beyond the security fixes mentioned above, active PRs address remaining audit findings: &lt;a href="https://github.com/marmot-protocol/mdk/pull/109">Secret&lt;T> type for zeroization&lt;/a> introduces a wrapper type that automatically zeros sensitive data on drop, &lt;a href="https://github.com/marmot-protocol/mdk/pull/111">messages query pagination&lt;/a> prevents memory exhaustion when loading chat history, and &lt;a href="https://github.com/marmot-protocol/mdk/pull/102">encrypted storage&lt;/a> adds at-rest encryption for the SQLite database storing group state and messages.&lt;/p>
&lt;h3 id="amethyst-android">Amethyst (Android)&lt;/h3>
&lt;p>A busy week of stability fixes across the Android client. &lt;a href="https://github.com/vitorpamplona/amethyst/commit/2c42796">Lenient JSON parsing&lt;/a> prevents crashes from malformed events by making Kotlin Serialization more forgiving. Event validation now &lt;a href="https://github.com/vitorpamplona/amethyst/commit/40f9622">checks kind field size&lt;/a> before processing to avoid exceptions from oversized values. The trust score UI got a smaller icon to reduce visual interference, and &lt;a href="https://github.com/vitorpamplona/amethyst/commit/69c53ac">improved error logging&lt;/a> helps diagnose relay connection issues. Translation updates arrived via Crowdin, and several SonarQube warnings were addressed.&lt;/p>
&lt;h3 id="tenex-ai-agents">TENEX (AI Agents)&lt;/h3>
&lt;p>The Nostr-native AI agent framework saw 81 commits this week building out autonomous capabilities. New &lt;a href="https://github.com/tenex-chat/tenex/pull/48">agent supervision system&lt;/a> implements behavioral heuristics to monitor agent actions and intervene when needed. &lt;a href="https://github.com/tenex-chat/tenex/commit/b244c10">Delegation transparency&lt;/a> adds user intervention logging to delegation transcripts, so users can audit what agents did on their behalf. The &lt;a href="https://github.com/tenex-chat/tenex/pull/47">LLM provider registry&lt;/a> was modularized for easier integration of different AI backends. Cross-project conversation support lets agents maintain context across multiple Nostr-based projects.&lt;/p>
&lt;h3 id="jumble-web-client">Jumble (Web Client)&lt;/h3>
&lt;p>The relay-focused web client added several user experience improvements. &lt;a href="https://github.com/CodyTseng/jumble/commit/695f2fe">Smart relay pool&lt;/a> intelligently manages connections based on usage patterns. &lt;a href="https://github.com/CodyTseng/jumble/commit/917fcd9">Live feed toggle&lt;/a> lets users switch between real-time streaming and manual refresh. &lt;a href="https://github.com/CodyTseng/jumble/commit/d1b3a8c">Auto-show new notes&lt;/a> at top surfaces fresh content without requiring page reload. &lt;a href="https://github.com/CodyTseng/jumble/commit/fd9f41c">Persistent cache&lt;/a> for following feed and notifications improves load times on return visits. Users can now &lt;a href="https://github.com/CodyTseng/jumble/commit/53a67d8">change default relays&lt;/a> through settings.&lt;/p>
&lt;hr>
&lt;p>That&amp;rsquo;s it for this week. Building something? Have news to share? Want us to cover your project? &lt;a href="nostr:npub1wav4fae3gyfy3xj298kxj2mj8phavz7vavps34przq02j7w902qq902923">Reach out via NIP-17 DM&lt;/a> or find us on Nostr.&lt;/p></content:encoded></item><item><title>Nostr Compass #3</title><link>https://nostrcompass.org/en/newsletters/2025-12-31-newsletter/</link><pubDate>Wed, 31 Dec 2025 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2025-12-31-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to the Nostr protocol ecosystem.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> As 2025 closes, we look back at five years of December milestones in Nostr&amp;rsquo;s evolution. From fiatjaf&amp;rsquo;s first client release in December 2020, through Jack Dorsey&amp;rsquo;s pivotal 14 BTC donation in December 2022, to this month&amp;rsquo;s NIP-55 signer proliferation and NDK&amp;rsquo;s 162x cache speedup, December has consistently marked turning points for the protocol. This special issue traces the technical history through each December, documenting the protocol&amp;rsquo;s growth from two experimental relays to 2,500+ nodes across 50 countries. Plus: Amethyst&amp;rsquo;s desktop module takes shape via Quartz, Notedeck gains messaging, Citrine hosts web apps, and NIP-54 fixes internationalization for non-Latin scripts.&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to the Nostr protocol ecosystem.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> As 2025 closes, we look back at five years of December milestones in Nostr&amp;rsquo;s evolution. From fiatjaf&amp;rsquo;s first client release in December 2020, through Jack Dorsey&amp;rsquo;s pivotal 14 BTC donation in December 2022, to this month&amp;rsquo;s NIP-55 signer proliferation and NDK&amp;rsquo;s 162x cache speedup, December has consistently marked turning points for the protocol. This special issue traces the technical history through each December, documenting the protocol&amp;rsquo;s growth from two experimental relays to 2,500+ nodes across 50 countries. Plus: Amethyst&amp;rsquo;s desktop module takes shape via Quartz, Notedeck gains messaging, Citrine hosts web apps, and NIP-54 fixes internationalization for non-Latin scripts.&lt;/p>
&lt;h2 id="december-recap-five-years-of-nostr-decembers">December Recap: Five Years of Nostr Decembers&lt;/h2>
&lt;p>Nostr turns five this year. fiatjaf initiated the protocol on November 7, 2020, and every December since has marked a distinct phase in its evolution: from proof-of-concept to global movement to production ecosystem. This is a technical retrospective of December 2020 through December 2025, the formative years that established Nostr&amp;rsquo;s foundation and catalyzed its breakout moment.&lt;/p>
&lt;h3 id="december-2020-genesis">December 2020: Genesis&lt;/h3>
&lt;p>The first full month of Nostr&amp;rsquo;s existence saw fiatjaf release &lt;a href="https://github.com/fiatjaf/branle">Branle&lt;/a>, the protocol&amp;rsquo;s first client, built with Quasar (Vue.js) and absurd-sql for local storage. fiatjaf had already established the core architecture: users identified by secp256k1 public keys, all posts cryptographically signed, relays serving as dumb storage that don&amp;rsquo;t communicate with each other. One or two experimental relays served a handful of early adopters coordinating in the Telegram group &lt;a href="https://t.me/nostr_protocol">@nostr_protocol&lt;/a>, which had launched November 16. The &lt;a href="https://fiatjaf.com/nostr.html">original documentation&lt;/a> described &amp;ldquo;the simplest open protocol that is able to create a censorship-resistant global social network,&amp;rdquo; a premise that would take two more years to prove.&lt;/p>
&lt;h3 id="december-2021-early-development">December 2021: Early Development&lt;/h3>
&lt;p>On December 31, 2021, Nostr hit the &lt;a href="https://news.ycombinator.com/item?id=29749061">Hacker News front page&lt;/a> with 110 points and 138 comments, submitted by Cameri. This marked the protocol&amp;rsquo;s first significant exposure to the broader developer community. The network ran on approximately seven relays with fewer than 1,000 users. Branle received updates including private key import (December 31) and multi-relay support. A command-line client, noscl, provided terminal-based interaction. The protocol specifications existed in fiatjaf&amp;rsquo;s documentation, though the formal &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a> wouldn&amp;rsquo;t be created until May 2022. The protocol was, as fiatjaf described it, &amp;ldquo;a work in progress.&amp;rdquo;&lt;/p>
&lt;h3 id="december-2022-the-tipping-point">December 2022: The Tipping Point&lt;/h3>
&lt;p>December 2022 transformed Nostr from a niche experiment into a mainstream movement. The catalyst came on December 15, when Jack Dorsey donated &lt;a href="https://www.coindesk.com/tech/2022/12/15/jack-dorsey-gives-decentralized-social-network-nostr-14-btc-in-funding">14.17171699 BTC&lt;/a> (~$245,000-$250,000) to fiatjaf after discovering the protocol and declaring it &amp;ldquo;100 percent what we wanted from Bluesky, but it wasn&amp;rsquo;t developed from a company.&amp;rdquo; On December 16, fiatjaf announced splitting funds with Damus developer William Casarin (jb55), and Dorsey verified his Nostr account (npub: &lt;code>npub1sg6plzptd64u62a878hep2kev88swjh3tw00gjsfl8f237lmu63q0uf63m&lt;/code>). The funding legitimized the project overnight.&lt;/p>
&lt;p>The same week, Twitter&amp;rsquo;s chaos accelerated adoption. December 14-15 saw suspensions of prominent journalists from the New York Times, CNN, and Washington Post. On December 18, Twitter &lt;a href="https://techcrunch.com/2022/12/18/twitter-wont-let-you-post-your-facebook-instagram-and-mastodon-handles/">announced bans&lt;/a> on accounts promoting Nostr, Mastodon, and other platforms. The policy was reversed the following day after backlash. The exodus drove users to explore alternatives.&lt;/p>
&lt;p>Protocol development surged. On December 16, &lt;a href="https://nostrcompass.org/en/topics/nip-19/">NIP-19&lt;/a> was merged (&lt;a href="https://github.com/nostr-protocol/nips/pull/57">#57&lt;/a>), introducing bech32-encoded identifiers (npub, nsec, note, nprofile, nevent) that made keys human-readable and distinguishable. The NIPs repository logged 36+ commits that month, including NIP-40 and NIP-07 updates. Clients proliferated: Damus filled its TestFlight beta within hours, Astral forked Branle for profile creation, Snort launched as a &amp;ldquo;fast, censorship-resistant&amp;rdquo; web client, and Vitor Pamplona began Amethyst development. Alby v1.22.1 &amp;ldquo;Kemble&amp;rsquo;s Cascade of Stars&amp;rdquo; shipped December 22 with NIP-19 support. By December 7, Nostr had approximately 800 users with profiles; when Damus hit the App Store on January 31, 2023, the floodgates opened, driving growth to 315,000+ users by June 2023.&lt;/p>
&lt;h3 id="december-2023-ecosystem-maturation">December 2023: Ecosystem Maturation&lt;/h3>
&lt;p>December 2023 marked a critical inflection point for Nostr protocol security. On December 20, &lt;a href="https://github.com/nostr-protocol/nips/pull/746">NIP-44 revision 3 was merged&lt;/a> following an independent Cure53 security audit (NOS-01) that identified 10 issues in the TypeScript, Go, and Rust implementations, including timing attacks and forward secrecy concerns. The updated spec replaced the flawed &lt;a href="https://nostrcompass.org/en/topics/nip-04/">NIP-04&lt;/a> encryption with ChaCha20 and HMAC-SHA256, establishing the cryptographic foundation that now underpins &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> private DMs and &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> gift wrapping. The same week, &lt;a href="https://opensats.org/blog/nostr-grants-december-2023">OpenSats announced their fourth wave of grants&lt;/a> on December 21, funding seven projects including Lume, noStrudel, ZapThreads, and an independent NIP-44 audit. This followed the &lt;a href="https://opensats.org/blog/nostr-grants-july-2023">first wave in July 2023&lt;/a> that had funded Damus, Coracle, Iris, and others, bringing total Nostr Fund allocation to approximately $3.4 million across 39 grants.&lt;/p>
&lt;p>The month also exposed sustainability tensions in the ecosystem. On December 28, William Casarin (jb55) &lt;a href="https://stacker.news/items/368863">posted on Stacker News&lt;/a> that 2024 would &amp;ldquo;likely be the last year of Damus,&amp;rdquo; citing that &amp;ldquo;nostr clients don&amp;rsquo;t make money&amp;rdquo; after Apple&amp;rsquo;s restrictions on in-app zaps severely limited revenue potential. The Damus team had previously rejected VC funding. Meanwhile, &lt;a href="https://github.com/getAlby/nostr-wallet-connect/releases/tag/0.4.1">Nostr Wallet Connect v0.4.1&lt;/a> shipped on December 26, extending &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> with &lt;code>pay_keysend&lt;/code>, &lt;code>make_invoice&lt;/code>, &lt;code>lookup_invoice&lt;/code>, &lt;code>list_transactions&lt;/code>, &lt;code>get_balance&lt;/code>, and &lt;code>get_info&lt;/code> methods, laying groundwork for the wallet integrations that would become standard across clients.&lt;/p>
&lt;h3 id="december-2024-protocol-advancement">December 2024: Protocol Advancement&lt;/h3>
&lt;p>December 2024 opened with the &lt;a href="https://damus.io/notedeck/">Notedeck Alpha launch&lt;/a> on November 30, the Damus team&amp;rsquo;s Rust-based desktop client featuring a multi-column interface with multiple account support. Built for Linux, macOS, and Windows (Android planned for 2025), Notedeck initially shipped to Damus Purple subscribers and represented a strategic expansion beyond iOS. Two weeks later, &lt;a href="https://opensats.org/blog/9th-wave-of-nostr-grants">OpenSats announced their ninth wave of grants&lt;/a> on December 16, funding AlgoRelay (the first algorithmic relay for personalized feeds), Pokey (Android app with Bluetooth mesh for restricted internet), Nostr Safebox (&lt;a href="https://nostrcompass.org/en/topics/nip-60/">NIP-60&lt;/a> &lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a> token storage), and LumiLumi (lightweight accessible web client), pushing total Nostr Fund allocation to approximately $9 million, a 67% year-over-year increase.&lt;/p>
&lt;p>The month saw significant client maturation across the ecosystem. &lt;a href="https://github.com/mikedilger/gossip/releases/tag/v0.13.0">Gossip 0.13.0&lt;/a> landed on December 23 with File Metadata (&lt;a href="https://nostrcompass.org/en/topics/nip-92/">NIP-92&lt;/a>/&lt;a href="https://nostrcompass.org/en/topics/nip-94/">NIP-94&lt;/a>) support, Blossom integration, and &lt;a href="https://nostrcompass.org/en/topics/nip-50/">NIP-50&lt;/a> relay search. &lt;a href="https://github.com/coracle-social/coracle/releases/tag/0.5.0">Coracle 0.5.0&lt;/a> shipped December 12 with reworked onboarding and nostr-editor integration. Protocol development remained active with 30 pull requests submitted between December 9-22 (10 merged), including &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> rewrites to use only NIP-44 encryption and continued work on &lt;a href="https://nostrcompass.org/en/topics/nip-104/">NIP-104&lt;/a> for Signal-level double ratchet encryption. Network statistics showed 224,000+ daily trusted pubkey events, 4x year-over-year growth in new profiles with contact lists, and a 50% increase in public writing events.&lt;/p>
&lt;h3 id="december-2025-ecosystem-expansion">December 2025: Ecosystem Expansion&lt;/h3>
&lt;p>December 2025 brought continued protocol maturation and ecosystem expansion. On December 21, &lt;a href="https://opensats.org/blog/fourteenth-wave-of-nostr-grants">OpenSats announced their fourteenth wave of Nostr grants&lt;/a>, funding three projects: YakiHonne (a multi-platform client with creator portal for long-form content and &lt;a href="https://nostrcompass.org/en/topics/cashu/">Cashu&lt;/a>/Nutzaps payment integration), Quartz (Vitor Pamplona&amp;rsquo;s Kotlin Multiplatform library that powers Amethyst and will enable an iOS version), and Nostr Feedz (RSS-to-Nostr bidirectional integration by PlebOne). Grant renewals went to Dart NDK and Mattn&amp;rsquo;s nostr-relay.&lt;/p>
&lt;p>Protocol evolution continued with &lt;a href="https://nostrcompass.org/en/topics/nip-be/">NIP-BE&lt;/a> (Bluetooth Low Energy messaging, &lt;a href="https://github.com/nostr-protocol/nips/pull/1979">#1979&lt;/a>) merged in November, enabling offline device synchronization. &lt;a href="https://nostrcompass.org/en/topics/nip-a4/">NIP-A4&lt;/a> (Public Messages, kind 24, &lt;a href="https://github.com/nostr-protocol/nips/pull/1988">#1988&lt;/a>) landed later in the month, defining notification-screen messages that use &lt;code>q&lt;/code> tags to avoid threading complications. &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> received major clarification (&lt;a href="https://github.com/nostr-protocol/nips/pull/2106">#2106&lt;/a>), introducing the &lt;code>hidden&lt;/code> tag for truly private, undiscoverable groups. The &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> spec also saw refinement (&lt;a href="https://github.com/nostr-protocol/nips/pull/2166">#2166&lt;/a>), addressing a common implementation mistake where developers called &lt;code>get_public_key&lt;/code> from background processes.&lt;/p>
&lt;p>On the client side, &lt;a href="https://nostrcompass.org/en/newsletters/2025-12-24-newsletter/#news">Primal Android became a full NIP-55 signer&lt;/a> through eight merged PRs implementing &lt;code>LocalSignerContentProvider&lt;/code>, joining Amber and Aegis as Android signing options. The &lt;a href="https://nostrcompass.org/en/newsletters/2025-12-24-newsletter/#notable-code-and-documentation-changes">NDK library achieved 162x faster cache queries&lt;/a> (from ~3,690ms to ~22ms) by eliminating duplicate writes and unnecessary LRU cache lookups (&lt;a href="https://github.com/nostr-dev-kit/ndk/pull/371">PR #371&lt;/a>, &lt;a href="https://github.com/nostr-dev-kit/ndk/pull/372">PR #372&lt;/a>). Shopstr introduced &lt;a href="https://nostrcompass.org/en/newsletters/2025-12-24-newsletter/#news">Zapsnags&lt;/a> for flash sales via zaps. White Noise shipped &lt;a href="https://nostrcompass.org/en/topics/mip-05/">MIP-05&lt;/a> privacy-preserving push notifications. See &lt;a href="https://nostrcompass.org/en/newsletters/2025-12-17-newsletter/">Newsletter #1&lt;/a> and &lt;a href="https://nostrcompass.org/en/newsletters/2025-12-24-newsletter/">Newsletter #2&lt;/a> for complete coverage.&lt;/p>
&lt;hr>
&lt;p>Five years ago, fiatjaf released Branle to a handful of users across two experimental relays. Today, the protocol supports 140+ clients, 2,500+ relays across 50 countries, and a growing web of trust linking hundreds of thousands of keypairs. December&amp;rsquo;s pattern of major releases continued this month with Bluetooth messaging, Android signer proliferation, and infrastructure grants signaling sustained investment in cross-platform tooling.&lt;/p>
&lt;h2 id="news">News&lt;/h2>
&lt;p>&lt;strong>Amethyst Desktop Takes Shape&lt;/strong> - The Quartz grant from OpenSats&amp;rsquo; fourteenth wave is already producing results. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/1625">PR #1625&lt;/a> creates a full &lt;code>:desktopApp&lt;/code> module for Amethyst using Compose Multiplatform, with login and global feed screens functional on Desktop JVM. The architecture converts the &lt;code>:commons&lt;/code> module to Kotlin Multiplatform with a clean source set structure (&lt;code>commonMain&lt;/code>, &lt;code>jvmAndroid&lt;/code>, &lt;code>androidMain&lt;/code>, &lt;code>jvmMain&lt;/code>), enabling shared UI components between Android and desktop while leaving platform-specific decisions to each target. This lays the foundation for the eventual iOS version via the same Kotlin Multiplatform approach.&lt;/p>
&lt;p>&lt;strong>Amethyst Voice Replies&lt;/strong> - A Christmas delivery from davotoula: &lt;a href="https://github.com/vitorpamplona/amethyst/pull/1622">PR #1622&lt;/a> adds dedicated voice reply screens with waveform visualization, re-record support, media server selection, and upload progress indicators. Users can now reply to both root voice messages and voice replies with audio.&lt;/p>
&lt;p>&lt;strong>Notedeck Adds Messaging&lt;/strong> - Notedeck, the Damus desktop client, gained a messages feature in &lt;a href="https://github.com/damus-io/notedeck/pull/1223">PR #1223&lt;/a>, expanding beyond timeline browsing into direct communication.&lt;/p>
&lt;p>&lt;strong>Citrine Hosts Web Apps&lt;/strong> - Citrine can now &lt;a href="https://github.com/greenart7c3/Citrine/pull/81">host web applications&lt;/a>, turning your phone into a local-first Nostr web server. A separate &lt;a href="https://github.com/greenart7c3/Citrine/pull/85">PR #85&lt;/a> adds automatic reconnection and event broadcasting when network connectivity returns, with comprehensive test coverage across Android API levels.&lt;/p>
&lt;p>&lt;strong>Nostrability Developer Toolkit Registry&lt;/strong> - The &lt;a href="https://github.com/nostrability/nostrability/issues/264">Developer Kits &amp;amp; Tooling&lt;/a> tracker maintains a curated registry of SDKs, libraries, and developer tools across languages (TypeScript, Rust, Python, Go, Dart, Swift, and more). If you&amp;rsquo;re new to Nostr development, this is a useful starting point for finding the right toolkit for your stack.&lt;/p>
&lt;h2 id="nip-updates">NIP Updates&lt;/h2>
&lt;p>Recent changes to the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a>:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-54/">NIP-54&lt;/a>&lt;/strong> - Critical internationalization fix for wiki d-tag normalization (&lt;a href="https://github.com/nostr-protocol/nips/pull/2177">#2177&lt;/a>). Previous rules converted all non-ASCII characters to &lt;code>-&lt;/code>, breaking support for Japanese, Chinese, Arabic, Cyrillic, and other scripts. The updated spec preserves UTF-8 letters, applies lowercase only to characters with case variants, and includes comprehensive examples: &lt;code>&amp;quot;ウィキペディア&amp;quot;&lt;/code> stays &lt;code>&amp;quot;ウィキペディア&amp;quot;&lt;/code>, &lt;code>&amp;quot;Москва&amp;quot;&lt;/code> becomes &lt;code>&amp;quot;москва&amp;quot;&lt;/code>, and mixed scripts like &lt;code>&amp;quot;日本語 Article&amp;quot;&lt;/code> normalize to &lt;code>&amp;quot;日本語-article&amp;quot;&lt;/code>.&lt;/li>
&lt;/ul>
&lt;h2 id="releases">Releases&lt;/h2>
&lt;p>&lt;strong>Zapstore 1.0-rc1&lt;/strong> - The Nostr-based permissionless app store ships the &lt;a href="https://github.com/zapstore/zapstore/releases/tag/1.0-rc1">first release candidate&lt;/a> of its new architecture, featuring a complete UI refresh, rewritten package manager with improved error handling, App Stacks for curated discovery, redesigned profile screens, background update checking, and infinite scrolling in release lists.&lt;/p>
&lt;p>&lt;strong>KeyChat v1.38.1&lt;/strong> - The MLS-based encrypted messaging app &lt;a href="https://github.com/keychat-io/keychat-app/releases/tag/v1.38.1%2B6489">adds UnifiedPush support&lt;/a> for Android and Linux push notifications, plus biometric authentication for privacy operations. Available for Android, Windows, macOS, and Linux.&lt;/p>
&lt;p>&lt;strong>Alby Go v2.0.0&lt;/strong> - The mobile Lightning wallet companion &lt;a href="https://github.com/getAlby/go/releases/tag/v2.0.0">ships a visual redesign&lt;/a> with new logo, updated color palette, redesigned address book, and improved amount input keyboard. BTC Map is now accessible from the home screen, and transaction descriptions appear in notifications.&lt;/p>
&lt;p>&lt;strong>nak v0.17.4&lt;/strong> - fiatjaf&amp;rsquo;s command-line Nostr tool &lt;a href="https://github.com/fiatjaf/nak/releases/tag/v0.17.4">released&lt;/a>, following v0.17.3&amp;rsquo;s LMDB Linux restriction fix from last week.&lt;/p>
&lt;h2 id="notable-code-and-documentation-changes">Notable code and documentation changes&lt;/h2>
&lt;p>&lt;em>Open pull requests and early-stage work worth watching.&lt;/em>&lt;/p>
&lt;h3 id="damus-ios">Damus (iOS)&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/damus/pull/3477">NIP-19 relay hints&lt;/a> implements relay hint consumption for event fetching. When users open nevent, nprofile, or naddr links, Damus now extracts relay hints from the bech32 TLV data and connects to ephemeral relays to fetch content not in the user&amp;rsquo;s relay pool. The implementation includes ref-counted cleanup to prevent race conditions during concurrent lookups. &lt;a href="https://github.com/damus-io/damus/pull/3474">Image URL detection&lt;/a> automatically converts pasted image URLs into preview thumbnails in the composer, with a carousel position badge for multiple images. &lt;a href="https://github.com/damus-io/damus/pull/3473">npub paste conversion&lt;/a> transforms pasted npub/nprofile strings into mention links with async profile resolution.&lt;/p>
&lt;h3 id="amethyst-android">Amethyst (Android)&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst/pull/1627">Payment targets&lt;/a> adds an event interface for NIP-57 zap splits, allowing posts to specify multiple recipients who share incoming zaps (useful for collaborations, revenue sharing, or tipping both content creators and the tools they use). &lt;a href="https://github.com/vitorpamplona/amethyst/pull/1624">Quartz feature parity documentation&lt;/a> adds a detailed table tracking which features are implemented across Android, Desktop JVM, and iOS targets, noting that iOS is missing core cryptography (&lt;code>Secp256k1Instance&lt;/code>), JSON serialization, and data structures.&lt;/p>
&lt;h3 id="notedeck-desktop">Notedeck (Desktop)&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/notedeck/pull/1226">Timeline filter rebuild&lt;/a> fixes a bug where unfollowed accounts kept appearing in feeds. Timeline filters were built once from the contact list and never updated; the fix adds &lt;code>contact_list_timestamp&lt;/code> tracking and an &lt;code>invalidate()&lt;/code> method to trigger rebuilds when follow state changes.&lt;/p>
&lt;h3 id="citrine-android-relay">Citrine (Android Relay)&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Citrine/pull/86">ContentProvider API&lt;/a> exposes the local relay&amp;rsquo;s event database to other Android apps via &lt;code>ContentResolver&lt;/code>. Unlike the WebSocket interface (which requires apps to maintain a persistent connection and speak the Nostr relay protocol), ContentProvider offers direct synchronous database access through Android&amp;rsquo;s native IPC mechanism. External apps can query events by ID, pubkey, kind, or date range, insert new events with validation, and delete events without managing socket connections.&lt;/p>
&lt;h3 id="rust-nostr-library">rust-nostr (Library)&lt;/h3>
&lt;p>&lt;a href="https://github.com/rust-nostr/nostr/pull/1183">NIP-40 relay-level support&lt;/a> adds expiration handling at the relay builder level. Expired events are now rejected before storage and filtered out before sending to clients, eliminating the need for each database implementation to handle expiration checks independently.&lt;/p>
&lt;h3 id="nak-cli">nak (CLI)&lt;/h3>
&lt;p>&lt;a href="https://github.com/fiatjaf/nak/pull/91">Blossom mirror&lt;/a> implements blob mirroring functionality for the command-line tool.&lt;/p>
&lt;h3 id="mostro-p2p-trading">Mostro (P2P Trading)&lt;/h3>
&lt;p>&lt;a href="https://github.com/MostroP2P/mostro/pull/559">Dev fee audit events&lt;/a> adds transparent audit trails for development fund payments through kind 8383 Nostr events. The implementation publishes non-blocking audit events after successful fee payments, including order details and payment hashes while excluding buyer/seller pubkeys for privacy.&lt;/p>
&lt;h3 id="mdk-marmot-development-kit">MDK (Marmot Development Kit)&lt;/h3>
&lt;p>Three security audit fixes landed: &lt;a href="https://github.com/marmot-protocol/mdk/pull/40">Author verification&lt;/a> enforces that rumor pubkeys match MLS sender credentials, preventing impersonation attacks. &lt;a href="https://github.com/marmot-protocol/mdk/pull/41">KeyPackage identity binding&lt;/a> verifies credential identity matches event signers. &lt;a href="https://github.com/marmot-protocol/mdk/pull/42">Admin update validation&lt;/a> prevents empty admin sets and non-member admin assignments.&lt;/p>
&lt;h3 id="shopstr-marketplace">Shopstr (Marketplace)&lt;/h3>
&lt;p>&lt;a href="https://github.com/shopstr-eng/shopstr/pull/217">HODL invoice escrow&lt;/a> implements a trust-minimized payment system for physical goods. The architecture uses Alby&amp;rsquo;s &lt;code>makeHoldInvoice&lt;/code> to lock buyer funds in their own wallet, with settlement triggered only after merchant inventory verification. The handshake protocol flows through &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> encrypted DMs: buyer sends order request, merchant responds with HODL invoice, buyer pays (funds locked), merchant confirms stock and shipping, then settlement releases funds. Multi-merchant cart support splits payments across vendors.&lt;/p>
&lt;h3 id="jumble-web-client">Jumble (Web Client)&lt;/h3>
&lt;p>&lt;a href="https://github.com/CodyTseng/jumble/pull/713">Per-relay discovery mode&lt;/a> adds a toggle to hide posts from followed users on specific relays, enabling language-based discovery feeds (e.g., nostr.band/lang/*). The feature filters out posts where the author pubkey appears in the user&amp;rsquo;s follow list, persisting toggle state per relay URL in localStorage.&lt;/p>
&lt;h3 id="white-noise-encrypted-messaging">White Noise (Encrypted Messaging)&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/whitenoise/pull/937">Media upload retry&lt;/a> adds retry options for failed uploads. &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/927">Profile edit warnings&lt;/a> alert users about profile changes. On the backend, &lt;a href="https://github.com/marmot-protocol/whitenoise-rs/pull/422">whitenoise-rs&lt;/a> fixes a race condition in AccountGroup creation.&lt;/p>
&lt;h3 id="npubcash-lightning-address-service">npub.cash (Lightning Address Service)&lt;/h3>
&lt;p>&lt;a href="https://github.com/cashubtc/npubcash-server/pull/40">v3 rewrite&lt;/a> migrates to Bun for the monorepo and server, adds SQLite support, drops v1 compatibility, implements LUD-21, and adds realtime mint quote updates.&lt;/p>
&lt;h3 id="nostr-java-library">nostr-java (Library)&lt;/h3>
&lt;p>&lt;a href="https://github.com/tcheeric/nostr-java/releases/tag/v1.1.1">v1.1.1&lt;/a> ships WebSocket handling refactors and improved test robustness across &lt;a href="https://github.com/tcheeric/nostr-java/pull/499">two PRs&lt;/a>.&lt;/p>
&lt;h3 id="nips-repository">NIPs Repository&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2180">NIP-54 Djot migration&lt;/a> proposes a separate change to the wiki spec: switching the content format from Asciidoc to Djot, a lightweight markup language with cleaner syntax. The PR introduces reference-style links for wikilinks, making cross-references between wiki articles more readable in source form. &lt;a href="https://github.com/nostr-protocol/nips/pull/2179">NIP-XX Quorum&lt;/a> introduces threshold multi-signature governance for Nostr groups using FROST (Flexible Round-Optimized Schnorr Threshold signatures). A Quorum is an nsec shared among members through a T-of-N scheme where members can represent themselves or delegate to a council of representatives. When the council changes, the old nsec becomes obsolete and a new one is distributed—the final act of any council is signing the governance transition event. The spec defines membership (public or private), elections and polls (popular votes, votes of no confidence), optional natural-language &amp;ldquo;laws,&amp;rdquo; and crucially, quorum ontologies where quorums can be members of other quorums, enabling hierarchical structures like localities joining regional bodies. Use cases span source code development, company boards, HOAs, and moderated communities.&lt;/p>
&lt;hr>
&lt;p>That&amp;rsquo;s it for this week and this year. Building something? Have news to share? Want us to cover your project? &lt;a href="nostr:npub1wav4fae3gyfy3xj298kxj2mj8phavz7vavps34przq02j7w902qq902923">Reach out via NIP-17 DM&lt;/a> or find us on Nostr.&lt;/p></content:encoded></item><item><title>Nostr Compass #2</title><link>https://nostrcompass.org/en/newsletters/2025-12-24-newsletter/</link><pubDate>Wed, 24 Dec 2025 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2025-12-24-newsletter/</guid><description>&lt;p>Welcome back to Nostr Compass, your weekly guide to the Nostr protocol ecosystem.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> Three &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> signer implementations see updates: Amber adds performance caching, Aegis gains &lt;code>nostrsigner:&lt;/code> URI support, and Primal Android joins them as a full local signer. Shopstr introduces &amp;ldquo;Zapsnags&amp;rdquo; for flash sales via zaps. Mostro adds a development fund. Four NIP updates land including Public Messages (kind 24) and group privacy improvements. NDK cache queries speed up 162x, Applesauce adds reactions and NIP-60 wallet support, and Tenex introduces RAL architecture for AI agent delegation. In our deep dive, we explain &lt;a href="https://nostrcompass.org/en/topics/nip-02/">NIP-02&lt;/a> (follow lists) and &lt;a href="https://nostrcompass.org/en/topics/nip-10/">NIP-10&lt;/a> (reply threading), foundational specs for building social timelines and conversations.&lt;/p></description><content:encoded>&lt;p>Welcome back to Nostr Compass, your weekly guide to the Nostr protocol ecosystem.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> Three &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> signer implementations see updates: Amber adds performance caching, Aegis gains &lt;code>nostrsigner:&lt;/code> URI support, and Primal Android joins them as a full local signer. Shopstr introduces &amp;ldquo;Zapsnags&amp;rdquo; for flash sales via zaps. Mostro adds a development fund. Four NIP updates land including Public Messages (kind 24) and group privacy improvements. NDK cache queries speed up 162x, Applesauce adds reactions and NIP-60 wallet support, and Tenex introduces RAL architecture for AI agent delegation. In our deep dive, we explain &lt;a href="https://nostrcompass.org/en/topics/nip-02/">NIP-02&lt;/a> (follow lists) and &lt;a href="https://nostrcompass.org/en/topics/nip-10/">NIP-10&lt;/a> (reply threading), foundational specs for building social timelines and conversations.&lt;/p>
&lt;h2 id="news">News&lt;/h2>
&lt;p>&lt;strong>Primal Android Becomes a NIP-55 Signer&lt;/strong> - Building on last week&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/newsletters/2025-12-17-newsletter/#primal-android">Nostr Connect support&lt;/a>, Primal has implemented full local signing capabilities through eight merged pull requests. The implementation includes a complete &lt;code>LocalSignerContentProvider&lt;/code> that exposes signing operations to other Android apps via Android&amp;rsquo;s content provider interface, following the &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> specification. The architecture separates concerns cleanly: &lt;code>SignerActivity&lt;/code> handles user-facing approval flows, &lt;code>LocalSignerService&lt;/code> manages background operations, and a new permissions system lets users control which apps can request signatures. This makes Primal a viable alternative to Amber for Android users who want to keep their keys in one app while using others for different Nostr experiences.&lt;/p>
&lt;p>&lt;strong>Shopstr Zapsnags: Flash Sales via Lightning&lt;/strong> - The Nostr-native marketplace introduced &lt;a href="https://github.com/shopstr-eng/shopstr/pull/211">&amp;ldquo;Zapsnags&amp;rdquo;&lt;/a>, a flash sale feature that lets buyers purchase items directly from their social feed with a single zap. The implementation filters kind 1 notes tagged with &lt;code>#shopstr-zapsnag&lt;/code> and renders them as product cards with a &amp;ldquo;Zap to Buy&amp;rdquo; button instead of the standard cart flow. When a buyer zaps, the system generates a payment request using &lt;a href="https://nostrcompass.org/en/topics/nip-57/">NIP-57&lt;/a>, polls for the kind 9735 zap receipt to confirm payment, then encrypts shipping information using &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> gift wrapping before sending it privately to the seller. The feature stores buyer details locally for repeat purchases and includes a merchant dashboard for creating flash sale listings. It&amp;rsquo;s a clever combination of social, payment, and privacy primitives that demonstrates how Nostr&amp;rsquo;s composable design enables novel commerce patterns.&lt;/p>
&lt;p>&lt;strong>Mostro Introduces Development Fund&lt;/strong> - The &lt;a href="https://nostrcompass.org/en/topics/nip-69/">NIP-69&lt;/a> P2P Bitcoin trading platform &lt;a href="https://github.com/MostroP2P/mostro/pull/555">implemented configurable development fees&lt;/a> to support sustainable maintenance. Operators can set &lt;code>dev_fee_percentage&lt;/code> between 10-100% of the Mostro trading fee (defaulting to 30%), which automatically routes to a development fund on each successful trade. The implementation adds three database columns (&lt;code>dev_fee&lt;/code>, &lt;code>dev_fee_paid&lt;/code>, &lt;code>dev_fee_payment_hash&lt;/code>) to track contributions and validates the percentage at daemon startup. Technical documentation in &lt;a href="https://github.com/MostroP2P/mostro/blob/main/docs/DEV_FEE.md">&lt;code>docs/DEV_FEE.md&lt;/code>&lt;/a> explains the system. This opt-in model lets operators support ongoing development while maintaining full transparency about fee allocation.&lt;/p>
&lt;h2 id="nip-updates">NIP Updates&lt;/h2>
&lt;p>Recent changes to the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a>:&lt;/p>
&lt;p>&lt;strong>New NIPs:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-a4/">NIP-A4&lt;/a> (Public Messages, kind 24)&lt;/strong> - A new kind for notification-screen messages designed for broad client support (&lt;a href="https://github.com/nostr-protocol/nips/pull/1988">#1988&lt;/a>). Unlike threaded conversations, these messages have no concept of chat history or message chains. They use &lt;code>q&lt;/code> tags (quotations) rather than &lt;code>e&lt;/code> tags to avoid threading complications, making them ideal for simple public notifications that appear in a recipient&amp;rsquo;s notification feed without creating conversation state.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Significant Changes:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a>&lt;/strong> - Major clarification of group semantics (&lt;a href="https://github.com/nostr-protocol/nips/pull/2106">#2106&lt;/a>). The &lt;code>closed&lt;/code> tag now means &amp;ldquo;unable to write&amp;rdquo; (read-only for non-members), decoupled from join mechanics. A new &lt;code>hidden&lt;/code> tag prevents relays from serving metadata or member events to non-members, enabling truly private groups that are undiscoverable without out-of-band invitation. The &lt;code>private&lt;/code> tag controls message visibility while still allowing public metadata for discovery.&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-51/">NIP-51&lt;/a>&lt;/strong> - Added kind 30006 for curated picture sets (&lt;a href="https://github.com/nostr-protocol/nips/pull/2170">#2170&lt;/a>), following the pattern of 30004 (articles) and 30005 (videos). Already implemented in Nostria.&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a>&lt;/strong> - Clarified connection initiation for Android signers (&lt;a href="https://github.com/nostr-protocol/nips/pull/2166">#2166&lt;/a>). Developers implementing multi-user sessions were misusing &lt;code>get_public_key&lt;/code> by calling it from background processes. The updated spec recommends calling it only once during initial connection, preventing a common implementation footgun.&lt;/li>
&lt;/ul>
&lt;h2 id="nip-deep-dive-nip-02-and-nip-10">NIP Deep Dive: NIP-02 and NIP-10&lt;/h2>
&lt;p>This week we cover two NIPs essential for social functionality: how clients know who you follow and how conversations are threaded.&lt;/p>
&lt;h3 id="nip-02entopicsnip-02-follow-list">&lt;a href="https://nostrcompass.org/en/topics/nip-02/">NIP-02&lt;/a>: Follow List&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/02.md">NIP-02&lt;/a> defines kind 3 events, which store your follow list. This simple mechanism powers the social graph that makes timelines possible.&lt;/p>
&lt;p>&lt;strong>Structure:&lt;/strong> A kind 3 event contains &lt;code>p&lt;/code> tags listing followed pubkeys:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;d7a8f...&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;a3b9c...&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1734912000&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">3&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;91cf9..af5f&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://alicerelay.example.com&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;alice&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;14aeb..8dad&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://bobrelay.example.com&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;bob&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;612ae..982b&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;e4f8a...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Each &lt;code>p&lt;/code> tag has four positions: the tag name, the followed pubkey (hex), an optional relay URL hint, and an optional &amp;ldquo;petname&amp;rdquo; (a local nickname). The relay hint tells other clients where to find that user&amp;rsquo;s events. The petname lets you assign memorable names to contacts without relying on their self-declared display names.&lt;/p>
&lt;p>&lt;strong>Replaceable behavior:&lt;/strong> Kind 3 falls in the replaceable range (0, 3, 10000-19999), so relays keep only the latest version per pubkey. When you follow someone new, your client publishes a complete new kind 3 containing all your follows plus the new one. This means follow lists must be complete each time; you can&amp;rsquo;t publish incremental updates.&lt;/p>
&lt;p>&lt;strong>Building timelines:&lt;/strong> To construct a home feed, clients fetch the user&amp;rsquo;s kind 3, extract all &lt;code>p&lt;/code> tag pubkeys, then subscribe to kind 1 events from those authors:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>[&lt;span style="color:#e6db74">&amp;#34;REQ&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;home&amp;#34;&lt;/span>, {&lt;span style="color:#f92672">&amp;#34;kinds&amp;#34;&lt;/span>: [&lt;span style="color:#ae81ff">1&lt;/span>], &lt;span style="color:#f92672">&amp;#34;authors&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;91cf9...&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;14aeb...&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;612ae...&amp;#34;&lt;/span>], &lt;span style="color:#f92672">&amp;#34;limit&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">50&lt;/span>}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The relay returns matching notes, and the client renders them. The relay hints in kind 3 help clients know which relays to query for each followed user.&lt;/p>
&lt;p>&lt;strong>Petnames and identity:&lt;/strong> The petname field enables a decentralized naming scheme. Rather than trusting whatever name a user claims in their profile, you can assign your own label. A client might display &amp;ldquo;alice (My Sister)&amp;rdquo; where &amp;ldquo;alice&amp;rdquo; comes from her kind 0 profile and &amp;ldquo;My Sister&amp;rdquo; is your petname. This provides context that global usernames cannot.&lt;/p>
&lt;p>&lt;strong>Practical considerations:&lt;/strong> Because kind 3 events are replaceable and must be complete, clients should preserve unknown tags when updating. If another client added tags your client doesn&amp;rsquo;t understand, blindly overwriting would lose that data. Append new follows rather than rebuilding from scratch.&lt;/p>
&lt;h3 id="nip-10entopicsnip-10-text-note-threading">&lt;a href="https://nostrcompass.org/en/topics/nip-10/">NIP-10&lt;/a>: Text Note Threading&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/10.md">NIP-10&lt;/a> specifies how kind 1 notes reference each other to form reply threads. Understanding this is essential for building conversation views.&lt;/p>
&lt;p>&lt;strong>The problem:&lt;/strong> When someone replies to a note, clients need to know: What is this a reply to? What&amp;rsquo;s the root of the conversation? Who should be notified? NIP-10 answers these questions through &lt;code>e&lt;/code> tags (event references) and &lt;code>p&lt;/code> tags (pubkey mentions).&lt;/p>
&lt;p>&lt;strong>Marked tags (preferred):&lt;/strong> Modern clients use explicit markers in &lt;code>e&lt;/code> tags:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;f9c2e...&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;a3b9c...&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1734912345&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;e&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;abc123...&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.example.com&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;root&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;e&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;def456...&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.example.com&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;reply&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;91cf9...&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;14aeb...&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Great point! I agree.&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;b7d3f...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>root&lt;/code> marker points to the original note that started the thread. The &lt;code>reply&lt;/code> marker points to the specific note being answered. If replying directly to the root, use only &lt;code>root&lt;/code> (no &lt;code>reply&lt;/code> tag needed). The distinction matters for rendering: the &lt;code>reply&lt;/code> determines indentation in a thread view, while &lt;code>root&lt;/code> groups all replies together.&lt;/p>
&lt;p>&lt;strong>Threading rules:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Direct reply to root: One &lt;code>e&lt;/code> tag with &lt;code>root&lt;/code> marker&lt;/li>
&lt;li>Reply to a reply: Two &lt;code>e&lt;/code> tags, one &lt;code>root&lt;/code> and one &lt;code>reply&lt;/code>&lt;/li>
&lt;li>The &lt;code>root&lt;/code> stays constant throughout the thread; &lt;code>reply&lt;/code> changes based on what you&amp;rsquo;re responding to&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Pubkey tags for notifications:&lt;/strong> Include &lt;code>p&lt;/code> tags for everyone who should be notified. At minimum, tag the author of the note you&amp;rsquo;re replying to. Convention is to also include all &lt;code>p&lt;/code> tags from the parent event (so everyone in the conversation stays in the loop), plus any users you @mention in your content.&lt;/p>
&lt;p>&lt;strong>Relay hints:&lt;/strong> The third position in &lt;code>e&lt;/code> and &lt;code>p&lt;/code> tags can contain a relay URL where that event or user&amp;rsquo;s content might be found. This helps clients fetch the referenced content even if they&amp;rsquo;re not connected to the original relay.&lt;/p>
&lt;p>&lt;strong>Deprecated positional tags:&lt;/strong> Early Nostr implementations inferred meaning from tag position rather than markers: first &lt;code>e&lt;/code> tag was root, last was reply, middle ones were mentions. This approach is deprecated because it creates ambiguity. If you see &lt;code>e&lt;/code> tags without markers, they&amp;rsquo;re likely from older clients. Modern implementations should always use explicit markers.&lt;/p>
&lt;p>&lt;strong>Building thread views:&lt;/strong> To display a thread, fetch the root event, then query for all events with an &lt;code>e&lt;/code> tag referencing that root:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>[&lt;span style="color:#e6db74">&amp;#34;REQ&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;thread&amp;#34;&lt;/span>, {&lt;span style="color:#f92672">&amp;#34;kinds&amp;#34;&lt;/span>: [&lt;span style="color:#ae81ff">1&lt;/span>], &lt;span style="color:#f92672">&amp;#34;#e&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;&amp;lt;root-event-id&amp;gt;&amp;#34;&lt;/span>]}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Sort results by &lt;code>created_at&lt;/code> and use &lt;code>reply&lt;/code> markers to build the tree structure. Events whose &lt;code>reply&lt;/code> points to the root are top-level replies; events whose &lt;code>reply&lt;/code> points to another reply are nested responses.&lt;/p>
&lt;h2 id="releases">Releases&lt;/h2>
&lt;p>&lt;strong>Zeus v0.12.0&lt;/strong> - Building on last week&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/newsletters/2025-12-17-newsletter/#zeus-lightning-wallet">NWC parallel payments support&lt;/a>, the Lightning wallet&amp;rsquo;s &lt;a href="https://github.com/ZeusLN/zeus/releases/tag/v0.12.0">major release&lt;/a> ships a complete &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> Nostr Wallet Connect service with custom relay support and budget tracking. A &lt;a href="https://github.com/ZeusLN/zeus/pull/3455">budget reload fix&lt;/a> ensures connections use current limits. &lt;a href="https://github.com/ZeusLN/zeus/pull/3460">Lightning address copying&lt;/a> no longer includes the &lt;code>lightning:&lt;/code> prefix, fixing paste issues in Nostr profile fields.&lt;/p>
&lt;p>&lt;strong>Amber v4.0.6&lt;/strong> - The Android &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> signer &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v4.0.6">adds performance caching&lt;/a> to signing operations and improves error handling when decrypting malformed content. Connection reliability improved with retry logic for relay connect events, and several crash fixes address edge cases around invalid &lt;code>nostrconnect://&lt;/code> URIs and permission screen interactions.&lt;/p>
&lt;p>&lt;strong>nak v0.17.3&lt;/strong> - The command-line Nostr tool&amp;rsquo;s &lt;a href="https://github.com/fiatjaf/nak/releases/tag/v0.17.3">latest release&lt;/a> restricts LMDB builds to Linux, fixing cross-platform compilation issues.&lt;/p>
&lt;p>&lt;strong>Aegis v0.3.4&lt;/strong> - The cross-platform Nostr signer &lt;a href="https://github.com/ZharlieW/Aegis/releases/tag/v0.3.4">adds support&lt;/a> for the &lt;code>nostrsigner:&lt;/code> URI scheme defined in &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a>, matching Amber&amp;rsquo;s connection flow. Local relay data can now be imported and exported for backup, and the release includes bug fixes for relay socket errors and UI improvements to the local relay interface.&lt;/p>
&lt;h2 id="notable-code-and-documentation-changes">Notable code and documentation changes&lt;/h2>
&lt;p>&lt;em>These are open pull requests and early-stage work, perfect for getting feedback before they merge. If something catches your eye, consider reviewing or commenting!&lt;/em>&lt;/p>
&lt;h3 id="damus-ios">Damus (iOS)&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/damus/pull/3469">Mute list persistence&lt;/a> fixes an issue where mute lists were wiped on cold start. The fix adds guards to prevent accidental overwrites during app initialization. &lt;a href="https://github.com/damus-io/damus/pull/3457">Profile stream timing&lt;/a> eliminates a ~1 second delay before cached profiles appeared. Previously, views waited for subscription tasks to restart; now &lt;code>streamProfile()&lt;/code> immediately yields cached data from NostrDB, removing the window where abbreviated pubkeys and placeholder images showed.&lt;/p>
&lt;h3 id="white-noise-encrypted-messaging">White Noise (Encrypted Messaging)&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/whitenoise/pull/919">Real-time message streaming&lt;/a> replaces the previous polling mechanism with a stream-based architecture. The new &lt;code>ChatStreamNotifier&lt;/code> consumes the Rust SDK&amp;rsquo;s message stream directly, maintaining chronological order and handling incremental updates efficiently. Testing showed significant improvement in responsiveness. A &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/921">chat list API&lt;/a> adds &lt;code>get_chat_list&lt;/code> for retrieving conversation summaries, and a &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/905">stable sort fix&lt;/a> prevents message reordering loops by using &lt;code>createdAt&lt;/code> with message ID as tiebreaker.&lt;/p>
&lt;h3 id="ndk-library">NDK (Library)&lt;/h3>
&lt;p>Two pull requests delivered dramatic cache performance improvements. &lt;a href="https://github.com/nostr-dev-kit/ndk/pull/371">PR #371&lt;/a> fixed a bug where events read from SQLite cache were immediately written back, causing 100% duplicate writes on app boot. The fix adds a &lt;code>fromCache&lt;/code> guard and implements O(1) duplicate checking via an in-memory Set. For small result sets (&amp;lt;100 events), direct JSON transfer replaces binary encoding overhead. &lt;a href="https://github.com/nostr-dev-kit/ndk/pull/372">PR #372&lt;/a> removed unnecessary &lt;code>seenEvent&lt;/code> calls for cached events. The LRU cache lookup cost 0.24-0.64ms per event; for 5,700 cached events, this added ~1.4 seconds of overhead. Result: cache queries dropped from ~3,690ms to ~22ms (162x faster).&lt;/p>
&lt;h3 id="rust-nostr-library">rust-nostr (Library)&lt;/h3>
&lt;p>&lt;a href="https://github.com/rust-nostr/nostr/pull/1176">Multi-filter REQ support&lt;/a> was restored after being removed in a previous refactor. The SDK again accepts &lt;code>Vec&amp;lt;Filter&amp;gt;&lt;/code> for subscription requests, enabling efficient queries that combine multiple filter conditions with OR logic. &lt;a href="https://github.com/rust-nostr/nostr/pull/1156">Relay provenance&lt;/a> was added to &lt;code>stream_events*&lt;/code> methods, so each streamed event now includes the &lt;code>RelayUrl&lt;/code> it came from and a &lt;code>Result&lt;/code> indicating success or failure, useful for tracking relay reliability and debugging connection issues. A &lt;a href="https://github.com/rust-nostr/nostr/pull/1179">security fix&lt;/a> removed the &lt;code>url-fork&lt;/code> dependency following RUSTSEC-2024-0421, eliminating a known vulnerability.&lt;/p>
&lt;h3 id="applesauce-library">Applesauce (Library)&lt;/h3>
&lt;p>The TypeScript library powering &lt;a href="https://github.com/hzrd149/nostrudel">noStrudel&lt;/a> saw significant development this week. New models include a &lt;a href="https://github.com/hzrd149/applesauce">reactions system&lt;/a> and user groups casting. Wallet functionality expanded with NIP-60 support, a send tab, and improved token recovery tools. A new &lt;code>user.directMessageRelays$&lt;/code> property exposes DM relay configuration. All actions were refactored to use async interfaces (removing async generators), and bug fixes addressed encrypted content restoration and time-based event filter edge cases.&lt;/p>
&lt;h3 id="tenex-ai-agents">Tenex (AI Agents)&lt;/h3>
&lt;p>The &lt;a href="https://github.com/tenex-chat/tenex">multi-agent coordination system&lt;/a> built on Nostr introduced RAL (Request-Action-Lifecycle) architecture in &lt;a href="https://github.com/pablof7z/tenex/pull/38">five merged PRs&lt;/a>. RAL enables agents to pause when delegating tasks and resume when results arrive, with conversation-scoped state persistence. Delegation tools (&lt;code>delegate&lt;/code>, &lt;code>ask&lt;/code>, &lt;code>delegate_followup&lt;/code>, &lt;code>delegate_external&lt;/code>) now publish Nostr events and return stop signals instead of blocking. The refactor includes AI SDK v6 migration, VCR testing infrastructure for deterministic LLM interaction recording, and multimodal image support.&lt;/p>
&lt;hr>
&lt;p>That&amp;rsquo;s it for this week. Building something? Have news to share? Want us to cover your project? &lt;a href="nostr:npub1wav4fae3gyfy3xj298kxj2mj8phavz7vavps34przq02j7w902qq902923">Reach out via NIP-17 DM&lt;/a> or find us on Nostr.&lt;/p></content:encoded></item><item><title>Nostr Compass #1</title><link>https://nostrcompass.org/en/newsletters/2025-12-17-newsletter/</link><pubDate>Mon, 15 Dec 2025 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2025-12-17-newsletter/</guid><description>&lt;p>Welcome to Nostr Compass, a weekly newsletter dedicated to the Nostr protocol ecosystem. Our mission is to keep developers, relay operators, and builders informed about important developments across the network. We document protocol evolution with technical accuracy, neutrality, and depth, covering everything from NIP proposals to client releases to implementation best practices.&lt;/p>
&lt;p>Nostr Compass is inspired by &lt;a href="https://bitcoinops.org/">Bitcoin Optech&lt;/a>, whose years of dedicated work advancing Bitcoin technical knowledge set the standard for protocol-focused newsletters. We&amp;rsquo;re grateful for their example and hope to bring the same rigor to the Nostr ecosystem.&lt;/p></description><content:encoded>&lt;p>Welcome to Nostr Compass, a weekly newsletter dedicated to the Nostr protocol ecosystem. Our mission is to keep developers, relay operators, and builders informed about important developments across the network. We document protocol evolution with technical accuracy, neutrality, and depth, covering everything from NIP proposals to client releases to implementation best practices.&lt;/p>
&lt;p>Nostr Compass is inspired by &lt;a href="https://bitcoinops.org/">Bitcoin Optech&lt;/a>, whose years of dedicated work advancing Bitcoin technical knowledge set the standard for protocol-focused newsletters. We&amp;rsquo;re grateful for their example and hope to bring the same rigor to the Nostr ecosystem.&lt;/p>
&lt;p>This inaugural issue establishes our weekly format. Each Wednesday we&amp;rsquo;ll bring you NIP updates, release notes, development highlights, and technical guidance. Whether you&amp;rsquo;re building a client, running a relay, or contributing to the protocol, Nostr Compass aims to be your reliable source for what&amp;rsquo;s happening across the ecosystem.&lt;/p>
&lt;h2 id="what-is-nostr">What is Nostr?&lt;/h2>
&lt;p>&lt;em>Since this is our first issue, we&amp;rsquo;re starting with a primer on how Nostr works. Regular readers can &lt;a href="https://nostrcompass.org/en/newsletters/2025-12-17-newsletter/#news--updates">skip ahead&lt;/a>.&lt;/em>&lt;/p>
&lt;p>Nostr (Notes and Other Stuff Transmitted by Relays) is a decentralized protocol for social networking and messaging. Unlike traditional platforms, Nostr has no central server, no company controlling it, and no single point of failure. Users own their identity through cryptographic keypairs, and content flows through independent relay servers that anyone can run.&lt;/p>
&lt;p>&lt;strong>How it works:&lt;/strong> Users generate a keypair (a private key called nsec and public key called npub). The private key signs messages called &amp;ldquo;events,&amp;rdquo; and the public key serves as your identity. Events are sent to relays, which store and forward them to other users. Because you control your keys, you can switch between clients or relays without losing your identity or followers.&lt;/p>
&lt;p>&lt;strong>Why it matters:&lt;/strong> Nostr provides censorship resistance through relay diversity (if one relay bans you, others can still serve your content), portability (your identity works across any Nostr app), and interoperability (all Nostr clients speak the same protocol). There&amp;rsquo;s no algorithm deciding what you see, no ads, and no data harvesting.&lt;/p>
&lt;p>&lt;strong>The ecosystem today:&lt;/strong> Nostr supports microblogging (like Twitter/X), long-form content (like Medium), direct messages, marketplaces, livestreaming, and more. Clients include Damus (iOS), Amethyst (Android), Primal, Coracle, and dozens of others. Lightning Network integration enables instant payments through &amp;ldquo;zaps.&amp;rdquo; The protocol continues to evolve through NIPs (Nostr Implementation Possibilities), community-driven specifications that extend functionality.&lt;/p>
&lt;h2 id="news">News&lt;/h2>
&lt;p>&lt;strong>NIP-BE Merged: Bluetooth Low Energy Support&lt;/strong> - A significant new capability &lt;a href="https://github.com/nostr-protocol/nips/pull/1979">landed in the protocol&lt;/a>. &lt;a href="https://nostrcompass.org/en/topics/nip-be/">NIP-BE&lt;/a> specifies how Nostr applications can communicate and synchronize over Bluetooth Low Energy. This enables offline-capable apps to sync data across nearby devices without internet connectivity. The spec adapts WebSocket relay patterns to BLE&amp;rsquo;s constraints, using DEFLATE compression and chunked messaging to handle BLE&amp;rsquo;s small MTU sizes (20-256 bytes). Devices negotiate roles based on UUID comparison, with the higher UUID becoming the GATT server.&lt;/p>
&lt;p>&lt;strong>MIP-05: Privacy-Preserving Push Notifications&lt;/strong> - The &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot Protocol&lt;/a> published &lt;a href="https://nostrcompass.org/en/topics/mip-05/">MIP-05&lt;/a> (&lt;a href="https://github.com/marmot-protocol/mips/blob/main/mip-05.md">spec&lt;/a>), a specification for push notifications that maintain privacy. Traditional push systems require servers to know device tokens and user identities; MIP-05 solves this by encrypting device tokens with ECDH+HKDF and ChaCha20-Poly1305, using ephemeral keys to prevent correlation. A three-event gossip protocol (kinds 447-449) synchronizes encrypted tokens across group members, and notifications use &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> gift wrapping with decoy tokens to hide group sizes. This enables WhiteNoise and other Marmot clients to deliver timely notifications without compromising user privacy.&lt;/p>
&lt;p>&lt;strong>Blossom BUD-10: New URI Scheme&lt;/strong> - The &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> media protocol is getting a custom URI scheme via &lt;a href="https://nostrcompass.org/en/topics/bud-10/">BUD-10&lt;/a> (&lt;a href="https://github.com/hzrd149/blossom/blob/master/buds/10.md">spec&lt;/a>). The new &lt;code>blossom:&amp;lt;sha256&amp;gt;.ext&lt;/code> format embeds file hash, extension, size, multiple server hints, and author pubkeys for &lt;a href="https://nostrcompass.org/en/topics/bud-03/">BUD-03&lt;/a> server discovery. This makes blob links more resilient than static HTTP URLs by enabling automatic fallback across servers.&lt;/p>
&lt;p>&lt;strong>Shopstr Marketplace Updates&lt;/strong> - The Nostr-native marketplace &lt;a href="https://github.com/shopstr-eng/shopstr/pull/202">implemented Nostr Wallet Connect&lt;/a> (&lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a>) for payments, &lt;a href="https://github.com/shopstr-eng/shopstr/pull/203">added listing expiration&lt;/a> using &lt;a href="https://nostrcompass.org/en/topics/nip-40/">NIP-40&lt;/a>, and introduced &lt;a href="https://github.com/shopstr-eng/shopstr/pull/210">discount codes&lt;/a> for sellers.&lt;/p>
&lt;h2 id="nip-updates">NIP Updates&lt;/h2>
&lt;p>Recent changes to the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a>:&lt;/p>
&lt;p>&lt;strong>New NIPs:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-be/">NIP-BE&lt;/a>&lt;/strong> - Bluetooth Low Energy messaging and device synchronization (&lt;a href="https://github.com/nostr-protocol/nips/pull/1979">#1979&lt;/a>)&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-63/">NIP-63&lt;/a>&lt;/strong> - Paywall/Premium Content standard for handling gated content within the protocol (&lt;a href="https://github.com/nostr-protocol/nips/pull/2156">#2156&lt;/a>)&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Significant Changes:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-24/">NIP-24&lt;/a>&lt;/strong> - Added optional &lt;code>languages&lt;/code> array to Kind 0 user metadata, allowing users to specify multiple preferred languages using IETF BCP 47 tags for improved content discovery and relay matching (&lt;a href="https://github.com/nostr-protocol/nips/pull/2159">#2159&lt;/a>)&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-69/">NIP-69&lt;/a>&lt;/strong> - Added order expiration support for P2P trading with &lt;code>expires_at&lt;/code> and &lt;code>expiration&lt;/code> tags (&lt;a href="https://github.com/nostr-protocol/nips/pull/2118">#2118&lt;/a>)&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a>&lt;/strong> - Gift wrap events can now be deleted via NIP-09/NIP-62 requests (&lt;a href="https://github.com/nostr-protocol/nips/pull/2131">#2131&lt;/a>)&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-51/">NIP-51&lt;/a>&lt;/strong> - Removed hashtag and URL tags from generic bookmarks; hashtags now use kind 30015 (&lt;a href="https://github.com/nostr-protocol/nips/pull/2133">#2133&lt;/a>)&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-18/">NIP-18&lt;/a>&lt;/strong> - Improved generic reposts for replaceable events with &lt;code>a&lt;/code> tag support (&lt;a href="https://github.com/nostr-protocol/nips/pull/2132">#2132&lt;/a>)&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a>&lt;/strong> - Refined wording and added kind 7 reaction support to DMs (&lt;a href="https://github.com/nostr-protocol/nips/pull/2098">#2098&lt;/a>)&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a>&lt;/strong> - Added &lt;code>self&lt;/code> field for relay public key identification (&lt;a href="https://github.com/nostr-protocol/nips/pull/1764">#1764&lt;/a>)&lt;/li>
&lt;/ul>
&lt;h2 id="nip-deep-dive-nip-01-and-nip-19">NIP Deep Dive: NIP-01 and NIP-19&lt;/h2>
&lt;p>For this inaugural issue, we cover two foundational NIPs that every Nostr developer should understand. See our topic pages for &lt;a href="https://nostrcompass.org/en/topics/nip-01/">NIP-01&lt;/a> and &lt;a href="https://nostrcompass.org/en/topics/nip-19/">NIP-19&lt;/a>.&lt;/p>
&lt;h3 id="nip-01-basic-protocol">NIP-01: Basic Protocol&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-01/">NIP-01&lt;/a> defines the core protocol. Everything in Nostr builds on this specification.&lt;/p>
&lt;p>&lt;strong>Events&lt;/strong> are the only object type. Each event contains:&lt;/p>
&lt;ul>
&lt;li>&lt;code>id&lt;/code>: SHA256 hash of the serialized event (the event&amp;rsquo;s unique identifier)&lt;/li>
&lt;li>&lt;code>pubkey&lt;/code>: The creator&amp;rsquo;s public key (32-byte hex, secp256k1)&lt;/li>
&lt;li>&lt;code>created_at&lt;/code>: Unix timestamp&lt;/li>
&lt;li>&lt;code>kind&lt;/code>: Integer categorizing the event type&lt;/li>
&lt;li>&lt;code>tags&lt;/code>: Array of arrays for metadata&lt;/li>
&lt;li>&lt;code>content&lt;/code>: The payload (interpretation depends on kind)&lt;/li>
&lt;li>&lt;code>sig&lt;/code>: Schnorr signature proving the pubkey created this event&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Kinds&lt;/strong> determine how relays store events:&lt;/p>
&lt;ul>
&lt;li>Regular events (1, 2, 4-44, 1000-9999): Stored normally, all versions kept&lt;/li>
&lt;li>Replaceable events (0, 3, 10000-19999): Only the latest per pubkey is kept&lt;/li>
&lt;li>Ephemeral events (20000-29999): Not stored, just forwarded to subscribers&lt;/li>
&lt;li>Addressable events (30000-39999): Latest per pubkey + kind + &lt;code>d&lt;/code> tag combination&lt;/li>
&lt;/ul>
&lt;p>Kind 0 is user metadata (profile), kind 1 is a text note (the basic post), kind 3 is the follow list.&lt;/p>
&lt;p>&lt;strong>Kind 1: Text Notes&lt;/strong> are the heart of social Nostr. A kind 1 event is a short-form post, similar to a tweet. The &lt;code>content&lt;/code> field contains the message text (plaintext, though clients often render markdown). Tags enable replies, mentions, and references:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;32-byte-hex&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;32-byte-hex&amp;gt;&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1734480000&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Hello Nostr! Check out @jb55&amp;#39;s work on Damus.&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;e&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;lt;replied-to-event-id&amp;gt;&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.example.com&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;reply&amp;#34;&lt;/span>],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;lt;jb55-pubkey&amp;gt;&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;lt;64-byte-hex&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>e&lt;/code> tag with &amp;ldquo;reply&amp;rdquo; marker indicates this is a reply (see &lt;a href="https://nostrcompass.org/en/topics/nip-10/">NIP-10&lt;/a> for threading conventions). The &lt;code>p&lt;/code> tag mentions a user, enabling clients to notify them and render their name instead of the raw pubkey. Clients fetch the mentioned user&amp;rsquo;s kind 0 event to get their display name and picture.&lt;/p>
&lt;p>To build a timeline, a client subscribes to kind 1 events from followed pubkeys: &lt;code>[&amp;quot;REQ&amp;quot;, &amp;quot;feed&amp;quot;, {&amp;quot;kinds&amp;quot;: [1], &amp;quot;authors&amp;quot;: [&amp;quot;&amp;lt;pubkey1&amp;gt;&amp;quot;, &amp;quot;&amp;lt;pubkey2&amp;gt;&amp;quot;, ...], &amp;quot;limit&amp;quot;: 50}]&lt;/code>. The relay returns matching notes, and the client renders them chronologically.&lt;/p>
&lt;p>&lt;strong>Addressable events&lt;/strong> (30000-39999) work like replaceable events but use a &lt;code>d&lt;/code> tag as an additional identifier. The relay keeps only the latest version of each pubkey + kind + d-tag combination. This enables editable articles, product listings, or any case where you need multiple replaceable items per user.&lt;/p>
&lt;p>&lt;strong>Tags&lt;/strong> are arrays where the first element is the tag name. Standard single-letter tags (&lt;code>e&lt;/code>, &lt;code>p&lt;/code>, &lt;code>a&lt;/code>, &lt;code>d&lt;/code>, &lt;code>t&lt;/code>) are indexed by relays for efficient querying. For example, &lt;code>[&amp;quot;e&amp;quot;, &amp;quot;&amp;lt;event-id&amp;gt;&amp;quot;]&lt;/code> references another event, &lt;code>[&amp;quot;p&amp;quot;, &amp;quot;&amp;lt;pubkey&amp;gt;&amp;quot;]&lt;/code> references a user.&lt;/p>
&lt;p>&lt;strong>Client-Relay Communication&lt;/strong> uses WebSocket connections with JSON arrays as messages. The first element identifies the message type.&lt;/p>
&lt;p>From client to relay:&lt;/p>
&lt;ul>
&lt;li>&lt;code>[&amp;quot;EVENT&amp;quot;, &amp;lt;event&amp;gt;]&lt;/code> - Publish an event to the relay&lt;/li>
&lt;li>&lt;code>[&amp;quot;REQ&amp;quot;, &amp;lt;sub-id&amp;gt;, &amp;lt;filter&amp;gt;, ...]&lt;/code> - Subscribe to events matching the filter(s)&lt;/li>
&lt;li>&lt;code>[&amp;quot;CLOSE&amp;quot;, &amp;lt;sub-id&amp;gt;]&lt;/code> - End a subscription&lt;/li>
&lt;/ul>
&lt;p>From relay to client:&lt;/p>
&lt;ul>
&lt;li>&lt;code>[&amp;quot;EVENT&amp;quot;, &amp;lt;sub-id&amp;gt;, &amp;lt;event&amp;gt;]&lt;/code> - Delivers an event matching your subscription&lt;/li>
&lt;li>&lt;code>[&amp;quot;EOSE&amp;quot;, &amp;lt;sub-id&amp;gt;]&lt;/code> - &amp;ldquo;End of stored events&amp;rdquo; - the relay has sent all historical matches and will now only send new events as they arrive&lt;/li>
&lt;li>&lt;code>[&amp;quot;OK&amp;quot;, &amp;lt;event-id&amp;gt;, &amp;lt;true|false&amp;gt;, &amp;lt;message&amp;gt;]&lt;/code> - Acknowledges whether an event was accepted or rejected (and why)&lt;/li>
&lt;li>&lt;code>[&amp;quot;NOTICE&amp;quot;, &amp;lt;message&amp;gt;]&lt;/code> - Human-readable message from the relay&lt;/li>
&lt;/ul>
&lt;p>The subscription flow: client sends &lt;code>REQ&lt;/code> with a subscription ID and filter, relay responds with matching &lt;code>EVENT&lt;/code> messages, then sends &lt;code>EOSE&lt;/code> to signal it&amp;rsquo;s caught up on history. After &lt;code>EOSE&lt;/code>, any new &lt;code>EVENT&lt;/code> messages are real-time. Client sends &lt;code>CLOSE&lt;/code> when done.&lt;/p>
&lt;p>&lt;strong>Filters&lt;/strong> specify which events to retrieve. A filter object can include: &lt;code>ids&lt;/code> (event IDs), &lt;code>authors&lt;/code> (pubkeys), &lt;code>kinds&lt;/code> (event types), &lt;code>#e&lt;/code>/&lt;code>#p&lt;/code>/&lt;code>#t&lt;/code> (tag values), &lt;code>since&lt;/code>/&lt;code>until&lt;/code> (timestamps), and &lt;code>limit&lt;/code> (max results). All conditions within one filter use AND logic. You can include multiple filters in a &lt;code>REQ&lt;/code>, and they combine with OR logic - useful for fetching different event types in one subscription.&lt;/p>
&lt;h3 id="nip-19-bech32-encoded-identifiers">NIP-19: Bech32-Encoded Identifiers&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-19/">NIP-19&lt;/a> defines the human-friendly formats you see everywhere in Nostr: npub, nsec, note, and more. These aren&amp;rsquo;t used in the protocol itself (which uses hex), but they&amp;rsquo;re essential for sharing and display.&lt;/p>
&lt;p>&lt;strong>Why bech32?&lt;/strong> Raw hex keys are error-prone to copy and hard to distinguish visually. Bech32 encoding adds a human-readable prefix and checksum. You can immediately tell an &lt;code>npub&lt;/code> (public key) from an &lt;code>nsec&lt;/code> (private key) or &lt;code>note&lt;/code> (event ID).&lt;/p>
&lt;p>&lt;strong>Basic formats&lt;/strong> encode raw 32-byte values:&lt;/p>
&lt;ul>
&lt;li>&lt;code>npub&lt;/code> - Public key (your identity, safe to share)&lt;/li>
&lt;li>&lt;code>nsec&lt;/code> - Private key (keep secret, used for signing)&lt;/li>
&lt;li>&lt;code>note&lt;/code> - Event ID (references a specific event)&lt;/li>
&lt;/ul>
&lt;p>Example: The hex pubkey &lt;code>3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d&lt;/code> becomes &lt;code>npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6&lt;/code>.&lt;/p>
&lt;p>&lt;strong>Shareable identifiers&lt;/strong> include metadata using TLV (Type-Length-Value) encoding:&lt;/p>
&lt;ul>
&lt;li>&lt;code>nprofile&lt;/code> - Profile with relay hints (helps clients find the user)&lt;/li>
&lt;li>&lt;code>nevent&lt;/code> - Event with relay hints, author pubkey, and kind&lt;/li>
&lt;li>&lt;code>naddr&lt;/code> - Addressable event reference (pubkey + kind + d-tag + relays)&lt;/li>
&lt;/ul>
&lt;p>These solve a key problem: if someone shares a note ID, how do you know which relay has it? An &lt;code>nevent&lt;/code> bundles the event ID with suggested relays, making sharing more reliable.&lt;/p>
&lt;p>&lt;strong>Important:&lt;/strong> Never use bech32 formats in the protocol itself. Events, relay messages, and NIP-05 responses must use hex. Bech32 is purely for human interfaces: display, copy/paste, QR codes, and URLs.&lt;/p>
&lt;h2 id="releases">Releases&lt;/h2>
&lt;p>&lt;strong>Amber v4.0.4&lt;/strong> - The Android signer app fixes a NullPointerException, improves performance on the activity screen, and adds translations for some event kinds. The previous v4.0.3 release added revamped encryption/decryption UI, account export/import, per-account relay handling, bunker ping support, and crash reporting. &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v4.0.4">Release&lt;/a>&lt;/p>
&lt;p>&lt;strong>Coracle 0.6.28&lt;/strong> - Bug fix release for the web client. Fixed topic feeds, image handling when imgproxy is disabled, and linkification of non-link highlight sources. &lt;a href="https://github.com/coracle-social/coracle/releases/tag/0.6.28">Release&lt;/a>&lt;/p>
&lt;p>&lt;strong>Flotilla v1.6.2&lt;/strong> - The Discord-like communities client fixes modal scrolling and style issues. Earlier releases in this cycle added optional badges and sounds for notifications, improved link rendering, QR code scanning for invite links, and streamlined wallet setup. &lt;a href="https://github.com/coracle-social/flotilla/releases/tag/1.6.2">Release&lt;/a>&lt;/p>
&lt;p>&lt;strong>nak v0.17.2&lt;/strong> - The command-line Nostr tool added a new &lt;code>nip&lt;/code> command for quick NIP reference lookup, plus fixes for git repository handling and stdin event processing. &lt;a href="https://github.com/fiatjaf/nak/releases/tag/v0.17.2">Release&lt;/a>&lt;/p>
&lt;p>&lt;strong>White Noise v0.2.1&lt;/strong> - Major release for the MLS-based encrypted messaging app adding image sharing via Blossom, background sync, push notifications, 8-language localization, and group member management. &lt;a href="https://github.com/marmot-protocol/whitenoise/releases/tag/v0.2.1%2B14">Release&lt;/a>&lt;/p>
&lt;p>&lt;strong>Amethyst v1.04.2&lt;/strong> - Feature release introducing follow lists/packs, new timeline filters, image gallery, and H.265 video compression (50% smaller files). Completed Kotlin Multiplatform migration. &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.04.2">Release&lt;/a>&lt;/p>
&lt;p>&lt;strong>Mostro v0.15.5&lt;/strong> - P2P trading platform update with NIP-69 order expiration support and improved trade history responses. &lt;a href="https://github.com/MostroP2P/mostro/releases/tag/v0.15.5">Release&lt;/a>&lt;/p>
&lt;p>&lt;strong>Nosflare v8.9.26&lt;/strong> - Serverless Nostr relay built on Cloudflare infrastructure. This release delivers a critical hotfix addressing a bug that could cause websocket failures, ensuring more stable connections for users and applications relying on the relay. &lt;a href="https://github.com/Spl0itable/nosflare/releases/tag/v8.9.26">Release&lt;/a>&lt;/p>
&lt;p>&lt;strong>Noscall v0.4.1&lt;/strong> - Nostr-based secure audio and video calling app. This release improves the pop-up UI on the Me page and fixes several known issues, resulting in better stability and call reliability. &lt;a href="https://github.com/sanah9/noscall/releases/tag/v0.4.1-release">Release&lt;/a>&lt;/p>
&lt;p>&lt;strong>Gitplaza v0.25.0&lt;/strong> - Desktop Nostr client focused on Git-related activity. This release introduces an advanced kind filter for the inbox feed, includes regular zaps in filters, and simplifies tab text formatting. Performance improvements optimize comment tree loading, reduce unnecessary database queries, and use cached comment branches for faster display. &lt;a href="https://codeberg.org/dluvian/gitplaza/releases/tag/v0.25.0">Release&lt;/a>&lt;/p>
&lt;h2 id="notable-code-and-documentation-changes">Notable code and documentation changes&lt;/h2>
&lt;h3 id="damus-ios">Damus (iOS)&lt;/h3>
&lt;p>Stability focus with crash and UI fixes: &lt;a href="https://github.com/damus-io/damus/pull/3377">cursor jumping fix&lt;/a> for the compose view, &lt;a href="https://github.com/damus-io/damus/pull/3366">NostrDB interface redesign&lt;/a> using Swift&amp;rsquo;s &lt;code>~Copyable&lt;/code> types for transaction safety, &lt;a href="https://github.com/damus-io/damus/pull/3341">thread UI stability&lt;/a> fixing action bar reinstantiation, &lt;a href="https://github.com/damus-io/damus/pull/3346">mute list freeze&lt;/a> from AttributeGraph cycles, and &lt;a href="https://github.com/damus-io/damus/pull/3334">profile crash&lt;/a> from cross-thread transaction cleanup. Also added &lt;a href="https://github.com/damus-io/damus/pull/3293">AGENTS.md&lt;/a> guidelines for AI coding agents.&lt;/p>
&lt;h3 id="notedeck-desktopmobile">Notedeck (Desktop/Mobile)&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/notedeck/pull/1191">Secure key storage&lt;/a> moves nsec to OS secure store with automatic migration. &lt;a href="https://github.com/damus-io/notedeck/pull/1201">Future note filtering&lt;/a> hides events dated 24+ hours ahead (anti-spam). &lt;a href="https://github.com/damus-io/notedeck/pull/1183">nevent copying&lt;/a> now includes relay hints. Also: &lt;a href="https://github.com/damus-io/notedeck/pull/1212">profile column quick-add&lt;/a>, &lt;a href="https://github.com/damus-io/notedeck/pull/1208">keyboard navigation&lt;/a>, &lt;a href="https://github.com/damus-io/notedeck/pull/1210">media loading optimization&lt;/a>.&lt;/p>
&lt;h3 id="amethyst-android">Amethyst (Android)&lt;/h3>
&lt;p>[&lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote signing](&lt;a href="https://github.com/vitorpamplona/amethyst/pull/1555">https://github.com/vitorpamplona/amethyst/pull/1555&lt;/a>) support for Nostr Connect. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/1586">Bookmark organization&lt;/a> with public/private list management. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/1596">strfry compatibility&lt;/a> fix for relay info parsing edge cases.&lt;/p>
&lt;h3 id="primal-android">Primal (Android)&lt;/h3>
&lt;p>&lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/788">Nostr Connect deep links&lt;/a> for &lt;code>nostrconnect://&lt;/code> URLs. &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/787">Remote login&lt;/a> via QR scan for bunker connections. &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/783">Connection race condition fix&lt;/a>.&lt;/p>
&lt;h3 id="white-noise-encrypted-messaging">White Noise (Encrypted Messaging)&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/whitenoise/pull/890">App data retention fix&lt;/a> disables Android auto-backup for privacy. &lt;a href="https://github.com/marmot-protocol/whitenoise/pull/861">Chat scroll behavior&lt;/a> preserves position when reading history.&lt;/p>
&lt;h3 id="zeus-lightning-wallet">Zeus (Lightning Wallet)&lt;/h3>
&lt;p>[&lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> parallel payments](&lt;a href="https://github.com/ZeusLN/zeus/pull/3407">https://github.com/ZeusLN/zeus/pull/3407&lt;/a>) for improved batch zap throughput.&lt;/p>
&lt;h2 id="developer-best-practices">Developer Best Practices&lt;/h2>
&lt;p>&lt;strong>Validate Auth Events Defensively&lt;/strong> - go-nostr fixed a &lt;a href="https://github.com/nbd-wtf/go-nostr/pull/182">panic in NIP-42 validation&lt;/a> when the relay tag was missing. Always check for required tags before accessing them, even in auth flows where you expect well-formed events.&lt;/p>
&lt;p>&lt;strong>Rate Limit by Authentication State&lt;/strong> - khatru added &lt;a href="https://github.com/fiatjaf/khatru/pull/57">NIP-42 based rate limiting&lt;/a>, allowing relays to apply different limits for authenticated vs anonymous connections. Consider tiered limits based on auth status rather than blanket restrictions.&lt;/p>
&lt;p>&lt;strong>Use Cursor Pagination for Lists&lt;/strong> - Blossom &lt;a href="https://github.com/hzrd149/blossom/pull/65">replaced date-based pagination&lt;/a> with cursor-based pagination on the &lt;code>/list&lt;/code> endpoint. Date-based pagination breaks when items share timestamps; cursors provide reliable iteration.&lt;/p>
&lt;p>&lt;strong>Schema Validation for Event Types&lt;/strong> - The &lt;a href="https://github.com/nostrability/schemata">nostrability/schemata&lt;/a> project provides JSON schemas for validating NIP-compliant events. Consider integrating schema validation in development to catch malformed events before they reach relays.&lt;/p>
&lt;hr>
&lt;p>That&amp;rsquo;s it for this week. Building something? Have news to share? Want us to cover your project? &lt;a href="nostr:npub1wav4fae3gyfy3xj298kxj2mj8phavz7vavps34przq02j7w902qq902923">Reach out via NIP-17 DM&lt;/a> or find us on Nostr.&lt;/p></content:encoded></item></channel></rss>