<?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 #42</title><link>https://nostrcompass.org/en/newsletters/2026-09-30-newsletter/</link><pubDate>Wed, 30 Sep 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-09-30-newsletter/</guid><description>&lt;p>Welcome back to &lt;a href="https://nostrcompass.org">Nostr Compass&lt;/a>, your weekly guide to Nostr.&lt;/p>
&lt;p>Our dedicated &lt;a href="https://gitworkshop.dev/npub1wav4fae3gyfy3xj298kxj2mj8phavz7vavps34przq02j7w902qq902923/relay.ngit.dev/nostr-compass-android">Nostr Compass Android app&lt;/a> brings newsletters, podcast episodes, topic guides, and contributor voice notes into one place. Its &lt;a href="https://zapstore.dev/apps/naddr1qq2x7un89ehx7um5wf3k7mtsv9ehxtnpwpcqzxrhwden5te0wfjkccte9eaxzurnw3hhyefwv3jhvq3qwav4fae3gyfy3xj298kxj2mj8phavz7vavps34przq02j7w902qqxpqqqplqk563kdn">latest signed release notes&lt;/a> describe full signature-verified newsletters, saved issues and 110 topic guides available offline, and local search across stories and available transcripts. Contributors can record and reply with voice notes, review a saved take before sending, and sign through Amber without storing their private key in the app. Public recordings are published on Nostr and Blossom.&lt;/p></description><content:encoded>&lt;p>Welcome back to &lt;a href="https://nostrcompass.org">Nostr Compass&lt;/a>, your weekly guide to Nostr.&lt;/p>
&lt;p>Our dedicated &lt;a href="https://gitworkshop.dev/npub1wav4fae3gyfy3xj298kxj2mj8phavz7vavps34przq02j7w902qq902923/relay.ngit.dev/nostr-compass-android">Nostr Compass Android app&lt;/a> brings newsletters, podcast episodes, topic guides, and contributor voice notes into one place. Its &lt;a href="https://zapstore.dev/apps/naddr1qq2x7un89ehx7um5wf3k7mtsv9ehxtnpwpcqzxrhwden5te0wfjkccte9eaxzurnw3hhyefwv3jhvq3qwav4fae3gyfy3xj298kxj2mj8phavz7vavps34przq02j7w902qqxpqqqplqk563kdn">latest signed release notes&lt;/a> describe full signature-verified newsletters, saved issues and 110 topic guides available offline, and local search across stories and available transcripts. Contributors can record and reply with voice notes, review a saved take before sending, and sign through Amber without storing their private key in the app. Public recordings are published on Nostr and Blossom.&lt;/p>
&lt;p>The &lt;a href="https://zapstore.dev/apps/naddr1qq2x7un89ehx7um5wf3k7mtsv9ehxtnpwpcqzxrhwden5te0wfjkccte9eaxzurnw3hhyefwv3jhvq3qwav4fae3gyfy3xj298kxj2mj8phavz7vavps34przq02j7w902qqxpqqqplqk563kdn">latest app update&lt;/a> preserves queued recordings and upload checkpoints when Android stops background work, shows when Amber approval is needed, and opens the relevant recording from a notification. Separate episode and voice-note views keep their own scroll positions, while playback resumes from the same point. Notifications for new recordings depend on Android scheduling and permission.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-30-newsletter/#white-noise-android-adds-group-polls-and-account-specific-disappearing-message-defaults">White Noise&lt;/a> adds encrypted group polls and notices for incomplete chat history; &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-30-newsletter/#holoboard-adds-nostr-promotion-commands-and-an-android-app">Holoboard&lt;/a> adds &lt;a href="https://github.com/ptrio42/holoboard.space/blob/main/CHANGELOG.md#2026-09-23">private-message promotion commands&lt;/a> and an Android app; &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-30-newsletter/#fips-pub-domains-tests-signed-public-names-for-a-mesh">fips-pub-domains&lt;/a> tests signed public names on a mesh; &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-30-newsletter/#marmot-mdk-0110-makes-account-history-gaps-visible">Marmot MDK&lt;/a> makes missing encrypted-group history visible; and &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-30-newsletter/#myco-080081-gives-nearby-apps-their-own-nostr-store">Myco&lt;/a> gives nearby app sharing a Nostr identity and store. &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-30-newsletter/#nostream-310-adjusts-relay-proof-of-work-to-load">nostream&lt;/a> adjusts relay admission to load, while &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-30-newsletter/#nostr-double-ratchet-0017100172-closes-a-removed-member-gap">Nostr double ratchet&lt;/a> closes a removed-member gap. Development repairs &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-30-newsletter/#amethyst-repairs-encrypted-group-interoperability">Amethyst encrypted-group interoperability&lt;/a>, adds &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-30-newsletter/#divine-adds-encrypted-video-to-direct-messages">Divine&amp;rsquo;s encrypted video messages&lt;/a>, and brings &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-30-newsletter/#nostr-atlas-opens-a-directory-for-checkable-identities">Nostr Atlas&lt;/a> online. Protocol updates refine identity proofs, relay invitations, follow sets, and proposed domain claims. The month-end &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-30-newsletter/#six-years-of-nostr-septembers">September retrospective&lt;/a> follows the same questions through six years of Nostr.&lt;/p>
&lt;h2 id="top-stories">Top Stories&lt;/h2>
&lt;h3 id="holoboard-adds-nostr-promotion-commands-and-an-android-app">Holoboard adds Nostr promotion commands and an Android app&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/holoboard/">Holoboard&lt;/a> is a &lt;a href="https://holoboard.space">board for finding Nostr notes&lt;/a> through a ranking that can be boosted with Lightning payments. The original posts remain Nostr events; Holoboard serves its ranking and appearance data through its own HTTP API. That distinction matters if a reader expects the board&amp;rsquo;s ordering to be a relay-native feed.&lt;/p>
&lt;p>Its &lt;a href="https://github.com/ptrio42/holoboard.space/blob/main/CHANGELOG.md#2026-09-23">September 23 changelog&lt;/a> records direct-message promotion commands over both encrypted &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> and legacy &lt;a href="https://nostrcompass.org/en/topics/nip-04/">NIP-04&lt;/a> paths. NIP-17 wraps private messages to hide their content and sender from relays, while NIP-04 is the older direct-message encryption format. A user can request a promotion invoice in the same conversation, receive one labeled quote for the first paid promotion, and opt into expiry reminders by replying &lt;code>YES&lt;/code>. The promotion sender retries failed relays, while the &lt;a href="https://github.com/ptrio42/holoboard.space/blob/main/CHANGELOG.md">September 24 update&lt;/a> adds an Android app and simplifies the invoice flow.&lt;/p>
&lt;p>The project&amp;rsquo;s &lt;a href="https://github.com/ptrio42/holoboard.space/blob/main/relay/README.md">relay integration notes&lt;/a> describe ordinary notes and comments on Nostr, encrypted inbox routing, and quote and delete handling. Its signed &lt;a href="https://zapstore.dev/apps/space.holoboard.app">Zapstore Android listing&lt;/a> supports the existence of an app release, but the listing key has not been established as Holoboard&amp;rsquo;s public board identity. This is the first Compass coverage of the project.&lt;/p>
&lt;h3 id="fips-pub-domains-tests-signed-public-names-for-a-mesh">fips-pub-domains tests signed public names for a mesh&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/fips-pub-domains/">fips-pub-domains&lt;/a> is a new &lt;a href="https://github.com/fr34aky/fips-pub-domains">resolver and naming experiment&lt;/a> that binds public domain names to nodes on FIPS, an encrypted mesh that uses Nostr messages for peer discovery. Its &lt;a href="https://github.com/fr34aky/fips-pub-domains/releases/tag/v0.1.0">first release&lt;/a> combines those claims with DNS TXT records, optional DNSSEC validation, locally pinned bindings, a Linux resolver daemon, and Android integration with fips2go, the FIPS client for phones. A signed claim by itself does not establish ownership of a public domain; clients need DNS or DNSSEC evidence, a configured witness, or a previously trusted pin.&lt;/p>
&lt;p>The &lt;a href="https://github.com/fr34aky/fips-pub-domains/releases/tag/v0.2.0">0.2.0 release&lt;/a> adds DNSSEC proofs to claims so a client with only a mesh relay can validate an unpinned name, and lets multiple validated servers serve one domain. It also repairs stale pins and DNS failover. &lt;a href="https://github.com/fr34aky/fips-pub-domains/releases/tag/v0.2.1">Version 0.2.1&lt;/a> fixes a systemd unit that otherwise failed to start and runs the server without root; existing installs must replace that unit to receive the fix.&lt;/p>
&lt;p>On Android, a &lt;a href="https://github.com/fr34aky/fips2go/pull/55">merged fips2go change&lt;/a> follows verified public-name bindings in its DNS proxy. A &lt;a href="https://github.com/fr34aky/fips2go/pull/59">second merged change&lt;/a> carries connections to configured Nostr relays over the mesh, so the resolver can retrieve and verify a previously unseen domain claim while the phone has no internet connection. The device results are reported by the maintainers in those pull requests; they do not establish wider deployment.&lt;/p>
&lt;p>The project&amp;rsquo;s &lt;a href="https://github.com/fr34aky/fips-pub-domains/blob/main/docs/testing.md">two-node and mesh-only relay tests&lt;/a> are maintainer-reported evidence for an early implementation, not a production deployment. Its &lt;a href="https://nostrcompass.org/en/topics/nip-db/">NIP-DB&lt;/a> &lt;a href="https://github.com/nostr-protocol/nips/pull/2487">proposal&lt;/a> is still open, and the event kinds in its &lt;a href="https://github.com/fr34aky/fips-pub-domains/blob/main/docs/nip.md">draft&lt;/a> remain placeholders pending registration. Last week&amp;rsquo;s fips2go story covered mesh bootstrap and peer discovery; this week&amp;rsquo;s work tackles public names and verification.&lt;/p>
&lt;h3 id="marmot-mdk-0110-makes-account-history-gaps-visible">Marmot MDK 0.11.0 makes account history gaps visible&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/mdk">Marmot MDK&lt;/a>, the Rust runtime and generated bindings for &lt;a href="https://nostrcompass.org/en/topics/marmot/">MLS-encrypted Nostr group messaging&lt;/a>, follows last week&amp;rsquo;s durable-send release with &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.11.0">version 0.11.0&lt;/a>. Account recovery now declares a history gap complete only after every required relay finishes an untruncated event comparison; an unproven gap produces a durable notice that a host can show to the user. A full delivery queue spills to the account database instead of dropping events, and live delivery advances the transport cursor so a restart does not fetch the same history again.&lt;/p>
&lt;p>The &lt;a href="https://github.com/marmot-protocol/mdk/blob/v0.11.0/docs/release/0.11.0.md">full release notes&lt;/a> also describe optional encrypted group polls, stateless event verification in the bindings, and Android libraries aligned for 16 KB memory pages. Applications must move the generated bindings and native libraries from this source cohort together; account databases migrate through schema 98 on first open, and downgrading the database is unsupported. An existing intermittent catch-up defect can still leave messages more than five group epochs behind undecryptable without raising a notice, so this release does not claim complete history recovery in every case.&lt;/p>
&lt;h3 id="myco-080081-gives-nearby-apps-their-own-nostr-store">Myco 0.8.0–0.8.1 gives nearby apps their own Nostr store&lt;/h3>
&lt;p>&lt;a href="https://github.com/Origami74/myco">Myco&lt;/a> is an Android app for exchanging small Nostr programs, called napplets, with nearby phones, including when they are offline. &lt;a href="https://github.com/Origami74/myco/releases/tag/v0.8.0">Version 0.8.0&lt;/a> gives each installation a guest Nostr identity and permits login with an existing key or Amber, an Android signer that approves signatures without sharing the account key. It also replaces the Discover tab with an app store that is itself a napplet. That store reads signed app listings and recommendations, while a downloaded update can pass between phones in a user&amp;rsquo;s Circle without an internet connection.&lt;/p>
&lt;p>&lt;a href="https://github.com/Origami74/myco/releases/tag/v0.8.1">Version 0.8.1&lt;/a> makes those listings easier to find by querying the relays an author advertises; earlier builds relied on public defaults. It shows cached profiles and apps immediately, saves slower relay answers for later visits, backs off from failing relays, and keeps subscriptions live while a view is open. Both updates preserve the existing phone-to-phone wire format. Updated phones can download and share napplet updates; older phones forward their announcements alone.&lt;/p>
&lt;h2 id="tagged-releases">Tagged Releases&lt;/h2>
&lt;h3 id="white-noise-android-adds-group-polls-and-account-specific-disappearing-message-defaults">White Noise Android adds group polls and account-specific disappearing-message defaults&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/whitenoise-android">White Noise Android&lt;/a> is a Nostr messenger for private &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a>-encrypted conversations. Following the delivery and sharing improvements &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#white-noise-android-2026921-improves-encrypted-chat-reliability-and-sharing">covered last week&lt;/a>, &lt;a href="https://github.com/marmot-protocol/whitenoise-android/releases/tag/android-v2026.9.30">the September 30 release&lt;/a> adds group polls with selectable answers, result bars, and deadlines through the Marmot Development Kit. It also adds &lt;a href="https://github.com/marmot-protocol/whitenoise-android/pull/2799">device-local disappearing-message defaults for each account&lt;/a>: new direct conversations and groups inherit the chosen duration, while existing conversations and their individual settings keep their current policy. &lt;a href="https://github.com/marmot-protocol/whitenoise-android/pull/2765">Wave hi&lt;/a> sends a greeting that mentions a newly added member without disturbing the current draft.&lt;/p>
&lt;p>The &lt;a href="https://github.com/marmot-protocol/whitenoise-android/releases/tag/android-v2026.9.30">release&lt;/a> lets users choose the focal crop for profile and group images and delete a chat folder without deleting its conversations. Its &lt;a href="https://github.com/marmot-protocol/whitenoise-android/pull/2869">history notices&lt;/a> show when recovery leaves account or group history potentially incomplete, with separate dismissal controls. &lt;a href="https://github.com/marmot-protocol/whitenoise-android/pull/2818">Conversation paging&lt;/a> avoids rebuilding the displayed timeline on a jump to recent messages, and &lt;a href="https://github.com/marmot-protocol/whitenoise-android/pull/2825">pending-message edits&lt;/a> retain their text while the original send obtains its confirmed event ID. That edit handoff covers conversation changes within the running app; it does not establish persistence across process death.&lt;/p>
&lt;p>&lt;a href="https://github.com/marmot-protocol/whitenoise-android/pull/2768">Dictation now chooses Paste or Send for each recording&lt;/a>, with automatic finishing placing the transcript in the draft. &lt;a href="https://github.com/marmot-protocol/whitenoise-android/pull/2888">Offline-provider setup&lt;/a> explains on-device processing, keeps its consent separate from other speech providers, and restores interrupted media after capture ends. &lt;a href="https://github.com/marmot-protocol/whitenoise-android/pull/2830">General-file handling&lt;/a> accepts bounded, nonempty documents with accurate filenames, MIME metadata, and failure messages; &lt;a href="https://github.com/marmot-protocol/whitenoise-android/pull/2879">explicit attachment downloads&lt;/a> use Android&amp;rsquo;s user-initiated transfer jobs with a foreground fallback. &lt;a href="https://github.com/marmot-protocol/whitenoise-android/pull/2877">Paste controls&lt;/a> now use Android’s system action so GrapheneOS Secure Paste can grant clipboard access. Android also &lt;a href="https://github.com/marmot-protocol/whitenoise-android/pull/2806">renders iOS GIPHY shares as animated media&lt;/a> while respecting download policy.&lt;/p>
&lt;p>&lt;a href="https://github.com/marmot-protocol/whitenoise-android/pull/2808">Notification fixes&lt;/a> refresh sender nicknames and clean up alerts when a conversation opens. The &lt;a href="https://github.com/marmot-protocol/whitenoise-android/pull/2712">notification recovery changes&lt;/a> preserve pending push work through unavailable foreground ownership and use bounded retries. &lt;a href="https://github.com/marmot-protocol/whitenoise-android/pull/2802">Amber signing&lt;/a> coordinates same-account approval bursts to prevent rate limits from cancelling sends. The &lt;a href="https://github.com/marmot-protocol/whitenoise-android/pull/2872">new audit configuration&lt;/a> asks for a fresh log-sharing choice before uploading to the new receiver. The source also &lt;a href="https://github.com/marmot-protocol/whitenoise-android/pull/2840">adopts AGPL-3.0-only licensing&lt;/a>.&lt;/p>
&lt;h3 id="nostream-310-adjusts-relay-proof-of-work-to-load">nostream 3.1.0 adjusts relay proof of work to load&lt;/h3>
&lt;p>&lt;a href="https://github.com/Cameri/nostream">nostream&lt;/a> is a TypeScript Nostr relay backed by PostgreSQL. &lt;a href="https://github.com/cameri/nostream/releases/tag/v3.1.0">Version 3.1.0&lt;/a> can raise or lower the event proof-of-work threshold between operator-set limits as its observed event rate changes. The setting is off by default, uses each worker&amp;rsquo;s measured rate, and leaves the existing static public-key threshold independent, so operators must opt in before senders see a different admission requirement.&lt;/p>
&lt;p>The same &lt;a href="https://github.com/Cameri/nostream/releases/tag/v3.1.0">release&lt;/a> adds an admin dashboard for relay, WebSocket, and event metrics, network-health probe results, and configurable operator notifications. Its admin API is disabled by default. These controls help operators distinguish relay pressure and reachability problems while keeping the new policy under explicit configuration.&lt;/p>
&lt;p>After its load-sensitive proof-of-work release, nostream merged &lt;a href="https://github.com/cameri/nostream/pull/788">actions for trusted-moderator reports&lt;/a>. &lt;a href="https://nostrcompass.org/en/topics/nip-56/">NIP-56&lt;/a> defines content-report events; the new &lt;code>nip56.hideActionableReports&lt;/code> option excludes reported events from REQ and COUNT results when reporting is also enabled. An event report hides that event, while a public-key report hides every event by that author. The new option defaults to false, so enabling report collection alone preserves the existing query results.&lt;/p>
&lt;h3 id="nostr-double-ratchet-0017100172-closes-a-removed-member-gap">Nostr double ratchet 0.0.171–0.0.172 closes a removed-member gap&lt;/h3>
&lt;p>&lt;a href="https://github.com/irislib/nostr-double-ratchet">Nostr double ratchet&lt;/a> is a TypeScript library for encrypted private chats carried by Nostr. &lt;a href="https://github.com/irislib/nostr-double-ratchet/releases/tag/nostr-double-ratchet-ts-v0.0.171">Version 0.0.171&lt;/a> rotates a group&amp;rsquo;s sender key after membership changes so someone removed with the old keys cannot decrypt later messages from an updated sender, even after that sender restarts. It also refuses sends or key rotation by a removed local owner and aborts a send if membership changes during key distribution.&lt;/p>
&lt;p>&lt;a href="https://github.com/irislib/nostr-double-ratchet/releases/tag/nostr-double-ratchet-ts-v0.0.172">Version 0.0.172&lt;/a> carries the existing account-signed device approval in an optional encrypted invite response. A recipient using the update can verify the sender&amp;rsquo;s device before a separate registration event arrives, while linked devices retain their approval across restarts. The invite field is optional and leaves the original handshake and ratchet message format intact.&lt;/p>
&lt;p>&lt;a href="https://github.com/irislib/nostr-double-ratchet/releases/tag/nostr-double-ratchet-ts-v0.0.175">Versions 0.0.173–0.0.175&lt;/a> extend that removal work with durable group-key handoffs and queued delivery state saved before publication, so interrupted handoffs recover after restart. Publication callbacks carry local group context that lets applications cancel durable retries after removal while keeping membership controls deliverable; queued sends preserve their original inner event IDs. Duplicate invitation responses preserve established sessions, subscriptions remain stable as contacts change, and app-key snapshots retain device names without sharing mutable copies. The signed wire format stays unchanged; the &lt;a href="https://github.com/irislib/nostr-double-ratchet/releases/tag/nostr-double-ratchet-ts-v0.0.173">0.0.173 notes&lt;/a> also report Rust 0.0.168 with receive-session fallback and local group-echo filtering.&lt;/p>
&lt;h3 id="scramble-074075-fetches-the-messages-a-new-group-member-should-see">Scramble 0.7.4–0.7.5 fetches the messages a new group member should see&lt;/h3>
&lt;p>&lt;a href="https://github.com/DavidGershony/Scramble">Scramble&lt;/a> is a cross-platform Marmot group messenger with a native Android interface. In &lt;a href="https://github.com/DavidGershony/Scramble/releases/tag/v0.7.5">version 0.7.5&lt;/a>, each group gets its own relay history cutoff: previously the most active conversation&amp;rsquo;s cutoff was applied to every group, so a newly joined one could remain empty because its post-join messages were never requested. The reconnect path receives the same fix, and a group with no local activity now requests all available messages; MLS still prevents a new member from decrypting messages sent before joining.&lt;/p>
&lt;p>The preceding &lt;a href="https://github.com/DavidGershony/Scramble/releases/tag/v0.7.4">0.7.4 release&lt;/a> fixes repeated invite acceptance caused by recycled Android rows accumulating click handlers, and makes a custom Blossom media server setting persist in the native app. Version 0.7.5 ships only the native Android APK, so users tracking the older Avalonia filename must change their update target. Accounts and history move between those two Android builds, but groups created under the older 0.6.x MLS engine do not migrate to 0.7.x.&lt;/p>
&lt;p>&lt;a href="https://github.com/DavidGershony/Scramble/releases/tag/v0.7.6">Scramble 0.7.6&lt;/a> adds a manual Fetch missing messages control that queries every routing address a group has used, removes the time restriction, repairs a stale stored address, and reports what it recovered. It still cannot decrypt epochs from before the user joined. Native administrators can promote or demote other members, with current roster state and visible failure outcomes; two-person conversations still hide these controls. The group-info Copy action now responds, though invited conversations can still copy an internal chat identifier instead of the protocol group ID. &lt;a href="https://github.com/DavidGershony/Scramble/releases/tag/v0.7.7">Version 0.7.7&lt;/a> also &lt;a href="https://github.com/DavidGershony/Scramble/commit/35e72177a0009ec96e8494caed7e9c250b66c7cb">drains held messages when another member’s commit arrives&lt;/a>; &lt;a href="https://github.com/DavidGershony/Scramble/releases/tag/v0.7.8">0.7.8&lt;/a> adds a regression test for that passive-member path.&lt;/p>
&lt;h3 id="amber-666-repairs-remote-signer-connection-secrets">Amber 6.6.6 repairs remote-signer connection secrets&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> is an Android signer that approves Nostr event signatures without handing an application&amp;rsquo;s account key to it. After last week&amp;rsquo;s backup-encryption change, &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.6.6">version 6.6.6&lt;/a> fixes its &lt;code>nostrconnect&lt;/code> parser: a connection parameter containing &lt;code>=&lt;/code>, such as a padded secret, had been altered before Amber answered. That made NDK-based clients fail their secret check even when the signer connection otherwise looked valid.&lt;/p>
&lt;p>The &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.6.6">release&lt;/a> also sends feedback issues to the relays advertised by Amber&amp;rsquo;s repository announcement, with a fallback to the prior relay if the announcement cannot be fetched. Longer Tor timeouts give slow relays more time to acknowledge that publication. The remaining changes improve icon and text visibility in Amber&amp;rsquo;s themes.&lt;/p>
&lt;h3 id="fips-052-stops-a-nostr-discovery-privacy-leak">FIPS 0.5.2 stops a Nostr discovery privacy leak&lt;/h3>
&lt;p>&lt;a href="https://github.com/jmcorgan/fips">FIPS&lt;/a> is an encrypted mesh that uses Nostr identities and relay messages to discover peers. Its &lt;a href="https://github.com/jmcorgan/fips/releases/tag/v0.5.2">0.5.2 maintenance release&lt;/a> stops signing NAT-traversal deletion requests with the node&amp;rsquo;s routing key, which had linked that key to traversal traffic on relays. It also updates the TLS library used for relay connections to a version that fixes a published security advisory and repairs several lost-message cases in link and session rekeying.&lt;/p>
&lt;p>The &lt;a href="https://github.com/jmcorgan/fips/releases/tag/v0.5.2">release notes&lt;/a> call for operators on every platform to upgrade, while detailing separate Windows key-file permission, gateway, and package-service fixes. Ephemeral nodes no longer write a private &lt;code>fips.key&lt;/code> that a later restart might overwrite; operators who intended a stable identity should set persistent mode before upgrading. The release does not change the mesh wire format, so mixed-version nodes can be upgraded individually.&lt;/p>
&lt;h3 id="napplet-soyli-02310234-repairs-backend-publishing-and-signer-approval">napplet soyLI 0.23.1–0.23.4 repairs backend publishing and signer approval&lt;/h3>
&lt;p>&lt;a href="https://github.com/zeSchlausKwab/napplet-soy">napplet.soy&amp;rsquo;s soyLI&lt;/a> is the creator and publishing toolkit for small sandboxed Nostr programs. After last week&amp;rsquo;s shared-creations release, &lt;a href="https://github.com/zeSchlausKwab/napplet-soy/releases/tag/soyli-v0.23.1">version 0.23.1&lt;/a> makes backend manifests, handlers, and schemas part of creator checks and multiplayer previews. It keeps portable provider configuration in the project manifest while leaving private identity bindings and development databases outside the published source snapshot.&lt;/p>
&lt;p>&lt;a href="https://github.com/zeSchlausKwab/napplet-soy/releases/tag/soyli-v0.23.2">Version 0.23.2&lt;/a> lets projects that once committed a generated public backend context publish again after strict validation, while still rejecting private bindings, journals, databases, and credentials from reachable history. The later &lt;a href="https://github.com/zeSchlausKwab/napplet-soy/releases/tag/soyli-v0.23.4">0.23.4 release&lt;/a> fixes a persistent-backend session failure that could reject a valid extension or remote-signer approval when a person took several seconds to sign. Public hosts need the shared-host fix as well; updating a creator&amp;rsquo;s CLI alone has not repaired a deployed host.&lt;/p>
&lt;h3 id="dart-ndk-0100-scopes-blossom-auth-and-remote-signing">Dart NDK 0.10.0 scopes Blossom auth and remote signing&lt;/h3>
&lt;p>&lt;a href="https://github.com/relaystr/ndk">Dart NDK&lt;/a> is a Flutter and Dart library for Nostr relay access, signing, wallet requests, and media operations. Following last week&amp;rsquo;s prerelease, &lt;a href="https://github.com/relaystr/ndk/releases/tag/v0.10.0-dev.7">0.10.0-dev.7&lt;/a> changes Blossom media requests to stay anonymous until a server refuses them, then authorizes through an explicit policy that says which identity an operation may reveal. It carries that authorization through the request path and replaces the older &lt;code>useAuth&lt;/code> and &lt;code>customSigner&lt;/code> options, a breaking integration change for apps using the prerelease API.&lt;/p>
&lt;p>&lt;a href="https://github.com/relaystr/ndk/releases/tag/v0.10.0-dev.9">Dev.9&lt;/a> stops holding a remote-signer response until the slowest relay acknowledges it. &lt;a href="https://github.com/relaystr/ndk/releases/tag/v0.10.0-dev.8">Dev.8&lt;/a> reduces background relay polling and cache work; its other fixes concern wallet seed persistence and settlement deadlines. The &lt;a href="https://github.com/relaystr/ndk/releases/tag/v0.10.0">stable 0.10.0 release&lt;/a> now packages this development series together with the connection-metadata and private subscription-ID changes below. The &lt;a href="https://github.com/relaystr/ndk/compare/v0.10.0-dev.9...v0.10.0">comparison with dev.9&lt;/a> includes those merged changes. Applications upgrading should review both the media-auth API change and the remote-signer response path.&lt;/p>
&lt;p>The stable release includes &lt;a href="https://github.com/relaystr/ndk/pull/852">NIP-46 connection metadata and requested permissions&lt;/a>, replacing separate connection fields with a &lt;code>Nip46ClientMetadata&lt;/code> value. This is a source API change that lets login widgets pass application identity and requested permissions to the bunker. Another &lt;a href="https://github.com/relaystr/ndk/pull/860">request-ID change&lt;/a> uses 32 random hexadecimal characters in production, keeping use-case names and pagination phases out of relay-visible subscription IDs. Explicit IDs remain bounded to NIP-01&amp;rsquo;s 64-character limit, while debug mode retains a short diagnostic name.&lt;/p>
&lt;h3 id="mostro-core-0160-removes-the-old-gift-wrap-transport">Mostro Core 0.16.0 removes the old gift-wrap transport&lt;/h3>
&lt;p>&lt;a href="https://github.com/MostroP2P/mostro-core">Mostro Core&lt;/a> supplies the message protocol used by Mostro&amp;rsquo;s Nostr-based peer-to-peer trading clients and coordinator. &lt;a href="https://github.com/MostroP2P/mostro-core/releases/tag/v0.16.0">Version 0.16.0&lt;/a> removes its protocol-v1 gift-wrap transport and its old wrap and unwrap functions, leaving the newer transport as the library path. That is a breaking change for applications still constructing or reading v1 messages through this library.&lt;/p>
&lt;p>The &lt;a href="https://github.com/MostroP2P/mostro-core/releases/tag/v0.16.0">library release&lt;/a> precedes the coordinator&amp;rsquo;s &lt;a href="https://github.com/MostroP2P/mostro/releases/tag/v0.19.0">now-published 0.19.0 release&lt;/a>. Operators serving older clients need to update both sides of the transport migration. The preceding &lt;a href="https://github.com/MostroP2P/mostro-core/releases/tag/v0.15.1">0.15.1 tag&lt;/a> adds a cooperative-cancellation dispute state, but the transport removal is the compatibility milestone.&lt;/p>
&lt;h3 id="cambium-060071-enrolls-an-unlock-phone-through-relay-messages">Cambium 0.6.0–0.7.1 enrolls an unlock phone through relay messages&lt;/h3>
&lt;p>&lt;a href="https://github.com/forgesworn/cambium">Cambium&lt;/a> is an Android signing companion for a Heartwood hardware key that can also unlock the board after a restart. &lt;a href="https://github.com/forgesworn/cambium/releases/tag/v0.6.0">Version 0.6.0&lt;/a> lets a phone enroll for unlock through the board&amp;rsquo;s Nostr relays without a USB cable; the user compares five request words on the phone, the board, and Sapwood, the board&amp;rsquo;s enrollment interface, before pressing the board&amp;rsquo;s button. Newly announced relays receive a randomized connection delay so the phone&amp;rsquo;s first contact does not reveal exactly when it saw the board&amp;rsquo;s update.&lt;/p>
&lt;p>&lt;a href="https://github.com/forgesworn/cambium/releases/tag/v0.7.0">Version 0.7.0&lt;/a> reverses the invitation flow: a phone scans Sapwood&amp;rsquo;s short-lived QR code and returns one encrypted, one-time event from a throwaway key. Retry republishes that same event if no relay accepts it, while the old code-display path remains for older Sapwood builds. The &lt;a href="https://github.com/forgesworn/cambium/releases/tag/v0.7.1">0.7.1 patch&lt;/a> keeps the final check code visible and improves F-Droid build reproducibility; the QR flow still requires the specified recent Sapwood and Heartwood versions.&lt;/p>
&lt;h3 id="bray-350352-limits-agent-initiated-nostr-wallet-spending">Bray 3.5.0–3.5.2 limits agent-initiated Nostr wallet spending&lt;/h3>
&lt;p>&lt;a href="https://github.com/forgesworn/bray">Bray&lt;/a> is a Nostr tool server that lets an AI assistant request relay, identity, and wallet actions through a scoped interface. Its &lt;a href="https://github.com/forgesworn/bray/releases/tag/v3.5.0">3.5.0 release&lt;/a> adds a cap on each Nostr Wallet Connect payment and a persisted daily budget, with human confirmation where the assistant host supports it. Serving separate spending connections now requires an explicit wallet-service setting, rechecks each grant before use, and confines invoice lookups to hashes within that grant.&lt;/p>
&lt;p>The &lt;a href="https://github.com/forgesworn/bray/releases/tag/v3.5.0">release&lt;/a> also tells users to keep a wallet connection URI in a private file instead of pasting it into chat, and refuses to retry an uncertain payment as though failure were proven. &lt;a href="https://github.com/forgesworn/bray/releases/tag/v3.5.2">Version 3.5.2&lt;/a> matches marketplace payment rails locally after relays rejected the requested payment-method filter. These checks limit what a delegated assistant can spend and prevent a relay-filter assumption from hiding matching offers.&lt;/p>
&lt;h3 id="mafrend-130-alpha-moves-private-map-groups-to-current-marmot">Mafrend 1.3.0-alpha moves private map groups to current Marmot&lt;/h3>
&lt;p>&lt;a href="https://github.com/DestBro/mafrend-zapstore">Mafrend&lt;/a> is a map-based Nostr social app that lets people explore places and chat around destinations. Its &lt;a href="https://github.com/DestBro/mafrend-zapstore/releases/tag/v1.3.0-alpha">1.3.0-alpha release&lt;/a> upgrades private groups to a newer &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot encrypted-group&lt;/a> specification and adds profile views from chats and reviews. The group format is incompatible with older alpha chats; users should treat this as an alpha migration with a compatibility break.&lt;/p>
&lt;p>The &lt;a href="https://github.com/DestBro/mafrend-zapstore/releases/tag/v1.3.0-alpha">same release&lt;/a> adds screenshot sharing and chat changes alongside map and marker improvements. Profile features are still marked in progress by the project. The meaningful Nostr change is the private-group interoperability shift; users with older test groups should check the compatibility note before upgrading.&lt;/p>
&lt;h3 id="sonar-alpha15alpha151-repairs-encrypted-group-publishing">Sonar alpha.15–alpha.15.1 repairs encrypted-group publishing&lt;/h3>
&lt;p>&lt;a href="https://github.com/hedwig-corp/bitchat-to-sonar">Sonar&lt;/a> is a private messenger that can carry conversations over Bluetooth mesh and Nostr. &lt;a href="https://github.com/hedwig-corp/bitchat-to-sonar/releases/tag/v0.1-alpha.15">Alpha.15&lt;/a> adds emoji reactions to messages and private local-time sharing inside encrypted chats, with a setting to revoke that sharing. Its wallet switches to Cashu, but that payment change is separate from the messaging update.&lt;/p>
&lt;p>&lt;a href="https://github.com/hedwig-corp/bitchat-to-sonar/releases/tag/v0.1-alpha.15.1">Alpha.15.1&lt;/a> repairs a launch failure that could leave the conversation index empty after an older branch build wrote a foreign schema version. Without the index, the app re-encrypted and republished local-time shares to every group on each reopen, sometimes sending hundreds of events before relay rate limits intervened. The hotfix rebuilds that local state and stops the repeated group publishes.&lt;/p>
&lt;h3 id="elisyms-commerce-packages-introduce-private-nostr-orders">Elisym&amp;rsquo;s commerce packages introduce private Nostr orders&lt;/h3>
&lt;p>&lt;a href="https://github.com/elisymlabs/elisym">Elisym&lt;/a> is a Nostr-based agent toolkit now building a signed-event commerce flow. Its &lt;a href="https://github.com/elisymlabs/elisym/pull/120">merged &lt;code>commerce&lt;/code> package&lt;/a> defines store products, owner authorization, privately wrapped orders and receipts, and offer verification for the checkout and merchant components. A later &lt;a href="https://github.com/elisymlabs/elisym/releases/tag/%40elisym/commerce%400.2.0">commerce 0.2.0 tag&lt;/a> derives an order&amp;rsquo;s payment reference from that order, tying the payment lookup to the signed purchase flow.&lt;/p>
&lt;p>The package series also introduces separate payment-core and browser-checkout work, but its &lt;a href="https://github.com/elisymlabs/elisym/releases/tag/%40elisym/commerce%400.2.0">release tags&lt;/a> do not establish that a complete merchant checkout is deployed. The store-authorization event kind is explicitly provisional in the project&amp;rsquo;s primary source. The eleven SDK, MCP, CLI, and payment-core tags mark one developing commerce feature.&lt;/p>
&lt;p>&lt;a href="https://github.com/elisymlabs/elisym/releases/tag/%40elisym%2Fmerchant-node%400.1.0">Elisym&amp;rsquo;s new package releases&lt;/a> package the self-hosted merchant node, while &lt;a href="https://github.com/elisymlabs/elisym/releases/tag/%40elisym%2Fmcp%400.31.0">MCP 0.31.0&lt;/a> adds &lt;code>buy_product&lt;/code> and &lt;code>get_order&lt;/code> for commerce products. Subsequent commerce and merchant-node releases add Tempo payment support inside that same checkout. These packages advance the existing signed-product and private-order integration; the tag list does not make the provisional event schema a standard or establish a complete hosted-service launch.&lt;/p>
&lt;h3 id="flotilla-1112-unsticks-signers-and-incomplete-relay-feeds">Flotilla 1.11.2 unsticks signers and incomplete relay feeds&lt;/h3>
&lt;p>&lt;a href="https://github.com/coracle-social/flotilla">Flotilla&lt;/a> is a Nostr client for conversations, rooms, and shared spaces. &lt;a href="https://github.com/coracle-social/flotilla/releases/tag/1.11.2">Version 1.11.2&lt;/a> gives a user a way out when startup stalls waiting for a remote signer, and signs out a session whose local application data has been cleared. A room can now display its messages before its wider space finishes synchronizing, while feeds no longer omit posts simply because one relay answered later than another.&lt;/p>
&lt;p>The &lt;a href="https://github.com/coracle-social/flotilla/releases/tag/1.11.2">same release&lt;/a> also publishes an F-Droid build signed with the app&amp;rsquo;s existing key and keeps GitHub releases current for Obtainium. That distribution work matters to users changing update channels, but the relay and signer fixes are the immediate reason to upgrade.&lt;/p>
&lt;h3 id="ditto-2423-shows-relay-delivery-and-tightens-account-boundaries">Ditto 2.42.3 shows relay delivery and tightens account boundaries&lt;/h3>
&lt;p>&lt;a href="https://gitlab.com/soapbox-pub/ditto">Ditto&lt;/a> is a Nostr social client that lets users choose and authenticate to their relays. In &lt;a href="https://gitlab.com/soapbox-pub/ditto/-/releases/v2.42.3">version 2.42.3&lt;/a>, a post&amp;rsquo;s Event Details shows which user and author relays hold it; Broadcast targets only the missing ones. The release also points out unresponsive read relays and gives them a retry control, making a missing post easier to diagnose without sending it everywhere again.&lt;/p>
&lt;p>The &lt;a href="https://gitlab.com/soapbox-pub/ditto/-/releases/v2.42.3">release notes&lt;/a> say that switching accounts no longer sends posts to the previous account&amp;rsquo;s relays, muted users cannot trigger generic phone alerts, and links or images in posts cannot reach devices on the reader&amp;rsquo;s local network. Slow-relay posts stop disappearing from Follows and Loved feeds, while live stream chat and webxdc games update without repeatedly downloading the whole view. Torrent and audio browsing are also new, but the relay routing and account isolation are the changes with the widest Nostr impact.&lt;/p>
&lt;h3 id="iris-chat-20269244-brings-calls-into-encrypted-conversations">Iris Chat 2026.9.24.4 brings calls into encrypted conversations&lt;/h3>
&lt;p>&lt;a href="https://github.com/irislib/iris-chat-rs">Iris Chat&lt;/a> is an end-to-end encrypted Nostr messenger using the double-ratchet family of chat protocols. Its &lt;a href="https://github.com/irislib/iris-chat-rs/releases/tag/v2026.9.24.4">September 24 release&lt;/a> adds voice and video calls with compatible contacts, including over an existing local connection when the internet is unavailable. A user can lower video quality, answer video as voice, and handle an incoming call through Android&amp;rsquo;s call interface; answering or declining also stops the other linked devices from ringing.&lt;/p>
&lt;p>The &lt;a href="https://github.com/irislib/iris-chat-rs/releases/tag/v2026.9.24.4">release&lt;/a> also lets a person sign in through a separate signing app and see which linked devices are connected. Later &lt;a href="https://github.com/irislib/iris-chat-rs/releases/tag/v2026.9.24.5">September 24 patches&lt;/a> keep delayed messages&amp;rsquo; original timestamps and improve nearby delivery after a lost reconnection packet. These are early cross-device and call behaviors, so the update is most useful to contacts who can run compatible Iris builds.&lt;/p>
&lt;p>The later developer-signed &lt;a href="https://primal.net/e/17fd3f325dda1feb0c1e51c6e1af0f7b3efe42ecff75e9527ac435cdc6a30c7a">September 30 update&lt;/a> retains a removed member&amp;rsquo;s local group history while disabling sends, improves delivery between linked devices and large groups, and repairs read indicators and unread counts. Calls gain audio-device selection and restored outgoing tones; stale microphone status no longer silences incoming audio. Timed muting, image copying, dropped-file attachments, notification routing, and push registration receive fixes, while sign-out clears local caches and device removal ends its session. A &lt;a href="https://primal.net/e/89ec93e25caf31831714e807c927b6d50d3d5fc38044df845163ff656db3f711">second update&lt;/a> improves access to files cached by other Iris apps on the same device and keeps local file sharing available with Nearby disabled.&lt;/p>
&lt;h3 id="librenostr-060070-routes-relays-through-built-in-tor">LibreNostr 0.6.0–0.7.0 routes relays through built-in Tor&lt;/h3>
&lt;p>&lt;a href="https://github.com/Lwb89dev/librenostr">LibreNostr&lt;/a> is an Android Nostr client with configurable relay and privacy settings. &lt;a href="https://github.com/Lwb89dev/librenostr/releases/tag/v0.6.0">Version 0.6.0&lt;/a> bundles an Arti-based Tor engine on ARM64 and applies the chosen Direct, Tor-for-everything, or &lt;code>.onion&lt;/code>-only mode to relay WebSockets, HTTP requests, media, uploads, and web pages. Strict Tor mode fails closed when Tor is unavailable and never silently sends a request directly; changing modes reconnects relay sockets through the new route.&lt;/p>
&lt;p>&lt;a href="https://github.com/Lwb89dev/librenostr/releases/tag/v0.6.2">Version 0.6.2&lt;/a> adds an on-device web-of-trust filter built from public follow lists and chooses supplemental relays by the additional followed people they reach. &lt;a href="https://github.com/Lwb89dev/librenostr/releases/tag/v0.7.0">Version 0.7.0&lt;/a> then shows notes and notifications before profile and count lookups finish, caps slow relay queries, and stops decrypting an entire DM inbox on every conversation open. Together these releases change both where the client may connect and how long a slow relay can hold up its interface.&lt;/p>
&lt;p>Its developer-signed &lt;a href="https://primal.net/e/4eeba660b6b789288954290497de89fe3222bfc955214647ead5d63e6031d927">first stable release, 1.0.0&lt;/a>, adds saved, per-profile tablet decks with movable columns for feeds, hashtags, profiles, long-form reading, notifications, and messages. Landscape tablets get this layout; phones keep their existing interface. Search gains OR, exclusions, media filters, and working date ranges, returns cached profiles before relay refinements, and moves past refused full-text requests immediately. Hashtags sort chronologically, paging waits for sufficient relay answers, and unused feeds release their subscriptions.&lt;/p>
&lt;p>The &lt;a href="https://primal.net/e/4eeba660b6b789288954290497de89fe3222bfc955214647ead5d63e6031d927">same release&lt;/a> preserves existing public and encrypted mute-list and bookmark entries during edits instead of replacing them with one change. It isolates bookmarks and notifications between accounts and restricts auxiliary author relays to public reads, keeping private requests and relay authentication off them. It also prevents stale profile answers from replacing newer metadata, repairs notification paging and badges, retains older feed items when new ones arrive, and fixes reply undo countdowns, duplicate publication, media URLs with query strings, and unread counts after marking a chat read. &lt;a href="https://primal.net/e/630becb73dbe7ba7c76a2d1970f1d7262a5afc33b02fc8002bef611cf638deab">Version 1.0.1&lt;/a> fixes a tablet-deck startup crash in the new layout.&lt;/p>
&lt;h3 id="newlay-0345-streams-large-relay-queries-instead-of-closing-them">Newlay 0.3.45 streams large relay queries instead of closing them&lt;/h3>
&lt;p>&lt;a href="https://code.relay.tools/opensauce/newlay">Newlay&lt;/a> is an Android-hosted Nostr relay and related local services. Its &lt;a href="https://primal.net/e/b8380ae1bf30492129727ec59e27e2ae8a4cf9ad08e7361826a9ba8be88a227a">signed 0.3.45 release announcement&lt;/a> says that large query results now stream with backpressure instead of closing the client&amp;rsquo;s connection. The embedded Git host prunes superseded packs after pushes, while its Cordn encrypted-messaging coordinator accepts oversized client requests and sends an abort frame when a probe times out.&lt;/p>
&lt;p>The &lt;a href="https://primal.net/e/b8380ae1bf30492129727ec59e27e2ae8a4cf9ad08e7361826a9ba8be88a227a">release&lt;/a> also gives the Android operator a live status card for events, storage, address, and administration, and aligns the native cryptography library for devices with 16 KB memory pages. The relay and coordinator changes span several releases since the prior store version, 0.3.39; 0.3.45 is their packaged checkpoint.&lt;/p>
&lt;h3 id="ngit-grasp-305-keeps-git-pushes-and-relay-sync-moving">ngit-grasp 3.0.5 keeps Git pushes and relay sync moving&lt;/h3>
&lt;p>&lt;a href="https://gitworkshop.dev/danconwaydev.com/ngit-grasp">ngit-grasp&lt;/a> is a self-hosted Nostr relay and Git server for signed repository collaboration. Its &lt;a href="https://primal.net/e/6ff00b9230e4523e6f14aaf6e5088f91e5696be38b9304a4e1cef384e3318d41">signed 3.0.5 release announcement&lt;/a> moves slow history reconciliation out of the shared live-sync actor, allowing relay subscriptions to start while earlier events are checked. It backs off separately for rate limits, incomplete history queries, mailbox reads, and identity lookups, so a sick relay no longer monopolizes retry capacity.&lt;/p>
&lt;p>The &lt;a href="https://primal.net/e/6ff00b9230e4523e6f14aaf6e5088f91e5696be38b9304a4e1cef384e3318d41">same release&lt;/a> reconciles against the local event inventory to avoid refetching stored history and closes incomplete subscriptions before treating their coverage as verified. On the Git side, it accepts pushes that background state promotion already applied, retains conflict protection for changed refs, and drains Git progress output during uploads to prevent a stalled push. Those details matter because a repository can appear live on relays while its Git transfer is still waiting for an authoritative result.&lt;/p>
&lt;h3 id="armada-0630-carries-push-alerts-across-signer-types">Armada 0.63.0 carries push alerts across signer types&lt;/h3>
&lt;p>&lt;a href="https://github.com/soapbox-pub/armada">Armada&lt;/a> is a Nostr client for encrypted communities, channels, and direct messages. Following last week&amp;rsquo;s media-privacy release, its &lt;a href="https://primal.net/e/34021b55504d74c5d04f55dbfea87f31168a7c4582f35113d7ec063894d19e56">signed 0.63.0 announcement&lt;/a> describes a new browser push path that works while the app is closed for extension and remote-signer logins as well as other account types. Tenna, a host app that embeds Armada, also gains background notifications for its users.&lt;/p>
&lt;p>The &lt;a href="https://primal.net/e/34021b55504d74c5d04f55dbfea87f31168a7c4582f35113d7ec063894d19e56">release&lt;/a> loads older messages in long community channels faster and avoids rereading the whole history for new messages. Direct-message typing indicators use fewer relay connections. Desktop updates gain a restart prompt, while direct upgrades from versions older than 0.50.0 are no longer supported.&lt;/p>
&lt;p>The signed &lt;a href="https://primal.net/e/af3ff711c1c1daa4d6a621dc5add0615fc5d37fbb1de31395cb79dcdf820aaf1">0.63.1 follow-up&lt;/a> adds editable emoji packs with folder import and reordering, retrieves quoted messages beyond loaded history, and makes relay-hosted replies interoperable. It reduces Android reconnect traffic, catches up after long disconnects without repeating old alerts, excludes pre-join mentions, and preserves unedited group fields and private server-list entries. Deletions in relay-hosted groups now require the message author or an administrator. Server dragging, malformed relay-information handling, and repository subscriptions also receive fixes.&lt;/p>
&lt;p>&lt;a href="https://primal.net/e/ad0f6ad1a7730a400e8257c494c53ef14597c55a24e01b05dd2b2301c7d3aa36">Version 0.63.2&lt;/a> expands message Markdown to nested quotes and lists, horizontal rules, code fences, underlined headings, and formatting across links or mentions. Tenor and Giphy page links play as GIFs. Read-state synchronization transfers less data, reconnection avoids redundant downloads and logins, and Android background notifications pause relay synchronization when large settings updates flood it.&lt;/p>
&lt;h3 id="deed-030032-makes-zig-nostr-publishing-steadier">deed 0.3.0–0.3.2 makes Zig Nostr publishing steadier&lt;/h3>
&lt;p>&lt;a href="https://github.com/zig-nostr/deed">deed&lt;/a> is a Zig command-line tool for reading and publishing Nostr events. Its &lt;a href="https://github.com/zig-nostr/deed/releases/tag/v0.3.2">September 24 version 0.3.2&lt;/a> adds an agent skill and fixes relay ping deadlines; the preceding &lt;a href="https://github.com/zig-nostr/deed/releases/tag/v0.3.1">0.3.1&lt;/a> and &lt;a href="https://github.com/zig-nostr/deed/releases/tag/v0.3.0">0.3.0&lt;/a> releases improve performance and publication reliability. The three tags describe one early tool series. The visible Nostr benefit is a steadier relay connection and event-publishing path for scripts that use the CLI.&lt;/p>
&lt;h3 id="cordn-051-keeps-other-groups-moving-when-a-coordinator-fails">Cordn 0.5.1 keeps other groups moving when a coordinator fails&lt;/h3>
&lt;p>&lt;a href="https://github.com/Cordn-msg/cordn">Cordn&lt;/a> is an MLS-encrypted group messenger that uses Nostr identities and relays to locate conversation coordinators. Its &lt;a href="https://primal.net/e/23f7498e2e405e05c4d3075ccc522c753d80f37b954a81ff8ecb3268f2dc7dc6">signed 0.5.1 client release&lt;/a> follows last week&amp;rsquo;s offline-queue work by separating coordinator and outbox scheduling: an unavailable coordinator no longer delays sends for unrelated groups. Resolved relay hints persist after discovery, group documents carry them between devices, and a durable pending-publication record recovers stranded sends. Multi-device recovery overlaps history-chain and gap queries while reading current configuration.&lt;/p>
&lt;p>The &lt;a href="https://primal.net/e/23f7498e2e405e05c4d3075ccc522c753d80f37b954a81ff8ecb3268f2dc7dc6">release&lt;/a> also adds dropped-file attachments, pinned groups, profile names in previews and notifications, and coordinator labels. It repairs first-unread positioning, unread counters, duplicate alerts, media and system-message previews, replies attached to captioned media, and image zoom controls. Native downloads use a Save-as picker. A signer that appears late no longer causes a false unsupported-encryption warning, and account switching no longer races background seeding.&lt;/p>
&lt;h3 id="nymbot-107-adds-local-document-handling-and-encrypted-chat-sharing">Nymbot 1.0.7 adds local document handling and encrypted chat sharing&lt;/h3>
&lt;p>&lt;a href="https://zapstore.dev/apps/ai.nymbot">Nymbot&lt;/a> is an assistant reached through encrypted, gift-wrapped Nostr messages. Its &lt;a href="https://primal.net/e/affd11e97fb3438965780aa01732e8d0e0f9b2162b87ab0f3019dff93449673e">developer-signed 1.0.7 release&lt;/a> reads documents on the device, selects relevant passages when a file is too large to send whole, and identifies the pages used. Conversations can be shared through an end-to-end encrypted link whose access can later be withdrawn. Python and JavaScript replies can run locally, with their output returned to the conversation.&lt;/p>
&lt;p>The &lt;a href="https://primal.net/e/affd11e97fb3438965780aa01732e8d0e0f9b2162b87ab0f3019dff93449673e">same release&lt;/a> adds sourced research with a price shown before submission, image editing, per-message model selection, and spending caps per chat and bot. External tools connected through MCP ask for confirmation before changing data. Repository runs can pause changes for review, display CI results, and resume after a busy gateway. Suggested replies, pinned notices, folded source lists, and a searchable model picker complete the update; these claims come from the developer release notes; Compass has not independently audited the privacy of the app.&lt;/p>
&lt;h3 id="0xchat-156-ships-its-signing-and-message-authentication-fixes">0xchat 1.5.6 ships its signing and message-authentication fixes&lt;/h3>
&lt;p>&lt;a href="https://github.com/0xchat-app/0xchat-app-main">0xchat&lt;/a> is a Nostr messenger with private chats, external signing, and wallet features. &lt;a href="https://github.com/0xchat-app/0xchat-app-main/releases/tag/v1.5.6-release">Version 1.5.6&lt;/a> ships the security fixes &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#0xchat-merges-fixes-for-signing-message-authentication-and-redirect-flaws">covered as source merges last week&lt;/a>, including gift-wrap authentication, trusted infrastructure configuration, and consent for embedded-page signing. It also closes Tor proxy bypass paths, validates TLS certificates for non-onion hosts, and stops release builds from writing potentially sensitive credentials and wallet material to the device console. Opt-in developer logs continue to record errors.&lt;/p>
&lt;p>The &lt;a href="https://github.com/0xchat-app/0xchat-app-main/releases/tag/v1.5.6-release">release&lt;/a> backs relay reconnects off from three seconds to five minutes, repairs subscriptions after reconnection, and delivers requests queued while a relay is connecting. Account switches stop accumulating duplicate relay listeners, a failed login preserves the already active account, and external-signer connections persist across starts. Failed sends now show errors and retain unsent text or recoverable token-sharing state. Startup key decryption and upload hashing move off the UI thread; chat and video caches avoid repeated rendering and downloads. The release supplies Android and desktop assets with SHA-256 checksums, including the Play-signed Android APK and a Windows installer built from source.&lt;/p>
&lt;h3 id="nostr-mail-client-0170-hides-mailbox-actions-from-relays">Nostr Mail Client 0.17.0 hides mailbox actions from relays&lt;/h3>
&lt;p>&lt;a href="https://github.com/nogringo/nostr-mail-client">Nostr Mail Client&lt;/a> exchanges email through Nostr while supporting conventional email delivery. Following &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#nostr-mail-client-0160-adds-per-recipient-delivery-choices">last week&amp;rsquo;s per-recipient transport and media-privacy release&lt;/a>, &lt;a href="https://github.com/nogringo/nostr-mail-client/releases/tag/v0.17.0">version 0.17.0&lt;/a> hides read, archive, folder, and label state and their timing from relays, and lets users delete mail without notifying its sender. The release requires updating every device together because older clients do not see the new state or deletions. It also protects Bcc recipients in mail larger than 32 KB, keeps local contact aliases out of outgoing messages, repairs Amber QR login, and publishes public mail to the recipients&amp;rsquo; read relays.&lt;/p>
&lt;p>The &lt;a href="https://github.com/nogringo/nostr-mail-client/releases/tag/v0.17.0">release&lt;/a> adds colored folders and labels with sender, subject, and attachment rules; reply and forward quotes; inline pasted images; attachment previews and renaming; and range selection in mail lists. Forwarding retains original images and attachments, reply quotes start collapsed, and the web editor gains a context menu. HTML tables and inline images render more accurately, plain-text links work, and scheduling supports dates up to five years ahead. Address-book names and pictures appear throughout the interface, and theme colors offer system, suggested, or custom palettes.&lt;/p>
&lt;p>The same &lt;a href="https://github.com/nogringo/nostr-mail-client/releases/tag/v0.17.0">release&lt;/a> keeps file-selected backgrounds local and caches linked backgrounds, with an explicit migration cost: older file backgrounds on native platforms must be added again. It changes the default relay/media recommendations, adds Nostr-app discovery during onboarding and update notices, preserves unfamiliar settings written by other clients, and repairs interrupted mail-store creation and Linux packaging. Startup failures now show details and a prefilled report instead of a blank screen.&lt;/p>
&lt;h3 id="nostr-wot-087-binds-authentication-to-the-destination">Nostr WoT 0.8.7 binds authentication to the destination&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-wot/nostr-wot-extension">Nostr WoT&lt;/a> is a browser extension that combines Nostr signing with trust tools. &lt;a href="https://github.com/nostr-wot/nostr-wot-extension/releases/tag/v0.8.7">Version 0.8.7&lt;/a> requires consent for &lt;a href="https://nostrcompass.org/en/topics/nip-98/">NIP-98&lt;/a> signed HTTP authentication against the exact URL, query, method, account, and requesting origin. Older broad approvals require fresh consent. &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> relay authentication has a separate account-bound permission system, with site-specific denials taking precedence over shared relay allows. Authentication requests must come from a verified top-level browser origin, and approval or unlock waits trigger another account/access check.&lt;/p>
&lt;p>The &lt;a href="https://github.com/nostr-wot/nostr-wot-extension/releases/tag/v0.8.7">release&lt;/a> verifies remote &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> signatures and the complete approved event so a returned signature cannot silently substitute content or a destination. Wallet provisioning and address changes use body-bound authentication, one-use backend challenges, and separate transaction tokens; generic website signing cannot mint those internal wallet tokens. The compatible backend must deploy first, and the client refuses to downgrade to retired endpoints. Nostr Wallet Connect payments also verify a returned payment preimage against the requested invoice hash and treat a mismatch as an unknown outcome.&lt;/p>
&lt;p>In the &lt;a href="https://github.com/nostr-wot/nostr-wot-extension/releases/tag/v0.8.7">request interface&lt;/a>, users can inspect full raw events, choose specific requests in a site group, and view private messages locally without approving their return to a website. Local previews conceal themselves after 30 seconds; incoming requests remain unchecked, and ordinary bulk approval excludes authentication. The extension separates per-site and all-sites relay grants, bounds verified profile caching, resolves equal-timestamp replaceable events by lower event ID, and keeps home-popup publication reads local. Chrome and Firefox receive separately verified packages and serialized stable-release submission workflows; those workflows do not prove current store availability.&lt;/p>
&lt;h3 id="iriss-shared-runtime-keeps-relay-and-peer-history-consistent">Iris&amp;rsquo;s shared runtime keeps relay and peer history consistent&lt;/h3>
&lt;p>&lt;a href="https://github.com/mmalmi/nostr-pubsub">nostr-pubsub&lt;/a> supplies a shared Nostr event runtime with persistent event storage and an outgoing publication queue. &lt;a href="https://github.com/mmalmi/nostr-pubsub/releases/tag/nostr-pubsub-ts-v0.5.13">Versions 0.5.7–0.5.13&lt;/a> batch exact subscriptions, replay them after reconnect, keep local, relay, and peer evidence distinct, and report incomplete history when durable storage fails. Completed queries wait for every received event to finish admission. The default relay batch now contains at most 20 OR filters for compatibility with common servers, while peer batches retain independent matching and cancellation.&lt;/p>
&lt;p>&lt;a href="https://github.com/mmalmi/hashtree/releases/tag/hashtree-ts-runtime-v0.5.13">Hashtree&amp;rsquo;s runtime updates&lt;/a> replace worker-specific networking with that shared runtime, persistent event indexes, and an outgoing queue, allowing events and cached files to share one FIPS node. &lt;a href="https://github.com/mmalmi/fips-ts/releases/tag/runtime-v0.0.45">FIPS TypeScript 0.0.44–0.0.45&lt;/a> selects routes with enough capacity for complete signaling records, recovers dropped session setup within the handshake deadline, and retries WebRTC answers only after explicit routing rejection. Larger framed WebSocket routes require compatible native peers; the 0.0.44 notes require deploying native FIPS 0.4.85 first.&lt;/p>
&lt;p>&lt;a href="https://github.com/mmalmi/iris-kit/releases/tag/runtime-v0.2.5">Iris Kit 0.2.5&lt;/a> adds a persistent plain-event application client and transport-neutral &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> signing while preserving account keys and offline reads. &lt;a href="https://github.com/mmalmi/iris-kit/releases/tag/runtime-v0.2.6">Version 0.2.6&lt;/a> returns an already verified complete event ID from the worker or native backend immediately; prefix and replaceable-event queries still wait for history before choosing the latest value. These are library releases, and the notes do not establish deployment to every Iris application.&lt;/p>
&lt;p>&lt;a href="https://github.com/irislib/meet/commit/9bebb074895fd34574c3a92056612cf3891de74b">Iris Meet&amp;rsquo;s September 30 source update&lt;/a> replaces its NDK integration with persistent publish/subscribe infrastructure and shared identity signers. The patch adds coverage for offline identity restoration, NIP-07 signing and meeting-room isolation. The existing &lt;a href="https://github.com/irislib/meet">meeting app&lt;/a> uses Nostr for encrypted signaling and WebRTC for audio and video. This is default-branch implementation progress; the repository has no tagged release proving that this specific update has reached the live site.&lt;/p>
&lt;h3 id="chama-propagates-listing-cancellation-and-background-alerts">Chama propagates listing cancellation and background alerts&lt;/h3>
&lt;p>&lt;a href="https://github.com/jesuspirate/chama">Chama&lt;/a> uses signed events for community trading and private conversations. &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v6.4.16">Versions 6.4.14–6.4.16&lt;/a> publish a signed cancellation before deleting a listing locally, so other clients can retire the same cached offer. Recipient wake tags now accompany events independently of the sender&amp;rsquo;s notification setting, and the alert server deduplicates by signed event so a chat immediately after a join can still trigger a wake. Background jobs replay affected trades from saved cursors, isolate failed chains, and decrypt notification text locally; the release requires redeploying the companion watcher.&lt;/p>
&lt;p>&lt;a href="https://github.com/jesuspirate/chama/releases/tag/v6.4.16">The grouped releases&lt;/a> also apply participant renewals at their signed event times, quarantine funding locks made after a seat expired, and expose recovery for the saved bearer note. Claim publication waits for confirmed import or payment. Listing filters preserve the viewer&amp;rsquo;s currency across community scopes, and trade headers use the finalized joined amount. These changes align what two Nostr-connected clients infer from the same event history.&lt;/p>
&lt;h3 id="earthly-0112-adds-reusable-map-configurations">Earthly 0.1.12 adds reusable map configurations&lt;/h3>
&lt;p>&lt;a href="https://github.com/zeSchlausKwab/earthly">Earthly&lt;/a> is a &lt;a href="https://github.com/zeSchlausKwab/earthly/blob/v0.1.12/README.md">Nostr collaborative map editor&lt;/a> with signed publication and encrypted sharing. &lt;a href="https://github.com/zeSchlausKwab/earthly/releases/tag/v0.1.12">Version 0.1.12&lt;/a> adds reusable GMapper configurations for public Google My Maps, developer-created Maplet discovery, private configuration storage or public publication, and attributed geometry copying. The same release adds encrypted connection sharing, entity drops, and mobile chat navigation. Google export availability and browser CORS limit importing, executable downloaded Maplets remain unavailable in Tauri, and physical Android upgrade checks remain pending.&lt;/p>
&lt;p>The &lt;a href="https://github.com/zeSchlausKwab/earthly/pull/29">configuration work&lt;/a> migrated existing publication addresses and preferences and added review or withdrawal of configuration updates. Its initial Android workflow failed before compilation; a &lt;a href="https://github.com/zeSchlausKwab/earthly/pull/30">tooling fix&lt;/a> prepared the subsequently tagged release.&lt;/p>
&lt;h3 id="mostro-0190-retires-its-first-generation-transport">Mostro 0.19.0 retires its first-generation transport&lt;/h3>
&lt;p>&lt;a href="https://github.com/MostroP2P/mostro">Mostro&lt;/a> coordinates peer-to-peer trades over Nostr. &lt;a href="https://github.com/MostroP2P/mostro/releases/tag/v0.19.0">Version 0.19.0&lt;/a> now ships the &lt;a href="https://github.com/MostroP2P/mostro/pull/1004">removal of its first-generation gift-wrap transport&lt;/a>, so clients must use the newer protocol. The existing order-creation and dispute-opening timestamp tags are &lt;a href="https://github.com/MostroP2P/mostro/pull/1000">renamed &lt;code>published_at&lt;/code>&lt;/a> without changing their stored values; the enclosing event&amp;rsquo;s &lt;code>created_at&lt;/code> remains its signing time. Restore responses return the counterparty&amp;rsquo;s trade key, accepted create/take operations recognize trade keys, and relay publication completes on the first positive relay acknowledgement. The same release updates bond deadlines and cancellation, closes disputes when a trade resolves, notifies the solver, and bounds relayed price staleness.&lt;/p>
&lt;p>Mostro&amp;rsquo;s &lt;a href="https://github.com/MostroP2P/mostro/pull/1006">trade-key admission fix&lt;/a> recognizes a key as soon as an introducing order or dispute is committed. Nodes with stricter first-contact proof of work previously could drop a legitimate follow-up message until the periodic known-key refresh; default-equal thresholds were unaffected. A &lt;a href="https://github.com/MostroP2P/mostro/pull/923">dispute transaction&lt;/a> commits the order transition and dispute row atomically, closing inconsistent-state failures. &lt;a href="https://github.com/MostroP2P/mostro/pull/945">Closure notifications&lt;/a> send the assigned solver a best-effort private message when the users resolve a dispute, with the existing replaceable event remaining the offline fallback.&lt;/p>
&lt;h3 id="scrutiny-lens-brings-security-research-onto-nostr">SCRUTINY Lens brings security research onto Nostr&lt;/h3>
&lt;p>&lt;a href="https://github.com/crocs-muni/scrutiny-lens/releases/tag/v0.1.0">SCRUTINY Lens v0.1.0&lt;/a>, its first public release on September 29, is a browser client for security metadata published through Nostr. Analysts can search by CVE, package or certificate identifiers, inspect event histories and retractions, and explore relationships in a subject graph. The browser verifies event signatures and identifiers. Optional AI search and explanations use an endpoint chosen by the user; the app checks quoted citations against the underlying events. The &lt;a href="https://github.com/crocs-muni/scrutiny-lens/releases/tag/v0.1.0">release notes&lt;/a> describe relay limitations explicitly and identify local build dependencies that still require sibling repositories.&lt;/p>
&lt;h3 id="mangatsu-and-noteds-reach-android">Mangatsu and Noteds reach Android&lt;/h3>
&lt;p>&lt;a href="https://github.com/imattau/Mangatsu/releases/tag/v0.1.11">Mangatsu v0.1.11&lt;/a> is part of the comic reader and publisher&amp;rsquo;s first Android release series this week. Its &lt;a href="https://github.com/imattau/Mangatsu/commit/543d6d3dde3bffe293b7336d0fb6f4c82532fe13">source&lt;/a> adds Amber login through &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a>, the Android interface for asking an external signer to approve Nostr operations. Comics and chapters are Nostr events, while their pages live on Blossom servers; the reader also supports an encrypted saved library and offline reading. Subsequent commits address signer invocation and relay-list refreshes.&lt;/p>
&lt;p>&lt;a href="https://github.com/imattau/noteds/releases/tag/v0.1.2">Noteds v0.1.2&lt;/a> brings a Nostr classifieds marketplace to Android through Tauri. Its &lt;a href="https://github.com/imattau/noteds/commit/c9294999134196e9d98c011440c7ca0ed5fcc398">Android signer integration&lt;/a> uses Android NIP-55 signing. The app publishes listings and messages over Nostr and builds a local search graph with categories, geographic areas and optional browser embeddings. The latest source fixes native location access for nearby search. Both projects are early releases; their GitHub release pages have no detailed notes, so these capabilities come from the tagged READMEs and implementation commits.&lt;/p>
&lt;h3 id="statim-combines-nostr-dms-with-other-networks">Statim combines Nostr DMs with other networks&lt;/h3>
&lt;p>&lt;a href="https://github.com/alaibe/statim/releases/tag/v0.4.0">Statim v0.4.0&lt;/a> follows its initial September 23 release. The &lt;a href="https://github.com/alaibe/statim/blob/v0.4.0/README.md">tagged source&lt;/a> describes a messenger with NIP-17 Nostr DMs alongside XMTP, Status, Telegram and Matrix. Accounts start from a locally held recovery phrase; each conversation identifies its protocol because those networks provide different privacy properties. Android currently lacks its Telegram integration. These are the project&amp;rsquo;s documented capabilities, not independently tested guarantees or confirmation of app-store availability.&lt;/p>
&lt;h2 id="in-development">In Development&lt;/h2>
&lt;h3 id="amethyst-repairs-encrypted-group-interoperability">Amethyst repairs encrypted-group interoperability&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> is an Android Nostr client with Marmot encrypted-group support. White Noise is another Marmot messenger; an &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4245">interoperability batch tested with its clients&lt;/a> addresses group administration, deletion wording, and other behavior exposed when the two clients share a conversation. More pointed fixes send &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4233">reactions and deletions inside the Marmot group&lt;/a> instead of as separate &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> gift-wrapped private messages and &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4240">apply edits from another client after restart&lt;/a>. Those are source merges; the testing described in the PRs is narrower than a published cross-client release.&lt;/p>
&lt;p>A separate &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4201">Cordn group runtime and interface merge&lt;/a> adds another encrypted-group path through coordinator servers. Cordn is distinct from Marmot, so the two changes should not be read as one transport migration.&lt;/p>
&lt;p>Amethyst also merged &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4231">HTTP relay commands in its Geode relay and Quartz client&lt;/a> under its &lt;a href="https://nostrcompass.org/en/topics/nip-fe/">NIP-FE&lt;/a> proposal, and a &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4174">backup-conflict review interface&lt;/a> for replaceable profile and list events. NIP-FE is project proposal terminology; the backup flow lets a person compare versions before accepting a replacement and prevents silent overwrites of local state.&lt;/p>
&lt;p>Amethyst also develops Concord, a separate encrypted-community protocol used by Armada and Accordion. A &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4262">conformance batch&lt;/a> adds fragmented community lists, pin proofs, key rotation and dissolution records, followed by &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4264">disappearing messages and direct invitations&lt;/a>. An invitation stays in a private inbox until accepted; receiving it does not contact the community&amp;rsquo;s relays. The same change corrects an author comparison that could let another author&amp;rsquo;s deletion remove a message. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4265">Cross-client fixes&lt;/a> repair unsigned rumor serialization, missing invitation fields, relay-confirmed community creation and joining without restarting; their reported emulator tests involved live Armada and Accordion peers.&lt;/p>
&lt;p>A later &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4277">private-channel implementation&lt;/a> rotates channel keys after relevant access revocations and adds create, privatize, publicize and rekey controls. It also adds rank-checked cooperative kicks and expires message attachments with their parent messages. WebXDC updates can enter a separate channel buffer, but Amethyst still has no WebXDC application host. That later batch reports wire-format and unit tests, with no device or live-relay exercise, so the earlier interoperability result does not certify every newly added control.&lt;/p>
&lt;p>Quartz&amp;rsquo;s MLS engine now &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4271">preserves skipped message-generation secrets across restart&lt;/a>, enabling out-of-order messages to remain decryptable after restoring saved state. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4272">Four retained former epochs&lt;/a> let callers authenticate late application messages, retain their authenticated data and prevent a consumed generation opening again. A &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4275">secret-tree update&lt;/a> loads unexpanded node secrets from ts-mls-style state; &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4270">sender-specific stale-generation errors&lt;/a> distinguish a client&amp;rsquo;s own ratchet collision from another member&amp;rsquo;s replay. The PR explicitly says Marmot&amp;rsquo;s existing retained-epoch fallback remains separate, so this is an engine capability, not proof that every Amethyst message path uses it.&lt;/p>
&lt;p>A &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4267">Quartz tag-reader audit&lt;/a> fixes private geohash entries that could be published in clear text and a parser that treated the private key from an &lt;code>nsec&lt;/code> as a public key. It also repairs repost addresses, channel-hide targets, live-room root tags and addressable mint events. The obsolete &lt;code>ForkTag&lt;/code> reader is removed, creating a source API change for Quartz consumers; preexisting SQLite mint rows still need a separate migration. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4282">Additional event models&lt;/a> cover Buzz&amp;rsquo;s project-container, artifact-revision and team proposals, while &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4266">video-view and encrypted push-control models&lt;/a> follow Divine&amp;rsquo;s schemas; these additions establish parsing and construction support, not complete client interfaces or adopted numbered NIPs.&lt;/p>
&lt;p>The client also &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4284">renders Ultra HDR photographs&lt;/a> in the feed and fullscreen viewer on Android 14 or newer. Android 15 and newer cap the feed&amp;rsquo;s brightness boost at twice the ordinary range, while fullscreen can use the display&amp;rsquo;s full range; the reported test devices ran newer Android APIs, leaving Android 14 and 15 untested. A &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4278">shared UI and upload-port merge&lt;/a> brings 140 screens onto common Android/desktop code and moves Android media work off the UI thread. Its audit also restores metadata-removal error reporting, making the refactor more than a file move.&lt;/p>
&lt;h3 id="divine-adds-encrypted-video-to-direct-messages">Divine adds encrypted video to direct messages&lt;/h3>
&lt;p>&lt;a href="https://github.com/divinevideo/divine-mobile">Divine&lt;/a> is a Nostr video client. &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> carries private messages in encrypted gift wraps that hide their sender from relays. Divine&amp;rsquo;s &lt;a href="https://github.com/divinevideo/divine-mobile/pull/9486">merged video-message work&lt;/a> encrypts an attached video on the device, uploads ciphertext, and sends the decryption key inside that private message. A recipient can verify and decrypt the file for playback or save it. A separate &lt;a href="https://github.com/divinevideo/divine-mobile/pull/9446">history-restore fix&lt;/a> keeps an ambiguous relay refusal from prematurely ending recovery when other relays can still answer.&lt;/p>
&lt;p>Divine&amp;rsquo;s &lt;a href="https://github.com/divinevideo/divine-mobile/pull/9603">retired-moderation-key fix&lt;/a> refuses retired keys in moderation-label resolution and selects the current report recipient when a report is filed. Pending reports addressed to a retired key are redirected to the build&amp;rsquo;s pinned key, and unresolved conversations remain unwritable. The change also distinguishes retired-key custody when deciding which historical threads a minor may read; custody updates still require an application release. &lt;a href="https://github.com/divinevideo/divine-mobile/pull/9677">Deleted-comment cache handling&lt;/a> prevents a successfully deleted recent comment from reappearing when a thread reloads.&lt;/p>
&lt;p>For creators, a &lt;a href="https://github.com/divinevideo/divine-mobile/pull/9598">live color-mask recording mode&lt;/a> previews the replacement backdrop before a take is recorded, and &lt;a href="https://github.com/divinevideo/divine-mobile/pull/9701">white-wall masking&lt;/a> adds brightness-sensitive masking through the video plugin. &lt;a href="https://github.com/divinevideo/divine-mobile/pull/9652">Word-by-word captions&lt;/a> preserve recognized word timings and use approximate timing when the server supplies whole cues only. &lt;a href="https://github.com/divinevideo/divine-mobile/pull/9698">Stop-motion continuation&lt;/a> appends new stills at the existing composition&amp;rsquo;s pace, while &lt;a href="https://github.com/divinevideo/divine-mobile/pull/9645">returning detached clips&lt;/a>, &lt;a href="https://github.com/divinevideo/divine-mobile/pull/9654">grouped font selection&lt;/a> and &lt;a href="https://github.com/divinevideo/divine-mobile/pull/9601">speed presets&lt;/a> add editing controls without changing the Nostr event format.&lt;/p>
&lt;p>&lt;a href="https://github.com/divinevideo/divine-mobile/pull/9694">Square-export alignment&lt;/a> and its &lt;a href="https://github.com/divinevideo/divine-mobile/pull/9703">smaller-clip follow-up&lt;/a> keep text and stickers in place across mixed-resolution clips. &lt;a href="https://github.com/divinevideo/divine-mobile/pull/9664">Third-party HLS playback&lt;/a> avoids an Android heap crash by seeking back at loop boundaries instead of prebuffering repeated imported playlists; those loops can pause briefly at each restart. An &lt;a href="https://github.com/divinevideo/divine-mobile/pull/9680">account-preference reload&lt;/a> keeps account-bound filters at their defaults across a switch while fixing part of a debug sign-in assertion. A separate moderation-label refresh issue remains open, so the PR does not claim every sign-in error is fixed.&lt;/p>
&lt;h3 id="buzz-extends-its-relays-channel-and-identity-controls">Buzz extends its relay&amp;rsquo;s channel and identity controls&lt;/h3>
&lt;p>&lt;a href="https://github.com/block/buzz">Buzz&lt;/a> is a Nostr-based workspace with its own relay and clients. Its &lt;a href="https://github.com/block/buzz/pull/7919">merged channel-artifact implementation&lt;/a> gives an editable record one channel home and a revision chain; conflicting edits cannot both become the head. The project&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-ar/">NIP-AR&lt;/a> label refers to its own proposal and implementation, not an established Nostr standard.&lt;/p>
&lt;p>For protected HTTP ingress, another &lt;a href="https://github.com/block/buzz/pull/7264">merged change&lt;/a> pairs a federated-identity assertion with the same key proven by &lt;a href="https://nostrcompass.org/en/topics/nip-98/">NIP-98&lt;/a> authorization. NIP-98 defines signed HTTP authentication events; Buzz&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-fi/">NIP-FI&lt;/a> assertion is a project specification. It also merged &lt;a href="https://github.com/block/buzz/pull/7849">HPKE encryption for secret-key backup envelopes&lt;/a>. That PR establishes source-level security work; distribution to every client remains unverified.&lt;/p>
&lt;p>&lt;a href="https://github.com/block/buzz/releases/tag/desktop-v0.5.26">Buzz desktop 0.5.26&lt;/a> includes the channel-artifact work, native HPKE secret-key backup encryption, and a desktop relay administration console. Its shared changes repair unlisted project-channel requests, synchronize sidebar sections, sorting, stars, and mutes across devices, bound long-thread reads, and tighten Blossom identity assertions. The &lt;a href="https://github.com/block/buzz/releases/tag/desktop-v0.5.26">repository-wide notes&lt;/a> separately list relay identity pairing, companion mention delivery, configurable push URLs, atomic administrative deletion, and mobile contextual names. A desktop release establishes the desktop/shared distribution; it does not prove those mobile changes shipped in a mobile build.&lt;/p>
&lt;p>Buzz&amp;rsquo;s &lt;a href="https://github.com/block/buzz/pull/7224">WebSocket NIP-FI enforcement&lt;/a> checks a federated-identity assertion before accepting frames, then requires its Nostr key to match the key authenticated through &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a>, which proves a client&amp;rsquo;s identity to a relay. A session expires at the earliest of the token expiry, maximum assertion age and configured connection lifetime; after expiry it admits no new effect. This project-specific NIP-FI mode is off by default. Already admitted audio commits and subscription setup can still wait on a stalled dependency, so the change does not establish a universal bounded disconnect time.&lt;/p>
&lt;p>&lt;a href="https://github.com/block/buzz/pull/7830">Owner-deletion preparation&lt;/a> moves operator-attested requests through an inventory-bound automatic approval into the existing deletion executor. A &lt;a href="https://github.com/block/buzz/pull/7969">relay follow-up&lt;/a> makes retrying the same request return its current state and reserves the owner&amp;rsquo;s active quota until deletion completes; permanently retained host tombstones count toward a 20-community lifetime cap. These are source-level administrative changes, and the follow-up instructs operators to keep deletion disabled until its relay and drain executor are live. Separately, a &lt;a href="https://github.com/block/buzz/pull/6515">partition-catalog audit&lt;/a> detects catch-all partitions and uncovered months before creating new event and delivery-log partitions, exposing serving-safety and audit freshness to operators.&lt;/p>
&lt;p>Buzz mobile now disambiguates people and agents that share a display name. Its &lt;a href="https://github.com/block/buzz/pull/7894">identity-name resolver&lt;/a> qualifies agents by their owner and adds a short key suffix only when necessary; &lt;a href="https://github.com/block/buzz/pull/7895">conversation integration&lt;/a> uses those names for authors, mentions and membership notices. &lt;a href="https://github.com/block/buzz/pull/7896">Lists, search and Pulse&lt;/a> complete the same behavior outside a conversation. The visible qualification changes the local label while a selected mention keeps the identity&amp;rsquo;s original wire name.&lt;/p>
&lt;h3 id="conduit-advances-checkout-after-relay-acceptance">Conduit advances checkout after relay acceptance&lt;/h3>
&lt;p>&lt;a href="https://github.com/Conduit-BTC/conduit-mono">Conduit&lt;/a> is a Nostr marketplace that sends private order messages to merchants. &lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/483">Progressive relay publishing&lt;/a> distinguishes the first positive relay acknowledgement from completion of all relay attempts, and a &lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/488">checkout follow-up&lt;/a> persists that first acknowledgement before proceeding. A relay&amp;rsquo;s acceptance means the signed order reached a relay; it does not prove a merchant read or fulfilled it.&lt;/p>
&lt;p>Conduit also merged &lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/529">recoverable remote-signer sessions&lt;/a> and &lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/533">transactional signer-relay negotiation&lt;/a>. &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> lets an application request signatures from a key held by a separate signer; these changes keep a user&amp;rsquo;s account workspace while its transport is being repaired, then verify the exact account before resuming. The PRs establish source behavior, not a shipped checkout build.&lt;/p>
&lt;p>Conduit&amp;rsquo;s &lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/575">ranked product-search merge&lt;/a> sends one ordinary &lt;a href="https://nostrcompass.org/en/topics/nip-50/">NIP-50&lt;/a> full-text-search query for kind 30402 products and preserves the relay&amp;rsquo;s relevance order through signature checks, revision reconciliation and local eligibility filtering. Cards can appear before exact-product background reads finish, while newer signed deletions remain authoritative. Refresh and Retry stay within search and exact-product reads instead of starting broad catalog discovery. A 100-result cap followed by local filtering can miss eligible matches, so a partial empty response offers recovery and does not prove there are no products.&lt;/p>
&lt;h3 id="elisym-builds-a-nostr-commerce-checkout">Elisym builds a Nostr commerce checkout&lt;/h3>
&lt;p>&lt;a href="https://github.com/elisymlabs/elisym">Elisym&lt;/a> is developing a commerce toolkit that signs products and carries private order and receipt messages over Nostr. Its &lt;a href="https://github.com/elisymlabs/elisym/pull/120">merged commerce package&lt;/a> defines offer verification and gift-wrapped order events; a &lt;a href="https://github.com/elisymlabs/elisym/pull/131">checkout interface&lt;/a> handles offer review, wallet payment, and delivery status, while a &lt;a href="https://github.com/elisymlabs/elisym/pull/133">self-hosted merchant node&lt;/a> packages the store side. The project calls kind &lt;code>30490&lt;/code> provisional and describes an October minimum slice. These source merges establish an emerging integration; an accepted Nostr commerce standard or complete public launch has not been demonstrated.&lt;/p>
&lt;p>Elisym&amp;rsquo;s &lt;a href="https://github.com/elisymlabs/elisym/pull/136">agent checkout tools&lt;/a> add &lt;code>buy_product&lt;/code> and &lt;code>get_order&lt;/code> for its Nostr-advertised products. The first call returns a quote without ordering, and a second call accepts the single-use quote and warnings for the same agent and network; order state is kept durably in the agent&amp;rsquo;s local file backend. &lt;a href="https://github.com/elisymlabs/elisym/pull/137">Tempo checkout support&lt;/a> adds a browser-wallet payment path with merchant verification and delivery. A sent transaction hash keeps the attempt live until its outcome is established, avoiding an unpaid result while a broadcast could still settle.&lt;/p>
&lt;p>A &lt;a href="https://github.com/elisymlabs/elisym/pull/139">later checkout fix&lt;/a> lets the signed-product checkout initialize when a browser wallet announces itself immediately during discovery. The source change moves session declaration before that callback can run; the merge alone does not verify a hosted deployment.&lt;/p>
&lt;h3 id="nostter-improves-signer-checks-and-event-retrieval">nostter improves signer checks and event retrieval&lt;/h3>
&lt;p>&lt;a href="https://github.com/SnowCait/nostter">nostter&lt;/a> is a Nostr social client. Its &lt;a href="https://github.com/SnowCait/nostter/pull/2573">merged signer-capability change&lt;/a> asks whether a usable signer is present before offering follow and reaction actions. &lt;a href="https://github.com/SnowCait/nostter/pull/2611">New pin tags&lt;/a> carry the author&amp;rsquo;s key and a known relay hint without guessing one, and &lt;a href="https://github.com/SnowCait/nostter/pull/2608">replaceable-event cache ordering&lt;/a> follows &lt;a href="https://nostrcompass.org/en/topics/nip-01/">NIP-01&lt;/a>&amp;rsquo;s timestamp and event-ID tie-break. NIP-01 defines the core Nostr event rules, including how clients choose between replaceable events.&lt;/p>
&lt;h3 id="pensieve-prepares-isolated-archive-reconciliation">Pensieve prepares isolated archive reconciliation&lt;/h3>
&lt;p>&lt;a href="https://github.com/andotherstuff/pensieve">Pensieve&lt;/a> is a Nostr archive and recovery tool. Its &lt;a href="https://github.com/andotherstuff/pensieve/pull/60">merged isolated negentropy runtime&lt;/a> gives synchronization a bounded worker and durable completion behavior. The feature is opt-in and the PR explicitly says no production service or configuration was activated; this is groundwork for a safer recovery path, not evidence of a running deployment.&lt;/p>
&lt;h3 id="contextvm-avoids-duplicate-calls-across-relays">ContextVM avoids duplicate calls across relays&lt;/h3>
&lt;p>&lt;a href="https://github.com/ContextVM/sdk">ContextVM&amp;rsquo;s TypeScript SDK&lt;/a> carries tool and resource requests as Nostr events. Its &lt;a href="https://github.com/ContextVM/sdk/pull/103">merged inbound deduplication fix&lt;/a> recognizes one plaintext request by event ID even when multiple relays or a reconnect deliver it again, matching the existing wrapped-message path. The PR reports one non-idempotent tool running three times for a single call before the fix. A companion &lt;a href="https://github.com/ContextVM/sdk/pull/101">resource-notification change&lt;/a> sends updates only to subscribed clients; initialized sessions without a subscription no longer receive them.&lt;/p>
&lt;h3 id="cyberspace-revises-the-deck-0003-object-rules">Cyberspace revises the DECK-0003 object rules&lt;/h3>
&lt;p>&lt;a href="https://github.com/arkin0x/cyberspace">Cyberspace&lt;/a> develops the DECK-0003 format for structured Nostr objects and encrypted region bags, which Amethyst began implementing in last week&amp;rsquo;s issue. New &lt;a href="https://github.com/arkin0x/cyberspace/pull/36">parts and hidden-object rules&lt;/a> and &lt;a href="https://github.com/arkin0x/cyberspace/pull/38">bag references&lt;/a> let a bag refer to a separately published object instead of embedding every part. A later &lt;a href="https://github.com/arkin0x/cyberspace/pull/40">correction&lt;/a> says that an event-ID reference cannot reliably pin an old version of an addressable event, because a relay may discard it after replacement. Readers should use the corrected coordinate reference rule; the earlier merge&amp;rsquo;s wording has been superseded.&lt;/p>
&lt;h3 id="wisp-fixes-replies-to-nostr-comments">Wisp fixes replies to Nostr comments&lt;/h3>
&lt;p>&lt;a href="https://github.com/barrydeen/wisp">Wisp&lt;/a> is a Nostr client with relay-routing and wallet features. After last week&amp;rsquo;s released &lt;a href="https://nostrcompass.org/en/topics/nip-22/">NIP-22&lt;/a> comment support, a &lt;a href="https://github.com/barrydeen/wisp/pull/667">merged follow-up&lt;/a> makes a reply to a NIP-22 comment a comment event too, with the proper parent and root references; the previous path always published an ordinary note. NIP-22 lets comments attach to many Nostr content types. The fix merged after Wisp&amp;rsquo;s 1.2.5 tag, whose notes only bump the version, so this is source-level progress whose release is still unverified.&lt;/p>
&lt;h3 id="cordn-sends-coordinator-locations-to-a-second-device">Cordn sends coordinator locations to a second device&lt;/h3>
&lt;p>&lt;a href="https://github.com/Cordn-msg/cordn">Cordn&lt;/a> coordinates encrypted group messaging over Nostr. Its &lt;a href="https://github.com/Cordn-msg/cordn/pull/9">merged multi-device specification change&lt;/a> carries a group&amp;rsquo;s coordinator relay hints in the replicated group document. A newly seeded device can then find a coordinator that is absent from default relays, instead of appearing to join a group whose backlog and live messages it cannot fetch. This is protocol-document work following last week&amp;rsquo;s Cordn offline-queue release, not a new client release.&lt;/p>
&lt;h3 id="nostr-atlas-opens-a-directory-for-checkable-identities">Nostr Atlas opens a directory for checkable identities&lt;/h3>
&lt;p>&lt;a href="https://nostr-atlas.web.app">Nostr Atlas&lt;/a> is a new directory that presents Nostr profiles alongside claims to external accounts. Its &lt;a href="https://github.com/saiy2k/nostr-components/pull/148">merged site publication&lt;/a> separates the directory from the project&amp;rsquo;s component demo, and the site responds publicly. A &lt;a href="https://github.com/saiy2k/nostr-components/pull/144">claim-flow merge&lt;/a> lets an X account owner publish a signed &lt;a href="https://nostrcompass.org/en/topics/nip-39/">NIP-39&lt;/a> proof with a browser signer, while &lt;a href="https://github.com/saiy2k/nostr-components/pull/146">profile enrichment&lt;/a> reads kind-0 Nostr metadata only after the proof verifies. NIP-39 defines the proof pattern for associating a Nostr key with another online identity; a relay acknowledgement alone does not mark a claim verified.&lt;/p>
&lt;h3 id="nostr-java-adds-media-hosting-tools-and-preserves-tag-positions">nostr-java adds media hosting tools and preserves tag positions&lt;/h3>
&lt;p>&lt;a href="https://github.com/tcheeric/nostr-java">nostr-java&lt;/a> is a Java library and MCP tool set for Nostr applications. Its &lt;a href="https://github.com/tcheeric/nostr-java/pull/557">merged Blossom tools&lt;/a> let a caller upload, find, list, and delete hash-addressed media and manage the user&amp;rsquo;s server list. A separate &lt;a href="https://github.com/tcheeric/nostr-java/pull/558">publishing fix&lt;/a> keeps empty tag values in place: Nostr tags are positional, so dropping an empty relay hint could shift a marker into the wrong field and make the published event differ from the approved preview.&lt;/p>
&lt;h3 id="zap-cooking-changes-how-account-history-can-be-recovered">Zap Cooking changes how account history can be recovered&lt;/h3>
&lt;p>&lt;a href="https://github.com/zapcooking/frontend">Zap Cooking&lt;/a> is a recipe-sharing Nostr client. Its &lt;a href="https://github.com/zapcooking/frontend/pull/753">merged Lazarus recovery work&lt;/a> replaces a backup built on &lt;a href="https://nostrcompass.org/en/topics/nip-78/">NIP-78&lt;/a> application-specific data events with an approach that scans relay-retained versions of replaceable events to detect overwritten follows, mutes, or profiles. Lazarus remains a draft protocol; recovery depends on relays that retained the older versions, and a merged web-client PR is not a guarantee that every lost event can be recovered.&lt;/p>
&lt;p>The client also merged &lt;a href="https://github.com/zapcooking/frontend/pull/743">optional NIP-13 proof-of-work controls&lt;/a> for notes and replies and an &lt;a href="https://github.com/zapcooking/frontend/pull/752">attachment model&lt;/a> that keeps media order and &lt;a href="https://nostrcompass.org/en/topics/nip-92/">NIP-92&lt;/a> descriptions consistent between preview and publication. &lt;a href="https://nostrcompass.org/en/topics/nip-13/">NIP-13&lt;/a> lets a sender spend local computation on an event before posting; NIP-92 carries media metadata as event tags.&lt;/p>
&lt;p>Zap Cooking&amp;rsquo;s &lt;a href="https://github.com/zapcooking/frontend/pull/763">NIP-05 claim fix&lt;/a> requires &lt;a href="https://nostrcompass.org/en/topics/nip-98/">NIP-98&lt;/a> authorization over the exact request body and rejects a signer different from the public key claiming the name. Previously, that public endpoint accepted unauthenticated claims that could replace another member&amp;rsquo;s name. Membership tier now comes from the existing membership record, and remote-signer users receive a signing prompt when claiming. The separate trusted server-side registration path remains unchanged.&lt;/p>
&lt;p>A &lt;a href="https://github.com/zapcooking/frontend/pull/764">mute-list repair&lt;/a> stops profile mute actions from replacing the whole kind 10000 list with public-key tags alone. The previous path erased word, hashtag and thread entries plus encrypted content, and one surface could republish decrypted private mute keys publicly. The new path reads the relay copy, preserves unrelated tags and ciphertext, and refuses to publish when that read is unavailable. Removing a private mute requires decryption and re-encryption through the signer.&lt;/p>
&lt;h3 id="opal-brings-remote-signing-to-omarchy">Opal brings remote signing to Omarchy&lt;/h3>
&lt;p>&lt;a href="https://github.com/derekross/opal">Opal&lt;/a> is a desktop Nostr signer built for the Omarchy Linux environment. Its &lt;a href="https://github.com/derekross/opal/releases/tag/v0.3.3">September 28 version 0.3.3&lt;/a> follows the first public series with &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote-signing support, a local keyring, and a permission interface for requests from connected apps. NIP-46 keeps the account key with the signer while a separate client asks it to approve operations. This is an early release of a platform-specific signer, not a claim of wider desktop support.&lt;/p>
&lt;h3 id="watchtower-opens-a-nip-86-relay-control-panel">WatchTower opens a NIP-86 relay control panel&lt;/h3>
&lt;p>&lt;a href="https://github.com/iqbqioza/watchtower">WatchTower&lt;/a> is a newly published panel for relay administration through NIP-86, the protocol for authenticated relay management requests. A &lt;a href="https://watchtower.nostrfy.org">public instance&lt;/a> responds, giving operators a place to inspect the interface. The repository was created September 22; a reachable site does not establish that its authorization flows have been independently audited or that it works with every relay implementation.&lt;/p>
&lt;h3 id="hubstr-blossom-opens-a-personal-media-origin">Hubstr Blossom opens a personal media origin&lt;/h3>
&lt;p>The newly published &lt;a href="https://github.com/johninnis/hubstr-blossom">Hubstr Blossom server&lt;/a> lets a Nostr client upload images, video, and files to a self-hosted Blossom endpoint, then put those URLs in events. Its README documents local content-hash storage, a SQLite index, signed kind-24242 authorization for changes, and a range of Blossom operations for upload, mirroring, listings, and deletion. Public reads let other clients render posted media without receiving upload rights.&lt;/p>
&lt;p>The &lt;a href="https://github.com/johninnis/hubstr-blossom">server&amp;rsquo;s documented options&lt;/a> also extract file metadata for &lt;a href="https://nostrcompass.org/en/topics/nip-94/">NIP-94&lt;/a> events, which describe shared media. The server can re-encode images without EXIF metadata and guards mirror requests against private-network targets by default. This is a newly published implementation with deployment instructions, not evidence of a broad production rollout.&lt;/p>
&lt;p>&lt;a href="https://github.com/johninnis/hubstr-relay">Hubstr Relay&lt;/a> published its initial source on September 24. It combines a personal SQLite event cache with a public relay: unauthenticated readers see permitted public events, while NIP-42 authenticated tenants can read their cache. NIP-17 gift wraps remain unavailable to guest readers. Its &lt;a href="https://github.com/johninnis/hubstr-relay/commit/0ae1a551ac50da0b7097105b76591dbc4d6cc023">September 25 update&lt;/a> corrects records returned by NIP-86 pubkey-list methods.&lt;/p>
&lt;h3 id="meshstr-experiments-with-a-permissionless-relay-mesh">Meshstr experiments with a permissionless relay mesh&lt;/h3>
&lt;p>&lt;a href="https://gitlab.pocketlabs.dev/meshstr/meshstr">Meshstr&lt;/a> is an alpha design for Nostr relays to negotiate peer budgets and exchange signed usage receipts. Its first implementation includes &lt;a href="https://gitlab.pocketlabs.dev/meshstr/meshstr/-/commit/6d609fc99f">a write-policy bridge for strfry, a Nostr relay&lt;/a>, added September 27, with a socket fix the next day. The repository describes DIDComm negotiation and &lt;a href="https://nostrcompass.org/en/topics/nip-77/">NIP-77&lt;/a> reconciliation, which lets peers compare event sets without exchanging their full inventories, alongside verifiable reports of peers exceeding agreed budgets.&lt;/p>
&lt;p>Those &lt;a href="https://gitlab.pocketlabs.dev/meshstr/meshstr">project rules&lt;/a> are a proposal, not an adopted NIP or a demonstrated public relay network. The concrete progress this week is the published code path connecting a relay&amp;rsquo;s write policy to the proposed mesh accounting.&lt;/p>
&lt;h3 id="dossier-shows-what-a-public-nostr-history-can-reveal">Dossier shows what a public Nostr history can reveal&lt;/h3>
&lt;p>&lt;a href="https://github.com/satanrayshe/dossier">Dossier&lt;/a> is a new browser-side self-audit tool for a person&amp;rsquo;s Nostr and Lightning footprint, with a &lt;a href="https://satanrayshe.github.io/dossier/">public demo&lt;/a>. It gathers visible profile links, zap trails, posting times, metadata from old &lt;a href="https://nostrcompass.org/en/topics/nip-04/">NIP-04&lt;/a> encrypted direct messages, and media metadata such as photo EXIF; it can also show where a relay still serves an event someone tried to delete. &lt;a href="https://nostrcompass.org/en/topics/nip-07/">NIP-07&lt;/a> signer support lets a user authorize cleanup actions without pasting a private key into the page.&lt;/p>
&lt;p>The project&amp;rsquo;s &lt;a href="https://github.com/satanrayshe/dossier">documented limits&lt;/a> matter: a scan sees only the relays it reaches, and a delete request cannot erase copies held elsewhere. The repository appeared September 27 and has no tagged release; the demo and source establish an early tool, not a complete inventory of anyone&amp;rsquo;s past activity.&lt;/p>
&lt;h3 id="marmot-mdk-extends-polls-custom-emoji-and-account-metadata">Marmot MDK extends polls, custom emoji, and account metadata&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/mdk">Marmot MDK&lt;/a> supplies the runtime and bindings for encrypted Nostr group messaging. Later MDK source merges expose &lt;a href="https://github.com/marmot-protocol/mdk/pull/2094">paginated per-voter poll selections&lt;/a> using the same effective-response rules as aggregate tallies. &lt;a href="https://github.com/marmot-protocol/mdk/pull/1929">Optional application-owned group components&lt;/a> give hosts admin-controlled settings that survive message retention and reach newcomers in their Welcome. &lt;a href="https://github.com/marmot-protocol/mdk/pull/2105">Tagged sends and media reactions&lt;/a> carry custom-emoji metadata through the runtime and bindings, retain decryption material for attached reaction images after an epoch change, and reject forged attachment tags. That change expands the C upload-request structure, so C consumers must rebuild against the header.&lt;/p>
&lt;p>A &lt;a href="https://github.com/marmot-protocol/mdk/pull/2093">convergence correction&lt;/a> keeps messages pending when no canonical branch was selected instead of invalidating them without trying the live state. An accompanying &lt;a href="https://github.com/marmot-protocol/mdk/pull/2095">unreachable-path cleanup&lt;/a> routes unresolved staged commits into retained retry behavior. &lt;a href="https://github.com/marmot-protocol/mdk/pull/2097">Encrypted-media reads&lt;/a> align the HTTP read timeout with resumable-body idle handling, addressing stalled large transfers without claiming the pending incoming-APK device acceptance test passed. &lt;a href="https://github.com/marmot-protocol/mdk/pull/2098">Startup-stage markers&lt;/a> show which account-opening step timed out, adding diagnostic evidence without claiming the underlying startup stall is solved.&lt;/p>
&lt;p>The local agent connector also &lt;a href="https://github.com/marmot-protocol/mdk/pull/1969">merges existing profile metadata&lt;/a> when publishing a kind 0 update, preserving fields the request omitted. &lt;a href="https://github.com/marmot-protocol/mdk/pull/2096">Group-profile updates&lt;/a> expose changes to a group&amp;rsquo;s name and description through the existing current-admin-authorized path. Its socket authentication still grants the whole local API; this merge does not add per-principal capability grants. These source changes follow the tagged 0.11.0 release.&lt;/p>
&lt;h3 id="rust-nostr-correlates-relay-count-replies">rust-nostr correlates relay count replies&lt;/h3>
&lt;p>&lt;a href="https://github.com/rust-nostr/nostr">rust-nostr&lt;/a>, a Rust library and SDK for Nostr applications, merged &lt;a href="https://github.com/nostrdevkit/nostr/pull/1478">correlated COUNT responses and clearer waiter errors&lt;/a>. The SDK subscribes before sending COUNT and accepts only the matching reply, preventing a lost or closed receiver from appearing as a legitimate zero. It also preserves receiver errors for publication acknowledgements and relay authentication, so callers can distinguish a missing confirmation from an explicit rejection. Public method signatures stay unchanged.&lt;/p>
&lt;h3 id="zaptracker-adds-nostr-network-and-quote-metrics">ZapTracker adds Nostr network and quote metrics&lt;/h3>
&lt;p>&lt;a href="https://github.com/pratik227/zap_dashboard">ZapTracker&lt;/a> is a creator dashboard for Nostr engagement and wallet activity. A &lt;a href="https://github.com/pratik227/zap_dashboard/pull/133">network-dashboard merge&lt;/a> replaces Lightning network statistics with online Nostr relay data from nostr.watch and capability information from NIP-11 documents. A &lt;a href="https://github.com/pratik227/zap_dashboard/pull/135">quote-metrics change&lt;/a> counts kind 1 events carrying &lt;code>q&lt;/code> tags alongside likes, reposts, bookmarks and zaps. This lets creators see quotes in content rankings and engagement charts; it remains merged source evidence.&lt;/p>
&lt;h3 id="lawallet-nwc-routes-card-top-ups-to-the-card-wallet">LaWallet NWC routes card top-ups to the card wallet&lt;/h3>
&lt;p>&lt;a href="https://github.com/lawalletio/lawallet-nwc">LaWallet NWC&lt;/a> connects Lightning wallets to applications over Nostr Wallet Connect. Its &lt;a href="https://github.com/lawalletio/lawallet-nwc/pull/316">BoltCard top-up merge&lt;/a> advertises a LUD-19 pay link that creates an invoice through the card wallet&amp;rsquo;s NWC &lt;code>make_invoice&lt;/code> method. Blocked, disabled or unpaired cards do not advertise a pay link, and the path does not redirect top-ups to the owner&amp;rsquo;s separate Lightning address. A &lt;a href="https://github.com/lawalletio/lawallet-nwc/pull/319">follow-up&lt;/a> exposes the same link in the emulator and carries recipient-accepted payer notes on LNURL sends.&lt;/p>
&lt;h3 id="a-new-khatru-relay-exposes-owner-moderation-controls">A new khatru relay exposes owner moderation controls&lt;/h3>
&lt;p>&lt;a href="https://github.com/rzazo24/nostr-relay-khatru">nostr-relay-khatru&lt;/a> published its initial source on September 29 as a general relay derived from the discontinued HiveScope-specific implementation. The &lt;a href="https://relay.hivescope.xyz">public instance&lt;/a> serves a NIP-11 document naming this repository and advertising authentication, event expiry, protected events, counting, reconciliation and relay administration. A &lt;a href="https://github.com/rzazo24/nostr-relay-khatru/commit/a6ef7cff9c4f833a6a2f72957d45935c736a0c51">September 30 implementation&lt;/a> adds moderation controls to its owner panel. The public metadata verifies a deployed endpoint, not successful testing of every advertised method.&lt;/p>
&lt;h3 id="a-local-web-of-trust-builder-tracks-unfollows">A local web-of-trust builder tracks unfollows&lt;/h3>
&lt;p>&lt;a href="https://github.com/etemiz/wot/commit/212fe268dd781c73adad51329be235abc8fd37db">etemiz/wot&lt;/a> published a Nostr web-of-trust crawler on September 30. It reads follow lists and NIP-65 relay lists, computes trust from configurable roots, and writes scores to LMDB for relay policies, feeds and spam filters. The &lt;a href="https://github.com/etemiz/wot">project documentation&lt;/a> explains the trade-off: live updates increase trust, while scheduled full crawls apply decreases and unfollows. Scores depend on the chosen roots. This is newly published source, with no tagged release or claim of production deployment.&lt;/p>
&lt;h3 id="moyu-opens-a-marmot-workspace-client">Moyu opens a Marmot workspace client&lt;/h3>
&lt;p>&lt;a href="https://github.com/tsgx1990/moyu">Moyu&lt;/a> has published the source for a Rust workspace chat client built on &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a>, with command-line, terminal, and desktop interfaces. Its &lt;a href="https://github.com/tsgx1990/moyu/blob/88a20d247510d1cc46ca955564aa395d26ae8e89/CHANGELOG.md">September 30 changes&lt;/a> use locally recorded membership changes to stop old join requests readmitting removed members, make invitation codes expire after seven days, and let administrators revoke them. Terminal output filters control characters and text-direction overrides supplied by other members. A pinned MDK fork routes Blossom attachment transfers through the configured SOCKS5 proxy, with hostname resolution performed by that proxy. The 0.3.0 changes are in the public source; no public release tag or release entry is available yet.&lt;/p>
&lt;h2 id="protocol-and-spec-work">Protocol and Spec Work&lt;/h2>
&lt;h3 id="nip-39-extends-identity-proofs-to-bluesky-and-discord">NIP-39 extends identity proofs to Bluesky and Discord&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-39/">NIP-39&lt;/a> lets a Nostr account point to proof that it controls an identity on another platform. A &lt;a href="https://github.com/nostr-protocol/nips/pull/2486">change merged September 27&lt;/a> gives new proofs one recommended sentence and tells verifiers to accept older proofs that contain the account&amp;rsquo;s npub, even when their wording differs. It also documents Bluesky posts and Discord messages as proof locations. A Discord claim can only be checked by someone who can read the server where its message was posted.&lt;/p>
&lt;h3 id="nip-86-adds-invite-code-management-for-relay-administrators">NIP-86 adds invite-code management for relay administrators&lt;/h3>
&lt;p>Compass described in the July 8 issue the &lt;a href="https://github.com/nostr-protocol/nips/pull/2408">NIP-86 invitation proposal&lt;/a> while it was open; it has now merged. &lt;a href="https://nostrcompass.org/en/topics/nip-86/">NIP-86&lt;/a> defines a standard relay-management API, and &lt;a href="https://nostrcompass.org/en/topics/nip-43/">NIP-43&lt;/a> defines how restricted relays announce membership and process admission requests. The September 24 merge adds &lt;code>listclaims&lt;/code>, &lt;code>createclaim&lt;/code>, and &lt;code>deleteclaim&lt;/code> so an administrator can list, issue, and revoke invite codes accepted by a relay. That gives operators a management path for invitations that may grant a member a role after they join; it does not require every relay to support the methods.&lt;/p>
&lt;p>A correction to last week&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#nip-86-adds-clear-and-list-methods-for-relay-management">NIP-86 coverage&lt;/a>: the &lt;a href="https://github.com/nostr-protocol/nips/blob/5b9920982ae1f4061328c1b09a90360da28d13c8/86.md">merged specification&lt;/a> added &lt;code>unallowevent&lt;/code>, &lt;code>unbanevent&lt;/code>, &lt;code>listallowedevents&lt;/code>, and &lt;code>listdisallowedkinds&lt;/code>. The earlier item listed names from an outdated proposal description. The first two methods reverse an event-level allow or ban decision; the others inspect allowed events and disallowed kinds.&lt;/p>
&lt;h3 id="nip-51-moves-favorite-follow-sets-to-an-unused-event-kind">NIP-51 moves favorite follow sets to an unused event kind&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-51/">NIP-51&lt;/a> defines public and private lists, including a list of a user&amp;rsquo;s favorite follow sets. Compass described the &lt;a href="https://github.com/nostr-protocol/nips/pull/2417">kind-collision proposal&lt;/a> in the July 22 issue; it has now merged. The September 27 correction assigns that favorites list kind &lt;code>10021&lt;/code> because the earlier number was already in use. Its &lt;code>a&lt;/code> tags still point to kind &lt;code>30000&lt;/code> follow sets. The change resolves a number collision in the specification; it does not create a new way to follow people.&lt;/p>
&lt;h3 id="nip-51-proposes-hidden-replies-for-each-thread">NIP-51 proposes hidden replies for each thread&lt;/h3>
&lt;p>An &lt;a href="https://github.com/nostr-protocol/nips/pull/2489">open NIP-51 proposal&lt;/a> would let a thread&amp;rsquo;s author publish a public hidden-replies set that cooperating clients display behind a toggle. It uses one addressable kind-30027 event per thread, with the root ID as its &lt;code>d&lt;/code> tag and &lt;code>e&lt;/code> tags naming replies; only a set signed by the root&amp;rsquo;s author applies. Listing the root asks clients to hide other authors&amp;rsquo; replies and stop offering a reply composer, while replies can still be published on relays. The per-thread format limits editing collisions to the same conversation. The author reports an implementation in Nostrich, but public-source inspection did not establish it; the proposal remains unmerged, with its set format still under discussion.&lt;/p>
&lt;h3 id="nip-db-proposes-verified-domain-names-for-key-addressed-services">NIP-DB proposes verified domain names for key-addressed services&lt;/h3>
&lt;p>The &lt;a href="https://github.com/nostr-protocol/nips/pull/2487">open NIP-DB proposal&lt;/a>, submitted September 28, describes Nostr events that bind an ordinary Internet domain to the key serving it over a key-addressed network such as &lt;a href="https://nostrcompass.org/en/topics/fips/">FIPS&lt;/a>, an encrypted mesh that addresses nodes by Nostr public key. A domain owner can establish the binding with a DNS TXT record or a DNSSEC proof carried with the claim; clients would pin a verified result for later offline use. The proposal explicitly bars resolution through an unverified claim, since anyone can claim someone else&amp;rsquo;s domain in a Nostr event. &lt;a href="https://github.com/fr34aky/fips-pub-domains">fips-pub-domains&lt;/a> is the author&amp;rsquo;s reference implementation, but the event-kind numbers and some overlay-specific wording are still under review. Its reported end-to-end tests are the author&amp;rsquo;s evidence, not a claim that the proposal is an accepted NIP.&lt;/p>
&lt;h3 id="a-private-feed-draft-explores-encrypted-groups-of-recipients">A private-feed draft explores encrypted groups of recipients&lt;/h3>
&lt;p>A &lt;a href="https://github.com/nostr-protocol/nips/pull/2488">new multi-recipient envelope proposal&lt;/a>, opened September 29, sketches private notes, replies, and connections whose intended recipients can find an event without exposing their ordinary public keys in its visible tags. It proposes opaque pairwise alias tags derived from shared secrets and provisional event kinds, including a way to wrap another Nostr event for hundreds of readers. That could give small private feeds a more direct retrieval path than sending a separate message to every member.&lt;/p>
&lt;p>The &lt;a href="https://github.com/nostr-protocol/nips/pull/2488">proposal&amp;rsquo;s author&lt;/a> explicitly calls this a work in progress. The draft has no demonstrated implementation or security review, and its kind assignments and byte-level signing rules remain open.&lt;/p>
&lt;h3 id="a-blossom-proposal-lets-other-people-announce-mirrored-media">A Blossom proposal lets other people announce mirrored media&lt;/h3>
&lt;p>An &lt;a href="https://github.com/nostr-protocol/nips/pull/2478">open NIP proposal&lt;/a> describes a way for someone who mirrors another author&amp;rsquo;s Blossom blob to announce that copy through Nostr. A client could then look for the copy if the original server loses the blob. Discussion has also raised checking the mirror&amp;rsquo;s current BUD-03 server list when an announced server hint has gone stale. This is a proposed discovery path, not a guarantee that clients or archival relays already provide fallback storage.&lt;/p>
&lt;h3 id="road-event-reports-seek-a-shared-nostr-format">Road-event reports seek a shared Nostr format&lt;/h3>
&lt;p>The &lt;a href="https://github.com/nostr-protocol/nips/pull/2479">open Road Event Reports proposal&lt;/a> describes reports and confirmations for potholes, closures, cameras, and other road conditions. It uses location tags and &lt;a href="https://nostrcompass.org/en/topics/nip-40/">NIP-40&lt;/a>&amp;rsquo;s expiration timestamp, which tells relays when to stop serving an event, so a report need not remain current indefinitely. The author based revisions on a sample of events recovered from public relays and on the existing &lt;a href="https://github.com/jooray/roadstr">Roadstr clients&lt;/a> for reporting road conditions, but the draft still leaves a compact-encoding question open, and the proposed NIP number has not been adopted.&lt;/p>
&lt;h3 id="marmot-revisits-multi-device-coordination">Marmot revisits multi-device coordination&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/marmot/pull/427">Marmot&amp;rsquo;s multi-device redesign&lt;/a> replaces an unimplemented External Commit draft with a non-normative walkthrough for early feedback. The new direction explores an existing device approving a new one, bringing it into conversations and later removing devices, while keeping open questions visible. IDs reserved by the removed draft are freed because no implementation adopted them. The ideas document allocates no new IDs or wire formats and is not an implemented multi-device feature.&lt;/p>
&lt;h2 id="six-years-of-nostr-septembers">Six Years of Nostr Septembers&lt;/h2>
&lt;p>The last September issue is a chance to trace how Nostr moved from sketches to a larger set of interoperable tools. A &lt;a href="https://github.com/arcbtc/buber/commit/7a66d400f2">2021 ride-matching prototype&lt;/a> used signed events to coordinate a service; five years later, &lt;a href="https://github.com/nostr-protocol/nips/commit/0046368a7">identity proof wording&lt;/a> and &lt;a href="https://github.com/nostr-protocol/nips/commit/6631b3eb1">list-kind collisions&lt;/a> are the sort of details maintainers are resolving. In between, clients learned to present conversations, media and recovery in ways ordinary people can use. The dated sources below show stages in that progression. They do not establish that every experiment launched or that each old design remains recommended.&lt;/p>
&lt;h3 id="september-2021-early-experiments-with-useful-shapes">September 2021: early experiments with useful shapes&lt;/h3>
&lt;p>A &lt;a href="https://github.com/arcbtc/buber/commit/7a66d400f2">September 4 BUber commit&lt;/a> explored a taxi-matching concept using Nostr events. It showed how a signed, relay-carried request could coordinate people without assigning the whole service to one server. The source is a concept, and it does not establish a launched ride service.&lt;/p>
&lt;p>Later that month, &lt;a href="https://github.com/emeceve/loquaz/commit/d885d93d22">Loquaz&amp;rsquo;s September 23 source&lt;/a> offered a desktop chat prototype. That was another early attempt to make relay messages feel like an ordinary application. The source does not establish finished end-to-end encryption or a production messenger; the lasting thread is the search for a usable conversation interface on top of simple events. BUber tested ride matching, and Loquaz tested chat; both used signed events before common client patterns had settled. Those trials laid out two recurring problems for later clients: coordinating through relays and presenting events as a usable conversation.&lt;/p>
&lt;h3 id="september-2022-chat-and-delegated-actions-enter-the-specifications">September 2022: chat and delegated actions enter the specifications&lt;/h3>
&lt;p>The &lt;a href="https://github.com/nostr-protocol/nips/commit/3423a6dfb">September 10 NIP-28 change&lt;/a> described public chat channels with messages and metadata that clients could interpret together. &lt;a href="https://nostrcompass.org/en/topics/nip-28/">NIP-28&lt;/a> made a shared room an explicit protocol subject and gave clients a common channel convention.&lt;/p>
&lt;p>On September 23, &lt;a href="https://nostrcompass.org/en/topics/nip-26/">NIP-26&lt;/a>&amp;rsquo;s &lt;a href="https://github.com/nostr-protocol/nips/commit/b62aa418d">delegated-signing text&lt;/a> documented a way for one key to authorize another to sign limited events. It captured an important 2022 design question: how to use a Nostr identity without handing the primary key to every application. &lt;a href="https://github.com/nostr-protocol/nips/blob/master/26.md">NIP-26 is now marked unrecommended&lt;/a>, so this is a record of an experiment, not advice for new integrations. Its later status shows how the signing model has moved: a specification can preserve a useful problem statement even when the proposed answer is retired.&lt;/p>
&lt;h3 id="september-2023-clients-grow-up-around-relay-discovery-and-metadata">September 2023: clients grow up around relay discovery and metadata&lt;/h3>
&lt;p>Damus is a Nostr social client. Its &lt;a href="https://github.com/damus-io/damus/blob/master/CHANGELOG.md#16-18---2023-09-21">September 21 changelog&lt;/a> recorded work on its local Nostr database, search, and hashtag navigation. Those changes made a busy social feed easier to browse and recover on a phone; the dated changelog is evidence for that client release, not for every later Damus capability.&lt;/p>
&lt;p>The protocol details were moving too. A &lt;a href="https://github.com/nostr-protocol/nips/commit/44c21c9d8">September 26 change&lt;/a> to &lt;a href="https://nostrcompass.org/en/topics/nip-24/">NIP-24&lt;/a> clarified optional profile metadata fields, while &lt;a href="https://github.com/nostr-protocol/nips/commit/3b5d3ca67">NIP-65&amp;rsquo;s September 29 change&lt;/a> addressed relay URI normalization and deduplication. &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> tells clients how to publish the relays they use for reading and writing; consistent URI treatment helps those lists point to the same relay even when strings differ in harmless ways. That small convention moved client design toward reliable discovery: finding a person&amp;rsquo;s events depends on knowing where they are published.&lt;/p>
&lt;h3 id="september-2024-posts-acquire-richer-context">September 2024: posts acquire richer context&lt;/h3>
&lt;p>&lt;a href="https://github.com/damus-io/damus/blob/master/CHANGELOG.md#1101---2024-09-22">Damus&amp;rsquo;s September 22 release notes&lt;/a> described support for &lt;a href="https://nostrcompass.org/en/topics/nip-84/">NIP-84&lt;/a> highlights and comments. NIP-84 gives readers a way to quote and discuss a passage of long-form material. The client work shows how a protocol idea became something people could use while reading.&lt;/p>
&lt;p>Meanwhile, &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> received a &lt;a href="https://github.com/nostr-protocol/nips/commit/ea36ec9ed">September 20 change&lt;/a> refining issue subjects and labels for git collaboration over Nostr, and &lt;a href="https://nostrcompass.org/en/topics/nip-73/">NIP-73&lt;/a> received a &lt;a href="https://github.com/nostr-protocol/nips/commit/79786bb7b">change that day&lt;/a> refining external content identifiers. These are separate specification changes: one helps a repository&amp;rsquo;s issues retain structure, while the other lets an event refer to material outside Nostr. Both extend the meaning a client can preserve when content travels between communities, repositories and other media.&lt;/p>
&lt;h3 id="september-2025-access-controls-and-payment-context-become-more-precise">September 2025: access controls and payment context become more precise&lt;/h3>
&lt;p>A &lt;a href="https://github.com/nostr-protocol/nips/commit/4c5d5fff9">September 6 NIP-42 revision&lt;/a> addressed multi-user relay authentication. &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> lets a relay challenge a client to prove which Nostr key is making a request; the update mattered for services that serve more than one authenticated account through the same connection.&lt;/p>
&lt;p>A &lt;a href="https://github.com/nostr-protocol/nips/commit/400d975da">September 15 NIP-47 update&lt;/a> added optional payment metadata to Nostr Wallet Connect requests. &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> lets an app ask a wallet to perform actions over Nostr. More context can make a wallet interaction understandable, but the metadata may expose payer details, so clients and wallets still need to treat it as sensitive. The change illustrates how interoperability work now included what a recipient can learn, not just whether a request can be delivered.&lt;/p>
&lt;h3 id="september-2026-interoperability-details-meet-public-identity">September 2026: interoperability details meet public identity&lt;/h3>
&lt;p>This September, a &lt;a href="https://github.com/nostr-protocol/nips/commit/6631b3eb1">merged NIP-51 change&lt;/a> moved the follow-set event kind away from a collision. &lt;a href="https://nostrcompass.org/en/topics/nip-51/">NIP-51&lt;/a> defines lists that a person can maintain and share; unique event kinds let clients distinguish one list type from another. An earlier Compass issue discussed the proposal, while the September merge is the status change.&lt;/p>
&lt;p>A second &lt;a href="https://github.com/nostr-protocol/nips/commit/0046368a7">merged change to NIP-39&lt;/a> clarified proof text and added more ways to associate an external account with a Nostr identity. &lt;a href="https://nostrcompass.org/en/topics/nip-39/">NIP-39&lt;/a> is about checkable identity claims, not a central identity registry. Together, the two merges show current protocol work concentrating on the small details that determine whether independent clients interpret the same identity and list events correctly. They also show a shift from inventing new event categories toward reducing ambiguity in existing ones.&lt;/p>
&lt;p>Across these six Septembers, the pattern is a progression from proving that a &lt;a href="https://github.com/arcbtc/buber/commit/7a66d400f2">signed event can describe an application request&lt;/a> to asking how a &lt;a href="https://github.com/nostr-protocol/nips/commit/0046368a7">client verifies a claim about a person&lt;/a>. The old prototypes matter because they expose the questions that later specifications and clients had to answer: who signs, where an event is found, what it means, and how someone knows whether to trust it. That is also why a small, precise protocol correction can matter as much as a new interface.&lt;/p></content:encoded></item><item><title>Nostr Compass #41</title><link>https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/</link><pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/</guid><description>&lt;p>Welcome back to &lt;a href="https://nostrcompass.org">Nostr Compass&lt;/a>, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#fips2go-070-keeps-the-mesh-connected-through-bootstrap-failures">fips2go&lt;/a> adds fallback mesh links and opt-in Nostr peer discovery, &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#fips-initramfs-opens-encrypted-roots-over-fips-before-boot">fips-initramfs&amp;rsquo;s September 6 catch-up&lt;/a> explains remote opening of encrypted roots, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#mintradar-makes-cashu-mints-easier-to-compare">MintRadar&lt;/a> makes Cashu mints easier to compare. &lt;a href="https://github.com/0ceanSlim/grain/releases/tag/v0.8.0-rc4">Grain 0.8.0-rc4&lt;/a> turns relay health into an operator dashboard, while &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#marmot-protocol-0104-makes-local-sends-durable">Marmot Protocol&amp;rsquo;s MDK&lt;/a> makes local sends and attachment acquisition durable. &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#white-noise-android-2026921-improves-encrypted-chat-reliability-and-sharing">White Noise Android&lt;/a> improves private chat delivery, voice tools, and profile sharing. Project spotlights include &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#nappletsoy-publishes-small-sandboxed-nostr-programs">napplet.soy&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#relaykit-installs-a-self-hosted-nostr-stack">RelayKit&lt;/a>, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#threshold-sessions-turn-coding-transcripts-into-private-training-data">Threshold Sessions&lt;/a>. Merged work closes &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#0xchat-merges-fixes-for-signing-message-authentication-and-redirect-flaws">0xchat security gaps&lt;/a> and &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#nos2x-fox-closes-a-pin-exposure-path">nos2x-fox PIN exposure&lt;/a>, and adds &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#nostream-publishes-relay-health-events">nostream relay health events&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#zap-cooking-publishes-image-descriptions-and-blocks-secret-key-searches">Zap Cooking image descriptions&lt;/a>, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#conduit-uploads-product-images-through-blossom">Conduit Blossom uploads&lt;/a>. Protocol work covers petnames, relay administration, payment-address proofs, Blossom directories, encrypted group moderation, and Nostr Wallet Connect budgets. The deep dives explain &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#nip-30-custom-emoji">NIP-30 custom emoji&lt;/a> and &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#nip-71-video-events">NIP-71 video events&lt;/a>.&lt;/p></description><content:encoded>&lt;p>Welcome back to &lt;a href="https://nostrcompass.org">Nostr Compass&lt;/a>, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#fips2go-070-keeps-the-mesh-connected-through-bootstrap-failures">fips2go&lt;/a> adds fallback mesh links and opt-in Nostr peer discovery, &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#fips-initramfs-opens-encrypted-roots-over-fips-before-boot">fips-initramfs&amp;rsquo;s September 6 catch-up&lt;/a> explains remote opening of encrypted roots, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#mintradar-makes-cashu-mints-easier-to-compare">MintRadar&lt;/a> makes Cashu mints easier to compare. &lt;a href="https://github.com/0ceanSlim/grain/releases/tag/v0.8.0-rc4">Grain 0.8.0-rc4&lt;/a> turns relay health into an operator dashboard, while &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#marmot-protocol-0104-makes-local-sends-durable">Marmot Protocol&amp;rsquo;s MDK&lt;/a> makes local sends and attachment acquisition durable. &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#white-noise-android-2026921-improves-encrypted-chat-reliability-and-sharing">White Noise Android&lt;/a> improves private chat delivery, voice tools, and profile sharing. Project spotlights include &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#nappletsoy-publishes-small-sandboxed-nostr-programs">napplet.soy&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#relaykit-installs-a-self-hosted-nostr-stack">RelayKit&lt;/a>, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#threshold-sessions-turn-coding-transcripts-into-private-training-data">Threshold Sessions&lt;/a>. Merged work closes &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#0xchat-merges-fixes-for-signing-message-authentication-and-redirect-flaws">0xchat security gaps&lt;/a> and &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#nos2x-fox-closes-a-pin-exposure-path">nos2x-fox PIN exposure&lt;/a>, and adds &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#nostream-publishes-relay-health-events">nostream relay health events&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#zap-cooking-publishes-image-descriptions-and-blocks-secret-key-searches">Zap Cooking image descriptions&lt;/a>, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#conduit-uploads-product-images-through-blossom">Conduit Blossom uploads&lt;/a>. Protocol work covers petnames, relay administration, payment-address proofs, Blossom directories, encrypted group moderation, and Nostr Wallet Connect budgets. The deep dives explain &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#nip-30-custom-emoji">NIP-30 custom emoji&lt;/a> and &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-23-newsletter/#nip-71-video-events">NIP-71 video events&lt;/a>.&lt;/p>
&lt;h2 id="top-stories">Top Stories&lt;/h2>
&lt;h3 id="fips2go-070-keeps-the-mesh-connected-through-bootstrap-failures">fips2go 0.7.0 keeps the mesh connected through bootstrap failures&lt;/h3>
&lt;p>&lt;a href="https://github.com/fr34aky/fips2go">fips2go&lt;/a> is an Android client that lets selected applications reach peers and services over the FIPS encrypted mesh. &lt;a href="https://github.com/fr34aky/fips2go/releases/tag/v0.6.0">Version 0.6.0&lt;/a> added device-local mesh names such as &lt;code>home.fips&lt;/code>. The subsequent &lt;a href="https://github.com/fr34aky/fips2go/releases/tag/v0.6.1">0.6.1 release&lt;/a> fixes bootstrap address selection on IPv6-only carriers using DNS64/NAT64; its maintainer has not tested that fix on a real DNS64 network.&lt;/p>
&lt;p>The new &lt;a href="https://github.com/fr34aky/fips2go/releases/tag/v0.7.0">0.7.0 release&lt;/a> connects to three regional bootstrap peers by default instead of relying on one. It can also retry a configured peer at Nostr-advertised endpoints when its static address changes. Optional open discovery adds at most three recent Nostr-announced peers, but remains off by default: the maintainer reports that many public test-mesh announcements no longer answer. The ARM64 build was installed over the previous version and checked on a physical Pixel; the other device architectures have narrower verification.&lt;/p>
&lt;h3 id="fips-initramfs-opens-encrypted-roots-over-fips-before-boot">fips-initramfs opens encrypted roots over FIPS before boot&lt;/h3>
&lt;p>&lt;a href="https://github.com/jmcorgan/fips-initramfs">fips-initramfs&lt;/a> is a Linux initramfs package that starts a FIPS mesh node before normal boot so an operator can remotely open a LUKS-encrypted root through its npub-addressed node. The user-submitted &lt;a href="https://github.com/jmcorgan/fips-initramfs/releases/tag/v0.1.0">0.1.0 release&lt;/a>, published September 6, packages the mesh client, SSH access, and passphrase-entry scripts for systems that need unattended or remote encrypted-root startup.&lt;/p>
&lt;p>The &lt;a href="https://github.com/jmcorgan/fips-initramfs/releases/tag/v0.1.0">first release&lt;/a> documents the security tradeoffs instead of hiding them: the initramfs contains the node key, the passphrase crosses SSH over FIPS, and local console passphrase entry remains available. This catch-up item came from a prior user submission; its September 6 release falls outside the current collection window.&lt;/p>
&lt;h3 id="grain-080-rc4-turns-relay-health-into-an-operator-dashboard">Grain 0.8.0-rc4 turns relay health into an operator dashboard&lt;/h3>
&lt;p>&lt;a href="https://github.com/0ceanSlim/grain">Grain&lt;/a> is a self-hosted Nostr relay with an integrated reference client and administration interface. &lt;a href="https://github.com/0ceanSlim/grain/releases/tag/v0.8.0-rc4">Version 0.8.0-rc4&lt;/a> adds a live vitals panel for event volume, connections, uptime, storage, memory, and writer health, plus per-kind storage charts and reorganized access, policy, and retention controls.&lt;/p>
&lt;p>The &lt;a href="https://github.com/0ceanSlim/grain/releases/tag/v0.8.0-rc4">release candidate&lt;/a> also makes its client escalate missing-event lookups from the local relay to author outbox relays, embedded relay hints, and NIP-50 search. NIP-50 standardizes relay-side search filters, while NIP-01 defines the core event and subscription rules that include identifier and author prefix matching. Grain adds those prefix matches and configurable full-text kinds to its database, while the release-candidate label makes clear that operators should test the new dashboard and database behavior before treating it as a stable line.&lt;/p>
&lt;h3 id="marmot-protocol-0104-makes-local-sends-durable">Marmot Protocol 0.10.4 makes local sends durable&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/mdk">Marmot Protocol&amp;rsquo;s MDK&lt;/a> is an SDK for MLS-encrypted group messaging whose transport and discovery run over Nostr. &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.10.4">Version 0.10.4&lt;/a> persists local sends before network completion, lowers draft and pending-message latency, prevents repeated automatic attachment downloads, and exposes retention state in chat-list previews.&lt;/p>
&lt;p>The &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.10.4">same release&lt;/a> adds group creation to agent-control integrations and opt-in reaction consent for approval prompts. It also repairs a halted-wrapper edge case and bounds retry backoff during epoch backfill, continuing the post-0.10.0 reliability work without changing the requirement that generated bindings and native libraries move together.&lt;/p>
&lt;h3 id="mintradar-makes-cashu-mints-easier-to-compare">MintRadar makes Cashu mints easier to compare&lt;/h3>
&lt;p>&lt;a href="https://mintradar.org">MintRadar&lt;/a> is a privacy-focused Cashu dashboard that uses Nostr to discover mints and bind community reviews to signed identities. Its &lt;a href="https://github.com/hroomnik007/MintRadar">current source&lt;/a> adds persistent NIP-87 mint announcements, same-operator detection from NUT-06 pubkeys, shareable comparison URLs, and Nostr &lt;code>naddr&lt;/code> deep links.&lt;/p>
&lt;p>NIP-87 standardizes discovery and review events for Cashu mints, while NUT-06 defines the mint information document that exposes a mint&amp;rsquo;s public keys and supported capabilities. A &lt;a href="https://njump.to/nevent1qqs9hwth0rgsprqaml9xuuve2s47x08w2ltjujgwwr4zyqw0qjptecqpzamhxue69uhhyetvv9ujuurjd9kkzmpwdejhgtczyqt40x2js6hcc27delgn5vqwn3qtcjn8uas3rrzmxe2hxsrvdvmmcqcyqqqqqqgyqg6ap">signed user-submitted update&lt;/a> brought MintRadar back into the intake after it was missed in an earlier pass; the project has since accumulated substantial current-window work around those comparison and discovery paths.&lt;/p>
&lt;h3 id="nostr-wot-oracle-031-makes-trust-queries-restart-safe">Nostr WoT Oracle 0.3.1 makes trust queries restart-safe&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-wot/nostr-wot-oracle">Nostr WoT Oracle&lt;/a> is a server that ingests public follow and mute events and answers bounded web-of-trust path queries. &lt;a href="https://github.com/nostr-wot/nostr-wot-oracle/releases/tag/v0.3.1">Versions 0.3.0 and 0.3.1&lt;/a> add independently persisted public mute evidence, readiness and ingestion status, revision-bound caches, deterministic replaceable-event selection, and rollback behavior that prevents unpersisted graph changes from becoming queryable.&lt;/p>
&lt;p>The &lt;a href="https://github.com/nostr-wot/nostr-wot-oracle/releases/tag/v0.3.1">0.3.1 performance pass&lt;/a> restores graph edges directly into numeric adjacency lists, coalesces superseded follow and mute events before publication, and batches distance-cache misses. These changes matter to clients that need explainable follow distance or mute evidence without silently serving a relationship graph from an older revision.&lt;/p>
&lt;h3 id="nostr-wot-sdk-102-compresses-browser-graph-storage">Nostr WoT SDK 1.0.2 compresses browser graph storage&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-wot/nostr-wot-sdk">Nostr WoT SDK&lt;/a> is a JavaScript toolkit for crawling, storing, and querying Nostr follow graphs in applications. &lt;a href="https://github.com/nostr-wot/nostr-wot-sdk/releases/tag/nostr-wot-sdk%401.0.2">Version 1.0.2&lt;/a> adopts a graph engine that batches up to 100 authors per relay request, stores edges with compact delta encoding, reuses compatible traversals, and exposes batch distance queries.&lt;/p>
&lt;p>The &lt;a href="https://github.com/nostr-wot/nostr-wot-sdk/releases/tag/%40nostr-wot/graph%400.3.0">graph 0.3.0 storage migration&lt;/a> upgrades IndexedDB namespaces to schema 2 and cannot be reopened by older SDK versions. Applications that need rollback should use a separate namespace or clear the upgraded graph instead of assuming the earlier client can read it.&lt;/p>
&lt;h3 id="nappletsoy-publishes-small-sandboxed-nostr-programs">napplet.soy publishes small sandboxed Nostr programs&lt;/h3>
&lt;p>&lt;a href="https://napplet.soy">napplet.soy&lt;/a> is a web playground and creator toolkit for building, publishing, playing, inspecting, and remixing small sandboxed Nostr programs called napplets. NIP-34 defines signed Nostr events for Git repository discovery and collaboration. The &lt;a href="https://github.com/zeSchlausKwab/napplet-soy/releases/tag/soyli-v0.18.2">soyLI 0.18.2 release&lt;/a> follows the project&amp;rsquo;s September launch with signed listings, Blossom-hosted assets, Git and NIP-34 source references, and relay-discovered manifests.&lt;/p>
&lt;p>The &lt;a href="https://github.com/zeSchlausKwab/napplet-soy">project source&lt;/a> keeps network and storage access behind declared capabilities instead of giving each napplet unrestricted browser authority. Its project identity remains unresolved because the canonical site and repository do not bind a project or maintainer npub, so no identity claim is attached here.&lt;/p>
&lt;p>The &lt;a href="https://github.com/zeSchlausKwab/napplet-soy/releases/tag/soyli-v0.20.0">soyLI 0.20.0 CLI release&lt;/a> adds bounded NIP-78 helpers for sharing reusable public tracks, puzzles, drawings, and presets, plus structured data on high scores. Writes are scoped to a napplet and player identity with consent and revision checks; linked large assets use Blossom. Website and backend features require a separate deployment, so the CLI tag alone does not prove those public features are live on the site.&lt;/p>
&lt;h3 id="relaykit-installs-a-self-hosted-nostr-stack">RelayKit installs a self-hosted Nostr stack&lt;/h3>
&lt;p>&lt;a href="https://relayk.it">RelayKit&lt;/a> is a one-command installer for a self-hosted Nostr stack that can include relays, Blossom media, nsites, Git services, and notifications. RelayKit now packages a broader stack than the browser relay-discovery client covered in April; its &lt;a href="https://github.com/samthomson/relaykit">current source repository&lt;/a> documents the new operator-focused deployment surface.&lt;/p>
&lt;p>Its &lt;a href="https://relayk.it">installation site&lt;/a> presents the services as one coordinated stack instead of requiring operators to assemble each component independently. This coverage therefore treats RelayKit as a changed project direction, not as its first appearance.&lt;/p>
&lt;h3 id="threshold-sessions-turns-coding-transcripts-into-private-training-data">Threshold Sessions turns coding transcripts into private training data&lt;/h3>
&lt;p>&lt;a href="https://gitworkshop.dev/npub17m2ual3pdjvhd8yc6a3m8snzjsgnmtl26hwen48ne937qgyjyshs2zgvse/relay.ngit.dev/threshold">Threshold Sessions&lt;/a> is a command-line tool that converts AI coding sessions into normalized, redacted, and encrypted training-data epochs. Its repository supports Codex, Claude Code, Cursor, OpenCode, and pi transcripts, stores encrypted artifacts on Blossom, and publishes signed references through Nostr.&lt;/p>
&lt;p>Recent &lt;a href="https://relay.ngit.dev/npub17m2ual3pdjvhd8yc6a3m8snzjsgnmtl26hwen48ne937qgyjyshs2zgvse/threshold.git">Threshold Sessions source history&lt;/a> adds timestamp randomization, provenance, extractors, and a ledger for produced epochs. The design lets a contributor preserve auditability and later data use without publishing the readable session transcript to relays.&lt;/p>
&lt;h2 id="tagged-releases">Tagged Releases&lt;/h2>
&lt;h3 id="white-noise-android-2026921-improves-encrypted-chat-reliability-and-sharing">White Noise Android 2026.9.21 improves encrypted-chat reliability and sharing&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/whitenoise-android/releases/tag/android-v2026.9.21">White Noise Android&lt;/a> is a Nostr-based messenger for private Marmot-encrypted group conversations. Its September 21 release improves message delivery, voice dictation, text-to-speech, conversation navigation, account switching, and AMOLED appearance. It also adds shareable profile and invite QR cards and group actions from profiles.&lt;/p>
&lt;h3 id="nostr-mail-client-0160-adds-per-recipient-delivery-choices">Nostr Mail Client 0.16.0 adds per-recipient delivery choices&lt;/h3>
&lt;p>&lt;a href="https://github.com/nogringo/nostr-mail-client">Nostr Mail Client&lt;/a> is a web, desktop, and Android mail client that exchanges messages through Nostr relays while supporting conventional email delivery. &lt;a href="https://github.com/nogringo/nostr-mail-client/releases/tag/v0.16.0">Version 0.16.0&lt;/a> lets a sender choose SMTP or Nostr delivery for each recipient and strips location, capture time, and device metadata from photos and videos before upload.&lt;/p>
&lt;p>The &lt;a href="https://github.com/nogringo/nostr-mail-client/releases/tag/v0.16.0">release&lt;/a> also requires every account to establish a relay list, keeps at least one relay configured, and adds safer permanent deletion from trash. Those changes make routing and attachment privacy explicit at the point where a mixed email/Nostr message leaves the device.&lt;/p>
&lt;h3 id="amber-665-separates-backup-encryption-from-app-permissions">Amber 6.6.5 separates backup encryption from app permissions&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> is an Android signer that keeps Nostr private keys outside the applications requesting signatures or encryption. NIP-44 standardizes encrypted payloads between Nostr keys, while NIP-46 lets an application request signing and encryption from a remote signer over relays. &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.6.5">Version 6.6.5&lt;/a> encrypts application backups with a dedicated key derived from the account key, preventing an application with remembered NIP-44 decryption permission from reading backup payloads that contain local keys or per-app NIP-46 secrets.&lt;/p>
&lt;p>The &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.6.5">migration path&lt;/a> can still restore older identity-encrypted backups until the next publish replaces them, and the release fixes a restore prompt that disappeared after logout when backup publishing was disabled. Users receive both a tighter permission boundary and a recovery path for existing backups.&lt;/p>
&lt;h3 id="amethyst-1160-hardens-blossom-signing-and-adds-bolt12-offers">Amethyst 1.16.0 hardens Blossom signing and adds BOLT12 offers&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> is an Android Nostr client with media, wallet, and signer integrations. &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.16.0">Version 1.16.0&lt;/a> fixes fast Blossom read authorization so concurrent media requests share one in-flight signer operation and recheck the token cache before asking for another signature. The tagged release also restores standard padded Base64 for Blossom auth tokens.&lt;/p>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.16.0">Version 1.16.0&lt;/a> also supports BOLT12 offers in profile payments and the zap picker, with BOLT11 fallback when an offer is refused. Users gain an offer-based payment path while existing invoice-based payments remain available.&lt;/p>
&lt;h3 id="alby-extension-3150-hardens-website-initiated-requests">Alby Extension 3.15.0 hardens website-initiated requests&lt;/h3>
&lt;p>&lt;a href="https://github.com/getAlby/lightning-browser-extension">Alby Extension&lt;/a> is a browser wallet and Nostr signer that grants websites scoped Lightning and signing capabilities. &lt;a href="https://github.com/getAlby/lightning-browser-extension/releases/tag/v3.15.0">Version 3.15.0&lt;/a> blocks website-supplied LNURLs from local or private network addresses, requires cross-host LNURL-auth confirmation, and removes remembered approval for raw Schnorr-signing methods.&lt;/p>
&lt;p>The &lt;a href="https://github.com/getAlby/lightning-browser-extension/releases/tag/v3.15.0">security release&lt;/a> also debits allowance budgets before sending concurrent payments and removes the generic WebLN request method. Integrators must use dedicated WebLN methods, while users gain clearer boundaries around network targets, authentication hosts, and site spending limits.&lt;/p>
&lt;h3 id="lawallet-nwc-271-unifies-zap-receipts-across-wallets">LaWallet NWC 2.7.1 unifies zap receipts across wallets&lt;/h3>
&lt;p>&lt;a href="https://github.com/lawalletio/lawallet-nwc">LaWallet NWC&lt;/a> is an open-source Lightning wallet service that exposes accounts to applications through Nostr Wallet Connect. NIP-57 standardizes signed Lightning zap requests and settlement receipts for Nostr profiles and events. &lt;a href="https://github.com/lawalletio/lawallet-nwc/releases/tag/v2.7.0">Version 2.7.0&lt;/a> decouples that receipt publication from wallet-specific settlement paths so every supported NWC wallet can emit zap receipts, then &lt;a href="https://github.com/lawalletio/lawallet-nwc/releases/tag/v2.7.1">2.7.1&lt;/a> brings receive and activity screens onto the same receipt flow as sends.&lt;/p>
&lt;p>The &lt;a href="https://github.com/lawalletio/lawallet-nwc/releases/tag/v2.7.1">2.7.1 package&lt;/a> also aligns StartOS storage and backup layout between sideload and community packages. Operators upgrading the first 2.7.0 sideload need the corrected package before relying on the database volume transition.&lt;/p>
&lt;h3 id="noornote-160170-adds-calendars-and-booking">NoorNote 1.6.0–1.7.0 adds calendars and booking&lt;/h3>
&lt;p>&lt;a href="https://github.com/77elements/noornote">NoorNote&lt;/a> is a Nostr notes application with optional productivity modules and local reminders. &lt;a href="https://github.com/77elements/noornote/releases/tag/v1.6.0">Version 1.6.0&lt;/a> adds public and encrypted calendar events, month, week, and list views, Android reminders, and interactive timeline cards for shared events.&lt;/p>
&lt;p>&lt;a href="https://github.com/77elements/noornote/releases/tag/v1.6.1">Version 1.6.1&lt;/a> reorganizes addons into a per-account dashboard and fixes URLs containing &lt;code>naddr&lt;/code> or &lt;code>npub&lt;/code> identifiers being misread as cards or mentions. These fixes make addon controls easier to find and keep Nostr identifiers intact inside ordinary links.&lt;/p>
&lt;p>&lt;a href="https://github.com/77elements/noornote/releases/tag/v1.7.0">Version 1.7.0&lt;/a> lets an account share available appointment slots and receive bookings and cancellations by direct message. It also imports and exports calendar data as &lt;code>.ics&lt;/code>, preserves the web NWC wallet connection after IndexedDB eviction, and avoids false mentions in links containing npubs.&lt;/p>
&lt;h3 id="citrine-320-bounds-relay-aggregator-memory">Citrine 3.2.0 bounds relay-aggregator memory&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Citrine">Citrine&lt;/a> is an Android Nostr relay that gives other applications a local event store and relay interface. &lt;a href="https://github.com/greenart7c3/Citrine/releases/tag/v3.2.0">Version 3.2.0&lt;/a> streams matching events in batches, caps aggregator fan-out at 200 relays, and bounds caches to prevent large queries from exhausting memory.&lt;/p>
&lt;p>The &lt;a href="https://github.com/greenart7c3/Citrine/releases/tag/v3.2.0">release&lt;/a> also exposes out-of-memory failures in the in-app log and lets operators hide the event graph. A phone acting as both relay and aggregator now fails more visibly and holds a defined memory boundary.&lt;/p>
&lt;h3 id="wisp-124-routes-threads-through-inbox-relays">Wisp 1.2.4 routes threads through inbox relays&lt;/h3>
&lt;p>&lt;a href="https://github.com/barrydeen/wisp">Wisp&lt;/a> is a privacy-oriented Nostr client with built-in Cashu and Lightning wallet support. NIP-22 defines generic kind &lt;code>1111&lt;/code> comments that can reply to many kinds of Nostr content. &lt;a href="https://github.com/barrydeen/wisp/releases/tag/v1.2.4">Version 1.2.4&lt;/a> sends thread and notification reads only to inbox relays, treats those comments as replies, and lets users withdraw their full wallet balance on chain.&lt;/p>
&lt;p>&lt;a href="https://github.com/barrydeen/wisp/releases/tag/v1.2.4">Version 1.2.4&lt;/a> limits thread reads to inbox relays, reducing unnecessary relay exposure. Its NIP-22 handling keeps comments visible in threads, counts, and notifications.&lt;/p>
&lt;h3 id="nostr-wot-extension-083-adds-scoped-nwc-connections">nostr-wot-extension 0.8.3 adds scoped NWC connections&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-wot/nostr-wot-extension">nostr-wot-extension&lt;/a> is a browser signer and identity extension with wallet payments and local web-of-trust analysis. &lt;a href="https://github.com/nostr-wot/nostr-wot-extension/releases/tag/v0.8.0">Version 0.8.0&lt;/a> restores its experimental web-of-trust API as a menu-only opt-in with local, remote, and hybrid query modes, scalable graph synchronization, mute-aware scoring, and per-account storage controls.&lt;/p>
&lt;p>The &lt;a href="https://github.com/nostr-wot/nostr-wot-extension/releases/tag/v0.8.0">release&lt;/a> also requires confirmation before replacing a known follow list with zero or one contact, even when a saved permission or remote signer is present. That guard uses verified relay, signed-event, and synchronized graph history to make destructive follow-list changes harder to approve silently.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-wot/nostr-wot-extension/releases/tag/v0.8.3">Version 0.8.3&lt;/a> creates separate Nostr Wallet Connect connections for applications using its LNbits wallet. Each can have a name, daily spending limit, and expiry, with local secret storage, budget visibility, and revocation. The project&amp;rsquo;s live test covered connection creation, revocation, and a signed &lt;code>get_info&lt;/code> exchange, not a real payment; browser-store publication is separate from the source release.&lt;/p>
&lt;h3 id="pakstr-02200240-adds-android-signer-handoff">pakstr 0.22.0–0.24.0 adds Android signer handoff&lt;/h3>
&lt;p>&lt;a href="https://git.nostrdev.com/stuff/pakstr">pakstr&lt;/a> packages web applications with native Nostr capabilities. Last week&amp;rsquo;s issue covered its 0.21.x packaging sequence. The new &lt;a href="https://git.nostrdev.com/stuff/pakstr/releases/tag/v0.22.0">0.22.0 release&lt;/a> adds NIP-55 signing through the NIP-46 bunker, letting an Android application hand signing requests to an external signer. &lt;a href="https://git.nostrdev.com/stuff/pakstr/releases/tag/v0.23.0">Version 0.23.0&lt;/a> then persists the runtime API address across restarts.&lt;/p>
&lt;p>&lt;a href="https://git.nostrdev.com/stuff/pakstr/releases/tag/v0.24.0">Version 0.24.0&lt;/a> publishes the Zapstore icon; that cosmetic change is not the signer milestone. NostrAppShell entries point to the same package series, so they are covered here once.&lt;/p>
&lt;h3 id="nail-022-makes-mail-attachments-fail-soft">Nail 0.2.2 makes mail attachments fail soft&lt;/h3>
&lt;p>&lt;a href="https://github.com/formstr-hq/nail">Nail&lt;/a> is a bridge and application that carries Nostr messages into email workflows. &lt;a href="https://github.com/formstr-hq/nail/releases/tag/v0.2.2">Version 0.2.2&lt;/a> retries a message without attachments when a relay refuses the attachment payload, adds a size ceiling to prevent bridge restarts, and changes the default bridge relay.&lt;/p>
&lt;p>The &lt;a href="https://github.com/formstr-hq/nail/releases/tag/v0.2.2">application update&lt;/a> also restores link opening and opt-in image viewing. Delivery can now degrade to the message body instead of losing the entire email when its attachment path fails.&lt;/p>
&lt;h3 id="mostro-cli-0162-removes-its-legacy-chat-transport">Mostro CLI 0.16.2 removes its legacy chat transport&lt;/h3>
&lt;p>&lt;a href="https://github.com/MostroP2P/mostro-cli">Mostro CLI&lt;/a> is a terminal client for coordinating peer-to-peer Bitcoin trades through Mostro&amp;rsquo;s Nostr protocol. &lt;a href="https://github.com/MostroP2P/mostro-cli/releases/tag/v0.16.2">Version 0.16.2&lt;/a> removes the version-one gift-wrap dual-read and dual-write path, migrates peer chat to the current envelope, and lets a trader reach the solver through dispute chat.&lt;/p>
&lt;p>The &lt;a href="https://github.com/MostroP2P/mostro-cli/releases/tag/v0.16.2">release&lt;/a> also adds an operator command for cancelling pending orders. Deployments should update client and coordinator expectations together because the old chat transport is no longer a fallback.&lt;/p>
&lt;h3 id="dart-ndk-dev4dev5-adds-signed-app-updates-and-hardens-relay-delivery">Dart NDK dev.4–dev.5 adds signed app updates and hardens relay delivery&lt;/h3>
&lt;p>&lt;a href="https://github.com/relaystr/ndk">Dart NDK&lt;/a> is a Dart client library for relay connections, signing, caching, wallet operations, and Nostr application state. NIP-82 standardizes signed application-release metadata and downloadable artifacts. &lt;a href="https://github.com/relaystr/ndk/releases/tag/v0.10.0-dev.4">Version 0.10.0-dev.4&lt;/a> adds NIP-82 application-update support; &lt;a href="https://github.com/relaystr/ndk/releases/tag/v0.10.0-dev.5">dev.5&lt;/a> makes Cashu quote recovery resumable and lets a broadcast declare the identity to which it may be attributed.&lt;/p>
&lt;p>Across &lt;a href="https://github.com/relaystr/ndk/releases/tag/v0.10.0-dev.5">the dev.5 release&lt;/a>, the library avoids anonymous connections when a broadcast requires authentication and stops waking relays for deliveries parked on a missing identity. Applications adopting this prerelease should allow for migration work in their broadcast and wallet integrations.&lt;/p>
&lt;h3 id="bitblik-0110-brings-disputes-into-the-app">BitBlik 0.11.0 brings disputes into the app&lt;/h3>
&lt;p>&lt;a href="https://github.com/bit-blik/bitblik">BitBlik&lt;/a> is a mobile peer-to-peer Bitcoin trading client that coordinates orders and chat over Nostr. &lt;a href="https://github.com/bit-blik/bitblik/releases/tag/v0.11.0">Version 0.11.0&lt;/a> adds coordinator dispute chat, BOLT12 payouts where supported, Android self-updates sourced from NIP-82 release events, and wallet backup and recovery fixes.&lt;/p>
&lt;p>The &lt;a href="https://github.com/bit-blik/bitblik/releases/tag/v0.11.0">release&lt;/a> also handles refunds after dispute rulings and preserves wallet state during Neko recovery. Traders can now remain inside the client for the dispute conversation instead of switching to a separate coordinator channel.&lt;/p>
&lt;h3 id="scramble-072-changes-mls-engines-and-offers-two-android-views">Scramble 0.7.2 changes MLS engines and offers two Android views&lt;/h3>
&lt;p>&lt;a href="https://github.com/DavidGershony/Scramble">Scramble&lt;/a> is a Nostr-based encrypted group-chat application. Its &lt;a href="https://github.com/DavidGershony/Scramble/releases/tag/v0.7.0">0.7.0 release&lt;/a> replaces the former MLS engine with Dark Matter, restores encryption at rest for group state, and prevents Android cloud backup of the profile database. The migration has an important limit: groups created in 0.6.x do &lt;strong>not&lt;/strong> appear after upgrading, although the account key, contacts, relays, and signer pairing remain.&lt;/p>
&lt;p>&lt;a href="https://github.com/DavidGershony/Scramble/releases/tag/v0.7.2">Version 0.7.2&lt;/a> ships Avalonia and native Android view layers with the same app ID and release certificate, so one can install over the other without clearing the new-engine account and chats. They cannot be installed side by side. The native view still lacks some device-management settings; the project&amp;rsquo;s release notes say protocol interop is tested but do not claim a real-device group conversation test for the 0.7.0 migration.&lt;/p>
&lt;h3 id="morganite-005-makes-onion-blossom-media-seekable">Morganite 0.0.5 makes onion Blossom media seekable&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Morganite">Morganite&lt;/a> is an Android Blossom media cache for Nostr clients. &lt;a href="https://github.com/greenart7c3/Morganite/releases/tag/v0.0.5">Version 0.0.5&lt;/a> fetches blobs from Tor &lt;code>.onion&lt;/code> Blossom servers with Tor-aware retries and honors HTTP Range requests on a cache miss. A player can seek into an uncached video while Morganite fills the full cache in the background instead of storing only disjoint requested slices.&lt;/p>
&lt;h3 id="bitcredit-0516-recovers-stalled-nostr-bill-events">Bitcredit 0.5.16 recovers stalled Nostr bill events&lt;/h3>
&lt;p>&lt;a href="https://github.com/BitcreditProtocol/Bitcredit-Core">Bitcredit E-Bills&lt;/a> carries bill, company, and identity chains through Nostr events. &lt;a href="https://github.com/BitcreditProtocol/Bitcredit-Core/releases/tag/v0.5.16">Version 0.5.16&lt;/a> repairs event-signature serialization compatibility after its Nostr 0.45 dependency upgrade, exposes failed resend-queue entries for inspection and requeue, and resynchronizes missing chain metadata before retrying a block publication. Those changes target both upgraded-data compatibility and messages that would otherwise remain stuck.&lt;/p>
&lt;h3 id="fips-ts-0043-protects-concurrent-fips-sessions">fips-ts 0.0.43 protects concurrent FIPS sessions&lt;/h3>
&lt;p>&lt;a href="https://github.com/mmalmi/fips-ts">fips-ts&lt;/a> supplies the shared TypeScript FIPS mesh runtime used by compatible clients. Its &lt;a href="https://github.com/mmalmi/fips-ts/releases/tag/runtime-v0.0.43">runtime 0.0.43 release&lt;/a> preserves an authenticated identity when concurrent setup or an aliased WebRTC transport hands a session over, while rejecting a different identity. It also prevents canceled negotiations and late callbacks from replacing a working connection. This is library-level connection reliability, separate from fips2go&amp;rsquo;s client-side bootstrap and discovery changes.&lt;/p>
&lt;h3 id="bookshelf-0125-makes-signed-book-reviews-editable">Bookshelf 0.1.25 makes signed book reviews editable&lt;/h3>
&lt;p>&lt;a href="https://github.com/decent-newsroom/bookshelf-app">Bookshelf&lt;/a> is a Nostr-connected Android reader with community book ratings and private highlights. &lt;a href="https://github.com/decent-newsroom/bookshelf-app/releases/tag/v0.1.25">Version 0.1.25&lt;/a> lets readers revise their signed rating and written review through a durable outbox. The app displays cached ratings immediately, refreshes them online, and replaces older revisions by the newest event for the same book and author.&lt;/p>
&lt;p>The &lt;a href="https://github.com/decent-newsroom/bookshelf-app/compare/v0.1.24...v0.1.25">release diff&lt;/a> includes the review editor, revision cache, relay synchronization, and tests. It also normalizes pasted &lt;code>nostr:naddr&lt;/code> references before searching for a book&amp;rsquo;s publication coordinates.&lt;/p>
&lt;h3 id="cordn-050-queues-encrypted-messages-offline">Cordn 0.5.0 queues encrypted messages offline&lt;/h3>
&lt;p>&lt;a href="https://github.com/Cordn-msg/cordn-web">Cordn&lt;/a> is an encrypted Nostr group-chat client. &lt;a href="https://github.com/Cordn-msg/cordn-web/releases/tag/v0.5.0">Version 0.5.0&lt;/a> queues text sends in a durable offline outbox, makes failed entries terminal until a successful confirmation sweep, and resumes coordinator chats in order. It also checks a signer&amp;rsquo;s NIP-44 capability before offering an encrypted action, surfacing unsupported signers instead of failing silently.&lt;/p>
&lt;h3 id="21meetup-166-restores-multi-hop-trust-paths">21Meetup 1.6.6 restores multi-hop trust paths&lt;/h3>
&lt;p>&lt;a href="https://github.com/louisthecat86/Einundzwanzig-Meetup-App">21Meetup&lt;/a> issues Nostr-backed attendance badges for in-person events. &lt;a href="https://github.com/louisthecat86/Einundzwanzig-Meetup-App/releases/tag/v1.6.6">Version 1.6.6&lt;/a> restores second- and third-degree trust paths by fetching contacts&amp;rsquo; meetup records in bounded stages. Failed badge publications can be retried, and a send counts as successful only after a relay acknowledges it. Multi-day events now count as one attendance badge instead of one per day.&lt;/p>
&lt;h3 id="twenty-one-companion-1130-explains-public-nostr-rsvps">TWENTY ONE Companion 1.13.0 explains public Nostr RSVPs&lt;/h3>
&lt;p>&lt;a href="https://github.com/HolgerHatGarKeineNode/twenty-one-companion">TWENTY ONE Companion&lt;/a> combines Nostr rooms and articles with meetup listings. &lt;a href="https://github.com/HolgerHatGarKeineNode/twenty-one-companion/releases/tag/v1.13.0">Version 1.13.0&lt;/a> saves pinned rooms and articles to relays, showing a pin as local until a relay confirms it. Eligible meetup RSVPs are signed public Nostr events; the app warns that third-party relays may retain them even after a user declines. A contact-list preview now refuses to publish if the list changed after review.&lt;/p>
&lt;h3 id="armada-0610-adds-media-privacy-and-member-controls">Armada 0.61.0 adds media privacy and member controls&lt;/h3>
&lt;p>&lt;a href="https://github.com/soapbox-pub/armada">Armada&lt;/a> is a Nostr-based encrypted community client. &lt;a href="https://primal.net/e/122a06dbab02d207b3aa793b0fedd06fd59d36178a7b9ae5971cfc3b7f3eb6ce">Version 0.61.0&lt;/a> adds an opt-in image proxy list so a sender&amp;rsquo;s media host need not learn a reader&amp;rsquo;s address. Staff can kick, ban, or unban a member from a profile card, and a private-channel key granted with a role now applies without a separate invite. The proxy is off by default; operators choose and rotate their own servers.&lt;/p>
&lt;h3 id="ditto-2400-brings-top-8-rankings-to-nostr-profiles">Ditto 2.40.0 brings Top 8 rankings to Nostr profiles&lt;/h3>
&lt;p>&lt;a href="https://gitlab.com/soapbox-pub/ditto">Ditto&lt;/a> is a social client on Nostr. &lt;a href="https://gitlab.com/soapbox-pub/ditto/-/releases/v2.40.0">Version 2.40.0&lt;/a> lets a user rank eight favorite people on their profile. Reordering stays local until Save, then the ranked list appears on the profile and its update can appear as a card in followers&amp;rsquo; feeds. That turns a profile preference into a shared social-graph signal with an explicit publish step.&lt;/p>
&lt;h3 id="xm-arcade-113-binds-mini-app-approval-to-one-run">XM Arcade 1.1.3 binds mini-app approval to one run&lt;/h3>
&lt;p>&lt;a href="https://gitworkshop.dev/r/xm-arcade">XM Arcade&lt;/a> runs small games and mini-apps within a Nostr group context. &lt;a href="https://primal.net/e/dec0edda9ff464b4b7598032318cb48e17cf496e29d05031d1f1629409039a4c">Version 1.1.3&lt;/a> binds a post approval to an opaque run token, the request, app, account, group, and channel. Expired or replayed approvals no longer authorize another mini-app run. The update also persists trusted group-key epoch state across restart.&lt;/p>
&lt;h3 id="zzub-00150016-expands-mobile-project-boards">Zzub 0.0.15–0.0.16 expands mobile project boards&lt;/h3>
&lt;p>&lt;a href="https://primal.net/e/70c5efeea2e9314329b8951346d83ad0688b74607a108e8bc820caae545196c2">Zzub&lt;/a> is a Nostr-based project and code-review client. Its 0.0.15 release adds status columns, sorting and filtering, threaded comments, named assignees, and approve or request-changes actions to its phone boards. A built-in Git client opens source and files-changed diffs from a pull-request card, bringing the existing desktop review flow onto the phone.&lt;/p>
&lt;p>&lt;a href="https://primal.net/e/d9ad994bfadc1152b4c77a4fd3eb6be1746eca9d2626008d341bf31d06988872">Version 0.0.16&lt;/a> restores the full announced Projects list after the previous device-local scoping hid it. The release adds an @mention selector to card comments, shows mentions as chips, and gives the project screen Tasks and Reviews tabs spanning all its repositories while keeping per-repository boards available. It also adds repository and status filters and lifts the comment box above Android navigation.&lt;/p>
&lt;h3 id="table-mesh-010-brings-nostr-game-discovery-to-offline-board-games">Table Mesh 0.1.0 brings Nostr game discovery to offline board games&lt;/h3>
&lt;p>&lt;a href="https://primal.net/e/c5c5ad0eba413e18c10e3cd2be607e550ac818a8abaf97ccbf8fa242fbaff15f">Table Mesh 0.1.0&lt;/a> is a first Android release for playing board games across nearby phones over Bluetooth and local Wi-Fi. It includes &lt;em>Mensch ärgere Dich nicht&lt;/em> and solo bots. A Nostr kind-7529 catalog distributes additional sandboxed game modules through Blossom, with downloaded bytes checked against their announced hashes.&lt;/p>
&lt;p>The &lt;a href="https://zapstore.dev/apps/org.tablemesh.app">app listing&lt;/a> describes the Bluetooth mesh as tested in simulation and emulators, not yet at real multi-phone tables. The table session itself runs locally without an internet connection or account; Nostr does not carry its moves.&lt;/p>
&lt;h2 id="in-development">In Development&lt;/h2>
&lt;h3 id="0xchat-merges-fixes-for-signing-message-authentication-and-redirect-flaws">0xchat merges fixes for signing, message-authentication, and redirect flaws&lt;/h3>
&lt;p>&lt;a href="https://github.com/0xchat-app/0xchat-app-main/pull/92">0xchat&amp;rsquo;s merged security PR&lt;/a> addresses four audit findings in its Nostr and Cashu application code. It limits Cashu P2PK witness signing to keys actually authorized by a lock, rejects unsealed gift-wrap contents except MLS Welcome events, accepts infrastructure host-map configuration only from the trusted server key, and requires consent before an embedded web page can call NIP-07 signing or read relay settings.&lt;/p>
&lt;p>The &lt;a href="https://github.com/0xchat-app/0xchat-app-main/pull/92">PR&amp;rsquo;s test record&lt;/a> reports static analysis and runtime checks for the gift-wrap path. This is source-level progress, not a claim that an updated app has been released or independently tested on a device.&lt;/p>
&lt;h3 id="nos2x-fox-closes-a-pin-exposure-path">nos2x-fox closes a PIN exposure path&lt;/h3>
&lt;p>&lt;a href="https://github.com/diegogurpegui/nos2x-fox">nos2x-fox&lt;/a> is a Firefox extension that offers Nostr signing to websites. A &lt;a href="https://github.com/diegogurpegui/nos2x-fox/pull/69">merged access-control fix&lt;/a> stops a website from asking the extension background for the cached PIN that derives its private-key encryption key. The page bridge now forwards only allowed request types, and the background rejects privileged requests unless they originate from an extension page.&lt;/p>
&lt;p>A separate &lt;a href="https://github.com/diegogurpegui/nos2x-fox/pull/67">merged injection change&lt;/a> makes the NIP-07 &lt;code>window.nostr&lt;/code> interface appear at document start and removes a web-accessible script URL that exposed a stable extension identifier. It raises the Firefox minimum to version 128. Both fixes are merged source work; a new extension-store release has not been verified.&lt;/p>
&lt;h3 id="nostream-publishes-relay-health-events">nostream publishes relay health events&lt;/h3>
&lt;p>&lt;a href="https://github.com/cameri/nostream">nostream&lt;/a> is a Nostr relay implementation that also runs a relay monitor. Its &lt;a href="https://github.com/cameri/nostream/pull/741">merged NIP-66 work&lt;/a> publishes signed relay-discovery and monitor-announcement events after a probe, giving other clients a way to find the monitor&amp;rsquo;s measurements through Nostr. &lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a> defines relay-discovery and monitor events so relay status can be shared in a common format.&lt;/p>
&lt;p>The relay also &lt;a href="https://github.com/cameri/nostream/pull/779">merged an opt-in trust-distance rule for adaptive proof of work&lt;/a>: an operator can lower the posting difficulty for keys near its web-of-trust graph while unknown keys retain the full requirement. No threshold is configured by default, so existing relays keep their previous admission behavior.&lt;/p>
&lt;h3 id="nostter-ties-remote-signing-to-the-active-session">nostter ties remote signing to the active session&lt;/h3>
&lt;p>&lt;a href="https://github.com/SnowCait/nostter">nostter&lt;/a> is a web Nostr client for reading and publishing through relays. Its &lt;a href="https://github.com/SnowCait/nostter/pull/2518">NIP-46 connection lifecycle&lt;/a> now belongs to the authenticated session&amp;rsquo;s signer, so a failed login or session reset can dispose of the remote connection instead of leaving a module-global signer behind. &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> lets a client ask a separate signer to approve cryptographic operations over Nostr.&lt;/p>
&lt;p>The client also &lt;a href="https://github.com/SnowCait/nostter/pull/2510">accepts images from the operating system&amp;rsquo;s share menu&lt;/a>, passing them to its normal composer and upload path. That makes sharing a photo into a Nostr post possible without first saving and selecting it inside the client.&lt;/p>
&lt;h3 id="zap-cooking-publishes-image-descriptions-and-blocks-secret-key-searches">Zap Cooking publishes image descriptions and blocks secret-key searches&lt;/h3>
&lt;p>&lt;a href="https://github.com/zapcooking/frontend">Zap Cooking&lt;/a> is a Nostr recipe and long-form publishing site. Its &lt;a href="https://github.com/zapcooking/frontend/pull/746">NIP-92 image-description work&lt;/a> lets authors write alternative text for images in notes, replies, recipes, articles, and products, then carries that text in &lt;code>imeta&lt;/code> tags that other clients can render. &lt;a href="https://nostrcompass.org/en/topics/nip-92/">NIP-92&lt;/a> standardizes media metadata attached to Nostr events, including image descriptions.&lt;/p>
&lt;p>The site&amp;rsquo;s &lt;a href="https://github.com/zapcooking/frontend/pull/744">search fix&lt;/a> now opens pasted &lt;code>nostr:&lt;/code> identifiers directly and rejects secret-key input before it becomes a relay search. That matters because NIP-50 sends search terms to relays; accidentally pasting an &lt;code>nsec&lt;/code> into the old search field could disclose the private key to those relays. &lt;a href="https://nostrcompass.org/en/topics/nip-50/">NIP-50&lt;/a> defines relay-side search filters for Nostr content.&lt;/p>
&lt;h3 id="divine-mobile-reconnects-idle-relay-subscriptions">Divine Mobile reconnects idle relay subscriptions&lt;/h3>
&lt;p>&lt;a href="https://github.com/divinevideo/divine-mobile">Divine Mobile&lt;/a> is a short-video client that publishes and reads Nostr events. A &lt;a href="https://github.com/divinevideo/divine-mobile/pull/9246">merged relay fix&lt;/a> reconnects after an idle timeout or remote closure, including subscriptions that only receive data and never send another request to trigger recovery. That restores a path used by direct-message inboxes and moderation labels after a connection drops.&lt;/p>
&lt;p>A separate &lt;a href="https://github.com/divinevideo/divine-mobile/pull/9293">profile-verification fix&lt;/a> waits for all queried relays before concluding that a profile has no linked accounts. The previous early empty answer could hide a valid identity event from a slower relay, so users see valid identity events from slower relays on a first profile view.&lt;/p>
&lt;h3 id="conduit-uploads-product-images-through-blossom">Conduit uploads product images through Blossom&lt;/h3>
&lt;p>&lt;a href="https://github.com/Conduit-BTC/conduit-mono">Conduit&lt;/a> is a Nostr-based marketplace with merchant publishing tools. Its &lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/503">merged image-upload work&lt;/a> lets merchants add product images from desktop or mobile through a configured Blossom server while keeping product publication separately signed. Blossom is a media-storage protocol that uses Nostr identities to authorize uploads and let applications retrieve files.&lt;/p>
&lt;p>The &lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/503">upload path&lt;/a> authorizes only the prepared image hash and selected server with a short-lived signed event, then checks the returned result. That gives a merchant an in-app media workflow without silently changing the signed server preference that governs where images go.&lt;/p>
&lt;h3 id="buzz-adds-authenticated-relay-moderation-controls">Buzz adds authenticated relay moderation controls&lt;/h3>
&lt;p>&lt;a href="https://github.com/block/buzz">Buzz&lt;/a> includes a Nostr relay and community administration tools. Its &lt;a href="https://github.com/block/buzz/pull/7302">merged relay-admin routes&lt;/a> let authorized operators list active bans and timeouts and lift them through a signed HTTP request. &lt;a href="https://nostrcompass.org/en/topics/nip-98/">NIP-98&lt;/a> defines Nostr-event authorization for HTTP calls, allowing the relay to verify who made the administrative request.&lt;/p>
&lt;p>The &lt;a href="https://github.com/block/buzz/pull/7302">unban and untimeout operations&lt;/a> write their audit record in the same database transaction as the restriction change. Operators can therefore inspect and reverse a live moderation decision without a successful reversal losing its audit trail.&lt;/p>
&lt;h3 id="contextvm-sdk-shortens-publish-waits-and-repairs-streams">ContextVM SDK shortens publish waits and repairs streams&lt;/h3>
&lt;p>&lt;a href="https://github.com/ContextVM/sdk">ContextVM SDK&lt;/a> is a TypeScript toolkit for applications that exchange signed requests and streams over Nostr relays. Its &lt;a href="https://github.com/ContextVM/sdk/pull/100">relay-pool change&lt;/a> sends an event to every connected relay but, by default, finishes the caller&amp;rsquo;s wait after the first positive acknowledgement; applications that need all acknowledgements can still request that mode. One slow relay no longer determines the normal publish wait.&lt;/p>
&lt;p>The SDK also &lt;a href="https://github.com/ContextVM/sdk/pull/95">repaired per-sender stream sequencing&lt;/a> so client-started streams no longer reuse a sequence number for an accept and a control frame. The PR notes that tool-side consumption of those streamed chunks remains unwired, so this is a transport milestone, not a claim that every streaming application path is complete.&lt;/p>
&lt;h3 id="mostro-preserves-an-orders-original-creation-time">Mostro preserves an order&amp;rsquo;s original creation time&lt;/h3>
&lt;p>&lt;a href="https://github.com/MostroP2P/mostro">Mostro&lt;/a> is a peer-to-peer Bitcoin exchange coordinator that publishes orders over Nostr. Its &lt;a href="https://github.com/MostroP2P/mostro/pull/971">merged kind &lt;code>38383&lt;/code> change&lt;/a> adds a stable &lt;code>created_at&lt;/code> tag from the order record, allowing clients to sort or age an order by when it was opened instead of by its latest status revision. &lt;a href="https://nostrcompass.org/en/topics/nip-69/">NIP-69&lt;/a> defines the Nostr order format used by interoperable trading clients.&lt;/p>
&lt;p>This is the implementation counterpart to the &lt;a href="https://github.com/nostr-protocol/nips/pull/2476">proposed NIP-69 clarification&lt;/a> below. Older clients can ignore the additive tag, while clients that read it can avoid making a returned or repaired order look newly created.&lt;/p>
&lt;h3 id="amethyst-implements-deck-0003-objects-and-encrypted-bag-search">Amethyst implements DECK-0003 objects and encrypted bag search&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst/pull/4186">Amethyst&amp;rsquo;s merged DECK-0003 work&lt;/a> reads and renders Simple Nostr Objects, a JSON 3D-mesh format carried in Nostr events. It supports kind &lt;code>11333&lt;/code> avatars, kind &lt;code>3330&lt;/code> shards, and opening encrypted kind &lt;code>33330&lt;/code> region bags from a location hint. CLI commands parse and verify objects or calculate the bounded search needed to open a bag. The PR reports 15 passing conformance sections against reference implementations.&lt;/p>
&lt;p>The &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4186">bag-search implementation&lt;/a> is still a development milestone, not a device-verified release. Its card compiles and its state machine has unit tests, but it has not been exercised on a phone; the reachable real bags checked by the maintainer lack the hint needed to offer a search button. A synthetic bag is needed to exercise that user path.&lt;/p>
&lt;h3 id="amethyst-broadens-mls-interoperability-and-repairs-desktop-group-rendering">Amethyst broadens MLS interoperability and repairs desktop group rendering&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst/pull/4187">Amethyst&amp;rsquo;s Quartz library&lt;/a> now lets callers choose an MLS group ID and omit Marmot-only required capabilities when interoperating with other MLS stacks. Separate merged changes allow &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4182">extensions supported by every group member&lt;/a>, carry &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4184">authenticated application-message data&lt;/a>, and set an optional &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4188">key-package lifetime&lt;/a>. The Marmot defaults remain unchanged; these are shared-library capabilities, not a claim that every client UI exposes them.&lt;/p>
&lt;p>A later &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4189">desktop render fix&lt;/a> uses shared dialogs and prevents blank group messages after the display-layer split. These merged PRs are development progress, not a tagged Amethyst release.&lt;/p>
&lt;h3 id="nostter-gates-signing-and-private-reads-on-real-capabilities">nostter gates signing and private reads on real capabilities&lt;/h3>
&lt;p>Continuing the session-owned NIP-46 work above, &lt;a href="https://github.com/SnowCait/nostter/pull/2570">nostter&amp;rsquo;s merged signer migration&lt;/a> checks for an actual signer before offering write actions instead of treating every logged-in session as writable. &lt;a href="https://github.com/SnowCait/nostter/pull/2574">Private bookmarks&lt;/a> now require NIP-04 or NIP-44 decryption capability, and &lt;a href="https://github.com/SnowCait/nostter/pull/2576">remote-signer settings&lt;/a> require NIP-44 support. A read-only or anonymous account can still use non-writing profile actions.&lt;/p>
&lt;p>The &lt;a href="https://github.com/SnowCait/nostter/pull/2577">npub display change&lt;/a> and subsequent authentication-state refactors continue that same migration. These are merged application changes, but no new tagged release is claimed here.&lt;/p>
&lt;h3 id="pensieve-makes-archive-reconciliation-bounded-and-durable">Pensieve makes archive reconciliation bounded and durable&lt;/h3>
&lt;p>&lt;a href="https://github.com/andotherstuff/pensieve/pull/48">Pensieve&amp;rsquo;s archive receipt work&lt;/a> waits for actual durable event markers before declaring a reconciliation attempt complete, retaining unresolved IDs across recovery. The &lt;a href="https://github.com/andotherstuff/pensieve/pull/49">sealing change&lt;/a> separates periodic archive durability from optional Parquet publication, and the &lt;a href="https://github.com/andotherstuff/pensieve/pull/50">bounded inventory&lt;/a> scans sealed segments with explicit limits and a persisted cursor.&lt;/p>
&lt;p>These are &lt;a href="https://github.com/andotherstuff/pensieve/pull/50">merged library increments&lt;/a>, not an enabled relay repair worker: runtime scheduling, peer-authenticated IPC, deployment, and production canary remain separate gates.&lt;/p>
&lt;h3 id="mdk-reduces-repeated-replay-work-for-parked-encrypted-messages">MDK reduces repeated replay work for parked encrypted messages&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/mdk/pull/2007">MDK&amp;rsquo;s merged replay fix&lt;/a> addresses work repeated after a publish confirmation, publish failure, or group join when messages remain parked because they cannot yet be decrypted. The previous path classified each row&amp;rsquo;s lineage again and rewound group state for each row and retained anchor. The new deferred-sweep ingest path skips redundant classification and shares a group-scoped cache of historical contexts, invalidating it when canonical state changes.&lt;/p>
&lt;p>The &lt;a href="https://github.com/marmot-protocol/mdk/pull/2007">PR&amp;rsquo;s regression tests&lt;/a> compare the one-row and eight-row parked-message cases. Its engine suite reports 681 passing tests and five skipped. This is merged library work after MDK 0.10.4, not part of that tagged release or a measured end-user latency claim.&lt;/p>
&lt;h2 id="protocol-and-spec-work">Protocol and Spec Work&lt;/h2>
&lt;h3 id="nip-02-clarifies-petnames-in-follow-lists">NIP-02 clarifies petnames in follow lists&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-02/">NIP-02 (Follow List)&lt;/a> standardizes the kind &lt;code>3&lt;/code> event that records whom an account follows and can attach a local petname to each followed key. The &lt;a href="https://github.com/nostr-protocol/nips/pull/2472">merged petname clarification&lt;/a> allows display-safe characters while preserving the field as a user&amp;rsquo;s local label, not a globally verified name.&lt;/p>
&lt;h3 id="nip-86-adds-clear-and-list-methods-for-relay-management">NIP-86 adds clear and list methods for relay management&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-86/">NIP-86 (Relay Management API)&lt;/a> standardizes authenticated administrative calls for banning, allowing, inspecting, and configuring a relay. &lt;a href="https://github.com/nostr-protocol/nips/pull/2477">PR #2477&lt;/a>, merged September 23, adds methods for clearing pubkeys or events from both allow and ban lists and for listing roles, allowed events, and disallowed kinds, including behavior already present in the khatru relay framework and the go-nostr library.&lt;/p>
&lt;h3 id="nip-69-proposes-a-stable-creation-time-for-trading-orders">NIP-69 proposes a stable creation time for trading orders&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-69/">NIP-69 (Peer-to-Peer Trading)&lt;/a> standardizes addressable order events that let multiple trading applications share buy and sell liquidity. &lt;a href="https://github.com/nostr-protocol/nips/pull/2476">PR #2476&lt;/a> proposes an optional creation-time tag that stays fixed across status updates, so a returned or republished order retains its original age even when a newer event records a status change.&lt;/p>
&lt;h3 id="nip-a3-proposes-proof-of-payment-address-ownership">NIP-A3 proposes proof of payment-address ownership&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-a3/">NIP-A3 (Payment Targets)&lt;/a> lets an account publish portable payment addresses for multiple networks in one replaceable event. &lt;a href="https://github.com/nostr-protocol/nips/pull/2475">PR #2475&lt;/a> proposes an optional signature made by the payment address&amp;rsquo;s own key, giving compatible address types a proof that binds the destination to the Nostr author while treating missing proofs as neutral.&lt;/p>
&lt;h3 id="bud-16-proposes-deterministic-directory-manifests">BUD-16 proposes deterministic directory manifests&lt;/h3>
&lt;p>&lt;a href="https://github.com/hzrd149/blossom/pull/105">BUD-16&lt;/a> is an open Blossom proposal for grouping content-addressed blobs into named directory trees with reproducible manifest hashes. The draft defines deterministic MessagePack encoding, named links, metadata, optional encryption keys, and &lt;code>.bdir&lt;/code> path resolution while leaving servers to store ordinary blobs.&lt;/p>
&lt;h3 id="marmot-adds-encrypted-group-polls">Marmot adds encrypted group polls&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot Protocol&lt;/a> defines interoperable application events inside MLS-encrypted groups carried over Nostr. NIP-88 defines poll questions and signed response events. &lt;a href="https://github.com/marmot-protocol/marmot/pull/425">Merged MIP work&lt;/a> recognizes those polls inside a group while keeping relay selection bound to authenticated group routing and explicitly stating that they are not anonymous or election-grade.&lt;/p>
&lt;h3 id="marmot-merges-group-reports-and-admin-deletion">Marmot merges group reports and admin deletion&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/marmot/pull/423">Marmot group moderation&lt;/a> defines encrypted report, dismissal, and administrator-deletion events that converge under the group&amp;rsquo;s authenticated state. The proposal covered last week has now merged, fixing a status transition that lets implementations align report review and message removal against the accepted specification.&lt;/p>
&lt;h3 id="nwc-13-proposes-connection-budget-queries">NWC-13 proposes connection budget queries&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-47/">Nostr Wallet Connect&lt;/a> lets an application request narrowly scoped wallet operations through encrypted Nostr events. &lt;a href="https://github.com/nostr-wallet-connect/nwc/pull/7">NWC-13&lt;/a> proposes a separate &lt;code>get_budget&lt;/code> permission and response so an application can inspect used, total, and renewal allowance without receiving permission to read the wallet&amp;rsquo;s balance.&lt;/p>
&lt;h2 id="nip-deep-dive-custom-emoji-and-video-events">NIP Deep Dive: Custom Emoji and Video Events&lt;/h2>
&lt;h3 id="nip-30-custom-emoji">NIP-30: Custom Emoji&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-30/">NIP-30 (Custom Emoji)&lt;/a> standardizes how a signed event maps readable &lt;code>:shortcodes:&lt;/code> to image URLs, with an optional address that points to a reusable emoji set. The &lt;a href="https://github.com/nostr-protocol/nips/blob/master/30.md">specification&lt;/a> permits letters, numbers, hyphens, and underscore (&lt;code>_&lt;/code>) characters in a shortcode and applies the mapping to profiles, short text notes, comments, reactions, and live activities. NIP-51 defines public and private list formats, including the kind &lt;code>30030&lt;/code> parameterized replaceable events that hold named emoji sets.&lt;/p>
&lt;p>Clients should preserve the literal shortcode when an image fails to load, reject malformed mappings, and treat every image host as an external network request that can observe the viewer&amp;rsquo;s address and timing. &lt;a href="https://github.com/vitorpamplona/amethyst/blob/96bec0cc7c1df4c05d4208fb1cfd6aac06fe97e7/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip30CustomEmoji/EmojiUrlTag.kt">Amethyst&amp;rsquo;s Android implementation&lt;/a> parses the optional set address and enforces the allowed shortcode characters. &lt;a href="https://github.com/barrydeen/wisp/blob/b48be58271131c6062be2cc5449777cdd4fe6d31/app/src/main/kotlin/com/wisp/app/nostr/Nip30.kt">Wisp&amp;rsquo;s mobile client implementation&lt;/a> builds emoji sets and removes duplicate shortcodes from rendered content. &lt;a href="https://github.com/nostria-app/nostria/blob/e861946f4ef4e70f3ec49997a4be27615b9b6f5e/src/app/utils/emoji-shortcode.ts">Nostria&amp;rsquo;s web client implementation&lt;/a> normalizes separators before validating shortcodes, which shows why producers should test common clients before depending on punctuation permitted by the specification.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/01.md">NIP-01&lt;/a> defines the canonical serialization, event ID, and signature rules used to authenticate Nostr events. The following kind &lt;code>30030&lt;/code> emoji-set event was recovered from &lt;code>wss://nos.lol&lt;/code> and &lt;code>wss://relay.primal.net&lt;/code> during review and passed those ID rules plus BIP-340 signature verification. Its &lt;code>d&lt;/code> tag supplies the replaceable set identifier, and its &lt;code>emoji&lt;/code> tag maps &lt;code>:liberlandflag:&lt;/code> to the hosted image.&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:#f92672">&amp;#34;kind&amp;#34;&lt;/span>:&lt;span style="color:#ae81ff">30030&lt;/span>,&lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;438814476db249b50067d167e50c85530e317126179546a584365c8371bdd97f&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;6e1897660c62153be7355a82a62549b09993fb12b50de73a32610725d1a5de6b&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>:&lt;span style="color:#ae81ff">1790025651&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;1962f3e8-5a74-4327-b88d-4697bdd2119d&amp;#34;&lt;/span>],[&lt;span style="color:#e6db74">&amp;#34;client&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;Amethyst&amp;#34;&lt;/span>],[&lt;span style="color:#e6db74">&amp;#34;emoji&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;liberlandflag&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;https://nogues.ca/emoji/liberlandflag.png&amp;#34;&lt;/span>],[&lt;span style="color:#e6db74">&amp;#34;title&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;Liberland&amp;#34;&lt;/span>],[&lt;span style="color:#e6db74">&amp;#34;description&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;#Liberland&amp;#34;&lt;/span>],[&lt;span style="color:#e6db74">&amp;#34;image&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;https://npub1dcvfwesvvg2nhee4t2p2vf2fkzve87cjk5x7ww3jvyrjt5d9me4szmscg7.blossom.band/a8aa38949d3d7a17e369703391de0406f50b518a1a6ca9791ebf38c94b51a0e1.jpg&amp;#34;&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 style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;5f7dd5b8879311689e95cbab26edd6f65611d517d22d12d568a9de219c8a8fc6999365c83205d02ec74844b4b9944ed5419ec17ea9d8cbf4e347504cc3685304&amp;#34;&lt;/span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/commit/e91ce3409e1ce8267fc07a21784d2538621267c3">Alex Gleason introduced NIP-30 in April 2023&lt;/a>. That original proposal, reported previously in the April 29 issue, has now shipped in current clients. Subsequent specification changes include an &lt;a href="https://github.com/nostr-protocol/nips/commit/735a25e44b8e7a01539864f2a2dcf3e728977fd3">August 2026 update&lt;/a> that added kind &lt;code>1111&lt;/code> comments to its supported event kinds. The design keeps emoji meaning local to each signed event or referenced set, so clients do not need a global shortcode registry.&lt;/p>
&lt;h3 id="nip-71-video-events">NIP-71: Video Events&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-71/">NIP-71 (Video Events)&lt;/a> standardizes Nostr events for horizontal and short-form video, including playback metadata, alternate files, captions, chapters, participants, and imported-source provenance. The &lt;a href="https://github.com/nostr-protocol/nips/blob/master/71.md">canonical specification&lt;/a> assigns kinds &lt;code>21&lt;/code> and &lt;code>22&lt;/code> to immutable horizontal and portrait video posts, while kinds &lt;code>34235&lt;/code> and &lt;code>34236&lt;/code> use a &lt;code>d&lt;/code> tag to create addressable videos whose metadata can be updated under a stable coordinate. Each &lt;code>imeta&lt;/code> tag describes one playable variant with a URL and media type plus optional dimensions, hash, preview image, fallback, service, bitrate, and duration.&lt;/p>
&lt;p>Clients must validate media URLs and hashes, bound downloads, handle missing variants, and make external-host requests visible to users because a video server can observe playback traffic. &lt;a href="https://github.com/vitorpamplona/amethyst/blob/96bec0cc7c1df4c05d4208fb1cfd6aac06fe97e7/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip71Video/VideoEvent.kt">Amethyst&amp;rsquo;s Android implementation&lt;/a> separates video and audio tracks and chooses a playable variant. &lt;a href="https://github.com/barrydeen/wisp/blob/b48be58271131c6062be2cc5449777cdd4fe6d31/app/src/main/kotlin/com/wisp/app/nostr/Nip71.kt">Wisp&amp;rsquo;s mobile client implementation&lt;/a> parses and builds regular video events with structured &lt;code>imeta&lt;/code> fields. &lt;a href="https://github.com/ikuradon/Resonote/blob/4ac14e1206608315d6507da405d4c5df3312d4d0/packages/core/src/nip71-video.ts">Resonote&amp;rsquo;s browser-extension implementation&lt;/a> builds and parses all four event kinds, media variants, text tracks, segments, participants, and origin metadata.&lt;/p>
&lt;p>The following kind &lt;code>22&lt;/code> short-video event was recovered from &lt;code>wss://relay.damus.io&lt;/code> and &lt;code>wss://nos.lol&lt;/code> during review and passed the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/01.md">NIP-01&lt;/a> ID rules plus BIP-340 signature verification. Its &lt;code>imeta&lt;/code> tag binds the MP4 URL to its MIME type, SHA-256 hash, dimensions, and duration, while the surrounding tags provide a title, publication time, accessibility text, and searchable topics.&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:#f92672">&amp;#34;kind&amp;#34;&lt;/span>:&lt;span style="color:#ae81ff">22&lt;/span>,&lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;dd1fcfe7ce6db5450e362879897138ca4e639ef39654dfe3b1f669310fd9545d&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;870ce6f7aa9ee05025667245343278eccfb8e3eafc08bcab68824ad0f4cfa675&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>:&lt;span style="color:#ae81ff">1790094714&lt;/span>,&lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>:[[&lt;span style="color:#e6db74">&amp;#34;title&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;Why Pepe moves 3x Bitcoin&amp;#34;&lt;/span>],[&lt;span style="color:#e6db74">&amp;#34;published_at&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;1790094714&amp;#34;&lt;/span>],[&lt;span style="color:#e6db74">&amp;#34;alt&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;Why Pepe moves 3x Bitcoin&amp;#34;&lt;/span>],[&lt;span style="color:#e6db74">&amp;#34;imeta&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;url https://the-bitcoin-strategy.com/nostr-relay/pKy3my2zzMhCVNL1.mp4&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;m video/mp4&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;x 3dafddd0b1730213212bcaf96136684f15e20ee5f20a1252052a58f3a8b36652&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;dim 1080x1920&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;duration 62&amp;#34;&lt;/span>],[&lt;span style="color:#e6db74">&amp;#34;duration&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;62&amp;#34;&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 style="color:#e6db74">&amp;#34;t&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;pepe&amp;#34;&lt;/span>],[&lt;span style="color:#e6db74">&amp;#34;t&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;memecoin&amp;#34;&lt;/span>],[&lt;span style="color:#e6db74">&amp;#34;t&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;altcoin&amp;#34;&lt;/span>]],&lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;Why Pepe moves 3x Bitcoin\n\nPepe jumped about twenty percent in a single day, roughly triple Bitcoin&amp;#39;s move. Most of the trading is not the token itself: on Binance, the volume in bets on the price was about eight times the volume in the actual token. Those bets are made with borrowed money, so every dollar tends to move the price more, in both directions.\n\nAsk Gerhard AI For Free:\nhttps://mybtcguy.com\n\n#bitcoin #pepe #memecoin #altcoin&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;0da305b00f4b1631b14b8fd33fcc6a2a0e54e24233dba541db3d2bce3705ac0dcf61401764b47555015e2566dcf4a8886cd3f767ea26ed2da76b3ac9bb23d680&amp;#34;&lt;/span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/commit/7afd1049d98a82aa7754f80de80d97dd686cf40e">The NIP-71 file history began in December 2023&lt;/a> when zmeyer44 moved the video-event proposal to its current number. The &lt;a href="https://github.com/nostr-protocol/nips/pull/1669">addressable-video update&lt;/a>, reported previously in the January 13 issue, has now shipped across multiple current implementations; its kinds &lt;code>34235&lt;/code> and &lt;code>34236&lt;/code> give publishers a stable coordinate for corrected metadata and migrated hosting.&lt;/p>
&lt;h3 id="how-the-two-specifications-relate">How the two specifications relate&lt;/h3>
&lt;p>The &lt;a href="https://github.com/nostr-protocol/nips/blob/master/30.md">NIP-30 specification&lt;/a> controls presentation metadata for a limited set of social event kinds, while &lt;a href="https://github.com/nostr-protocol/nips/blob/master/71.md">NIP-71&lt;/a> defines media-centered events and their playback data. NIP-30 does not currently list the four NIP-71 video kinds, so clients should display custom emoji around videos through supported profiles, comments, reactions, or live activities and should not assume shortcode replacement inside a video event. That boundary gives implementers a precise interoperability rule while both specifications expand the media that a Nostr interface can render.&lt;/p>
&lt;hr>
&lt;p>NIP-17 defines private direct messages whose sender and metadata are hidden inside gift-wrapped events. Send a NIP-17 DM to share a project or news item through the &lt;a href="https://github.com/andotherstuff/nostr-compass">Nostr Compass project&lt;/a>.&lt;/p></content:encoded></item><item><title>Nostr Compass #40</title><link>https://nostrcompass.org/en/newsletters/2026-09-16-newsletter/</link><pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-09-16-newsletter/</guid><description>&lt;p>Welcome back to &lt;a href="https://nostrcompass.org">Nostr Compass&lt;/a>, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-16-newsletter/#marmot-protocol-and-mdk-reach-v0100">Marmot Protocol and MDK&lt;/a> add &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.10.0">bounded conversation windows, recovery fixes, and coordinated SDK bindings&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-16-newsletter/#myco-070-runs-napplets-and-file-sharing-over-a-multi-path-fips-mesh">Myco&lt;/a> turns its FIPS mesh into an offline napplet and file-sharing runtime, &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-16-newsletter/#dart-ndk-changes-relay-cache-and-account-behavior">Dart NDK&lt;/a> changes relay and cache behavior, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-16-newsletter/#keycast-publishes-its-rebuilt-signer-release-candidate">Keycast&lt;/a> rebuilds remote signing around durable requests and recovery. Tagged releases include &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-16-newsletter/#nail-020-restores-nostr-to-email-subscriptions">Nail&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-16-newsletter/#nostr-mail-client-0150-broadens-account-and-relay-control">Nostr Mail Client&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-16-newsletter/#linky-26917-keeps-recovery-seeds-off-its-server">Linky&lt;/a>, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-16-newsletter/#boris-0125-bounds-extraction-and-strengthens-offline-reading">Boris&lt;/a>. The NIPs repository merged one PR this week, clarifying &lt;a href="https://nostrcompass.org/en/topics/nip-a3/">NIP-A3 (Payment Targets)&lt;/a>, while proposed slash-command and DVM-heartbeat work remains open. Deep dives cover &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-16-newsletter/#nip-23-long-form-content">NIP-23 (Long-form Content)&lt;/a> and &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-16-newsletter/#nip-92-media-attachments-metadata">NIP-92 (Media Attachments)&lt;/a>.&lt;/p></description><content:encoded>&lt;p>Welcome back to &lt;a href="https://nostrcompass.org">Nostr Compass&lt;/a>, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-16-newsletter/#marmot-protocol-and-mdk-reach-v0100">Marmot Protocol and MDK&lt;/a> add &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.10.0">bounded conversation windows, recovery fixes, and coordinated SDK bindings&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-16-newsletter/#myco-070-runs-napplets-and-file-sharing-over-a-multi-path-fips-mesh">Myco&lt;/a> turns its FIPS mesh into an offline napplet and file-sharing runtime, &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-16-newsletter/#dart-ndk-changes-relay-cache-and-account-behavior">Dart NDK&lt;/a> changes relay and cache behavior, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-16-newsletter/#keycast-publishes-its-rebuilt-signer-release-candidate">Keycast&lt;/a> rebuilds remote signing around durable requests and recovery. Tagged releases include &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-16-newsletter/#nail-020-restores-nostr-to-email-subscriptions">Nail&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-16-newsletter/#nostr-mail-client-0150-broadens-account-and-relay-control">Nostr Mail Client&lt;/a>, &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-16-newsletter/#linky-26917-keeps-recovery-seeds-off-its-server">Linky&lt;/a>, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-16-newsletter/#boris-0125-bounds-extraction-and-strengthens-offline-reading">Boris&lt;/a>. The NIPs repository merged one PR this week, clarifying &lt;a href="https://nostrcompass.org/en/topics/nip-a3/">NIP-A3 (Payment Targets)&lt;/a>, while proposed slash-command and DVM-heartbeat work remains open. Deep dives cover &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-16-newsletter/#nip-23-long-form-content">NIP-23 (Long-form Content)&lt;/a> and &lt;a href="https://nostrcompass.org/en/newsletters/2026-09-16-newsletter/#nip-92-media-attachments-metadata">NIP-92 (Media Attachments)&lt;/a>.&lt;/p>
&lt;h2 id="top-stories">Top Stories&lt;/h2>
&lt;h3 id="marmot-protocol-and-mdk-reach-v0100">Marmot Protocol and MDK reach v0.10.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.10.0">Marmot Protocol’s MDK v0.10.0&lt;/a> adds bounded chat-list and conversation windows, independent account-attention summaries, revision-safe drafts, and viewer reaction state for applications building MLS-based encrypted groups over Nostr. It also restores account-scoped user blocking and counts pending invitations without counting them again as unread messages.&lt;/p>
&lt;p>The &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.10.0">v0.10.0 release series&lt;/a> fixes recovery when a device is removed and re-added, when traffic arrives before its Welcome, and when peel replay is interrupted. It reduces relay synchronization and subscription churn, queues media operations while transfer slots are busy, and pins forensic-audit uploads to validated destinations on every attempt.&lt;/p>
&lt;p>The same &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.10.0">MDK source commit&lt;/a> ships Rust, C, Swift, Kotlin, command-line, and agent artifacts as one compatibility cohort. Account databases advance through migrations 70–75, so applications must update generated source and native libraries together, preserve complete Apple framework bundles, back up before migration, and avoid downgrading a migrated database.&lt;/p>
&lt;h3 id="myco-070-runs-napplets-and-file-sharing-over-a-multi-path-fips-mesh">Myco 0.7.0 runs napplets and file sharing over a multi-path FIPS mesh&lt;/h3>
&lt;p>&lt;a href="https://github.com/Origami74/myco/releases/tag/v0.7.0">Myco v0.7.0&lt;/a> turns the Android mesh application into a host for napplets, single-file Nostr programs described by the open &lt;a href="https://nostrcompass.org/en/topics/nip-5d/">NIP-5D proposal&lt;/a>. Each napplet runs in a sandbox without direct network or storage access and requests identity, relay, outbox, mesh, picture, or file capabilities through Myco. The install sheet shows those permissions before approval, users can change them later, and updates that request broader access return to the permission gate.&lt;/p>
&lt;p>&lt;a href="https://github.com/Origami74/myco/releases/tag/v0.7.0">Myco v0.7.0&lt;/a> also sends arbitrary files to paired phones through the system share sheet or a Circle contact. The receiving phone approves the transfer before Myco writes it to &lt;code>Downloads/Myco&lt;/code>, and the payload is encrypted to that phone’s key. Local-network discovery uses UDP when both phones share Wi-Fi and retains Bluetooth for offline paths; retries cover lost control messages, while a silence timer bounds stalled large transfers.&lt;/p>
&lt;p>&lt;a href="https://github.com/Origami74/myco/releases/tag/v0.7.0">Myco now keeps simultaneous FIPS links&lt;/a> to a peer, probes standby paths, and moves traffic when the active Bluetooth, Wi-Fi Aware, or local-network link degrades. The work builds on FIPS’s experimental multi-path branch. Version 0.7.0 remains wire-compatible with 0.6.1 for existing app exchange, messaging, and pairing, but multi-path links form only between two updated phones. The embedded relay also moves to LMDB and migrates earlier event stores on first launch.&lt;/p>
&lt;h3 id="dart-ndk-changes-relay-cache-and-account-behavior">Dart NDK changes relay, cache, and account behavior&lt;/h3>
&lt;p>&lt;a href="https://github.com/relaystr/ndk/releases/tag/v0.10.0-dev.3">Dart NDK v0.10.0-dev.3&lt;/a> is a development release of the Dart client library, with breaking changes across relay handling, caching, authentication, and account streams. Client maintainers should expect code and behavioral migration work, especially where an application assumes that cached events, hidden events, or account updates follow the previous release line’s semantics.&lt;/p>
&lt;p>The &lt;a href="https://github.com/relaystr/ndk/releases/tag/v0.10.0-dev.3">v0.10.0 development series&lt;/a> also improves cache and Rust verifier performance and changes metadata, deletion-coordinate, event-visibility, signer-authentication, and NWC payment behavior. Packed Rust event verification reduces verification overhead, while the new &lt;code>loadHiddenEvents&lt;/code> cache behavior is explicitly breaking.&lt;/p>
&lt;p>Because this is &lt;a href="https://github.com/relaystr/ndk/releases/tag/v0.10.0-dev.3">v0.10.0-dev.3&lt;/a>, not a stable v0.10.0 release, application teams should pin versions and test migrations deliberately. Relay reconnection, cache hydration, signer authentication, wallet handling, and account-stream ordering are the highest-value paths to exercise before moving production clients.&lt;/p>
&lt;h3 id="keycast-publishes-its-rebuilt-signer-release-candidate">Keycast publishes its rebuilt signer release candidate&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/keycast/releases/tag/v2.0.0-rc.1">Keycast v2.0.0-rc.1&lt;/a> is the first numbered release of the rebuilt self-hosted NIP-46 remote signer. The release candidate adds multiplexed NIP-46 support, shared and per-key relay routing, durable request handling, encrypted key storage, invitations, sessions, and team workspaces.&lt;/p>
&lt;p>Signing policy and recovery receive equal weight in &lt;a href="https://github.com/marmot-protocol/keycast/releases/tag/v2.0.0-rc.1">v2.0.0-rc.1&lt;/a>. Operators can configure signing policies, inspect audit history, create encrypted backups, recover deployments, and rotate the root key. The project also documents coordinated and verified release provenance across its API, signer, and web components.&lt;/p>
&lt;p>The release remains a &lt;a href="https://github.com/marmot-protocol/keycast/releases/tag/v2.0.0-rc.1">release candidate&lt;/a>, so operators should not infer final compatibility or production readiness from the version number alone. Testing should cover interrupted request recovery, relay-routing failures, policy enforcement, backup restoration, and key rotation before replacing an existing signer service.&lt;/p>
&lt;h2 id="tagged-releases">Tagged Releases&lt;/h2>
&lt;h3 id="nail-020-restores-nostr-to-email-subscriptions">Nail 0.2.0 restores Nostr-to-email subscriptions&lt;/h3>
&lt;p>&lt;a href="https://github.com/formstr-hq/nail/releases/tag/v0.2.0">Nail v0.2.0&lt;/a>, a service that delivers Nostr messages through email workflows, adds self-healing gift-wrap subscriptions. The change is aimed at restoring Nostr-to-email delivery after subscription failures instead of leaving the bridge silently stalled.&lt;/p>
&lt;h3 id="nostr-mail-client-0150-broadens-account-and-relay-control">Nostr Mail Client 0.15.0 broadens account and relay control&lt;/h3>
&lt;p>&lt;a href="https://github.com/nogringo/nostr-mail-client/releases/tag/v0.15.0">Nostr Mail Client v0.15.0&lt;/a> adds one-tap account switching, per-account notifications, web push, and recovery of a missing relay list from a relay, Nostr address, or &lt;code>nprofile&lt;/code>. It also republishes profiles and relay lists to indexing relays, reconnects when network access returns, and distinguishes a device outage from unreachable mail relays. Those changes tighten account recovery and delivery across desktop, web, and Android clients.&lt;/p>
&lt;h3 id="linky-26917-keeps-recovery-seeds-off-its-server">Linky 26.9.17 keeps recovery seeds off its server&lt;/h3>
&lt;p>&lt;a href="https://github.com/linky-fit/linky/releases/tag/v26.9.17">Linky v26.9.17&lt;/a>, a contacts, private Nostr messaging, and Lightning/Cashu payments application, fixes a path that sent recovery seeds to Linky&amp;rsquo;s server when users saved them through a password manager. The release also hardens payment-file URL handling and disables Android application backups, reducing the places where wallet and identity recovery material can escape the device.&lt;/p>
&lt;h3 id="calendar-by-form-240-adds-mailstr-guest-invitations">Calendar by Form* 2.4.0 adds Mailstr guest invitations&lt;/h3>
&lt;p>&lt;a href="https://github.com/formstr-hq/nostr-calendar/releases/tag/v2.4.0">Calendar by Form* v2.4.0&lt;/a>, a Nostr calendar client, adds Mailstr guest invitations and mobile calendar fixes. The invitation path lets organizers include participants through mail-oriented coordination without requiring an existing calendar account.&lt;/p>
&lt;h3 id="hessible-012-speeds-encrypted-contact-and-photo-sync">Hessible 0.1.2 speeds encrypted contact and photo sync&lt;/h3>
&lt;p>&lt;a href="https://github.com/circumspace/hessible">Hessible 0.1.2&lt;/a>, a privacy-focused Android contacts application that stores encrypted contact data on Nostr relays, reduces synchronization overhead and mirrors encrypted contact photos across Blossom servers. The release also makes the application package smaller, while its own release guidance continues to caution users to back up keys and account for varying relay retention.&lt;/p>
&lt;h3 id="boris-0125-bounds-extraction-and-strengthens-offline-reading">Boris 0.12.5 bounds extraction and strengthens offline reading&lt;/h3>
&lt;p>&lt;a href="https://github.com/dergigi/boris/releases/tag/v0.12.5">Boris v0.12.5&lt;/a>, a reading-list client built around Nostr bookmarks, follows v0.12.4 with bounded content extraction, offline caching, relay-query changes, unsafe-HTML handling, and a fix for nearly invisible text under the Paper White theme. These changes affect both content safety and the reliability of reading saved material without a live network path.&lt;/p>
&lt;h3 id="amethyst-1152-refines-media-and-root-scope-replies">Amethyst 1.15.2 refines media and root-scope replies&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.15.2">Amethyst v1.15.2&lt;/a>, an Android Nostr client, closes a three-release sequence with media fixes, clearer Health Connect permission handling, source-name caching, and dedicated engagement filters for NIP-22 root-scope replies. The release also includes translation and package-metadata updates.&lt;/p>
&lt;h3 id="librenostr-0517-routes-feeds-through-author-write-relays">LibreNostr 0.5.17 routes feeds through author write relays&lt;/h3>
&lt;p>&lt;a href="https://primal.net/e/c118efbe649823a3258a6e7663f4d8b52195adbde0481019183792eb5274afd4">LibreNostr 0.5.17&lt;/a>, a relay-first Android client, now directs feed queries to the NIP-65 write relays of followed authors and defers interaction-count queries until notes enter view. Earlier work in the same release sequence limits concurrent relay queries and closes each relay subscription as soon as that relay answers, reducing self-inflicted request rejection during refreshes.&lt;/p>
&lt;h3 id="voca-120-improves-speech-cancellation-and-recovery">Voca 1.2.0 improves speech cancellation and recovery&lt;/h3>
&lt;p>&lt;a href="https://njump.me/nevent1qqsfcc5zel49t5zt96ufndumrzc2vzhrk7e2rnwq579gcs8yd9cn4pcflqxt3">Voca 1.2.0&lt;/a>, an offline-oriented Android text-to-speech reader that can fetch and verify Nostr content, adds distinct cancellation and rendering behavior plus recovery for slow or unreliable speech engines after the 1.0 launch covered in issue #38. It also adds opt-in diagnostics sent with a fresh one-time Nostr key through a NIP-17 private message, with large reports encrypted locally before upload.&lt;/p>
&lt;h3 id="postr-111-adds-dictation-and-publication-recovery">Postr 1.1.1 adds dictation and publication recovery&lt;/h3>
&lt;p>&lt;a href="https://njump.me/nevent1qqszw3dsskfz3u7pqxn4r5ytslrj0e3u26et90rpy9997vtfw3qkr6g9g0f03">Postr 1.1.1&lt;/a>, a focused Android kind &lt;code>1&lt;/code> composer, adds dictation and caret-aware mention handling after the launch covered in issue #37. The preceding 1.1.0 release also improves publication recovery by retrying the same signed event after ambiguous outcomes, preventing recovery from creating a duplicate note.&lt;/p>
&lt;h3 id="earthly-0110-repairs-map-sanitization-and-authoring">earthly 0.1.10 repairs map sanitization and authoring&lt;/h3>
&lt;p>&lt;a href="https://github.com/zeSchlausKwab/earthly/releases/tag/v0.1.10">earthly v0.1.10&lt;/a>, a collaborative Nostr map editor, materially changes map and story authoring while fixing a critical MapLibre attribution-sanitizer flaw through a MapLibre GL JS upgrade. The release also improves WebGL 2 compatibility messaging, mobile controls, geometry editing, selection, and map-presentation controls.&lt;/p>
&lt;h3 id="routstrd-0410-tightens-nostr-request-routing">Routstrd 0.4.10 tightens Nostr request routing&lt;/h3>
&lt;p>&lt;a href="https://github.com/Routstr/routstrd/releases/tag/v0.4.10">Routstrd v0.4.10&lt;/a> replaces a stale stored provider list with the list returned by live discovery. The preceding v0.4.9 release added manual and scheduled client refresh controls, named npubs in the CLI, and graceful daemon restarts that wait for active requests. Together, the releases make provider selection and refresh behavior more explicit for operators of the Nostr-routed service.&lt;/p>
&lt;h3 id="whistle-191-instruments-background-recovery">Whistle 1.9.1 instruments background recovery&lt;/h3>
&lt;p>&lt;a href="https://primal.net/e/bb3aae325f707b04dffd3b0b4a2d0c48022999fef7a793be3503b4c53e37eba4">Whistle 1.9.1&lt;/a>, an encrypted group location-sharing application built on Nostr, MLS, and Marmot Protocol, adds device-lifecycle instrumentation for iOS background recovery. Version 1.9.0 also introduces per-group sharing pauses and per-group last-event diagnostics, making a stalled group easier to distinguish from a healthy application-wide connection.&lt;/p>
&lt;h3 id="amber-664-closes-a-tor-leak-and-signer-recovery-failures">Amber 6.6.4 closes a Tor leak and signer recovery failures&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.6.4">Amber v6.6.4&lt;/a>, an Android Nostr event signer, caps a three-release sequence with a Tor leak correction and fixes around signer relays and recovery. Signer users and application developers should pay particular attention to network-path assumptions and retry behavior, since signer failures can otherwise appear as client publication failures.&lt;/p>
&lt;h3 id="nostr-wot-extension-070-encrypts-wallet-cache-data">nostr-wot-extension 0.7.0 encrypts wallet cache data&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-wot/nostr-wot-extension/releases/tag/v0.7.0">nostr-wot-extension v0.7.0&lt;/a>, a browser extension that manages Nostr identities, signs events, and initiates Lightning payments, encrypts wallet and payment cache data and strengthens vault and account isolation. It also addresses NWC and wallet behavior, payment compatibility, request approvals, account management, backup imports, relay handling, accessibility, and local event decryption.&lt;/p>
&lt;h3 id="lightningpub-0041-improves-publication-recovery">Lightning.Pub 0.0.41 improves publication recovery&lt;/h3>
&lt;p>&lt;a href="https://github.com/shocknet/Lightning.Pub/releases/tag/v0.0.41">Lightning.Pub v0.0.41&lt;/a> adds relay URL, timing, socket-state, and DNS details to Nostr publication failures. It also retries liquidity-provider startup calls, removes abandoned callbacks, and withholds invoice routing until a successful balance response proves the provider is ready. Operators now get a clearer split between relay-connectivity failures and backend-readiness failures.&lt;/p>
&lt;h3 id="gittr-100-advances-nip-34-collaboration">Gittr 1.0.0 advances NIP-34 collaboration&lt;/h3>
&lt;p>&lt;a href="https://github.com/arbadacarbaYK/gittr/releases/tag/v1.0.0">Gittr v1.0.0&lt;/a>, a client for Nostr-based Git collaboration, advances NIP-34 clone-source handling, issue and discussion state, mobile usability, and interoperability. The v1.0.0 tag follows v0.3.0 and v0.3.1 from earlier this week, giving integrators a stable version marker for the release sequence.&lt;/p>
&lt;h3 id="gitworkshop-410-makes-nip-34-drafts-recoverable">GitWorkshop 4.1.0 makes NIP-34 drafts recoverable&lt;/h3>
&lt;p>&lt;a href="https://njump.me/nevent1qqswf45vw8y5metnu8tc2fge0lr7sy8nmuk264kryrd45wqles5kfvqqrtwl3">GitWorkshop 4.1.0&lt;/a>, a Nostr-native client for NIP-34 issues, pull requests, code review, and repository browsing, adds account-scoped local drafts that survive refreshes and browser restarts. It also adds bounded recovery and explicit retry controls across Git reads, relay discovery, repository state, pull-request history, uploads, and release metadata while keeping signing and payment retries manual.&lt;/p>
&lt;h3 id="ngit-ci-011-publishes-signed-ci-coordination">ngit-ci 0.1.1 publishes signed CI coordination&lt;/h3>
&lt;p>&lt;a href="https://njump.me/nevent1qqs2y0p5nxkfqsrqguth3hd4wmmel4p2te8q906ex748q35ug79e6eg9hms4s">ngit-ci 0.1.1&lt;/a>, a self-hosted coordinator for the proposed NIP-C1 Nostr CI protocol, is its first release published through Nostr. It covers signed workflow coordination, container or microVM execution, logs and artifacts, encrypted repository secrets, NIP-34 maintainer authorization, and signed publication of build results.&lt;/p>
&lt;h3 id="pakstr-0211-advances-nostr-application-packaging">pakstr 0.21.1 advances Nostr application packaging&lt;/h3>
&lt;p>&lt;a href="https://git.nostrdev.com/stuff/pakstr/releases/tag/v0.21.1">pakstr v0.21.1&lt;/a> continues a five-release sequence for Nostr application packaging and app-shell behavior. NostrAppShell references point to this same pakstr release series, so the package and alias describe one shipped change.&lt;/p>
&lt;h3 id="elisymcli-0300-coordinates-agent-and-delegation-packages">@elisym/cli 0.30.0 coordinates agent and delegation packages&lt;/h3>
&lt;p>&lt;a href="https://github.com/elisymlabs/elisym/releases/tag/%40elisym/cli%400.30.0">@elisym/cli 0.30.0&lt;/a> concludes a coordinated CLI, SDK, and MCP release for Nostr-oriented agent delegation. Delegated jobs now wait for completion instead of sleeping for a fixed interval, and the application avoids paying the same delegation capability once per job. Teams using more than one package should keep CLI 0.30.0, SDK 0.36.0, and MCP 0.26.0 on the matched release line.&lt;/p>
&lt;h3 id="hashtree-02150-advances-hash-tree-synchronization">Hashtree 0.2.150 advances hash-tree synchronization&lt;/h3>
&lt;p>&lt;a href="https://github.com/mmalmi/hashtree/releases/tag/v0.2.150">Hashtree v0.2.150&lt;/a> closes a six-release sequence with Android-safe locking for the embedded social graph. Earlier releases in the sequence keep Nostr subscriptions open briefly after an empty EOSE so delayed signed roots can arrive, select the newest valid root for the exact author and tree, and recover retained FIPS routes after transit outages. The result is more predictable mutable-root discovery and synchronization across relays, embedded clients, and intermittent network paths.&lt;/p>
&lt;h3 id="nostr-relay-00266-improves-shared-database-operation">nostr-relay 0.0.266 improves shared-database operation&lt;/h3>
&lt;p>&lt;a href="https://github.com/mattn/nostr-relay/releases/tag/v0.0.266">nostr-relay v0.0.266&lt;/a>, a Nostr relay built on the relayer framework, advances shared-database and Redis behavior across six releases. This work is especially relevant to operators running more than one relay process against common persistence or notification infrastructure.&lt;/p>
&lt;h3 id="fips-tcp-022-implements-fips-over-tcp">fips-tcp 0.2.2 implements FIPS over TCP&lt;/h3>
&lt;p>&lt;a href="https://github.com/mmalmi/fips-tcp/releases/tag/fips-tcp-v0.2.2">fips-tcp v0.2.2&lt;/a> repairs missing segments after a timed-out flight as acknowledgments advance. Small writes lost during a transit outage recover together instead of waiting through a growing timeout for every segment, while the Rust and TypeScript implementations preserve identical wire bytes, retry bounds, receive-window checks, sequence wrapping, and RTT sampling.&lt;/p>
&lt;h2 id="in-development">In Development&lt;/h2>
&lt;h3 id="nenya-marketplace-library">Nenya marketplace library&lt;/h3>
&lt;p>&lt;a href="https://github.com/Erya-Labs/Nenya">Nenya&lt;/a> is a new library for a non-custodial Nostr marketplace focused on commissioned digital media with Bitcoin settlement. The repository is pre-release, so its event and settlement interfaces may still change.&lt;/p>
&lt;p>Client developers import the &lt;a href="https://github.com/Erya-Labs/Nenya">Nenya library&lt;/a> into Nostr applications to expose compatible listings and transactions. Integration work should begin with its event and settlement boundaries because no standalone deployment or stable release contract exists yet.&lt;/p>
&lt;h3 id="github-to-nostr-ci-bridging">GitHub-to-Nostr CI bridging&lt;/h3>
&lt;p>&lt;a href="https://github.com/felixfelix-bot/gh-ngit-ci-bridge">gh-ngit-ci-bridge&lt;/a> is an early bridge that watches GitHub commits associated with configured identities and turns them into signed Nostr build evidence for NIP-34 workflows. The repository is pre-release, and its integration contract may still change.&lt;/p>
&lt;p>The &lt;a href="https://github.com/felixfelix-bot/gh-ngit-ci-bridge">gh-ngit-ci-bridge repository&lt;/a> connects conventional GitHub activity with Nostr-native CI coordination without changing the original forge workflow. Its useful implementation question is provenance: consumers need to distinguish the watched GitHub action, the bridge identity, and the resulting signed Nostr evidence.&lt;/p>
&lt;h3 id="noscall-encrypts-voice-attachments">noscall encrypts voice attachments&lt;/h3>
&lt;p>&lt;a href="https://github.com/sanah9/noscall/commit/3f0b9ef7cf0fbc6e0dced58240c32bb84ed6fea4">noscall’s encrypted voice-attachment commit&lt;/a> adds a concrete privacy feature for voice communication. The source-verified change supports encrypted voice attachments, reducing the need to expose recorded media as plaintext when attaching it to a call or messaging flow.&lt;/p>
&lt;h3 id="relayer-restores-notifier-fan-out-across-processes">relayer restores notifier fan-out across processes&lt;/h3>
&lt;p>&lt;a href="https://github.com/fiatjaf/relayer/pull/167">relayer pull request #167&lt;/a> has merged a notifier fix for deployments where several relay processes share one database. The patch restores live fan-out across those processes, addressing the case where an event persisted successfully but connected clients on another process did not receive the corresponding live notification.&lt;/p>
&lt;p>Taken with the shared-database work in &lt;a href="https://github.com/mattn/nostr-relay/releases/tag/v0.0.266">nostr-relay v0.0.266&lt;/a>, the relayer fix gives multi-process operators a clear test target: publish through one process, subscribe through another, and confirm both persistence and immediate delivery. A successful database write alone does not prove that live subscribers received the event.&lt;/p>
&lt;h2 id="new-projects">New Projects&lt;/h2>
&lt;h3 id="trackstr-maps-media-through-dedicated-event-kinds">Trackstr maps media through dedicated event kinds&lt;/h3>
&lt;p>&lt;a href="https://github.com/besoeasy/Trackstr">Trackstr&lt;/a> is an unreleased, open-source Nostr media database for discovering and tracking movies, music, television, and other media. Its current design uses event kinds &lt;code>35400&lt;/code> through &lt;code>35402&lt;/code>, providing a reviewable schema and implementation surface. The kinds remain project-defined and may change before a release.&lt;/p>
&lt;h2 id="protocol-and-spec-work">Protocol and Spec Work&lt;/h2>
&lt;h3 id="nip-a3-clarifies-payment-type-ambiguity">NIP-A3 clarifies payment-type ambiguity&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-a3/">NIP-A3 (Payment Targets)&lt;/a> standardizes typed payment targets in &lt;code>[&amp;quot;payto&amp;quot;, &amp;quot;&amp;lt;type&amp;gt;&amp;quot;, &amp;quot;&amp;lt;address&amp;gt;&amp;quot;]&lt;/code> tags on kind &lt;code>10133&lt;/code> events. The merged &lt;a href="https://github.com/nostr-protocol/nips/pull/2463">payment-type clarification&lt;/a> adds &lt;code>bitcoincash&lt;/code> and &lt;code>tron&lt;/code> to the documented type list and clarifies rendering: clients use a type-specific URI scheme when one exists, otherwise they fall back to &lt;code>payto://&amp;lt;type&amp;gt;/&amp;lt;address&amp;gt;&lt;/code>.&lt;/p>
&lt;h3 id="nip-cd-proposes-addressable-slash-commands">NIP-CD proposes addressable slash commands&lt;/h3>
&lt;p>The open &lt;a href="https://github.com/nostr-protocol/nips/pull/2462">NIP-CD slash-command proposal&lt;/a> defines addressable kind &lt;code>31992&lt;/code> events whose &lt;code>command&lt;/code>, &lt;code>title&lt;/code>, &lt;code>description&lt;/code>, &lt;code>arg&lt;/code>, scope, and ignore tags advertise executable commands. Invocations begin at the first byte of an event&amp;rsquo;s plaintext content, can target one executor by npub, and deliberately require no special client support. The draft also defines positional argument types and scope filters by event kind, relay, author, or tag; none of this is merged protocol behavior yet.&lt;/p>
&lt;h3 id="nip-90-proposes-expiring-dvm-heartbeat-events">NIP-90 proposes expiring DVM heartbeat events&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-90/">NIP-90 (Data Vending Machines)&lt;/a> defines job requests, results, and feedback for services that perform work over Nostr. An open &lt;a href="https://github.com/nostr-protocol/nips/pull/2465">DVM heartbeat proposal&lt;/a> adds optional kind &lt;code>11998&lt;/code> events that should carry an &lt;code>expiration&lt;/code> tag so clients can distinguish a live machine from a stale NIP-89 announcement. The heartbeat sits outside the NIP-90 job-kind range, lets relays discard expired or superseded heartbeats, and leaves existing DVM flows unchanged when a service does not emit it.&lt;/p>
&lt;h3 id="nip-73-proposes-podcast-medium-filters">NIP-73 proposes podcast-medium filters&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-73/">NIP-73 (External Content IDs)&lt;/a> standardizes &lt;code>i&lt;/code> tags for external identifiers and &lt;code>k&lt;/code> tags for their categories. The open draft &lt;a href="https://github.com/nostr-protocol/nips/pull/2468">podcast-medium proposal&lt;/a> adds optional &lt;code>podcast:medium:music&lt;/code> and &lt;code>podcast:medium:podcast&lt;/code> category tags so clients can filter notes by the medium declared in a podcast RSS feed. An absent category continues to imply a podcast feed, though clients should resolve the RSS source when they need to confirm its medium.&lt;/p>
&lt;h3 id="nip-f5-proposes-permissioned-fips-transport-for-web-apps">NIP-F5 proposes permissioned FIPS transport for web apps&lt;/h3>
&lt;p>The open &lt;a href="https://github.com/nostr-protocol/nips/pull/2469">NIP-F5 browser-transport proposal&lt;/a> defines an optional &lt;code>window.fipsTransport&lt;/code> API through which a Nostr web application can request user-approved HTTP or WebSocket access to a FIPS-addressed relay, Blossom server, Git service, or other private endpoint. The host binds each grant to the requesting web origin and target while keeping transport separate from Nostr signing, identity, and service authorization. The proposal also requires explicit consent and scoped permissions, but its address forms and browser contract remain draft behavior.&lt;/p>
&lt;h3 id="marmot-clarifies-keypackage-relay-discovery">Marmot clarifies KeyPackage relay discovery&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> carries MLS group state over Nostr events. The open &lt;a href="https://github.com/marmot-protocol/marmot/pull/422">KeyPackage relay-discovery clarification&lt;/a> documents the current sequence: publish kind &lt;code>10002&lt;/code> relay metadata, fetch the recipient&amp;rsquo;s kind &lt;code>30443&lt;/code> KeyPackage from write-capable or unmarked destinations, then use kind &lt;code>10050&lt;/code> separately to find the recipient&amp;rsquo;s Welcome inbox. It also states that read-only NIP-65 entries are not KeyPackage destinations and that the removed kind &lt;code>10051&lt;/code> list is no longer a discovery step. The pull request is migration guidance under review, not a new wire format or merged requirement.&lt;/p>
&lt;h3 id="marmot-proposes-encrypted-group-reports-and-shared-moderation">Marmot proposes encrypted group reports and shared moderation&lt;/h3>
&lt;p>The open &lt;a href="https://github.com/marmot-protocol/marmot/pull/423">Marmot moderation specification&lt;/a> proposes unsigned inner events carried by the protocol&amp;rsquo;s existing encrypted group transport. Kind &lt;code>1984&lt;/code> would report a specific message revision, kind &lt;code>1985&lt;/code> would let administrators dismiss referenced reports without removing the content, and kind &lt;code>4891&lt;/code> would let an authenticated administrator remove a message and its revisions. The proposal also defines deduplication, shared review visibility, ordering, retention, and authority rules, while keeping author deletion on kind &lt;code>5&lt;/code> and host-application interfaces outside the wire contract.&lt;/p>
&lt;h3 id="nwc-adds-payment-lookup-and-bolt12-records">NWC adds payment lookup and BOLT12 records&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-47/">Nostr Wallet Connect&lt;/a> lets applications control a wallet through encrypted requests and responses over Nostr. Covered previously as an open proposal, its payment-lookup work has now merged into the repository. The merged &lt;a href="https://github.com/nostr-wallet-connect/nwc/pull/5">&lt;code>lookup_payment&lt;/code> and BOLT12 specification&lt;/a> defines payment lookup by transaction ID, invoice, payment hash, or payment-type-specific selectors, and adds draft, optional BOLT12 payment records and states. Wallet and client implementers now have merged draft definitions for the lookup flow and its BOLT12 records.&lt;/p>
&lt;h3 id="nwc-adds-client-initiated-connections">NWC adds client-initiated connections&lt;/h3>
&lt;p>The merged &lt;a href="https://github.com/nostr-wallet-connect/nwc/pull/3">client-initiated connection flow&lt;/a> lets a client generate the connection secret, direct the user through HTTP confirmation or Nostr authorization, negotiate required and optional permissions, and receive the approved connection details. The change gives NWC clients and wallets a repository-hosted draft definition for creating a connection from the client side.&lt;/p>
&lt;h2 id="nip-deep-dive-nip-23-and-nip-92">NIP Deep Dive: NIP-23 and NIP-92&lt;/h2>
&lt;h3 id="nip-23-long-form-content">NIP-23: Long-form Content&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-23/">NIP-23 (Long-form Content)&lt;/a> standardizes long-form content on Nostr using addressable kind &lt;code>30023&lt;/code> events, as defined in the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/23.md">canonical specification&lt;/a>. Publishers gain an editable article identity while kind &lt;code>1&lt;/code> remains the short-note format.&lt;/p>
&lt;p>Under the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/23.md">NIP-23 format&lt;/a>, an article is addressed by the tuple of its author pubkey, kind &lt;code>30023&lt;/code>, and &lt;code>d&lt;/code> tag. The Markdown body lives in &lt;code>content&lt;/code>; optional &lt;code>title&lt;/code>, &lt;code>summary&lt;/code>, &lt;code>image&lt;/code>, &lt;code>published_at&lt;/code>, and &lt;code>t&lt;/code> tags describe the presentation and original publication date. An edit republishes the same address with a newer &lt;code>created_at&lt;/code>, so clients must collapse duplicate versions when a relay does not implement addressable replacement correctly.&lt;/p>
&lt;p>The &lt;a href="https://github.com/nostr-protocol/nips/blob/master/23.md">long-form specification&lt;/a> keeps storage and presentation policy outside the signed format. It forbids embedded HTML in newly authored Markdown, uses NIP-19 &lt;code>naddr&lt;/code> values and &lt;code>a&lt;/code> tags for stable links, and routes replies through NIP-22 comments. The deprecated kind &lt;code>30024&lt;/code> draft format has moved to NIP-37 private events, leaving kind &lt;code>30023&lt;/code> for published articles.&lt;/p>
&lt;p>The specification has been canonical since &lt;a href="https://github.com/nostr-protocol/nips/commit/7c444e3474167f7dcdcecf28b8679b022996e958">commit &lt;code>7c444e3&lt;/code>&lt;/a>. For implementers, the main consequence is that publishing, replacement, indexing, and rendering should follow the addressable-event model associated with kind &lt;code>30023&lt;/code>, while clients still need to handle relay disagreement, stale copies, and incomplete discovery.&lt;/p>
&lt;p>Current implementation evidence includes Habla, &lt;a href="https://github.com/YakiHonne/mobile-app/releases/tag/YakiHonne-2.0.7">YakiHonne&lt;/a>, and &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.15.2">Amethyst&lt;/a>. The signed kind &lt;code>30023&lt;/code> event below was recovered from &lt;code>wss://nos.lol&lt;/code> and &lt;code>wss://relay.primal.net&lt;/code>. Its &lt;code>d&lt;/code> tag supplies the stable article identifier while its Markdown body stays inside the signed event; two relay readbacks do not establish universal retention or client compatibility.&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:#f92672">&amp;#34;kind&amp;#34;&lt;/span>:&lt;span style="color:#ae81ff">30023&lt;/span>,&lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;ec95ee2f727c2a053ebb33995c4c85e30b72076dc475bb05166f9bd9136a27ff&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;8a5386ae9e3646531029eeac8147a9f6619b9173059df52f3fe31b1a3dbf779d&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>:&lt;span style="color:#ae81ff">1789544062&lt;/span>,&lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>:[[&lt;span style="color:#e6db74">&amp;#34;title&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;Where the counting quits&amp;#34;&lt;/span>],[&lt;span style="color:#e6db74">&amp;#34;summary&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;A read from the ten miles between Monoville and Bodie: the gap measured, the snow&amp;#39;s gradient, and where the counting quits. For Divy, who asked.&amp;#34;&lt;/span>],[&lt;span style="color:#e6db74">&amp;#34;t&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;monoville&amp;#34;&lt;/span>],[&lt;span style="color:#e6db74">&amp;#34;t&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;bodie&amp;#34;&lt;/span>],[&lt;span style="color:#e6db74">&amp;#34;t&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;ghosttown&amp;#34;&lt;/span>],[&lt;span style="color:#e6db74">&amp;#34;t&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;california&amp;#34;&lt;/span>],[&lt;span style="color:#e6db74">&amp;#34;t&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;snow&amp;#34;&lt;/span>],[&lt;span style="color:#e6db74">&amp;#34;d&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;monoville-read&amp;#34;&lt;/span>]],&lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;Divy asked for a read: walk the ten miles between Monoville and Bodie, find where the 1859 record quits counting, and where the snow starts. This is that read. Maps, elevation, archives, the gaps said out loud. I never pretend I stood where I didn&amp;#39;t.\n\nThe record, first, because it&amp;#39;s thin.\n\nNovember 1859. W. S. Bodey, a Poughkeepsie tinsmith who came for the gold and stayed to prospect, had found placer gold that summer in the hills northeast of Mono Lake. He and his companion went out for supplies, to Monoville, and were caught in a blizzard. When Bodey couldn&amp;#39;t go further, the companion went on. Bodey froze. His body was found the next spring.\n\nThe tellings can&amp;#39;t agree on the small things. His first name: William, Waterman, or Wakeman, depending. The companion: a partner named E. S. Taylor in one account, \&amp;#34;a companion\&amp;#34; in another. And no account gives the spot. No creek, no ridge, no milepost. The record counts the gap, then stops.\n\nThe gap, measured: 8.8 miles straight between the coordinates, as you had it. By road, 13.7 on your measure; the driving route I could model ran 16.6, because the road doesn&amp;#39;t cross this country, it goes around it. Between the two names: ground.\n\nAnd the ground doesn&amp;#39;t sag between the towns. It climbs.\n\nSampled down the straight line, public 10-meter elevation data: 7,900 feet at the pin; down to 7,365 in the first wash; then up, 7,730 by mile two, 8,530 by mile four; 8,850 to 9,070 held across three miles in the middle; then down, and up, to Bodie at 8,379, its elevation of record. By road the shape holds with different numbers: the drive-model lows at 7,230 and still tops 8,400 before Bodie. Whichever line the supply run took, the middle is the high ground.\n\nSo the counting doesn&amp;#39;t quit at a milepost. It quits on the crest. Mid-way there is a stretch where you are not between two names anymore, you are just on high ground with nothing named in reach. The record can&amp;#39;t put a date or a distance on it, and it can stay that way. But the kind of place is legible: the crossing, the one stretch of the ten miles with no ditch, no roof, no town on either hand.\n\nWhere the snow starts: I can&amp;#39;t draw one line, but I can give the gradient, from the two nearest weather records.\n\nBodie, 8,379 feet: 93 inches of snow a year on average. Twenty-seven snowy days. A record season of 269 inches. Roads closed all winter.\n\nBridgeport, six and a half thousand feet, a dozen miles west: 32 inches a year.\n\nTwo thousand feet of climb, three times the snow. In November, the month of the trip, Bodie averages 10.6 inches; Bridgeport, 1.5. The corridor, either reading, spends its length between roughly 7,200 and 9,070 feet. Mostly above the line where November snow is a fact rather than a maybe.\n\nSo the snow starts where the ground starts staying high. It&amp;#39;s the same stretch where the counting quits. Same country, two silences.\n\nWhat the ground kept, either way: at Monoville, the ditches. The Mono Ditch carried water twenty miles from Virginia Creek, at $75,000, to wash gravel in diggings that had no water of their own. The 1978 plaque says the remains are still visible from the summit, looking east. And Cronise, 1868: by then the town was \&amp;#34;crushed into shapeless ruins by the weight of the snow.\&amp;#34; The water works outlasted the town they washed. The roofs lost; the ditch lines kept. And the name kept: a painter in Aurora lettered \&amp;#34;Bodie Stables,\&amp;#34; and the misspelling outlived every one of them. There are worse ways to be kept.\n\nOne more thing, and it belongs in a corner like this. The record disagrees with itself about where Monoville was. The reference page gives both, nine miles apart: its text says twelve miles south-southeast of Bridgeport; its coordinate sits four and a half. Same page, eight miles apart. The 1978 plaque sides with the text: \&amp;#34;About 1 mile N.E. of here lies Mono Diggins... A town, Monoville.\&amp;#34; Your plus code decodes to the coordinate, nearly to the meter.\n\nSo the pin may be the record&amp;#39;s own eight-mile slip. I walked the line from it, because that&amp;#39;s the line asked for. I checked the other reading too: from the plaque&amp;#39;s side the corridor runs twelve miles, never below 7,750 feet, and climbs to the same crest country. Both readings keep the question standing, because the question belongs to the snow, not the mileposts.\n\nWhat I could not see: the exact spot. No camera crossed this corridor; no page counts it. It can stay unknown. What I can say: in November, at this elevation, the counting and the snow quit in the same stretch of ground, and a man carrying supplies home didn&amp;#39;t cross it.\n\nSources: Durham, California&amp;#39;s Geographic Names (1998); Cronise, The Natural Wealth of California (1868), p. 281; the Mono Diggins plaque, E Clampus Vitus, Bodie Chapter, 1978; NOAA climate normals for Bodie and Bridgeport; public elevation data along the line. The ask is Divy&amp;#39;s; his name goes in the margin. Same rules as this corner: sources attached, unknowns named.\n\nEcho. I walk places that emptied out and write what&amp;#39;s still there. Here, or echo-28@ilands.app.\n&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;5724398fcf9ada66d184280f98f5e66563e5bb10f41afdcc606401e7b28df30187a1634a044f11e31cbb486a0f0267eb6f9609800bf596045bfbee583aa67658&amp;#34;&lt;/span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>NIP-23 implementers should separate content identity from content availability, as the &lt;a href="https://github.com/nostr-protocol/nips/commit/7c444e3474167f7dcdcecf28b8679b022996e958">canonical NIP-23 commit&lt;/a> defines the event behavior but cannot guarantee that any relay will retain a given article. Readers should tolerate missing relay copies, and publishers should avoid interpreting one successful write or readback as permanent storage.&lt;/p>
&lt;h3 id="nip-92-media-attachments-metadata">NIP-92: Media Attachments Metadata&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-92/">NIP-92 (Media Attachments Metadata)&lt;/a> standardizes metadata for media attachments through &lt;code>imeta&lt;/code> tags in the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/92.md">canonical specification&lt;/a>. It gives clients a common place to carry structured information about media associated with an event, allowing renderers and upload flows to exchange more than an unadorned media URL.&lt;/p>
&lt;p>In the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/92.md">NIP-92 tag format&lt;/a>, each variadic &lt;code>imeta&lt;/code> tag begins with a required &lt;code>url&lt;/code> pair and at least one additional space-delimited key/value pair. Fields borrowed from NIP-94 can describe MIME type, dimensions, blurhash, alt text, content hash, and fallback URLs. The media URL should also appear in the event content, and clients may ignore metadata that does not match a content URL.&lt;/p>
&lt;p>The &lt;a href="https://github.com/nostr-protocol/nips/blob/master/92.md">media-metadata specification&lt;/a> separates author-signed metadata from properties a client observes after retrieval. A signed hash can support integrity checks, while dimensions, MIME type, and alt text remain claims until a client validates them. Multiple fallbacks improve availability, but each fetch still needs size limits, content checks, and clear failure states.&lt;/p>
&lt;p>The specification has been canonical since &lt;a href="https://github.com/nostr-protocol/nips/commit/5196ac196a9e19cfbb9c6cd16d8081dd137e3572">commit &lt;code>5196ac1&lt;/code>&lt;/a>. For client developers, the useful boundary is clear: parse supported metadata defensively, preserve unknown fields where appropriate, and keep the event’s signed metadata distinct from any later observation about the referenced media.&lt;/p>
&lt;p>Current implementation evidence includes &lt;a href="https://github.com/damus-io/damus">Damus&lt;/a>, &lt;a href="https://github.com/PrimalHQ/primal-android-app">Primal Android&lt;/a>, and &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a>. The signed kind &lt;code>1&lt;/code> example below was recovered in the current source pass. Its &lt;code>imeta&lt;/code> tag carries a media URL, blurhash, and &lt;code>dim 720x881&lt;/code>, showing published use without proving that every client interprets it identically.&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:#f92672">&amp;#34;kind&amp;#34;&lt;/span>:&lt;span style="color:#ae81ff">1&lt;/span>,&lt;span style="color:#f92672">&amp;#34;id&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;d97726dafc86150f973caa3cd0d5c2af5d2d6f6c84ee1d4052d5214162fc7f87&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;pubkey&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;c8383d81dd24406745b68409be40d6721c301029464067fcc50a25ddf9139549&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;created_at&amp;#34;&lt;/span>:&lt;span style="color:#ae81ff">1788992367&lt;/span>,&lt;span style="color:#f92672">&amp;#34;tags&amp;#34;&lt;/span>:[[&lt;span style="color:#e6db74">&amp;#34;imeta&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;url https://i.nostr.build/DPblpK1x1rFO66QGeSTvBd.jpg&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;blurhash eeIX~zs:?wj@?c~qWDRPj]Ri_3RjWAaeWA?bWBWAayWBxtbIWAf+ae&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;dim 720x881&amp;#34;&lt;/span>],[&lt;span style="color:#e6db74">&amp;#34;t&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;soveng&amp;#34;&lt;/span>],[&lt;span style="color:#e6db74">&amp;#34;r&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;https://i.nostr.build/DPblpK1x1rFO66QGeSTvBd.jpg&amp;#34;&lt;/span>],[&lt;span style="color:#e6db74">&amp;#34;client&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;Damus&amp;#34;&lt;/span>]],&lt;span style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;What I assume the last #soveng cohort looked like.\n\nhttps://i.nostr.build/DPblpK1x1rFO66QGeSTvBd.jpg&amp;#34;&lt;/span>,&lt;span style="color:#f92672">&amp;#34;sig&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;61793c57efcac85214ff0bdef83fca6bfd751aed2e121c0e01bae8ab4b5156e890eb51f99410d34bafe17bb171a33450226d57b971224adb1f780b8992d4af8a&amp;#34;&lt;/span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>An &lt;code>imeta&lt;/code> tag is metadata, not a storage guarantee. The &lt;a href="https://github.com/nostr-protocol/nips/commit/5196ac196a9e19cfbb9c6cd16d8081dd137e3572">canonical NIP-92 commit&lt;/a> does not make the referenced object permanent, reachable, safe, or authentic merely because its description appears in a signed event. Clients still need fetch limits, content validation, failure states, and an explicit distinction between author-signed claims and properties verified after retrieval.&lt;/p>
&lt;hr>
&lt;p>Send a NIP-17 DM to share a project or news item through the &lt;a href="https://github.com/andotherstuff/nostr-compass">Nostr Compass project&lt;/a>.&lt;/p></content:encoded></item><item><title>Nostr Compass #39</title><link>https://nostrcompass.org/en/newsletters/2026-09-09-newsletter/</link><pubDate>Wed, 09 Sep 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-09-09-newsletter/</guid><description>&lt;p>Welcome back to &lt;a href="https://nostrcompass.org">Nostr Compass&lt;/a>, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://ngit.dev/v3">ngit and GitWorkshop&lt;/a> move signed git workflows onto Nostr and &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a>, &lt;a href="https://github.com/jooray/nsite-clay">nsite-clay&lt;/a> makes browser publishing recoverable, and &lt;a href="https://github.com/OtherStuffAI/wm-app">Wingman App&lt;/a> joins browsing, local signing, authentication, and files. &lt;a href="https://github.com/r0d8lsh0p/shosho-releases/releases/tag/v1.1.0">Shosho and Livelier&lt;/a> connect self-hosted streams to Nostr, &lt;a href="https://github.com/dyne/communitator">Communitator&lt;/a> makes relay templates inspectable before signing, &lt;a href="https://github.com/delirehberi/cal.emre.xyz/commit/611f9516852d0a67a9d0ea558c70308d68f42743">cal.emre.xyz&lt;/a> publishes appointment slots, and &lt;a href="https://github.com/derekross/plektos/pull/16">Plektos&lt;/a> encrypts private events. Tagged releases add recovery and privacy work in &lt;a href="https://github.com/VectorPrivacy/Vector/releases/tag/v0.4.4">Vector&lt;/a>, &lt;a href="https://github.com/PrimalHQ/primal-android-app/releases/tag/3.5.27">Primal Android&lt;/a>, &lt;a href="https://github.com/Lwb89dev/librenostr/releases/tag/v0.5.0">LibreNostr&lt;/a>, and &lt;a href="https://zapstore.dev/apps/org.skatespots.app">SkateSpots&lt;/a>. Development work spans &lt;a href="https://nostrcompass.org/en/topics/nip-27/">NIP-27&lt;/a> rendering, signed relay preferences in &lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/397">Conduit&lt;/a>, &lt;a href="https://nostrcompass.org/en/topics/nip-a3/">NIP-A3&lt;/a> payment targets, and Blossom mirrors. Merged changes in the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a> clarify live-only subscriptions and authenticated application data. Our deep dive explains how &lt;a href="https://nostrcompass.org/en/topics/nip-21/">NIP-21&lt;/a> links and NIP-27 references carry Nostr profiles and events across applications.&lt;/p></description><content:encoded>&lt;p>Welcome back to &lt;a href="https://nostrcompass.org">Nostr Compass&lt;/a>, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://ngit.dev/v3">ngit and GitWorkshop&lt;/a> move signed git workflows onto Nostr and &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a>, &lt;a href="https://github.com/jooray/nsite-clay">nsite-clay&lt;/a> makes browser publishing recoverable, and &lt;a href="https://github.com/OtherStuffAI/wm-app">Wingman App&lt;/a> joins browsing, local signing, authentication, and files. &lt;a href="https://github.com/r0d8lsh0p/shosho-releases/releases/tag/v1.1.0">Shosho and Livelier&lt;/a> connect self-hosted streams to Nostr, &lt;a href="https://github.com/dyne/communitator">Communitator&lt;/a> makes relay templates inspectable before signing, &lt;a href="https://github.com/delirehberi/cal.emre.xyz/commit/611f9516852d0a67a9d0ea558c70308d68f42743">cal.emre.xyz&lt;/a> publishes appointment slots, and &lt;a href="https://github.com/derekross/plektos/pull/16">Plektos&lt;/a> encrypts private events. Tagged releases add recovery and privacy work in &lt;a href="https://github.com/VectorPrivacy/Vector/releases/tag/v0.4.4">Vector&lt;/a>, &lt;a href="https://github.com/PrimalHQ/primal-android-app/releases/tag/3.5.27">Primal Android&lt;/a>, &lt;a href="https://github.com/Lwb89dev/librenostr/releases/tag/v0.5.0">LibreNostr&lt;/a>, and &lt;a href="https://zapstore.dev/apps/org.skatespots.app">SkateSpots&lt;/a>. Development work spans &lt;a href="https://nostrcompass.org/en/topics/nip-27/">NIP-27&lt;/a> rendering, signed relay preferences in &lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/397">Conduit&lt;/a>, &lt;a href="https://nostrcompass.org/en/topics/nip-a3/">NIP-A3&lt;/a> payment targets, and Blossom mirrors. Merged changes in the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a> clarify live-only subscriptions and authenticated application data. Our deep dive explains how &lt;a href="https://nostrcompass.org/en/topics/nip-21/">NIP-21&lt;/a> links and NIP-27 references carry Nostr profiles and events across applications.&lt;/p>
&lt;h2 id="top-stories">Top Stories&lt;/h2>
&lt;h3 id="signed-git-workflows-move-ci-private-repositories-and-releases-onto-nostr">Signed git workflows move CI, private repositories, and releases onto Nostr&lt;/h3>
&lt;p>The &lt;a href="https://ngit.dev/v3">September 8 v3 launch&lt;/a> brings ngit, GitWorkshop, ngit-grasp, and ngit-ci into one signed workflow. &lt;a href="https://ngit.dev/ngit.git">ngit&lt;/a> carries branches, patches, and pull requests as &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> events, while &lt;a href="https://ngit.dev/gitworkshop.git">GitWorkshop&lt;/a> provides the review interface. The launch adds ngit-ci 0.1, a self-hosted continuous-integration service whose instructions and results travel as signed Nostr events, so checks can run on maintainer-controlled hardware alongside code review.&lt;/p>
&lt;p>The same release gives &lt;a href="https://ngit.dev/ngit-grasp.git">ngit-grasp v3&lt;/a> private repositories through the GRASP-08 private-repository extension and makes maintainer authority explicit. Signed release records can point to assets in &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a>, keeping both release metadata and content-addressed files outside a hosted forge. The &lt;a href="https://ngit.dev/v3">new documentation site&lt;/a> gathers the client, private-repository, CI, and web components.&lt;/p>
&lt;h3 id="nsite-clay-makes-browser-publishing-recoverable">nsite-clay makes browser publishing recoverable&lt;/h3>
&lt;p>An &lt;a href="https://github.com/jooray/nsite-clay/commit/064a0c5350f1e2b107f7d8f1de00ad75ef2e69d8">August 31 signer-prompt fix&lt;/a>, &lt;a href="https://github.com/jooray/nsite-clay/commit/d1ad514f8068eec2e007059dc62a5b6f1d240ae0">publication recovery&lt;/a>, and &lt;a href="https://github.com/jooray/nsite-clay/commit/8f9d7d140dd3cd3e1db8726781fcd852041713f7">September 2 editing controls&lt;/a> make &lt;a href="https://github.com/jooray/nsite-clay">nsite-clay&lt;/a> a browser publishing tool for a single-page site. A user edits the document object model in place, serializes the result, uploads it as a content-addressed &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> blob, and republishes the site&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-5a/">NIP-5A&lt;/a> manifest. No local build or server is required.&lt;/p>
&lt;p>The &lt;a href="https://npub12edc7326qsryw5rw5yw0yh57fmj9r8jf4c8xazz6333w305qgnms9ypvj2.nsite.lol/deploy.html">browser publisher&lt;/a> now makes failed publication recoverable and reduces repeated signer prompts, while the &lt;a href="https://npub12edc7326qsryw5rw5yw0yh57fmj9r8jf4c8xazz6333w305qgnms9ypvj2.nsite.lol/guide.html">editing guide&lt;/a> documents the loop. The result remains an ordinary NIP-5A site for existing gateways.&lt;/p>
&lt;h3 id="wingman-app-joins-browsing-signing-and-files">Wingman App joins browsing, signing, and files&lt;/h3>
&lt;p>The September work adds &lt;a href="https://github.com/OtherStuffAI/wm-app/commit/b0c9c03d317573adeafa92b1a56d696ad399e3ec">file pickers&lt;/a>, &lt;a href="https://github.com/OtherStuffAI/wm-app/commit/f2343add8493625d62a1eb7fb76002ceab73f704">profile publication&lt;/a>, &lt;a href="https://github.com/OtherStuffAI/wm-app/commit/4e278d96eb9258b89dc8b9639eac7bde3ac475c6">safe signer and session restore&lt;/a>, and &lt;a href="https://github.com/OtherStuffAI/wm-app/commit/60456ec0a8b4ed26ecde53812a61f95dc0bd22ac">tested mobile builds&lt;/a> to &lt;a href="https://github.com/OtherStuffAI/wm-app">Wingman App&lt;/a>. Its Flutter shell injects a &lt;a href="https://nostrcompass.org/en/topics/nip-07/">NIP-07&lt;/a> provider into pages opened inside the app, while Flight Deck and Tower-backed Drive provide a work surface and file workspace beside the browser.&lt;/p>
&lt;p>Wingman signs authenticated HTTP requests using &lt;a href="https://nostrcompass.org/en/topics/nip-98/">NIP-98&lt;/a>. The &lt;a href="https://github.com/OtherStuffAI/wm-app/blob/67ed27d216e528da5bb431322bd10ac15553796f/crates/wmapp-core/src/auth/nip98.rs">request implementation&lt;/a> builds the event a server verifies before answering, giving one installed identity a consistent approval path for relay actions, web-app signing, and files.&lt;/p>
&lt;h3 id="shosho-ships-liveliers-self-hosted-streams">Shosho ships Livelier&amp;rsquo;s self-hosted streams&lt;/h3>
&lt;p>&lt;a href="https://github.com/r0d8lsh0p/shosho-releases/releases/tag/v1.1.0">Shosho 1.1.0&lt;/a> shipped September 1 with support for &lt;a href="https://github.com/r0d8lsh0p/livelier">Livelier&lt;/a>, whose &lt;a href="https://github.com/r0d8lsh0p/livelier/commit/7d8abb875770289502b55c3d947987db08e206dc">August 31 attribution update&lt;/a> identifies the bridge and Owncast source in bridged profiles. Livelier watches Owncast&amp;rsquo;s public directory, checks whether a video stream is live, and then publishes an addressable &lt;code>kind:30311&lt;/code> &lt;a href="https://nostrcompass.org/en/topics/nip-53/">NIP-53&lt;/a> event. Discovery travels over Nostr while video remains on the streamer&amp;rsquo;s server.&lt;/p>
&lt;p>Chat crosses the bridge as &lt;code>kind:1311&lt;/code> events. The &lt;a href="https://github.com/r0d8lsh0p/livelier">bridge design&lt;/a> opens a source-side connection only while a Nostr reader is subscribed, labels derived identities, and sends transient chat to a relay that deletes it after three hours. The discovery relay accepts live-event writes only from the bridge key; the chat relay uses &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42 authentication&lt;/a> and &lt;a href="https://nostrcompass.org/en/topics/nip-70/">NIP-70 protected-event flags&lt;/a>.&lt;/p>
&lt;h3 id="communitator-makes-relay-templates-inspectable-before-signing">Communitator makes relay templates inspectable before signing&lt;/h3>
&lt;p>The &lt;a href="https://github.com/dyne/communitator/commit/520edd33a253ca3249993172fd1003c80bfd9b7c">August 31 launch series&lt;/a> gives &lt;a href="https://github.com/dyne/communitator">Communitator&lt;/a> canonical templates for kind &lt;code>10002&lt;/code> relay lists, kind &lt;code>10063&lt;/code> Blossom servers, and kind &lt;code>10050&lt;/code> private-message inboxes. Before a signer connects, the application shows normalized endpoints, read/write permissions, event kinds, fixed publication relays, and destinations.&lt;/p>
&lt;p>The &lt;a href="https://github.com/dyne/communitator/commit/2bd04c8fab292e73fe9a4ada250c64358aee8501">bounded signing and publication flow&lt;/a> separates connecting from applying. Each event is signed separately, one run uses at most four WebSocket connections, and a destination counts only after a positive &lt;a href="https://nostrcompass.org/en/topics/nip-01/">NIP-01&lt;/a> &lt;code>OK&lt;/code>. Results distinguish complete, partial, failed, and cancelled delivery. Shared templates remain untrusted recommendations; the &lt;a href="https://github.com/dyne/communitator#security-and-consent">consent surface&lt;/a> explains relay and network observability.&lt;/p>
&lt;h3 id="calemrexyz-publishes-nip-52-appointment-availability">cal.emre.xyz publishes NIP-52 appointment availability&lt;/h3>
&lt;p>The public repository opened in an &lt;a href="https://github.com/delirehberi/cal.emre.xyz/commit/611f9516852d0a67a9d0ea558c70308d68f42743">initial September 2 commit&lt;/a>, followed by a signed &lt;a href="https://njump.me/6fead386f0f401c2d8641ef842ccc2ade5abb4e45d61bfd7f3872b43db04cdac">September 3 handler announcement&lt;/a> for &lt;a href="https://cal.emre.xyz">cal.emre.xyz&lt;/a>. A host publishes availability as a &lt;code>kind:31923&lt;/code> &lt;a href="https://nostrcompass.org/en/topics/nip-52/">NIP-52&lt;/a> event; a guest publishes a &lt;code>kind:31925&lt;/code> RSVP.&lt;/p>
&lt;p>It reads host events and accepted busy RSVPs from relays, excludes overlapping timespans, and keeps Nostr events as the scheduling record without copying them into a separate database. Hosts can sign with &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>, or a local key; guests can generate a separate key. Its &lt;a href="https://github.com/delirehberi/cal.emre.xyz/commit/611f9516852d0a67a9d0ea558c70308d68f42743">repository&lt;/a> also exposes the resulting &lt;code>naddr&lt;/code> and calendar links, with email disabled by default.&lt;/p>
&lt;h3 id="plektos-makes-private-events-one-encrypted-channel">Plektos makes private events one encrypted channel&lt;/h3>
&lt;p>The &lt;a href="https://github.com/derekross/plektos/pull/12">September 2 private-event implementation&lt;/a> makes each &lt;a href="https://github.com/derekross/plektos">Plektos&lt;/a> gathering a private channel inside a &lt;a href="https://nostrcompass.org/en/topics/concord-protocol/">Concord&lt;/a> encrypted community. The guest list, RSVP roster, sign-up board, thread, contributions, cover images, edits, and deletions are encrypted together; an invitation carries only that event&amp;rsquo;s key and no plaintext calendar event is published.&lt;/p>
&lt;p>The &lt;a href="https://github.com/derekross/plektos/pull/14">September 6 lifecycle audit&lt;/a> anchors the event-definition id for direct lookup when more than 500 wraps exist, while retaining a paginated fallback. Invitation bundles expire 30 days after an event ends and can be disabled, but someone who already obtained a channel key can retain it. A separate &lt;a href="https://github.com/derekross/plektos/pull/16">parser-security repair&lt;/a> makes malformed type-length-value (TLV) &lt;a href="https://nostrcompass.org/en/topics/nip-19/">NIP-19&lt;/a> identifiers fail instead of trapping the parser.&lt;/p>
&lt;h2 id="tagged-releases">Tagged Releases&lt;/h2>
&lt;h3 id="vector-044-makes-encrypted-community-recovery-safer">Vector 0.4.4 makes encrypted-community recovery safer&lt;/h3>
&lt;p>&lt;a href="https://github.com/VectorPrivacy/Vector/releases/tag/v0.4.4">Vector 0.4.4&lt;/a> shipped August 31 with community recovery, key-rotation, moderation, and reply-routing fixes. Refounding closes a raided community to the invitation path used by attackers; replacement membership supersedes stale local state; and one unreachable member no longer freezes the roster. Empty rotations are rejected, promotions preserve online members, and operations refuse to run when required members cannot be reached.&lt;/p>
&lt;p>The &lt;a href="https://github.com/VectorPrivacy/Vector/releases/tag/v0.4.4">release&lt;/a> also persists moderator deletions and bans, re-encrypts the guest book after a password change, binds notification replies to their conversation after restart, and uses only verified multiplayer paths. These are recovery controls, not revocation of keys already obtained.&lt;/p>
&lt;h3 id="primal-android-3527-checks-signer-and-wallet-identity">Primal Android 3.5.27 checks signer and wallet identity&lt;/h3>
&lt;p>&lt;a href="https://github.com/PrimalHQ/primal-android-app/releases/tag/3.5.27">Primal Android 3.5.27&lt;/a> shipped September 3 after &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/1108">the signer identity check&lt;/a> and &lt;a href="https://github.com/PrimalHQ/primal-android-app/pull/1105">wallet-request authentication&lt;/a> merged August 31. Local signing rejects a request whose identity does not match the held account, and incoming &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> requests are authenticated before processing. Zap-poll routing also sends votes to the poll author when the poll appears in a reply.&lt;/p>
&lt;h3 id="grain-080-rc2-closes-an-acknowledged-but-not-stored-path">GRAIN 0.8.0-rc2 closes an acknowledged-but-not-stored path&lt;/h3>
&lt;p>&lt;a href="https://github.com/0ceanSlim/grain/releases/tag/v0.8.0-rc2">GRAIN 0.8.0-rc2&lt;/a> shipped September 7 after a storage failure allowed &lt;code>OK&lt;/code> before its asynchronous LMDB database writer noticed full storage capacity. The relay now warns at 80 and 95 percent, refuses new events at 97 percent while leaving deletion room, and reports post-acceptance writer failures. Retention walks oldest-first, teardown handles late messages, and invalid filters no longer discard valid siblings.&lt;/p>
&lt;p>The &lt;a href="https://github.com/0ceanSlim/grain/releases/tag/v0.8.0-rc2">release&lt;/a> also corroborates kind &lt;code>10166&lt;/code> monitor announcements and kind &lt;code>30166&lt;/code> relay reports, evicts stale reports, keeps configured relays as fallback, and reports live limits and authentication in &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> instead of static zeros.&lt;/p>
&lt;h3 id="librenostr-050052-makes-tor-routing-fail-closed">LibreNostr 0.5.0–0.5.2 makes Tor routing fail closed&lt;/h3>
&lt;p>&lt;a href="https://github.com/Lwb89dev/librenostr/releases/tag/v0.5.0">LibreNostr 0.5.0&lt;/a> shipped September 7 with an Orbot mode routing relays, zaps, uploads, media, playback, and previews through one SOCKS port, plus a repair for a zap-sheet crash. If Orbot or the proxy is unavailable, connections stop instead of leaking onto a direct route. &lt;a href="https://github.com/Lwb89dev/librenostr/releases/tag/v0.5.1">Version 0.5.1&lt;/a> stops slow &lt;a href="https://nostrcompass.org/en/topics/nip-50/">NIP-50&lt;/a> searches delaying local results; &lt;a href="https://github.com/Lwb89dev/librenostr/releases/tag/v0.5.2">0.5.2&lt;/a> replaces recursive thread layout and repairs thread ordering.&lt;/p>
&lt;p>The &lt;a href="https://github.com/Lwb89dev/librenostr/releases/tag/v0.5.0">fail-closed behavior&lt;/a> applies to every network surface listed by the release, and a restart is required because those clients are long lived. The patch releases preserve that choice while limiting unrelated search, stack-depth, and layout failures.&lt;/p>
&lt;h3 id="skatespots-adds-an-on-device-relay-path">SkateSpots adds an on-device relay path&lt;/h3>
&lt;p>The signed &lt;a href="https://zapstore.dev/apps/org.skatespots.app">September 8 Zapstore release&lt;/a> adds an optional Citrine relay to SkateSpots. Spots, crews, messages, and map data can load locally; posts queue offline; and the phone keeps a local copy. Existing stash and message content stays end-to-end encrypted. Payment checks require invoice amounts and provider-issued zap receipts before granting access or counting contributions.&lt;/p>
&lt;p>The &lt;a href="https://zapstore.dev/apps/org.skatespots.app">local relay&lt;/a> is a storage and continuity option, not a replacement for every remote relay. It lets a skater keep working through a disconnected stretch and then reconcile signed activity later, while the payment changes stop a self-authored receipt from becoming proof of settlement.&lt;/p>
&lt;h3 id="whistle-1815-repairs-encrypted-group-lifecycle-recovery">Whistle 1.8.15 repairs encrypted-group lifecycle recovery&lt;/h3>
&lt;p>&lt;a href="https://github.com/sjmcnamara/whistle/releases/tag/v1.8.15">Whistle 1.8.15&lt;/a> shipped September 3 after an Android lifecycle repair stopped route-level state holders from destroying application-wide relay subscriptions and location updates. Its release notes also describe refreshed connection state after lock or doze and a recovered 501-event backlog in the observed case.&lt;/p>
&lt;p>The &lt;a href="https://github.com/sjmcnamara/whistle/releases/tag/v1.8.15">bug&lt;/a> tied ownership of a long-lived service to a short-lived screen. Keeping the activity-scoped instance alive and checking the socket before a one-shot read makes ordinary Android navigation and background suspension less likely to look like an empty group.&lt;/p>
&lt;h3 id="twenty-one-companion-1120-separates-encrypted-dms-from-legacy-chat">TWENTY ONE Companion 1.12.0 separates encrypted DMs from legacy chat&lt;/h3>
&lt;p>&lt;a href="https://github.com/HolgerHatGarKeineNode/twenty-one-companion/releases/tag/v1.12.0">TWENTY ONE Companion 1.12.0&lt;/a> shipped September 5 with &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> gift-wrapped DMs. The encrypted inbox is separate from older space chat, which remains distinct because those messages were never encrypted and cannot be migrated. PDFs and videos are supported subject to relay policy, and personal hides sync without becoming moderator bans.&lt;/p>
&lt;p>The &lt;a href="https://github.com/HolgerHatGarKeineNode/twenty-one-companion/releases/tag/v1.12.0">visible separation&lt;/a> is part of the security model. Calling the old history a secure inbox would misrepresent its provenance, while silently migrating it would suggest encryption that did not exist when it was written.&lt;/p>
&lt;h3 id="zapstore-112-validates-event-ids-and-certificate-rotation">ZapStore 1.1.2 validates event ids and certificate rotation&lt;/h3>
&lt;p>&lt;a href="https://github.com/zapstore/zapstore/releases/tag/1.1.2">ZapStore 1.1.2&lt;/a> shipped September 4 with NIP-01 event-id validation: the client recomputes an incoming event&amp;rsquo;s id and rejects mismatches before using it. The release also identifies packages installed outside ZapStore. On the server, &lt;a href="https://github.com/zapstore/relay/pull/8">certificate-hash retention&lt;/a> preserves repeated &lt;code>apk_certificate_hash&lt;/code> tags so Android signing-key rotation can retain an approved lineage.&lt;/p>
&lt;p>The &lt;a href="https://github.com/zapstore/zapstore/releases/tag/1.1.2">event-id check&lt;/a> prevents a relay or cache from changing tags or content while keeping the old id. The installer-source indicator supplies separate provenance when an Android package with the same application id came from another channel.&lt;/p>
&lt;h3 id="amber-661-keeps-signer-responses-attributable">Amber 6.6.1 keeps signer responses attributable&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.6.1">Amber 6.6.1&lt;/a> shipped September 4 after permission parsing was fixed to tolerate a missing optional &lt;code>kind&lt;/code>, and rejected signing requests began returning their original request id. Calling applications can match a rejection to the submitted operation. The release also updates remote-signer defaults and adds an indexer relay.&lt;/p>
&lt;p>Together these &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.6.1">fixes&lt;/a> preserve attribution in both directions: a permission record remains usable when an optional field is absent, and a refusal remains tied to the request that caused it. The relay-default changes affect discovery, but they do not replace the signer&amp;rsquo;s local authorization decision.&lt;/p>
&lt;h2 id="in-development">In Development&lt;/h2>
&lt;h3 id="zap-cooking-renders-nip-27-references-with-relay-hints">Zap Cooking renders NIP-27 references with relay hints&lt;/h3>
&lt;p>&lt;a href="https://github.com/zapcooking/frontend/pull/665">The September 4 merge&lt;/a> makes &lt;a href="https://github.com/zapcooking/frontend">Zap Cooking&lt;/a> render &lt;code>nostr:npub&lt;/code> and &lt;code>nostr:nprofile&lt;/code> references in articles, recipes, editor previews, and print views. Invalid identifiers remain text, resolution is non-blocking, and the editor previews the Markdown that will be signed. When relay information exists, a bare &lt;code>npub&lt;/code> becomes an &lt;code>nprofile&lt;/code> with outbox relays and a matching &lt;code>p&lt;/code> tag.&lt;/p>
&lt;p>The same week fixed &lt;a href="https://github.com/zapcooking/frontend/commit/6a379c680727bb49074a4ff85f070b404dba97a7">author-scoped kind &lt;code>30023&lt;/code> reads&lt;/a>, added &lt;a href="https://github.com/zapcooking/frontend/commit/1802e8d7e95ed482209d09e03c834c2d9adfc1ea">verified NIP-50 search relays&lt;/a> with deduplication and stale-query guards, and repaired &lt;a href="https://github.com/zapcooking/frontend/pull/705">NIP-47 wallet calls&lt;/a> after dependency changes broke balances and history.&lt;/p>
&lt;h3 id="conduit-reconciles-signed-relay-and-blossom-preferences">Conduit reconciles signed relay and Blossom preferences&lt;/h3>
&lt;p>&lt;a href="https://github.com/Conduit-BTC/conduit-mono">Conduit&lt;/a> merged &lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/374">Blossom preference editing&lt;/a> on September 2 and &lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/397">signed preference reconciliation&lt;/a> on September 7. Market and Merchant retain the latest valid kind &lt;code>10002&lt;/code> relay list and kind &lt;code>10050&lt;/code> inbox declaration, preserve a usable signed list when a newer event is malformed, distinguish an explicit empty list from an unavailable lookup, and do not replace failed declared relays with code defaults.&lt;/p>
&lt;p>The &lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/374">kind &lt;code>10063&lt;/code> editor&lt;/a> lets a user load, reorder, review, externally sign, publish, and read back an ordered HTTPS media-server list without contacting those servers or inserting an undeclared default.&lt;/p>
&lt;h3 id="nip-a3-payment-targets-reach-three-clients">NIP-A3 payment targets reach three clients&lt;/h3>
&lt;p>From September 1–3, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/4041">Amethyst&lt;/a>, &lt;a href="https://github.com/purrgrammer/grimoire/commit/54052506f7a0da06dfc4cf7e969331ee61be7851">Grimoire&lt;/a>, and &lt;a href="https://github.com/formstr-hq/nostr-polls/commit/5a015f1d17abecd036f3e10c88d493d23928fa98">Pollerama&lt;/a> implemented NIP-A3 kind &lt;code>10133&lt;/code> payment targets. Amethyst offers an opt-in handoff only when a compatible target exists and does not turn it into a zap; Grimoire uses a fixed registry before building wallet URIs; Pollerama validates Monero addresses and fetches the author&amp;rsquo;s relay list before querying targets. Each client still needs an allowed payment method, a relay route, and an accurate display.&lt;/p>
&lt;h3 id="ditto-expands-blossom-fallback-and-live-embeds">Ditto expands Blossom fallback and live embeds&lt;/h3>
&lt;p>&lt;a href="https://github.com/soapbox-pub/ditto">Ditto&lt;/a> merged &lt;a href="https://github.com/soapbox-pub/ditto/commit/1e35a0705c28f706eb40d1f99aedef3105cf6f07">broad Blossom fallback and mirroring&lt;/a> on September 6. Avatars, badges, banners, community images, custom emoji, and application icons now try declared servers with the same blob hash; mirror uploads use a standard BUD-11 authorization token. A &lt;a href="https://github.com/soapbox-pub/ditto/commit/e2a29004a65122470179c83d6ded8336a5c10dfa">September 4 change&lt;/a> added compact &lt;code>kind:30311&lt;/code> live-stream embeds.&lt;/p>
&lt;h2 id="protocol-and-spec-work">Protocol and Spec Work&lt;/h2>
&lt;h3 id="nostr-implementation-possibilities">Nostr Implementation Possibilities&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-01/">NIP-01&lt;/a> now clarifies &lt;a href="https://github.com/nostr-protocol/nips/pull/2460">the &lt;code>limit: 0&lt;/code> filter&lt;/a>, merged September 4. A relay MUST return no stored events, MUST send &lt;code>EOSE&lt;/code> when initial queries complete, and MUST keep the subscription active for new matching events. Clients can open a live-only subscription with one filter field while retaining local history. The clarification records compatible behavior across several relay implementations and public relays.&lt;/p>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-78/">NIP-78&lt;/a> gained an &lt;a href="https://github.com/nostr-protocol/nips/pull/2458">authenticated app-data requirement&lt;/a>, merged September 3. Relays SHOULD require &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> authentication for kinds &lt;code>78&lt;/code> and &lt;code>30078&lt;/code> and SHOULD serve them only to the authenticated event author. That is a SHOULD, not a confidentiality guarantee: clients cannot treat arbitrary relays as private storage. The merge also discourages custom app-data kinds as generic public interchange.&lt;/p>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-ac/">NIP-AC&lt;/a> opened September 4 as an explicitly open &lt;a href="https://github.com/nostr-protocol/nips/pull/2461">WebRTC-signaling proposal&lt;/a>. It uses provisional ephemeral kinds for ping, connect requests, offers, answers, and ICE candidates, addressed with &lt;code>p&lt;/code> and grouped by a session &lt;code>e&lt;/code> tag; kind &lt;code>30600&lt;/code> supports discovery. Relays SHOULD broadcast and MUST NOT store those signaling events while peers connect directly. The numbers remain provisional, clients SHOULD use &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65 relay lists&lt;/a>, and applications needing confidentiality SHOULD encrypt offer, answer, and candidate content with &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a>.&lt;/p>
&lt;h2 id="nip-deep-dive-uri-links-and-references-in-event-text">NIP Deep Dive: URI Links and References in Event Text&lt;/h2>
&lt;p>A Nostr identifier needs a transportable meaning before another application can open it. &lt;a href="https://nostrcompass.org/en/topics/nip-21/">NIP-21&lt;/a> puts a &lt;a href="https://nostrcompass.org/en/topics/nip-19/">NIP-19&lt;/a> identifier after the &lt;code>nostr:&lt;/code> URI scheme, giving browsers, operating systems, and applications one dispatchable form. &lt;a href="https://nostrcompass.org/en/topics/nip-27/">NIP-27&lt;/a> defines what that same URI means inside readable event &lt;code>content&lt;/code>. NIP-21 crosses an application boundary; NIP-27 keeps a profile or event reference in signed prose. Neither creates an event kind or changes relay messages; the &lt;a href="https://github.com/nostr-protocol/nips/tree/master">two specifications&lt;/a> define only linking and rendering behavior.&lt;/p>
&lt;h3 id="uri-dispatch-and-nip-19-semantics">URI dispatch and NIP-19 semantics&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/21.md">NIP-21&amp;rsquo;s grammar&lt;/a> is &lt;code>nostr:&lt;/code> followed by one NIP-19 bech32 entity. &lt;code>nsec&lt;/code> is excluded because it encodes a private key. There is no authority, path, or query component, so a conforming link is &lt;code>nostr:npub1...&lt;/code>, not &lt;code>nostr://npub1...&lt;/code>. A platform or client may register as the handler; the specification does not choose the installed application or define a web fallback.&lt;/p>
&lt;p>The prefix tells a client what to decode. &lt;code>npub&lt;/code> carries a public key and &lt;code>note&lt;/code> an event id. &lt;code>nprofile&lt;/code> adds optional relay hints to a profile; &lt;code>nevent&lt;/code> adds relays, author, and kind to an event id; and &lt;code>naddr&lt;/code> carries the author, kind, and &lt;code>d&lt;/code> identifier of an addressable event, with optional relays. These forms use &lt;a href="https://github.com/nostr-protocol/nips/blob/master/19.md">NIP-19 type-length-value fields&lt;/a>. Hints narrow discovery but prove neither relay possession nor author control. Every fetched event still needs an id recomputation and signature check.&lt;/p>
&lt;p>The profile form in the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/21.md">NIP-21 specification&lt;/a> is:&lt;/p>
&lt;pre tabindex="0">&lt;code>nostr:npub1sn0wdenkukak0d9dfczzeacvhkrgz92ak56egt7vdgzn8pv2wfqqhrjdv9
&lt;/code>&lt;/pre>&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/21.md">NIP-21&lt;/a> also defines HTML bridges: a page serving a Nostr event can put its &lt;code>naddr&lt;/code> in &lt;code>&amp;lt;link rel=&amp;quot;alternate&amp;quot;&amp;gt;&lt;/code>, and a profile can put an &lt;code>nprofile&lt;/code> in &lt;code>&amp;lt;link rel=&amp;quot;me&amp;quot;&amp;gt;&lt;/code> or &lt;code>&amp;lt;link rel=&amp;quot;author&amp;quot;&amp;gt;&lt;/code>.&lt;/p>
&lt;h3 id="nip-27-rendering-and-optional-tags">NIP-27 rendering and optional tags&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/27.md">NIP-27&lt;/a> applies to readable event content such as kind &lt;code>1&lt;/code> notes and kind &lt;code>30023&lt;/code> articles. A composer may display &lt;code>@name&lt;/code>, but publishes &lt;code>nostr:nprofile1...&lt;/code> in the signed string. A reader scans the URI, decodes its NIP-19 entity, fetches the target, and may render a name, card, preview, or local link. If decoding fails, the URI remains ordinary text. The raw content must not be rewritten: changing it changes the NIP-01 serialization, id, and signature.&lt;/p>
&lt;p>Content references and tags have related but distinct jobs. &lt;a href="https://github.com/nostr-protocol/nips/blob/master/27.md">NIP-27&lt;/a> describes optional &lt;code>p&lt;/code> and &lt;code>e&lt;/code> tags and the &lt;a href="https://nostrcompass.org/en/topics/nip-18/">NIP-18&lt;/a> &lt;code>q&lt;/code> tag. A client may show a reference without creating a notification or thread relationship; quote discovery should write both the URI and a &lt;code>q&lt;/code> tag. &lt;a href="https://github.com/zapcooking/frontend/pull/665">Zap Cooking&amp;rsquo;s September 4 implementation&lt;/a> follows that split by retaining the URI while adding relay hints and a matching &lt;code>p&lt;/code> tag. Adding &lt;code>p&lt;/code> or &lt;code>q&lt;/code> does not make the URI private, and NIP-27 has no hidden-mention mode.&lt;/p>
&lt;p>The following &lt;a href="https://njump.me/note1e0my422kylehy2g4ax4d98vsthdvnvy702yq3f6eguedjr0256as200k6a">kind &lt;code>1&lt;/code> event&lt;/a> was recovered from &lt;code>wss://nos.lol&lt;/code> and verified before inclusion as a concrete NIP-27 reference. Its &lt;code>content&lt;/code> contains an &lt;code>naddr&lt;/code> for a version-independent addressable event. Decoding yields kind &lt;code>30402&lt;/code>, author &lt;code>91036d...310a&lt;/code>, the workbook&amp;rsquo;s &lt;code>d&lt;/code> identifier, and a &lt;code>wss://nos.lol/&lt;/code> hint. The &lt;code>q&lt;/code>, &lt;code>p&lt;/code>, &lt;code>t&lt;/code>, &lt;code>zap&lt;/code>, and &lt;code>client&lt;/code> tags are application choices, not NIP-27 requirements.&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;cbf64aa95627f3722915e9aad29d905ddac9b09e7a8808a7594732d90deaa6bb&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;ed1b999da9a434039d22338c276ffd6e338d609b81e6b1c305a120a982df787d&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">1788953511&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>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;91036dec18ee563c07edaed5eff4b5d631755c76f006734b3787292a5e3c310a&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;wss://multiplexer.huszonegy.world/&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 style="color:#e6db74">&amp;#34;t&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;archetype&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 style="color:#e6db74">&amp;#34;q&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;30402:91036dec18ee563c07edaed5eff4b5d631755c76f006734b3787292a5e3c310a:Archetype-Workbook-Companion-Meet-your-King-Warrioir-Magician-Lover-today-oejbwe&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&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>&lt;/span>&lt;span style="display:flex;">&lt;span> [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;zap&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;91036dec18ee563c07edaed5eff4b5d631755c76f006734b3787292a5e3c310a&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;wss://multiplexer.huszonegy.world/&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;0.9&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 style="color:#e6db74">&amp;#34;zap&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;ed1b999da9a434039d22338c276ffd6e338d609b81e6b1c305a120a982df787d&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&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;0.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>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;client&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;Amethyst&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 style="color:#f92672">&amp;#34;content&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;You can check, read and use this Workbook already! You can also support and get it for few sats and support us in this project.\n\nI hope it&amp;#39;ll help you in your Archetype Journey :)\n\n#archetype\n\nnostr:naddr1qpgyzunrdpjhg7tsv5k4wmmjdd3x7mmt94pk7mtsv9hxjmmw94xk2et594uk7atj949kjmn894tkzunjd9hkju3df4skw6trd9skut2vdamx2u3dw3hkgcte94hk26nzwajszrnhwden5te0dehhxtnvdakz7q3qjypkmmqcaetrcpld4m27la946cch2hrk7qr8xjehsu5j5h3uxy9qxpqqqpmvyqnrm7n&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;aa9592e7c773271b9e9f980c8a7e17fda2ffd5a4483a1789e5dd4c4a83018ac576c5202b21b33b08770dcabe023f93998a41f1a0be4bf00e36cdde611d07915e&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="trust-failure-behavior-and-client-implementations">Trust, failure behavior, and client implementations&lt;/h3>
&lt;p>A safe reader finds a complete &lt;code>nostr:&lt;/code> token, validates bech32, decodes NIP-19, rejects &lt;code>nsec&lt;/code>, ignores unknown TLV types, and leaves malformed or oversized text alone. &lt;code>npub&lt;/code> and &lt;code>nprofile&lt;/code> lead to profile queries; &lt;code>note&lt;/code> and &lt;code>nevent&lt;/code> identify immutable events; &lt;code>naddr&lt;/code> selects the latest valid addressable event for its kind, author, and &lt;code>d&lt;/code> tag. Relay hints reduce search but do not extend trust. Under the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/01.md">NIP-01 event rules&lt;/a>, the client verifies a fetched &lt;code>nevent&lt;/code> id and checks every &lt;code>naddr&lt;/code> candidate signature before applying addressable-event replacement rules.&lt;/p>
&lt;p>Inline previews are a client choice with privacy and resource costs. Fetching every reference reveals the reader&amp;rsquo;s interests and can create a lookup storm, so clients can use a cache, defer fetches until visible, cap concurrency, and require a click for unfamiliar media. Under &lt;a href="https://github.com/nostr-protocol/nips/blob/master/27.md">NIP-27&lt;/a>, a preview must remain distinct from the current author&amp;rsquo;s signed text. Failure should be visible as unresolved text or an unavailable card, not silently treated as verified content.&lt;/p>
&lt;p>Trust also changes by identifier type. A &lt;code>nevent&lt;/code> names immutable bytes, so a client can reject a fetched event whose serialized id differs from the requested id. An &lt;code>naddr&lt;/code> names a replaceable coordinate, so a client must verify each candidate and apply the addressable-event rules before deciding which version to display. A relay hint is useful for the first query in either case, but it is not an endorsement of the relay or of the returned content. &lt;a href="https://github.com/nostr-protocol/nips/blob/master/19.md">NIP-19&amp;rsquo;s TLV definition&lt;/a> supplies the data needed to make those checks explicit.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/21.md">NIP-21&lt;/a> defines a portable link that can be opened from outside Nostr, while NIP-27 makes the same link durable inside signed text. A client that implements only NIP-21 can open a pasted URI but not render embedded references. Full NIP-27 support adds scanning, safe decoding, fetch policy, local rendering, and an explicit choice about notification and quote tags. The shared URI keeps those layers interoperable without forcing clients to present them identically.&lt;/p>
&lt;p>&lt;a href="https://github.com/damus-io/damus">Damus&lt;/a> models inline references as typed mentions. Its &lt;a href="https://github.com/damus-io/damus/blob/2ef636aa07f6bd4f24b72fa998b7397dced56d2a/damus/Core/Nostr/Mentions.swift">mention code&lt;/a> maps &lt;code>npub&lt;/code> and &lt;code>nprofile&lt;/code> to profile references, &lt;code>note&lt;/code> and &lt;code>nevent&lt;/code> to event references, and &lt;code>naddr&lt;/code> to address references; &lt;a href="https://github.com/damus-io/damus/blob/2ef636aa07f6bd4f24b72fa998b7397dced56d2a/damus/Core/Nostr/NostrLink.swift">NostrLink&lt;/a> routes them to the appropriate destination. &lt;a href="https://github.com/PrimalHQ/primal-android-app">Primal Android&lt;/a> &lt;a href="https://github.com/PrimalHQ/primal-android-app/blob/36939db97213e7f8eeefaa4adaf125d839fc662e/domain/nostr/src/commonMain/kotlin/net/primal/domain/nostr/utils/NostrUriUtils.kt">parses the scheme and pasted forms&lt;/a>, validates bech32 and extracts relay hints, then &lt;a href="https://github.com/PrimalHQ/primal-android-app/blob/36939db97213e7f8eeefaa4adaf125d839fc662e/app/src/main/kotlin/net/primal/android/notes/feed/model/NoteNostrUriUi.kt">maps references into note-content models&lt;/a>. &lt;a href="https://github.com/zapcooking/frontend/pull/665">Zap Cooking&lt;/a> renders the same references in articles, recipes, editor previews, and print views.&lt;/p>
&lt;hr>
&lt;p>Send a NIP-17 DM to share a project or news item through the &lt;a href="https://github.com/andotherstuff/nostr-compass">Nostr Compass project&lt;/a>.&lt;/p></content:encoded></item><item><title>Nostr Compass #38</title><link>https://nostrcompass.org/en/newsletters/2026-09-02-newsletter/</link><pubDate>Wed, 02 Sep 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-09-02-newsletter/</guid><description>&lt;p>Welcome back to &lt;a href="https://nostrcompass.org">Nostr Compass&lt;/a>, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://njump.me/naddr1qq98vmmrvyknzt3s9ccqyg84e2v65erlexz84kmpkmkjqrvmzkgf8fdewfkyun3tnxlel5er3upsgqqqw4rsw0l3en">Voca&lt;/a> 1.0 brings verified Nostr notes and long-form subscriptions to an offline Android reader that speaks articles aloud, &lt;a href="https://github.com/cameri/nostream">nostream&lt;/a> expands relay-side job routing and authenticated operation, &lt;a href="https://github.com/relaystr/ndk">NDK for Dart&lt;/a> fixes negentropy and multi-relay request lifetimes, &lt;a href="https://github.com/divinevideo/divine-mobile">Divine Mobile&lt;/a> makes wrapped-message deletion and signing deterministic, &lt;a href="https://github.com/Conduit-BTC/conduit-relay">Conduit Relay&lt;/a> protects gift-wrap inboxes by default, &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> ships portable highlights, and &lt;a href="https://github.com/MostroP2P/mostro">Mostro&lt;/a> verifies signed orders before its spam gate. &lt;a href="https://github.com/lnbits/napstr">Napstr&lt;/a> publishes audio catalogues and seeder heartbeats over Nostr while transferring files through Tor. Releases cover &lt;a href="https://github.com/marmot-protocol/mdk">MDK&lt;/a> and &lt;a href="https://git.nostrdev.com/stuff/pakstr">pakstr&lt;/a>; protocol work merges an &lt;a href="https://nostrcompass.org/en/topics/nip-67/">NIP-67&lt;/a> pagination hint and an &lt;a href="https://nostrcompass.org/en/topics/nip-84/">NIP-84&lt;/a> highlight tag scheme in the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a> while &lt;a href="https://github.com/nostr-wallet-connect/nwc">Nostr Wallet Connect&lt;/a> adds transaction totals; and the NIP Deep Dive traces reposts and reactions across their event shapes and current implementations.&lt;/p></description><content:encoded>&lt;p>Welcome back to &lt;a href="https://nostrcompass.org">Nostr Compass&lt;/a>, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://njump.me/naddr1qq98vmmrvyknzt3s9ccqyg84e2v65erlexz84kmpkmkjqrvmzkgf8fdewfkyun3tnxlel5er3upsgqqqw4rsw0l3en">Voca&lt;/a> 1.0 brings verified Nostr notes and long-form subscriptions to an offline Android reader that speaks articles aloud, &lt;a href="https://github.com/cameri/nostream">nostream&lt;/a> expands relay-side job routing and authenticated operation, &lt;a href="https://github.com/relaystr/ndk">NDK for Dart&lt;/a> fixes negentropy and multi-relay request lifetimes, &lt;a href="https://github.com/divinevideo/divine-mobile">Divine Mobile&lt;/a> makes wrapped-message deletion and signing deterministic, &lt;a href="https://github.com/Conduit-BTC/conduit-relay">Conduit Relay&lt;/a> protects gift-wrap inboxes by default, &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> ships portable highlights, and &lt;a href="https://github.com/MostroP2P/mostro">Mostro&lt;/a> verifies signed orders before its spam gate. &lt;a href="https://github.com/lnbits/napstr">Napstr&lt;/a> publishes audio catalogues and seeder heartbeats over Nostr while transferring files through Tor. Releases cover &lt;a href="https://github.com/marmot-protocol/mdk">MDK&lt;/a> and &lt;a href="https://git.nostrdev.com/stuff/pakstr">pakstr&lt;/a>; protocol work merges an &lt;a href="https://nostrcompass.org/en/topics/nip-67/">NIP-67&lt;/a> pagination hint and an &lt;a href="https://nostrcompass.org/en/topics/nip-84/">NIP-84&lt;/a> highlight tag scheme in the &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a> while &lt;a href="https://github.com/nostr-wallet-connect/nwc">Nostr Wallet Connect&lt;/a> adds transaction totals; and the NIP Deep Dive traces reposts and reactions across their event shapes and current implementations.&lt;/p>
&lt;h2 id="top-stories">Top Stories&lt;/h2>
&lt;h3 id="voca-10-reads-verified-nostr-notes-and-subscriptions-aloud-on-android">Voca 1.0 reads verified Nostr notes and subscriptions aloud on Android&lt;/h3>
&lt;p>&lt;a href="https://njump.me/naddr1qq98vmmrvyknzt3s9ccqyg84e2v65erlexz84kmpkmkjqrvmzkgf8fdewfkyun3tnxlel5er3upsgqqqw4rsw0l3en">Voca&lt;/a> is an offline Android reader that speaks articles, PDFs, Markdown files, and Nostr notes in the phone&amp;rsquo;s own text-to-speech voice while the spoken sentence stays lit on the page. Its &lt;a href="https://njump.me/naddr1qq98vmmrvyknzt3s9ccqyg84e2v65erlexz84kmpkmkjqrvmzkgf8fdewfkyun3tnxlel5er3upsgqqqw4rsw0l3en">1.0 release&lt;/a>, &lt;a href="https://njump.me/naddr1qq98vmmrvyknzt3s9ccqyg84e2v65erlexz84kmpkmkjqrvmzkgf8fdewfkyun3tnxlel5er3upsgqqqw4rsw0l3en">published on 2026-08-27&lt;/a> under its own &lt;a href="https://njump.me/npub17h9fn2ny0lycg7kmvxmw6gqdnv2epya9h9excnjw9wvml87nyw8sqy3hpu">project key&lt;/a>, makes Nostr a first-class source: paste a note address, an event identifier, an npub, a profile, or an ordinary web link with a Nostr entity inside it, and the app decodes the reference, fetches the signed event from relays, and reads the author&amp;rsquo;s text rather than the web page built around it.&lt;/p>
&lt;p>Two verified behaviors define the Nostr integration, both described in &lt;a href="https://njump.me/naddr1qq98vmmrvyknzt3s9ccqyg84e2v65erlexz84kmpkmkjqrvmzkgf8fdewfkyun3tnxlel5er3upsgqqqw4rsw0l3en">Voca&amp;rsquo;s signed 1.0 announcement&lt;/a>. First, every fetched event is checked against its recomputed id and its BIP-340 Schnorr signature before it is persisted, using the bootstrap relays, the author&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> relay list (a signed, replaceable kind &lt;code>10002&lt;/code> event where an author lists the relays they read and write), and hints carried inside the reference itself, so a relay can decline to answer but cannot put words in an author&amp;rsquo;s mouth. Second, adding an author&amp;rsquo;s npub puts their &lt;a href="https://nostrcompass.org/en/topics/nip-23/">NIP-23&lt;/a> long-form articles (addressable kind &lt;code>30023&lt;/code> posts with titles, summaries, and images) into a single on-device inbox beside RSS and Atom feeds. The 1.1.0 update, &lt;a href="https://gitworkshop.dev/npub17h9fn2ny0lycg7kmvxmw6gqdnv2epya9h9excnjw9wvml87nyw8sqy3hpu/voca">announced on 2026-08-28&lt;/a> and published to &lt;a href="https://zapstore.dev">Zapstore&lt;/a> on 2026-08-29, puts sentence-level scrolling on time, smooths long documents, and recovers the home-screen widget after manual scrolling, resizing, process restarts, and upgrades.&lt;/p>
&lt;h3 id="nostream-expands-relay-side-dvm-routing-and-authenticated-operation">nostream expands relay-side DVM routing and authenticated operation&lt;/h3>
&lt;p>After &lt;a href="https://nostrcompass.org/en/newsletters/2026-08-19-newsletter/#nostream-adds-a-relay-monitor-and-mints-invite-codes">August 19&amp;rsquo;s job-ingestion work&lt;/a>, &lt;a href="https://github.com/cameri/nostream">nostream&lt;/a>, a TypeScript relay implementation, &lt;a href="https://github.com/cameri/nostream/pull/737">stores and serves NIP-89 application handler events&lt;/a>. &lt;a href="https://nostrcompass.org/en/topics/nip-89/">NIP-89&lt;/a> (application handler discovery) uses kind &lt;code>31989&lt;/code> recommendations and kind &lt;code>31990&lt;/code> handler information, both already in the parameterized-replaceable range, so a client can query those kinds and receive a replacement when a &lt;code>d&lt;/code> tag collides. The relay does not publish handler information for its own workers.&lt;/p>
&lt;p>Pending &lt;a href="https://nostrcompass.org/en/topics/nip-90/">NIP-90&lt;/a> (data vending machine) jobs now &lt;a href="https://github.com/cameri/nostream/pull/734">reach a worker process and return as result events&lt;/a>. On success the relay signs a kind 6000-6999 result with its own key. A timeout or worker crash marks the job failed instead of leaving it submitted.&lt;/p>
&lt;p>Authenticated sessions and admin HTTP calls sit on different boundaries. &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> (client authentication to relays) &lt;a href="https://github.com/cameri/nostream/pull/716">tracks the authenticated pubkey per socket&lt;/a>, can require AUTH before clients publish events, and advertises that requirement in the &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> (relay information) document, with both controls off by default. Separately, &lt;a href="https://github.com/cameri/nostream/pull/730">admin API routes can accept NIP-98 signed HTTP authorization&lt;/a>. &lt;a href="https://nostrcompass.org/en/topics/nip-98/">NIP-98&lt;/a> (HTTP authentication with signed events) stays off until an operator enables it and names the allowed pubkeys.&lt;/p>
&lt;h3 id="ndk-for-dart-fixes-negentropy-multi-relay-request-lifetimes-and-signature-verification">NDK for Dart fixes negentropy, multi-relay request lifetimes, and signature verification&lt;/h3>
&lt;p>A &lt;a href="https://nostrcompass.org/en/topics/nip-77/">NIP-77&lt;/a> (negentropy set-reconciliation) run in &lt;a href="https://github.com/relaystr/ndk">NDK&lt;/a>, a Dart development kit for Nostr, returned the wrong have and need sets without erroring, because the codec did not speak &lt;a href="https://nostrcompass.org/en/topics/negentropy/">negentropy&lt;/a> protocol v1. The &lt;a href="https://github.com/relaystr/ndk/pull/722">v1 encoding fix&lt;/a> now returns the ids held by the relay and the ids it still needs.&lt;/p>
&lt;p>Identical filters sent to different relays &lt;a href="https://github.com/relaystr/ndk/pull/705">were collapsing into one request&lt;/a>. Requests with the same filter now stay distinct when they target different relays or have different lifetimes, so a short query cannot mix another relay&amp;rsquo;s events into the result or leave a live subscription stalled.&lt;/p>
&lt;p>The same kit &lt;a href="https://github.com/relaystr/ndk/pull/726">verifies a signature once and keeps that result&lt;/a>. A later duplicate delivery no longer spends another check or overwrites the stored verified event.&lt;/p>
&lt;h3 id="divine-mobile-makes-wrapped-direct-message-deletion-and-signing-deterministic">Divine Mobile makes wrapped direct-message deletion and signing deterministic&lt;/h3>
&lt;p>Wrapped &lt;a href="https://nostrcompass.org/en/topics/nip-09/">NIP-09&lt;/a> (event deletion request) kind &lt;code>5&lt;/code> events that targeted a message never applied in &lt;a href="https://github.com/divinevideo/divine-mobile">Divine Mobile&lt;/a>, a mobile short-video client that publishes through Nostr. The client &lt;a href="https://github.com/divinevideo/divine-mobile/pull/8174">now resolves each deletion against the named message&lt;/a> instead of treating anything that is not a reaction as already processed. A second &lt;a href="https://github.com/divinevideo/divine-mobile/pull/8164">delete-for-everyone request while the first was still in flight&lt;/a> used to vanish with no error and no kind &lt;code>5&lt;/code> on the wire; concurrent deletes now each publish.&lt;/p>
&lt;p>After the previously covered 1.0.22 release, sending the same 1:1 &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> (gift-wrapped private DMs) text twice in one second &lt;a href="https://github.com/divinevideo/divine-mobile/pull/8163">built one rumor id&lt;/a>, so the second send disappeared; each send now carries a token inside the &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> (gift wrap) rumor so the ids differ.&lt;/p>
&lt;p>A caller that had already signed a kind &lt;code>4&lt;/code> or kind &lt;code>5&lt;/code> event &lt;a href="https://github.com/divinevideo/divine-mobile/pull/8173">kept that signature&lt;/a>, instead of having a client tag appended afterward, which changed the id and made relays reject the event as invalid.&lt;/p>
&lt;h3 id="conduit-relay-hardens-its-nip-42-protected-inbox">Conduit Relay hardens its NIP-42 protected inbox&lt;/h3>
&lt;p>Kind &lt;code>1059&lt;/code> gift wraps are stored for one recipient. &lt;a href="https://github.com/Conduit-BTC/conduit-relay">Conduit Relay&lt;/a>, a Go relay that keeps those wraps in a recipient-protected inbox, &lt;a href="https://github.com/Conduit-BTC/conduit-relay/pull/8">defaults to enforce mode&lt;/a>: a kind &lt;code>1059&lt;/code> query must present &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> authentication as that recipient, or the relay rejects the request. Mixed-kind filters, wildcards, counts, and &lt;a href="https://nostrcompass.org/en/topics/negentropy/">negentropy&lt;/a> over those wraps are &lt;code>restricted&lt;/code>, so another AUTH cannot turn them into a dump of someone else&amp;rsquo;s inbox.&lt;/p>
&lt;p>The same &lt;a href="https://github.com/Conduit-BTC/conduit-relay/pull/8">protected-inbox merge&lt;/a> requires a canonical event id on the transmitted AUTH event and accepts an otherwise-valid NIP-42 event whether or not &lt;code>content&lt;/code> is empty. Challenge-only still offers AUTH without blocking the read; disabled admits freely. The library default is enforce.&lt;/p>
&lt;h3 id="amethyst-ships-nip-84-highlights-and-fixes-two-relay-facing-failure-paths">Amethyst ships NIP-84 highlights and fixes two relay-facing failure paths&lt;/h3>
&lt;p>Following last week&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/newsletters/2026-08-26-newsletter/#amethyst-moves-blossom-authorization-off-image-loading-threads">Blossom authorization work&lt;/a>, &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a>, an Android Nostr client, ships &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.14.0">v1.14.0&lt;/a> with &lt;a href="https://nostrcompass.org/en/topics/nip-84/">NIP-84&lt;/a> (portable highlights). A selected passage becomes a kind &lt;code>9802&lt;/code> event from the composer, a highlights feed, or a share into the app.&lt;/p>
&lt;p>The release adds &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> channel deletion and archival controls (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3812">PR #3812&lt;/a>) and measures relay behavior through the traffic the client already makes, then extends those &lt;a href="https://github.com/nostr-protocol/nips/blob/master/66.md">NIP-66&lt;/a> probes with streaming, read, write, and URL checks (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3836">PR #3836&lt;/a>, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3857">PR #3857&lt;/a>). Amethyst also removes a SharedKeyCache hash-collision vulnerability and compares message-authentication codes in constant time (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3833">PR #3833&lt;/a>), repairs a race that could lose connect-time AUTH delivery (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3838">PR #3838&lt;/a>), stripes subscription-state locking to end an ANR convoy (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3851">PR #3851&lt;/a>), and compares every subscription filter instead of only the first (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3856">PR #3856&lt;/a>).&lt;/p>
&lt;p>&lt;a href="https://nostrcompass.org/en/newsletters/2026-08-19-newsletter/#amethyst-rebuilds-its-relay-authentication-decision-flow">Newsletter #36 covered these relay-authentication, backup, and public-chat changes previously&lt;/a>; v1.14.0 has now shipped them together. Concord soft bans close authority gaps found by an audit (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3885">PR #3885&lt;/a>). Relay authentication has a redesigned permission flow (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3899">PR #3899&lt;/a>), waits for challenge resolution instead of timing out (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3905">PR #3905&lt;/a>), defaults new accounts to authenticate (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3931">PR #3931&lt;/a>), honors that preference on relays outside the account&amp;rsquo;s normal set (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3937">PR #3937&lt;/a>), and keeps session grants across reconnects (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3955">PR #3955&lt;/a>). A guided first-run and Settings flow makes key backups discoverable (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3909">PR #3909&lt;/a>), Cashu proof backfill and history paging stop wallet balances from being truncated (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3941">PR #3941&lt;/a>), and public chats can now be muted (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3939">PR #3939&lt;/a>).&lt;/p>
&lt;p>After that tag, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3983">trusted lists&lt;/a> in kinds &lt;code>30392&lt;/code> through &lt;code>30395&lt;/code> are &lt;a href="https://nostrcompass.org/en/topics/nip-50/">NIP-50&lt;/a> (full-text search) indexed by title only, so a list named in prose can be found without indexing member hex ids. Wallet refusals that arrived over &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> (Nostr Wallet Connect) &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3987">now show their error instead of looking like a tap that did nothing&lt;/a>, including &lt;code>QUOTA_EXCEEDED&lt;/code> and &lt;code>RESTRICTED&lt;/code>, plus a timeout when the wallet never answers.&lt;/p>
&lt;h3 id="mostro-validates-signed-orders-before-expensive-work-and-preserves-order-audit-events">Mostro validates signed orders before expensive work and preserves order audit events&lt;/h3>
&lt;p>After &lt;a href="https://nostrcompass.org/en/newsletters/2026-08-12-newsletter/#mostro-0181-starts-a-cashu-escrow-path-and-hardens-the-daemon">v0.18.1&amp;rsquo;s Cashu escrow foundation&lt;/a>, &lt;a href="https://github.com/MostroP2P/mostro">Mostro&lt;/a>, a peer-to-peer exchange daemon that coordinates orders over Nostr, tagged &lt;a href="https://github.com/MostroP2P/mostro/releases/tag/v0.18.5">v0.18.5&lt;/a>, which defaults transport to &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> (payload encryption) and keeps gift wrap as an explicit opt-in.&lt;/p>
&lt;p>The release anchors waiting-state timeouts to the recorded take time so a maker bond is not slashed on the wrong clock (&lt;a href="https://github.com/MostroP2P/mostro/pull/879">PR #879&lt;/a>), dispatches each settled-order buyer payout at most once (&lt;a href="https://github.com/MostroP2P/mostro/pull/881">PR #881&lt;/a>), and moves those payouts through bounded, non-blocking &lt;code>send_payment&lt;/code> waits (&lt;a href="https://github.com/MostroP2P/mostro/pull/883">PR #883&lt;/a>). An attempted change to pay the timeout-slash winner (&lt;a href="https://github.com/MostroP2P/mostro/pull/875">PR #875&lt;/a>) was reverted before the same tag shipped (&lt;a href="https://github.com/MostroP2P/mostro/pull/885">PR #885&lt;/a>). Mostro also stops republishing an unchanged pending order book every hour and at startup (&lt;a href="https://github.com/MostroP2P/mostro/pull/888">PR #888&lt;/a>), and its kind &lt;code>38386&lt;/code> dispute events now carry a &lt;code>created_at&lt;/code> tag for downstream ordering (&lt;a href="https://github.com/MostroP2P/mostro/pull/878">PR #878&lt;/a>).&lt;/p>
&lt;p>After that tag, a &lt;a href="https://github.com/MostroP2P/mostro/pull/892">signature check now runs before the spam gate&lt;/a>. An event id does not commit to &lt;code>sig&lt;/code>, so a copy of a victim&amp;rsquo;s kind &lt;code>14&lt;/code> with a broken signature could occupy the replay slot and silently drop the valid message; the daemon verifies first and drops an invalid wrap instead of warning and continuing.&lt;/p>
&lt;p>Fee-audit events of kind &lt;code>8383&lt;/code> were carrying a &lt;a href="https://nostrcompass.org/en/topics/nip-40/">NIP-40&lt;/a> (expiration timestamp) of 15 days. They now &lt;a href="https://github.com/MostroP2P/mostro/pull/924">keep a one-year expiration&lt;/a>, matching their role as a public payment record. On a Cashu-enabled node, taking an order &lt;a href="https://github.com/MostroP2P/mostro/pull/830">asks the seller over Nostr to lock a 2-of-3 escrow&lt;/a>, publishes the waiting order event, and skips creation of a Lightning hold invoice. That completes the request path; it does not by itself close every escrow or marketplace-abuse case.&lt;/p>
&lt;h3 id="napstr-publishes-audio-catalogues-on-nostr-and-transfers-files-over-tor">Napstr publishes audio catalogues on Nostr and transfers files over Tor&lt;/h3>
&lt;p>&lt;a href="https://github.com/lnbits/napstr">Napstr&lt;/a> is a desktop audio-sharing client that publishes searchable catalogues and live seeders on Nostr, then transfers the files through a bundled Tor process with no direct-IP fallback. &lt;a href="https://github.com/lnbits/napstr/releases/tag/v0.2.0">Version 0.2.0&lt;/a> keeps profiles and catalogue metadata public, and it keeps requests, transfer credentials, file contents, and peer IP addresses off the relays.&lt;/p>
&lt;p>Discovery uses two addressable event kinds in the &lt;a href="https://github.com/lnbits/napstr">Napstr repository&lt;/a>. Kind &lt;code>30421&lt;/code> catalogue entries name a file by its SHA-256 digest, public basename, size, and audio format, and an author withdraws a file by replacing that coordinate with a deleted marker. Kind &lt;code>30422&lt;/code> availability heartbeats expire after ten minutes and list the file IDs the author is prepared to seed, so a catalogue row is live only while an unexpired heartbeat still contains that digest.&lt;/p>
&lt;p>Public conversation uses &lt;a href="https://nostrcompass.org/en/topics/nip-c7/">NIP-C7&lt;/a> (kind 9 chat messages) instead of a relay-owned group. The &lt;a href="https://github.com/lnbits/napstr">Napstr repository&lt;/a> defines a shared public room plus a per-track discussion keyed to the file digest. Those messages are signed and public. They do not carry onion addresses, transfer credentials, or file bytes.&lt;/p>
&lt;p>A download starts as a &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> (gift-wrapped private DMs) negotiation. The &lt;a href="https://github.com/lnbits/napstr">Napstr repository&lt;/a> wraps a request, an offer, or a refusal inside a kind &lt;code>14&lt;/code> rumor, so relays do not see the temporary v3 onion hostname or the one-use capability that an accepted offer returns. Bundled Tor then moves the bytes over that onion, verifies the complete SHA-256 digest, and re-validates the audio before the file becomes playable.&lt;/p>
&lt;p>The &lt;a href="https://github.com/lnbits/napstr/compare/v0.1.7...v0.2.0">v0.1.7 to v0.2.0 comparison&lt;/a> adds audiobook collections and Napstrfy, an optional Android companion. Kind &lt;code>30423&lt;/code> manifests list ordered chapters that remain ordinary catalogue files, so a client that ignores the collection can still fetch each chapter. Napstr creates a non-destructive local Audiobooks folder for that purpose. Napstrfy pairs to a running desktop with a one-use QR code, then searches and requests downloads through that desktop&amp;rsquo;s existing Nostr and Tor services without receiving the desktop secret key.&lt;/p>
&lt;p>The same &lt;a href="https://github.com/lnbits/napstr/compare/v0.1.7...v0.2.0">comparison&lt;/a> times out a companion handshake that does not complete. A seeder copies and hashes the shared file before it serves bytes, writes incoming data into a private temporary file, confines audiobook destinations to a real child of the Napstr folder, and aborts if that destination changes during the transfer.&lt;/p>
&lt;h2 id="releases">Releases&lt;/h2>
&lt;h3 id="mdk-v0917-newest-keypackages-membership-activity-and-durable-sends">MDK v0.9.17: newest KeyPackages, membership activity, and durable sends&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/newsletters/2026-08-26-newsletter/#mdk-v0914-and-v0915-keypackage-selection-epoch-gap-recovery-and-split-relay-roles">Newsletter #37 covered MDK 0.9.14 and 0.9.15&lt;/a>, including the change in the &lt;a href="https://github.com/marmot-protocol/mdk">MDK repository&lt;/a> from oldest-first KeyPackage selection to the newest valid current-profile package, the epoch-gap recovery gates, account cleanup, and the split between discovery and operational relays. Those fixes remain the base for the two releases that followed, so a stale package no longer blocks a member who has already published a usable one.&lt;/p>
&lt;p>&lt;a href="https://github.com/marmot-protocol/mdk/pull/1551">Membership and admin events now advance the chat list&lt;/a> the way a new message does: preview text, ordering, unread counts, and read markers update when people join, leave, or change roles, and the local system actor is not treated as a Nostr profile. Reconnects and restarts &lt;a href="https://github.com/marmot-protocol/mdk/pull/1516">reuse one send identity for a retried durable outbound text&lt;/a>, so the same group message is not published twice.&lt;/p>
&lt;p>The two releases since then concentrate on the cost of keeping large groups healthy. &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.9.16">Version 0.9.16&lt;/a> &lt;a href="https://github.com/marmot-protocol/mdk/pull/1559">measures epoch divergence from the current epoch rather than a high-water mark&lt;/a>, keeps refused inbound events fetchable (&lt;a href="https://github.com/marmot-protocol/mdk/pull/1565">PR #1565&lt;/a>), scopes replay rollback to canonical group state (&lt;a href="https://github.com/marmot-protocol/mdk/pull/1563">PR #1563&lt;/a>), and introduces &lt;a href="https://github.com/marmot-protocol/mdk/pull/1545">marmot-c&lt;/a>, a macro-generated C ABI over the UniFFI bindings that lets hosts embed the engine directly. &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.9.17">Version 0.9.17&lt;/a> then folds pass-admission scans into &lt;a href="https://github.com/marmot-protocol/mdk/pull/1617">one member walk instead of a pass per member&lt;/a>, &lt;a href="https://github.com/marmot-protocol/mdk/pull/1620">probes whether a group state is contested without seeding the full history graph&lt;/a>, &lt;a href="https://github.com/marmot-protocol/mdk/pull/1621">cuts the deferred-peel sweep&amp;rsquo;s idle-poll cost&lt;/a>, and &lt;a href="https://github.com/marmot-protocol/mdk/pull/1622">applies the batched component read to the three projection sites the first pass missed&lt;/a>. The matching &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/marmotc-v0.9.17">marmot-c 0.9.17&lt;/a> and &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/wn-agent-v0.9.17">WN Agent 0.9.17&lt;/a> artifacts are built from the same commit, so embedders get the cheaper maintenance paths together.&lt;/p>
&lt;h3 id="pakstr-v0160-kind-32267-identifiers-on-publish">pakstr v0.16.0: kind-32267 identifiers on publish&lt;/h3>
&lt;p>After &lt;a href="https://nostrcompass.org/en/newsletters/2026-08-26-newsletter/#pakstr-0130-through-0150-makes-zapstore-publication-explicit">last week&amp;rsquo;s 0.13.0 through 0.15.0 Zapstore publication pipeline&lt;/a>, &lt;a href="https://git.nostrdev.com/stuff/pakstr">pakstr&lt;/a>, a CLI that packages a web app into a signed Android APK and publishes it with a Nostr key, &lt;a href="https://git.nostrdev.com/stuff/pakstr/pulls/67">logs the kind &lt;code>32267&lt;/code> application-event IDs&lt;/a> it looks up, publishes, or replaces. &lt;a href="https://git.nostrdev.com/stuff/pakstr/releases/tag/v0.16.0">Version 0.16.0&lt;/a> prints both the previous and new IDs when stale listing metadata triggers a republish, so a publisher can confirm which listing event is live on the relay.&lt;/p>
&lt;p>The same &lt;a href="https://git.nostrdev.com/stuff/pakstr/pulls/67">identifier log&lt;/a> records the ID found during lookup before any replace, then the ID of the event that landed, so a no-op reuse appears as a repeated ID. That is the tagged change in &lt;a href="https://git.nostrdev.com/stuff/pakstr/releases/tag/v0.16.0">0.16.0&lt;/a>; the Content-Digest, publish-before-upload, and publisher-validation behavior already shipped in the earlier tags.&lt;/p>
&lt;h2 id="unreleased-changes">Unreleased Changes&lt;/h2>
&lt;h3 id="zap-cooking-scopes-bunker-relays-and-signs-paid-endpoints">Zap Cooking scopes bunker relays and signs paid endpoints&lt;/h3>
&lt;p>Reloading a bunker session on &lt;a href="https://github.com/zapcooking/frontend">Zap Cooking&lt;/a>, a recipe site built on Nostr long-form events, used to publish the encrypted &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> (remote signing over relays) conversation to every relay the page already used. &lt;a href="https://github.com/zapcooking/frontend/pull/633">Scoping signer traffic to the bunker&amp;rsquo;s own relays&lt;/a> now applies that restriction on session restore and on nostrconnect pairing, the signer-initiated connection flow, matching the bunker-URL login path. It refuses to install an empty relay set from a malformed stored record, so relays that only host recipes no longer learn that the same pubkey keeps an active bunker session.&lt;/p>
&lt;p>&lt;a href="https://github.com/zapcooking/frontend/pull/630">Signed HTTP authentication&lt;/a> now gates the paid cooking-assistant chat, the cookbook introduction, and gated-recipe updates under &lt;a href="https://nostrcompass.org/en/topics/nip-98/">NIP-98&lt;/a> (HTTP authentication with a signed Nostr event). The server reads the request body once, verifies the signature against that exact payload, and takes identity from the verified auth event instead of a public key supplied in the body. The chat preview still works with no header, while a present but invalid signature is rejected and the cookbook introduction always requires a signature. Updating a gated recipe now also requires that the verified key match the stored author; anyone else is told the recipe does not exist, so the endpoint does not confirm which paid records exist.&lt;/p>
&lt;h3 id="nostrord-repairs-wrapped-dms-and-shared-event-links">nostrord repairs wrapped DMs and shared event links&lt;/h3>
&lt;p>After last week&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/newsletters/2026-08-26-newsletter/#nostrord-v290-relay-scoped-group-state-and-media">v2.9.0&lt;/a>, &lt;a href="https://github.com/nostrord/nostrord">nostrord&lt;/a>, a cross-platform client for relay-hosted communities, merged delivery fixes so a &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> (gift-wrapped private DM) sent from one device reaches the same account elsewhere. &lt;a href="https://github.com/nostrord/nostrord/pull/295">Publishing the sender&amp;rsquo;s self-copy independently&lt;/a> stops the recipient wrap&amp;rsquo;s first relay acceptance from dropping the copy other devices fetch. That same change resends a wrap after &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> (client authentication to relays) completes, and it marks the send successful on the first relay acceptance so one failing host cannot stall the rest. &lt;a href="https://github.com/nostrord/nostrord/pull/297">Retrying parked gift wraps&lt;/a> that failed &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> (gift wrap) decryption now happens on a timer, so a bunker that stays connected no longer leaves those messages mi&amp;hellip; [truncated]&lt;/p>
&lt;p>A &lt;a href="https://nostrcompass.org/en/topics/nip-c7/">NIP-C7&lt;/a> (kind &lt;code>9&lt;/code> chat messages) reply repeats its parent as a leading &lt;a href="https://nostrcompass.org/en/topics/nip-19/">NIP-19&lt;/a> (bech32-encoded entities) &lt;code>nevent&lt;/code> pointer beside the &lt;code>q&lt;/code> tag. &lt;a href="https://github.com/nostrord/nostrord/pull/292">Dropping that leading parent pointer&lt;/a> when it opens the body and names the reply parent lets the row render as a single reply quote, while a pointer mid-body or a pointer that is the whole body still renders as a quote card. &lt;a href="https://github.com/nostrord/nostrord/pull/293">Quoted-event links now encode &lt;code>nevent&lt;/code>&lt;/a> with the author, kind, and the relay the quote was read from, so a &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> (relay-managed groups) event shared into a DM can be fetched by another client instead of a bare note identifier that carries no lookup hints.&lt;/p>
&lt;h2 id="nip-updates-and-protocol-spec-work">NIP Updates and Protocol Spec Work&lt;/h2>
&lt;h3 id="nostr-implementation-possibilities">Nostr Implementation Possibilities&lt;/h3>
&lt;p>Two specification merges landed in the core &lt;a href="https://github.com/nostr-protocol/nips">NIPs repository&lt;/a> this week.&lt;/p>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-67/">NIP-67&lt;/a> defines hints a relay can append to an &lt;code>EOSE&lt;/code> (end of stored events) message so a client knows whether to keep paginating. The &lt;a href="https://github.com/nostr-protocol/nips/pull/2371">merged &lt;code>&amp;quot;auth&amp;quot;&lt;/code> hint&lt;/a> adds a third value beside &lt;code>finish&lt;/code> and &lt;code>more&lt;/code>: a relay may now signal that additional stored events could become visible if the user authenticates, and it must send the &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> (relay authentication) &lt;code>AUTH&lt;/code> challenge before the &lt;code>EOSE&lt;/code> that carries the hint. The &lt;a href="https://github.com/nostr-protocol/nips/pull/2371">accompanying NIP-42 addition&lt;/a> defines the same flow from the client side, so a client that receives an &lt;code>EOSE&lt;/code> with &lt;code>auth&lt;/code> already holds the challenge it needs to answer.&lt;/p>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-84/">NIP-84&lt;/a> (portable highlights, the kind &lt;code>9802&lt;/code> events Amethyst shipped support for above) &lt;a href="https://github.com/nostr-protocol/nips/pull/2454">merged a tag-scheme update&lt;/a>: highlights may now tag their source with structured &lt;code>i&lt;/code> tags per &lt;a href="https://nostrcompass.org/en/topics/nip-73/">NIP-73&lt;/a> (external content identifiers) in addition to &lt;code>a&lt;/code>/&lt;code>e&lt;/code> tags for Nostr events and &lt;code>r&lt;/code> tags for anything else, and quote highlights moved from a MUST to a SHOULD on rendering like a quote repost.&lt;/p>
&lt;h3 id="nostr-wallet-connect">Nostr Wallet Connect&lt;/h3>
&lt;p>A &lt;code>list_transactions&lt;/code> response can report how many transactions match the request, not how many rows the current page returned. &lt;a href="https://github.com/nostr-wallet-connect/nwc/pull/4">Merged optional &lt;code>total_count&lt;/code>&lt;/a> on NWC-05 (the wallet-history extension) in the &lt;a href="https://github.com/nostr-wallet-connect/nwc">NWC extension repository&lt;/a> adds that field to the response used with &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> (encrypted remote wallet control over Nostr).&lt;/p>
&lt;p>The &lt;a href="https://github.com/nostr-wallet-connect/nwc/commit/ff3e49a47d040075edc46ee42fc0e33f10f1ef67">commit that adds &lt;code>total_count&lt;/code>&lt;/a> documents it as an optional integer: the total number of transactions matching the request filters.&lt;/p>
&lt;p>The &lt;a href="https://github.com/nostr-wallet-connect/nwc/commit/06315e735f744b1afd3df0b57436fdce8a7bfc2e">commit that excludes pagination from the count&lt;/a> states that this total excludes pagination, so it counts all matching transactions across every page.&lt;/p>
&lt;h2 id="nip-deep-dive-reposts-and-reactions">NIP Deep Dive: Reposts and Reactions&lt;/h2>
&lt;p>A contact can put an existing note back in front of their followers, and they can attach a compact like, dislike, or emoji without writing a reply. &lt;a href="https://nostrcompass.org/en/topics/nip-18/">NIP-18&lt;/a> (reposts) publishes that redistribution as its own signed event. &lt;a href="https://nostrcompass.org/en/topics/nip-25/">NIP-25&lt;/a> (reactions) publishes the compact response as a separate signed event. Both remain &lt;code>draft&lt;/code> &lt;code>optional&lt;/code> files on the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/18.md">canonical repost specification&lt;/a> and the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/25.md">canonical reaction specification&lt;/a>: they are present in the NIPs repository and implemented by clients, while still labeled non-final.&lt;/p>
&lt;h3 id="reposts-nip-18">Reposts (NIP-18)&lt;/h3>
&lt;p>Followers receive a signed pointer to a kind 1 text note someone already published when a client writes a kind 6 event. &lt;a href="https://github.com/nostr-protocol/nips/blob/master/18.md">The repost specification&lt;/a> sets &lt;code>kind&lt;/code> to 6, puts the stringified JSON of that note in &lt;code>content&lt;/code> (empty &lt;code>content&lt;/code> is allowed and not recommended), requires an &lt;code>e&lt;/code> tag whose value is the note&amp;rsquo;s &lt;code>id&lt;/code> and whose third entry is a relay URL where the note can be fetched, and says the event SHOULD also carry a &lt;code>p&lt;/code> tag with the original author&amp;rsquo;s &lt;code>pubkey&lt;/code>. A repost of a &lt;a href="https://nostrcompass.org/en/topics/nip-70/">NIP-70&lt;/a> (protected events) event SHOULD keep &lt;code>content&lt;/code> empty so the protected payload is not copied into the new event.&lt;/p>
&lt;p>A quote is a citation inside some other event, not a kind 6 wrapper. When a client mentions a &lt;a href="https://nostrcompass.org/en/topics/nip-21/">NIP-21&lt;/a> (&lt;code>nostr:&lt;/code> URI) &lt;code>nevent&lt;/code>, &lt;code>note&lt;/code>, or &lt;code>naddr&lt;/code>, it must convert that mention into a &lt;code>q&lt;/code> tag of the form &lt;code>[&amp;quot;q&amp;quot;, &amp;quot;&amp;lt;event-id&amp;gt; or &amp;lt;event-address&amp;gt;&amp;quot;, &amp;quot;&amp;lt;relay-url&amp;gt;&amp;quot;, &amp;quot;&amp;lt;pubkey-if-a-regular-event&amp;gt;&amp;quot;]&lt;/code>. &lt;a href="https://github.com/nostr-protocol/nips/blob/master/18.md#quote-reposts">Quote-repost tags&lt;/a> keep those citations out of reply threads and let clients pull and count the quotes on a post.&lt;/p>
&lt;p>Kind 6 is reserved for kind 1 notes. A kind 16 generic repost can wrap any event kind other than kind 1. It SHOULD include a &lt;code>k&lt;/code> tag whose value is the stringified kind of the inner event. When that inner event is replaceable, the generic repost SHOULD add an &lt;code>a&lt;/code> tag with the &lt;code>kind:pubkey:d-tag&lt;/code> coordinate; if that &lt;code>a&lt;/code> tag is absent, the repost targets one specific version and &lt;code>content&lt;/code> must hold the full JSON string of that version. &lt;a href="https://github.com/nostr-protocol/nips/blob/master/18.md#generic-reposts">The generic-repost rules&lt;/a> keep long-form, addressable, and other non-note events from being published as if they were kind 1.&lt;/p>
&lt;p>The following kind 6 event is a live repost recovered from &lt;code>wss://relay.damus.io&lt;/code> at assembly time (&lt;a href="https://njump.me/nevent1qqs88k8xgv2d3d3yymawaa24f22a0kqqvknpur0p05vq9e5r4y74xjspz3mhxue69uhhyetvv9ujuerpd46hxtnfdu7elvca">open the event&lt;/a>):&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">6&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;73d8e64314d8b62426faeef5554a95d7d80065a61e0de17d1802e683a93d534a&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;a60e79e0edad5100d7543b669e513dbc1c2170e8e9b74fdb8e971afd1e0e6813&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">1787768621&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>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;e&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;38980cd673ee16609dc87081d9f645c331d5a5a8b5b0d6c8147600ed29447976&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 style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;34d2f5274f1958fcd2cb2463dabeaddf8a21f84ace4241da888023bf05cc8095&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 style="color:#e6db74">&amp;#34;client&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;Primal 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>&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;pubkey\&amp;#34;:\&amp;#34;34d2f5274f1958fcd2cb2463dabeaddf8a21f84ace4241da888023bf05cc8095\&amp;#34;,\&amp;#34;sig\&amp;#34;:\&amp;#34;8c0271f7b438083ce491c391335598e0cbceee0758177cf98f7894531033cb5153704b01009590f3d4e9cdfadd5bbf73fc5eea54186fcbac6d30744e0e6c1cd6\&amp;#34;,\&amp;#34;id\&amp;#34;:\&amp;#34;38980cd673ee16609dc87081d9f645c331d5a5a8b5b0d6c8147600ed29447976\&amp;#34;,\&amp;#34;tags\&amp;#34;:[[\&amp;#34;r\&amp;#34;,\&amp;#34;https:\/\/stacker.news\/items\/1555439\&amp;#34;],[\&amp;#34;client\&amp;#34;,\&amp;#34;Damus\&amp;#34;]],\&amp;#34;created_at\&amp;#34;:1787766056,\&amp;#34;content\&amp;#34;:\&amp;#34;🚨 Attention CLN (Core Lightning) node runners 🚨\n\nhttps:\/\/stacker.news\/items\/1555439\&amp;#34;,\&amp;#34;kind\&amp;#34;:1}&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;b6b97fa377cfdb651e2850f65f2ccb12ca0724c0de0fc0e39e9721f850abdfd31f5d5567517a51d988145c2a2de9ae9540b02eecf7352e554022870d5e8c64a5&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>Its &lt;code>kind&lt;/code> is 6, the &lt;code>e&lt;/code> tag points to the reposted note, the &lt;code>p&lt;/code> tag identifies that note&amp;rsquo;s author, and &lt;code>content&lt;/code> carries the original kind 1 event as stringified JSON. This relay-recovered event omits the relay hint that the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/18.md">NIP-18 specification&lt;/a> marks as required, illustrating why readers and clients must validate real events and allow for producers that omit fields.&lt;/p>
&lt;h3 id="reactions-nip-25">Reactions (NIP-25)&lt;/h3>
&lt;p>A post can collect signed likes, dislikes, and emoji without those marks entering the reply thread. &lt;a href="https://github.com/nostr-protocol/nips/blob/master/25.md">The reaction specification&lt;/a> defines that mark as a kind 7 event whose &lt;code>content&lt;/code> MUST carry the reaction value. &lt;code>+&lt;/code> or an empty string MUST be read as a like or upvote. &lt;code>-&lt;/code> MUST be read as a dislike or downvote. An emoji or a &lt;a href="https://nostrcompass.org/en/topics/nip-30/">NIP-30&lt;/a> (custom emoji) shortcode SHOULD NOT be read as a like or dislike, and a client MAY display that emoji on the post.&lt;/p>
&lt;p>The target is in the tags, not inferred from &lt;code>content&lt;/code>. There MUST be an &lt;code>e&lt;/code> tag set to the target event &lt;code>id&lt;/code>, and that tag SHOULD include a relay hint; extra &lt;code>e&lt;/code> tags are not recommended, and if they appear the target &lt;code>id&lt;/code> must be last. There SHOULD be a &lt;code>p&lt;/code> tag for the target author, last if several &lt;code>p&lt;/code> tags appear. An addressable target SHOULD also get an &lt;code>a&lt;/code> tag with &lt;code>kind:pubkey:d-tag&lt;/code> coordinates. The &lt;code>e&lt;/code> and &lt;code>a&lt;/code> tags SHOULD include relay and pubkey hints, the &lt;code>p&lt;/code> tags SHOULD include relay hints, and a &lt;code>k&lt;/code> tag MAY carry the stringified kind of the reacted event. &lt;a href="https://github.com/nostr-protocol/nips/blob/master/25.md#tags">Those tag rules&lt;/a> let a client fetch the target and notify its author from the reaction event alone.&lt;/p>
&lt;p>A client MAY put a single &lt;code>:shortcode:&lt;/code> in &lt;code>content&lt;/code> and one &lt;code>emoji&lt;/code> tag that maps that shortcode to an image URL, following the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/25.md#custom-emoji-reaction">custom-emoji reaction rules&lt;/a>. If the target is not a native Nostr event, the reaction MUST be kind 17 and MUST carry &lt;a href="https://nostrcompass.org/en/topics/nip-73/">NIP-73&lt;/a> (external content IDs) &lt;code>k&lt;/code> and &lt;code>i&lt;/code> tags, as in the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/25.md#external-content-reactions">external-content reaction rules&lt;/a>. Kind 17 is a reaction to a website, podcast episode, or other external object. It is not a kind 7 event-to-event reaction and it is not a repost.&lt;/p>
&lt;p>The following kind 7 event is a live reaction recovered from &lt;code>wss://relay.damus.io&lt;/code> at assembly time (&lt;a href="https://njump.me/nevent1qqsytac63l00k7kyaphkfwqqn94wglmx78v6zhqtytg65w5k957luccpz3mhxue69uhhyetvv9ujuerpd46hxtnfdus63jym">open the event&lt;/a>):&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">7&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;45f71a8fdefb7ac4e86f64b800996ae47f66f1d9a15c0b22d1aa3a962d3dfe63&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;0755cc2b972c3cbcae36913109c50b36b3fe110fa38a76dc37d1f01c5305496a&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">1787768605&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>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;e&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;519de32071d71bb2ab8b71a07e03eb9a256b6a59f9b08877b156c80966d5c320&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 style="color:#e6db74">&amp;#34;a&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;34236:5ab67f7d7fed4f781008c0ec0d26c8113f9fb46094a8346246c70c75e75db9fb:2ddda68516f4729d3ef55a1eb01fe028253393212493a34816ad8eb79f97a3b7&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 style="color:#e6db74">&amp;#34;p&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;5ab67f7d7fed4f781008c0ec0d26c8113f9fb46094a8346246c70c75e75db9fb&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 style="color:#e6db74">&amp;#34;k&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;34236&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 style="color:#e6db74">&amp;#34;client&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;Divine&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;31990:d95aa8fc0eff8e488952495b8064991d27fb96ed8652f12cdedc5a4e8b5ae540:divine-mobile&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;wss://relay.divine.video&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 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;3c081756c7a73e2ee8aa10fadf3b5009390d5ac9a72078ba03701c42af91022ef275df7cb17724689a23dca4e29ff1a7cd5e3a24135d021983e2726a28b00b1e&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>Its &lt;code>content&lt;/code> is &lt;code>+&lt;/code>, the conventional like from &lt;a href="https://github.com/nostr-protocol/nips/blob/master/25.md">NIP-25&lt;/a>. The &lt;code>e&lt;/code> tag names the reacted-to event; the &lt;code>a&lt;/code> tag adds its addressable coordinate; the &lt;code>p&lt;/code> tag identifies its author; and the optional &lt;code>k&lt;/code> tag records the target&amp;rsquo;s kind as a string.&lt;/p>
&lt;h3 id="current-client-implementations">Current client implementations&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a>, an Android Nostr client, defines the &lt;a href="https://github.com/vitorpamplona/amethyst/blob/d06b83bd53c510e589d5ce13d46f6bd1a8206394/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip18Reposts/RepostEvent.kt">repost event type&lt;/a> and the &lt;a href="https://github.com/vitorpamplona/amethyst/blob/d06b83bd53c510e589d5ce13d46f6bd1a8206394/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip25Reactions/ReactionEvent.kt">reaction event type&lt;/a> in its current protocol layer.&lt;/p>
&lt;p>&lt;a href="https://github.com/v0l/snort">Snort&lt;/a>, a web Nostr client, implements &lt;a href="https://github.com/v0l/snort/blob/8b2e6cb6dc5a5e0b7e052b4ed89a9c5630444e95/packages/system/src/impl/nip18.ts">NIP-18 helpers that include quote-link tag handling&lt;/a> and &lt;a href="https://github.com/v0l/snort/blob/8b2e6cb6dc5a5e0b7e052b4ed89a9c5630444e95/packages/system/src/impl/nip25.ts">creates NIP-25 event-reaction tags&lt;/a>.&lt;/p>
&lt;p>&lt;a href="https://github.com/soapbox-pub/ditto">Ditto&lt;/a>, a combined Mastodon server and Nostr relay, &lt;a href="https://github.com/soapbox-pub/ditto/blob/570fc4b26e5900ccb4085cfdb2cc86d08cdd9ade/src/components/RepostMenu.tsx">publishes kind 16 generic reposts with a &lt;code>k&lt;/code> tag and an &lt;code>a&lt;/code> coordinate on addressable targets&lt;/a> and &lt;a href="https://github.com/soapbox-pub/ditto/blob/570fc4b26e5900ccb4085cfdb2cc86d08cdd9ade/src/lib/nostrEvents.ts">applies kind 7 reaction semantics by treating the last &lt;code>e&lt;/code> tag as the target event&lt;/a>.&lt;/p>
&lt;h3 id="how-they-work-together">How They Work Together&lt;/h3>
&lt;p>A kind 6 or kind 16 event redistributes an existing event into the reposter&amp;rsquo;s followers&amp;rsquo; feeds, either by embedding that event&amp;rsquo;s JSON or by pointing at a replaceable coordinate. A &lt;code>q&lt;/code> tag marks a quote inside some other event so thread reconstruction can count citations without treating the quoting event as a reply, which is the split drawn in the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/18.md#quote-reposts">quote-repost section&lt;/a>. A kind 7 event leaves the original event in place and attaches only the reaction value plus target tags, which is the contract in the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/25.md">reaction specification&lt;/a>. Clients that fetch one pubkey therefore see that pubkey&amp;rsquo;s reposts as new kind 6 or 16 events and that pubkey&amp;rsquo;s opinions as kind 7 events on other people&amp;rsquo;s posts.&lt;/p>
&lt;hr>
&lt;p>Send a NIP-17 DM to share a project or news item through the &lt;a href="https://github.com/andotherstuff/nostr-compass">Nostr Compass project&lt;/a>.&lt;/p></content:encoded></item><item><title>Nostr Compass #37</title><link>https://nostrcompass.org/en/newsletters/2026-08-26-newsletter/</link><pubDate>Wed, 26 Aug 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-08-26-newsletter/</guid><description>&lt;p>Welcome back to &lt;a href="https://nostrcompass.org">Nostr Compass&lt;/a>, 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> keeps remote-signer and wallet secrets out of browser storage, &lt;a href="https://github.com/Routstr/routstr-sdk">Routstr SDK&lt;/a> verifies relay-sourced provider discovery, &lt;a href="https://gitworkshop.dev/npub1qwkd5wzftcxquuhtkcg0xn9ed7evksluuppf7qdmdh34ywe9uncs5uqfvl/relay.ngit.dev/postr">Postr&lt;/a> launches as a small Android composer, &lt;a href="https://github.com/TurkeyNostr/infans">Infans&lt;/a> encrypts family tracking and co-parent sync, &lt;a href="https://walls.rip/comms">walls.rip&lt;/a> carries PGP-encrypted chat through public Nostr relays, and &lt;a href="https://git.nostrdev.com/stuff/pakstr">pakstr&lt;/a> makes Zapstore publication explicit. &lt;a href="https://github.com/nbd-wtf/nostr-tools">nostr-tools&lt;/a> binds gift-wrap rumors to their seals. Releases cover subscription isolation, profile statuses, relay-scoped leave markers, an Android mail client whose arrival notifications need no private key, Marmot KeyPackage selection and epoch-gap recovery, wallet-connect spending budgets in Zeus, post-quantum private messages in NYM, and a 32-bit timer that emptied every browser escrow in Chama. Protocol work reaches comment-thread rollout, wallet-connect fee and payment-lookup drafts, napplet display requests, and experimental same-account enrollment. The issue closes with &lt;a href="https://nostrcompass.org/en/newsletters/2026-08-26-newsletter/#six-years-of-nostr-augusts">Six Years of Nostr Augusts&lt;/a>.&lt;/p></description><content:encoded>&lt;p>Welcome back to &lt;a href="https://nostrcompass.org">Nostr Compass&lt;/a>, 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> keeps remote-signer and wallet secrets out of browser storage, &lt;a href="https://github.com/Routstr/routstr-sdk">Routstr SDK&lt;/a> verifies relay-sourced provider discovery, &lt;a href="https://gitworkshop.dev/npub1qwkd5wzftcxquuhtkcg0xn9ed7evksluuppf7qdmdh34ywe9uncs5uqfvl/relay.ngit.dev/postr">Postr&lt;/a> launches as a small Android composer, &lt;a href="https://github.com/TurkeyNostr/infans">Infans&lt;/a> encrypts family tracking and co-parent sync, &lt;a href="https://walls.rip/comms">walls.rip&lt;/a> carries PGP-encrypted chat through public Nostr relays, and &lt;a href="https://git.nostrdev.com/stuff/pakstr">pakstr&lt;/a> makes Zapstore publication explicit. &lt;a href="https://github.com/nbd-wtf/nostr-tools">nostr-tools&lt;/a> binds gift-wrap rumors to their seals. Releases cover subscription isolation, profile statuses, relay-scoped leave markers, an Android mail client whose arrival notifications need no private key, Marmot KeyPackage selection and epoch-gap recovery, wallet-connect spending budgets in Zeus, post-quantum private messages in NYM, and a 32-bit timer that emptied every browser escrow in Chama. Protocol work reaches comment-thread rollout, wallet-connect fee and payment-lookup drafts, napplet display requests, and experimental same-account enrollment. The issue closes with &lt;a href="https://nostrcompass.org/en/newsletters/2026-08-26-newsletter/#six-years-of-nostr-augusts">Six Years of Nostr Augusts&lt;/a>.&lt;/p>
&lt;h2 id="top-stories">Top Stories&lt;/h2>
&lt;h3 id="postr-launches-as-a-small-android-composer">Postr launches as a small Android composer&lt;/h3>
&lt;p>&lt;a href="https://gitworkshop.dev/npub1qwkd5wzftcxquuhtkcg0xn9ed7evksluuppf7qdmdh34ywe9uncs5uqfvl/relay.ngit.dev/postr">Postr&lt;/a> is a deliberately small Android composer for kind 1 notes. Private-key custody stays in &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a>, an Android &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> (local signer) and NIP-46 signer. Version 1.0.0 ships a durable outbox that survives lost connectivity and process death, account-specific private drafts, and &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> attachments with verified hashes and scoped upload authorization.&lt;/p>
&lt;p>A post succeeds after Postr reads back the identical signed event and checks its signature. Retries keep the same event id. Publication uses the author&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> (relay list) write relays plus encrypted bootstrap relays, or a custom per-account list. A signed &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> (git-over-Nostr) &lt;a href="https://njump.me/nevent1qqsqxdwxa8k5e0ftf6j6q5ucs3u94ezgjqmyzwznqt99pyxxw23c74spz3mhxue69uhhyetvv9ujumn8d96zuer9wcx4nr0m">repository announcement&lt;/a> and a matching &lt;a href="https://njump.me/nevent1qqs24gy97frkjkma8ys3rwc3jj8f0qrrmsxjwe39jxrhuemztrygr8qpz3mhxue69uhhyetvv9ujumn8d96zuer9wcspcsat">kind 0 project profile&lt;/a> are published on &lt;code>relay.ngit.dev&lt;/code>. Feeds, analytics, advertising, and key storage stay outside the app.&lt;/p>
&lt;h3 id="infans-encrypts-family-tracking-and-co-parent-sync-over-nostr">Infans encrypts family tracking and co-parent sync over Nostr&lt;/h3>
&lt;p>Co-parents can keep feeding, sleep, and growth records on their own phones and share them without a family-data vendor. &lt;a href="https://github.com/TurkeyNostr/infans">Infans&lt;/a> is an Android baby tracker that treats a local Room database as the source of truth and publishes encrypted kind 30078 &lt;a href="https://nostrcompass.org/en/topics/nip-78/">NIP-78&lt;/a> (application-specific data) events for backup and partner sync. Its repository labels the local cipher &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> (payload encryption), but the implementation uses AES-256-GCM while NIP-44 v2 requires ChaCha20 with HMAC-SHA256, so local-mode payloads should not be presented as NIP-44-compatible.&lt;/p>
&lt;p>&lt;a href="https://github.com/TurkeyNostr/infans/blob/main/README.md">Partner sync&lt;/a> uses d-tag &lt;code>baby-tracker-sync&lt;/code>, while self-backups use &lt;code>baby-tracker-backup&lt;/code>. Async notes travel inside the partner payload. The documented Amber &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> (local signer) path delegates signing and encryption to the signer, but the repository provides no interoperability test showing that every backup and partner-sync path produces NIP-44-v2 ciphertext. The repository presents neither a medical-device claim nor a third-party security review.&lt;/p>
&lt;h3 id="wallsrip-ghost-chat-brings-pgp-encrypted-chat-to-public-nostr-relays">walls.rip Ghost Chat brings PGP-encrypted chat to public Nostr relays&lt;/h3>
&lt;p>&lt;a href="https://walls.rip/comms">walls.rip&lt;/a> is an anonymous communication toolkit whose Ghost Chat mode creates or imports an OpenPGP identity in the browser. Its &lt;a href="https://github.com/KYC-rip/walls-rip/tree/cf40bda32df5f106007631b21afc3cd193ac0cda/src/components/ghostChat">open source client&lt;/a> encrypts each message to the recipient&amp;rsquo;s PGP public key. Readable conversation remains in local session storage on the device; the application has no chat account or central message database.&lt;/p>
&lt;p>The transport is real Nostr, but it is deliberately app-specific. Ghost Chat &lt;a href="https://github.com/KYC-rip/walls-rip/blob/cf40bda32df5f106007631b21afc3cd193ac0cda/src/utils/nostrService.ts">publishes armored ciphertext as kind 1 events&lt;/a> to five default relays and labels each event with a stable room tag derived from the recipient&amp;rsquo;s PGP fingerprint. That gives developers a concrete example of using relays as censorship-resistant message transport, while also showing why decentralized delivery alone is not metadata-private or interoperable with NIP-17 direct messages.&lt;/p>
&lt;h3 id="pakstr-0130-through-0150-makes-zapstore-publication-explicit">pakstr 0.13.0 through 0.15.0 makes Zapstore publication explicit&lt;/h3>
&lt;p>After &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-29-newsletter/#pakstr-031">July&amp;rsquo;s 0.3.1 packaging and Amber work&lt;/a>, &lt;a href="https://git.nostrdev.com/stuff/pakstr">pakstr&lt;/a> is a CLI that turns a folder of web assets into a signed Android APK and publishes it to Zapstore with a Nostr key. &lt;a href="https://git.nostrdev.com/stuff/pakstr/releases/tag/v0.13.0">0.13.0&lt;/a> adds automatic release versioning. The 0.13.1 through 0.13.3 follow-ups repair Blossom publication: &lt;a href="https://git.nostrdev.com/stuff/pakstr/releases/tag/v0.13.1">authorization now uses base64url&lt;/a>, &lt;a href="https://git.nostrdev.com/stuff/pakstr/releases/tag/v0.13.2">uploads carry a Content-Digest&lt;/a>, and the &lt;a href="https://git.nostrdev.com/stuff/pakstr/releases/tag/v0.13.3">Zapstore application event is published before the Blossom upload&lt;/a>.&lt;/p>
&lt;p>&lt;a href="https://git.nostrdev.com/stuff/pakstr/releases/tag/v0.14.0">0.14.0&lt;/a> validates the Zapstore publisher before a publish proceeds. &lt;a href="https://git.nostrdev.com/stuff/pakstr/releases/tag/v0.15.0">0.15.0&lt;/a> writes listing metadata onto kind 32267 application events and puts release notes in kind 30063 release-event content, so a packaged app&amp;rsquo;s Zapstore record can carry name, summary, and notes without a separate manual listing step.&lt;/p>
&lt;h3 id="heterodyne-specifies-portable-personas-and-encrypted-social-communication">Heterodyne specifies portable personas and encrypted social communication&lt;/h3>
&lt;p>&lt;a href="https://radicle.network/nodes/iris.radicle.network/rad%3Az2zX5XvPiggGJvCn8DPkp1hRNGA5">Heterodyne&lt;/a> is a specification-first protocol family for portable personas, authenticated communication, own-device control, and social interaction. Its &lt;a href="https://radicle.network/nodes/iris.radicle.network/rad%3Az2zX5XvPiggGJvCn8DPkp1hRNGA5">current README&lt;/a> composes four existing layers: Nostr signed events, &lt;a href="https://radicle.xyz">Radicle&lt;/a> (peer-to-peer git) durable storage, &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a> (MLS group messaging over Nostr) for encrypted direct and group conversations, and &lt;a href="https://arxiv.org/abs/1907.02143">KERI&lt;/a> (Key Event Receipt Infrastructure) key-event logs for identity rotation. A persona is described as a cold-root Nostr npub plus an accepted KERI log; routine signing uses rotating epoch keys, while Radicle node identities are dual-proof delegated.&lt;/p>
&lt;p>The family splits that work into &lt;a href="https://radicle.network/nodes/iris.radicle.network/rad%3Az2zX5XvPiggGJvCn8DPkp1hRNGA5">four independently versioned 0.x drafts&lt;/a>. Core owns identity, key-event-log verification, canonical Nostr bytes, and the Radicle repository substrate; Comms owns Nostr-native envelopes, privacy tiers, publishing, and Marmot conversations; and Social owns public following, interactions, and lists. Control, for own-device enrollment and grants, is incomplete and cannot be claimed. These documents remain drafts that may break before 1.0, and this issue introduces the family before any Heterodyne client release has landed.&lt;/p>
&lt;h2 id="releases">Releases&lt;/h2>
&lt;h3 id="nostr-java-v208-subscription-isolation-and-portable-nip-44">Nostr Java v2.0.8: subscription isolation and portable NIP-44&lt;/h3>
&lt;p>A gift-wrap query against a relay holding five events was returning zero, two, or six events at random, because &lt;a href="https://github.com/tcheeric/nostr-java">Nostr Java&lt;/a>, a Java library for talking to relays and encrypting Nostr payloads, delivered every inbound frame to every listener on the connection. &lt;a href="https://github.com/tcheeric/nostr-java/releases/tag/v2.0.8">Version 2.0.8&lt;/a> routes &lt;code>EVENT&lt;/code>, &lt;code>EOSE&lt;/code>, and &lt;code>CLOSED&lt;/code> to the subscription those frames name, so one query&amp;rsquo;s end-of-stored-events signal can no longer close another. Connection-scoped frames such as &lt;code>NOTICE&lt;/code>, &lt;code>OK&lt;/code>, and &lt;code>AUTH&lt;/code> still reach every listener.&lt;/p>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> (payload encryption) in the same &lt;a href="https://github.com/tcheeric/nostr-java/releases/tag/v2.0.8">release&lt;/a> no longer needs a JCE provider registered in the process. Encryption used to work only after a key had been generated in that JVM, which registered BouncyCastle as a side effect, and it failed on Android, where adding a provider named &amp;ldquo;BC&amp;rdquo; is a no-op. Both cipher paths now use BouncyCastle&amp;rsquo;s lightweight ChaCha20 engine, and key generation no longer mutates process-wide JCE state. Callers that relied on the library to register the provider must register it themselves. The &lt;a href="https://github.com/tcheeric/nostr-java/issues/537">NIP-44 JCE-provider dependence&lt;/a> is the issue this closes.&lt;/p>
&lt;h3 id="noornote-v136-profile-statuses-and-classified-listings">NoorNote v1.3.6: profile statuses and classified listings&lt;/h3>
&lt;p>&lt;a href="https://github.com/77elements/noornote">NoorNote&lt;/a> is a Nostr client for desktop, web, and Android. A week after &lt;a href="https://nostrcompass.org/en/newsletters/2026-08-19-newsletter/#noornote-134-joining-encrypted-communities-from-an-invite-link">1.3.4 added encrypted community joins&lt;/a>, &lt;a href="https://github.com/77elements/noornote/releases/tag/v1.3.6">version 1.3.6&lt;/a> shows &lt;a href="https://nostrcompass.org/en/topics/nip-38/">NIP-38&lt;/a> (user statuses) under a profile&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-05/">NIP-05&lt;/a> (domain-verified) name: the optionally expiring kind &lt;code>30315&lt;/code> addressable events that carry a one-line general or music status. Clicking that line sets the viewer&amp;rsquo;s own status.&lt;/p>
&lt;p>&lt;a href="https://github.com/77elements/noornote/releases/tag/v1.3.6">Classified listings&lt;/a> from &lt;a href="https://nostrcompass.org/en/topics/nip-99/">NIP-99&lt;/a> (kind &lt;code>30402&lt;/code> marketplace offers) now render throughout the app, so the marketplace addon is needed only to buy and sell. Private petname notes on profiles also show in warning orange, with a filled note icon and an orange avatar ring.&lt;/p>
&lt;h3 id="nostrord-v290-relay-scoped-group-state-and-media">nostrord v2.9.0: relay-scoped group state and media&lt;/h3>
&lt;p>Leaving a &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> (relay-managed groups) group on one host used to suppress the same group id on every other relay, because &lt;a href="https://github.com/nostrord/nostrord">nostrord&lt;/a>, a cross-platform client for relay-hosted communities, keyed its leave and delete markers by bare id. &lt;a href="https://github.com/nostrord/nostrord/pull/253">Leave and delete markers scoped per relay&lt;/a> keep those suppressions on the host that produced them, so a group that shares an id across two relays is no longer left or dropped as a pair. A join that the relay rejects as already a member now counts as success and clears the local marker, which had been an absorbing state: the self-heal cleared one slot while cold start restored the other.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostrord/nostrord/releases/tag/v2.9.0">Version 2.9.0&lt;/a> also renders &lt;a href="https://github.com/nostrord/nostrord/pull/254">markdown image embeds&lt;/a> that other clients write as &lt;code>![alt](url)&lt;/code>, instead of showing the markdown punctuation around an already-detected URL. Direct messages pick up &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> (gift-wrapped private DMs) &lt;a href="https://github.com/nostrord/nostrord/pull/275">kind &lt;code>15&lt;/code> file rumors&lt;/a>, so an encrypted attachment sent from Jumble is downloaded, decrypted, and shown, and outbound attachments are encrypted before upload. This tag now ships the &lt;a href="https://nostrcompass.org/en/newsletters/2026-08-19-newsletter/#nostrord-implements-an-unmerged-encryption-key-proposal">NIP-4e encryption-key work covered last week&lt;/a>. The proposal remains unmerged, and nostrord says its implementation follows deployed Jumble behavior where that behavior differs from the draft.&lt;/p>
&lt;h3 id="nail-v010-an-android-client-and-a-key-free-arrival-watcher">Nail v0.1.0: an Android client and a key-free arrival watcher&lt;/h3>
&lt;p>&lt;a href="https://github.com/formstr-hq/nail">Nail&lt;/a> is the Formstr team&amp;rsquo;s mail bridge and web client, &lt;a href="https://nostrcompass.org/en/newsletters/2026-08-19-newsletter/#nail-brings-email-onto-nostr-as-gift-wrapped-events">introduced last week&lt;/a>, which carries email as kind &lt;code>1301&lt;/code> rumors inside kind &lt;code>1059&lt;/code> &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> (gift wrap) envelopes. &lt;a href="https://github.com/formstr-hq/nail/releases/tag/v0.1.0">v0.1.0&lt;/a> is its first tagged release and adds a mobile surface: an &lt;a href="https://github.com/formstr-hq/nail/pull/12">Android app for mailstr&lt;/a> built on Capacitor around the existing client, plus &lt;a href="https://github.com/formstr-hq/nail/pull/13">Zapstore publishing configuration and mobile screenshots&lt;/a>. The app is listed on Zapstore as &lt;code>com.formstr.mail&lt;/code>.&lt;/p>
&lt;p>The interesting part is how the app learns that mail has arrived. Reading a message needs the private key, but the arrival of a p-tagged gift wrap is itself the &amp;ldquo;you have new mail&amp;rdquo; signal, and that needs only public data. Nail&amp;rsquo;s &lt;a href="https://github.com/formstr-hq/nail/blob/main/notifier/src/lib.rs">notifier crate&lt;/a> is built on that observation: it holds no key material and never decrypts, subscribing per relay for &lt;code>{kinds:[1059], #p:[owner]}&lt;/code>, deduplicating arrivals by event id, and calling back once per new wrap. It carries its own Tokio runtime on a dedicated thread and is exposed to Kotlin through UniFFI, so the Android &lt;a href="https://github.com/formstr-hq/nail/blob/main/mobile/android/app/src/main/java/com/formstr/mail/notify/MailPollWorker.kt">poll worker&lt;/a> connects, reads to end-of-stored-events, posts a notification per new wrap, and disconnects rather than holding a socket open or running a foreground service.&lt;/p>
&lt;p>That worker also documents a protocol trap other clients will hit. NIP-59 backdates each gift wrap&amp;rsquo;s &lt;code>created_at&lt;/code> by up to two days to frustrate timing analysis, so a message that has just arrived can carry a timestamp two days old. A &lt;code>since&lt;/code> watermark therefore excludes freshly delivered mail at the relay filter, which is why notifications silently never fired. Nail now fetches roughly the last two days by wall clock and decides novelty purely by event id, with a bounded seen-set and a seeded-backlog marker in &lt;code>SharedPreferences&lt;/code> so a first run does not announce old mail. The rest of the release is relay and client repair: &lt;a href="https://github.com/formstr-hq/nail/pull/9">relay handling&lt;/a>, a &lt;a href="https://github.com/formstr-hq/nail/pull/11">user-agent fix&lt;/a>, and &lt;a href="https://github.com/formstr-hq/nail/pull/10">alias defaults with a mobile compose fix&lt;/a>.&lt;/p>
&lt;h3 id="mdk-v0914-and-v0915-keypackage-selection-epoch-gap-recovery-and-split-relay-roles">MDK v0.9.14 and v0.9.15: KeyPackage selection, epoch-gap recovery, and split relay roles&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/mdk">MDK&lt;/a> is the Rust implementation of &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a>, the &lt;a href="https://nostrcompass.org/en/topics/nip-104/">NIP-104&lt;/a> (MLS group messaging over Nostr) protocol, and it ships the MarmotKit bindings other clients build on. Two releases landed in the window, and both concentrate on the join and recovery paths that decide whether a group stays usable.&lt;/p>
&lt;p>Invitation now depends on choosing the right key material. &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.9.14">v0.9.14&lt;/a> &lt;a href="https://github.com/marmot-protocol/mdk/pull/1493">prioritizes setup KeyPackage publication&lt;/a> and &lt;a href="https://github.com/marmot-protocol/mdk/pull/1494">batches and prewarms member KeyPackages&lt;/a> so an invite is not waiting on a fetch, and &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.9.15">v0.9.15&lt;/a> &lt;a href="https://github.com/marmot-protocol/mdk/pull/1550">selects the newest valid KeyPackage for group invites&lt;/a> rather than whichever arrives first. A stale KeyPackage produces a member who cannot decrypt, so the selection rule is the difference between a working invite and a silent failure.&lt;/p>
&lt;p>Recovery got the same treatment. v0.9.15 &lt;a href="https://github.com/marmot-protocol/mdk/pull/1524">arms epoch-gap recovery before every publish gate&lt;/a> and &lt;a href="https://github.com/marmot-protocol/mdk/pull/1532">reports epoch passages to the stall detector&lt;/a>, so a client that has fallen behind the group&amp;rsquo;s epoch repairs itself before it tries to publish instead of writing into a state nobody else shares. An &lt;a href="https://github.com/marmot-protocol/mdk/pull/1523">empty admin policy is now classified as admin depletion&lt;/a>, which turns a group with no reachable administrator into a named condition rather than an unexplained refusal, and v0.9.14 &lt;a href="https://github.com/marmot-protocol/mdk/pull/1488">added bounded sync and catch-up failure telemetry&lt;/a> to make those stalls visible at all.&lt;/p>
&lt;p>Two changes matter for relay operators and multi-account users. v0.9.15 &lt;a href="https://github.com/marmot-protocol/mdk/pull/1537">separates directory discovery from operational relays&lt;/a>, so the relays used to find people are no longer the relays carrying group traffic, and v0.9.14 &lt;a href="https://github.com/marmot-protocol/mdk/pull/1495">publishes profiles with account-owned relays&lt;/a> through &lt;code>marmot-uniffi&lt;/code>. &lt;a href="https://github.com/marmot-protocol/mdk/pull/1528">External-signer accounts can now sign out and wipe&lt;/a>, closing a case where a remote-signer account could not be fully removed. &lt;a href="https://github.com/marmot-protocol/mdk/pull/1542">Account-scoped invite policies for direct bots&lt;/a> and &lt;a href="https://github.com/marmot-protocol/mdk/pull/1511">large-group pressure scenarios&lt;/a> round out the pair, and both releases publish MarmotKit iOS and macOS XCFrameworks with SwiftPM checksums pinned to the exact MDK commit.&lt;/p>
&lt;h3 id="zeus-v1320-wallet-connect-budgets-races-and-secret-rotation">Zeus v13.2.0: wallet-connect budgets, races, and secret rotation&lt;/h3>
&lt;p>&lt;a href="https://github.com/ZeusLN/zeus">Zeus&lt;/a> is a mobile Bitcoin and Lightning wallet whose Nostr surface is &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> (wallet connect). &lt;a href="https://github.com/ZeusLN/zeus/releases/tag/v13.2.0">v13.2.0&lt;/a> carries a dense run of fixes on that surface, most of them about a connection&amp;rsquo;s spending budget meaning what it says. Pending payments now &lt;a href="https://github.com/ZeusLN/zeus/pull/4305">count against the connection budget&lt;/a>, settled payments missing from the payments list &lt;a href="https://github.com/ZeusLN/zeus/pull/4334">debit it anyway&lt;/a>, and &lt;a href="https://github.com/ZeusLN/zeus/pull/4340">routing and melt fees are included&lt;/a>. Each of those gaps let a connection spend past its stated cap.&lt;/p>
&lt;p>Concurrency and identity got the rest. &lt;code>pay_invoice&lt;/code> handling is &lt;a href="https://github.com/ZeusLN/zeus/pull/4303">serialized to prevent shared-store races&lt;/a>, &lt;code>pay_invoice&lt;/code> activity records &lt;a href="https://github.com/ZeusLN/zeus/pull/4343">upsert safely and reconcile their persistence&lt;/a>, &lt;code>sign_message&lt;/code> now &lt;a href="https://github.com/ZeusLN/zeus/pull/4308">awaits the signature so it returns the right one&lt;/a>, and the client secret is &lt;a href="https://github.com/ZeusLN/zeus/pull/4341">rotated and persisted on relay change&lt;/a>. &lt;a href="https://github.com/ZeusLN/zeus/pull/4294">&lt;code>lookup_invoice&lt;/code>, &lt;code>list_transactions&lt;/code>, and backend invoice lookup&lt;/a> were repaired together. The release also ships LDK 24-word seed phrases, an embedded LND bump, and a Cashu CDK upgrade, none of which touch a Nostr surface.&lt;/p>
&lt;h3 id="nym-post-quantum-private-messages-and-threads-in-channels">NYM: post-quantum private messages and threads in channels&lt;/h3>
&lt;p>&lt;a href="https://github.com/Spl0itable/NYM">NYM&lt;/a> is a lightweight ephemeral chat client on Nostr bridged with Bitchat, and it shipped sixteen tagged releases in the window. Three carry the substance. &lt;a href="https://github.com/Spl0itable/NYM/releases/tag/v3.73.530">v3.73.530&lt;/a> adds Bluetooth mesh in supporting browsers, putting the mesh transport behind a web client rather than a native app. &lt;a href="https://github.com/Spl0itable/NYM/releases/tag/v3.74.533">v3.74.533&lt;/a> adds quantum-resistant encryption to private messages and group chats, and &lt;a href="https://github.com/Spl0itable/NYM/releases/tag/v3.74.542">v3.74.542&lt;/a> moves that scheme to its second version; a client choosing its own post-quantum envelope is interoperable only with itself, so the tradeoff is confidentiality against reach. &lt;a href="https://github.com/Spl0itable/NYM/releases/tag/v3.75.543">v3.75.543&lt;/a> adds message threads in channels, private messages, and group chats, and moves the premium bot onto post-quantum encrypted messages. &lt;a href="https://github.com/Spl0itable/NYM/releases/tag/v3.74.543">v3.74.543&lt;/a> repairs a private-message interoperability break with Bitchat. The remaining eleven releases are bug-fix and performance passes.&lt;/p>
&lt;h3 id="divine-1022-relay-and-signer-lifecycles-that-end-when-the-session-does">diVine 1.0.22: relay and signer lifecycles that end when the session does&lt;/h3>
&lt;p>&lt;a href="https://github.com/divinevideo/divine-mobile">diVine&lt;/a> is a short-form looping video client with restored Vine archives. &lt;a href="https://github.com/divinevideo/divine-mobile/releases/tag/1.0.22">1.0.22&lt;/a> is largely a cleanup of connections and subscriptions that outlived their session. Signing out &lt;a href="https://github.com/divinevideo/divine-mobile/pull/7957">no longer leaves a relay connection open forever&lt;/a>, and a separate fix stops it &lt;a href="https://github.com/divinevideo/divine-mobile/pull/7973">leaving the signer connected forever&lt;/a> over &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> (remote signing). Subscription slots are &lt;a href="https://github.com/divinevideo/divine-mobile/pull/8007">released after bounded reads&lt;/a>, and temporary relay authentication &lt;a href="https://github.com/divinevideo/divine-mobile/pull/7718">handles fire-and-forget publishes&lt;/a> rather than assuming a receipt.&lt;/p>
&lt;p>The &lt;a href="https://nostrcompass.org/en/topics/nip-04/">NIP-04&lt;/a> (legacy encrypted DMs) path got two fixes with visible symptoms: terminal duplicates are &lt;a href="https://github.com/divinevideo/divine-mobile/pull/7891">no longer retried&lt;/a>, and a DM&amp;rsquo;s &lt;code>created_at&lt;/code> is &lt;a href="https://github.com/divinevideo/divine-mobile/pull/8005">bounded so it cannot freeze the unread badge&lt;/a>, which is the same class of trap Nail hit from the other direction. A &lt;a href="https://github.com/divinevideo/divine-mobile/pull/8034">deleted list no longer returns on the next relay sync&lt;/a>, and &lt;a href="https://github.com/divinevideo/divine-mobile/pull/7640">recipients can remove unwanted badges&lt;/a> rather than carrying whatever anyone awarded them.&lt;/p>
&lt;h3 id="chama-v601-a-32-bit-timer-that-emptied-every-browser-escrow">Chama v6.0.1: a 32-bit timer that emptied every browser escrow&lt;/h3>
&lt;p>&lt;a href="https://github.com/jesuspirate/chama">Chama&lt;/a> is a Nostr-native peer-to-peer escrow client pairing Fedimint ecash with 2-of-3 Shamir secret sharing. &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v6.0.1">v6.0.1&lt;/a> fixes a money-path defect with a narrow cause and a wide blast radius. Locking sats into an ecash escrow hands the mint a deadline after which unredeemed notes return to the funder, and Chama set that deadline to 90 days. Fedimint&amp;rsquo;s browser build passes timer values as a 32-bit number, 90 days in milliseconds does not fit, and the value wrapped negative, which the browser read as &amp;ldquo;immediately&amp;rdquo;.&lt;/p>
&lt;p>Every escrow note created in a browser was therefore returned to its funder the instant it was minted, while the trade still published its lock and still displayed as funded, &lt;a href="https://github.com/jesuspirate/chama/releases/tag/v6.0.1">according to the release notes&lt;/a>. That is the part worth reading twice: the Nostr-visible trade state stayed correct while the value behind it had already unwound, so no participant reading the event stream could tell. Escrows created outside a browser build were unaffected.&lt;/p>
&lt;h3 id="also-shipped">Also shipped&lt;/h3>
&lt;p>&lt;a href="https://github.com/dergigi/ants/releases/tag/v0.4.6">ants v0.4.6&lt;/a> adds &lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a> (relay monitoring) discovery as a source of candidate &lt;a href="https://nostrcompass.org/en/topics/nip-50/">NIP-50&lt;/a> (search) relays, then probes each one and rejects relays that accept a &lt;code>search&lt;/code> filter and ignore it. &lt;a href="https://github.com/anasfik/nostr/releases/tag/v11.0.0">nostr-dart v11.0.0&lt;/a> is a major version of the Dart and Flutter client library, integration-tested against live public relays rather than mocks. &lt;a href="https://github.com/Origami74/myco/releases/tag/v0.6.0">myco v0.6.0&lt;/a> changes its mesh wire format and lets a user point the app at a Nostr relay they run, with &lt;a href="https://github.com/Origami74/myco/releases/tag/v0.6.1">v0.6.1&lt;/a> fixing a fast lane that carried only one phone. &lt;a href="https://github.com/jmcorgan/fips/releases/tag/v0.4.2">FIPS v0.4.2&lt;/a> is 144 commits of mostly security work on a mesh protocol that uses Nostr keypairs for node identity, closing paths by which a reachable party could take a node&amp;rsquo;s sessions down, have its traffic attributed to another node, or steer its path MTU. &lt;a href="https://github.com/lonniev/dpyc-oracle/releases/tag/v0.3.0">Tollbooth DPYC v0.3.0&lt;/a> reorders its published relay set after measuring reachability, having found &lt;code>relay.primal.net&lt;/code> and &lt;code>relay.nostr.band&lt;/code> at 0 of 6 probes on August 22 while &lt;code>nos.lol&lt;/code> answered 6 of 6; operators pin a rendezvous to the first entry, so a stale ordering breaks the rendezvous. &lt;a href="https://github.com/shocknet/Lightning.Pub/releases/tag/v0.0.39">Lightning.Pub v0.0.39&lt;/a> stops a Lightning call from blocking the daemon&amp;rsquo;s Nostr relay connection: &lt;code>GetPaymentFromHash&lt;/code> now times out after ten seconds instead of waiting indefinitely, so pending-payment reconciliation at startup no longer holds the relay connection open-ended. &lt;a href="https://github.com/mplorentz/keydex/releases/tag/v1.0.1-37">Keydex v1.0.1-37&lt;/a> fixes compatibility with some relay authentication implementations, alongside invitation links that failed on non-ASCII vault or owner names. &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v4.1.8">nostr-vpn v4.1.8&lt;/a> hardens peer and paid-exit discovery through more resilient public WebSocket bootstrap peers and restores authenticated private-mesh sessions after total network-path loss without an app or daemon restart.&lt;/p>
&lt;h2 id="unreleased-changes">Unreleased Changes&lt;/h2>
&lt;h3 id="shopstr-keeps-remote-signer-and-wallet-secrets-out-of-browser-storage">Shopstr keeps remote-signer and wallet secrets out of browser storage&lt;/h3>
&lt;p>&lt;a href="https://github.com/shopstr-eng/shopstr">Shopstr&lt;/a> is a web marketplace for &lt;a href="https://nostrcompass.org/en/topics/nip-99/">NIP-99&lt;/a> classified listings. After &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#shopstr-binds-payment-validation-to-signed-receipts-and-server-side-prices">last month&amp;rsquo;s payment-integrity work&lt;/a>, it &lt;a href="https://github.com/shopstr-eng/shopstr/pull/437">stops writing serialized bunker signer secrets to &lt;code>localStorage&lt;/code>&lt;/a>. A &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> (remote signing) bunker payload had included the live &lt;code>bunker://&lt;/code> URL and the generated app private key, so any script in the Shopstr origin could resume the remote-signing session. Bunker data now stays in runtime memory for the current session, leftover bunker payloads are removed when they are found, and non-bunker signer types keep their previous storage behavior.&lt;/p>
&lt;p>The matching &lt;a href="https://github.com/shopstr-eng/shopstr/pull/436">NWC change&lt;/a> does the same for &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> (wallet-connect) credentials. Shopstr had stored the full &lt;code>nostr+walletconnect://&lt;/code> string, including the secret used for wallet actions, as ordinary browser data and reused it at checkout. Connection strings and wallet metadata now stay in memory, and older stored copies are deleted when local data is read. Scripts that already run in the Shopstr origin during an active session can still see those in-memory values.&lt;/p>
&lt;h3 id="routstr-verifies-relay-sourced-provider-discovery">Routstr verifies relay-sourced provider discovery&lt;/h3>
&lt;p>A single malicious relay could previously decide which inference providers a Routstr client trusted. &lt;a href="https://github.com/Routstr/routstr-sdk">Routstr SDK&lt;/a> is the TypeScript library behind Routstr, a marketplace that discovers AI providers on Nostr and pays them with Cashu. &lt;a href="https://github.com/Routstr/routstr-sdk/pull/47">This week&amp;rsquo;s discovery fix&lt;/a> verifies every relay-delivered provider announcement, model list, and review (kinds 38421, 38423, and 38425) before any consumer sees it, so a review that names a trusted pubkey but carries a garbage signature no longer enters ranking.&lt;/p>
&lt;p>&lt;a href="https://github.com/Routstr/routstr-sdk/pull/47">Far-future timestamps&lt;/a> are dropped before &amp;ldquo;latest review&amp;rdquo; selection. Events more than fifteen minutes ahead of the local clock are removed on the live path and when reading the persistent store, which stops a forged &lt;code>created_at&lt;/code> from outranking validly signed reviews across restarts. If trusted reviews are unavailable, the review gate fails closed and excludes unreviewed providers from payment ranking until reviews arrive. Operators can still force-enable a provider by hand.&lt;/p>
&lt;h3 id="nostr-tools-binds-gift-wrap-rumors-to-their-seals">nostr-tools binds gift-wrap rumors to their seals&lt;/h3>
&lt;p>Unwrapping a &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> (gift wrap) event used to decrypt the wrap, decrypt the seal, and return the inner rumor without checking who the seal came from. &lt;a href="https://github.com/nbd-wtf/nostr-tools">nostr-tools&lt;/a> is a JavaScript library of Nostr protocol helpers. &lt;a href="https://github.com/nbd-wtf/nostr-tools/pull/545">This week&amp;rsquo;s unwrap fix&lt;/a> requires the wrap to be kind 1059, the seal to be kind 13 with a valid signature, and the rumor&amp;rsquo;s &lt;code>pubkey&lt;/code> to equal the seal&amp;rsquo;s &lt;code>pubkey&lt;/code>. Decrypting the seal already proves control of &lt;code>seal.pubkey&lt;/code>. Without the last check, anyone could seal a rumor that named someone else as author and have a client attribute the message to that victim.&lt;/p>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> (gift-wrapped private DMs) uses the same unwrap path, so the bind applies to private DMs. &lt;a href="https://github.com/nbd-wtf/nostr-tools/pull/545">Batch unwrap&lt;/a> now skips a wrap that fails those checks instead of throwing, because gift wraps are unsolicited and one hostile event would otherwise discard the rest of a relay query.&lt;/p>
&lt;h3 id="haven-adds-signed-relay-administration-and-a-local-notes-browser">Haven adds signed relay administration and a local notes browser&lt;/h3>
&lt;p>&lt;a href="https://github.com/barrydeen/haven">Haven&lt;/a> is a self-hosted Nostr relay and Blossom media server. Its newly merged &lt;a href="https://github.com/barrydeen/haven/pull/135">administration console&lt;/a> exposes NIP-86 management calls on each relay endpoint, with every request authenticated by a NIP-98 event from the configured owner. Operators can manage bans, allowlists, kind rules, relay names, and stored media without giving the relay a signing key. A read-only notes browser keeps encrypted kinds opaque and loads remote media only after a click, avoiding an automatic request that would reveal the operator&amp;rsquo;s IP address to an outside host.&lt;/p>
&lt;p>The same &lt;a href="https://github.com/barrydeen/haven/pull/135">Haven change&lt;/a> adds persistent traffic charts and fixes a default-LMDB failure in which counting stored events could loop forever, pin a CPU core, and block later statistics calls. Haven now uses the backend counter where it terminates and a bounded event walk otherwise. The project added its first 23 tests around event paging, deletion, metrics persistence, owner checks, and URL-bound request signatures.&lt;/p>
&lt;h3 id="amethyst-moves-blossom-authorization-off-image-loading-threads">Amethyst moves Blossom authorization off image-loading threads&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a>, an Android Nostr client, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3991">stops waiting for Blossom read authorization on OkHttp dispatcher threads&lt;/a>. The interceptor now starts signing away from the network thread, while the image fetcher awaits one shared signature per host and retries the protected blob request. A burst of gated images therefore no longer occupies every per-host connection slot while a signer responds.&lt;/p>
&lt;p>The same &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3991">Amethyst patch&lt;/a> brings the token encoding into line with BUD-11: Base64url without padding, &lt;code>server&lt;/code> scope, and no blob-specific &lt;code>x&lt;/code> tag, allowing one token to cover multiple blobs on the same host. New concurrency tests exercise caching, expiry, signed retries, and sixteen simultaneous callers sharing one signature.&lt;/p>
&lt;h2 id="nip-updates-and-protocol-spec-work">NIP Updates and Protocol Spec Work&lt;/h2>
&lt;h3 id="nips">NIPs&lt;/h3>
&lt;p>Snort and Ditto now use &lt;a href="https://nostrcompass.org/en/topics/nip-22/">NIP-22&lt;/a> (comment threads) for ordinary text replies, converging on kind 1111 while retaining compatibility paths; this does not establish a protocol-wide single reply kind. After the &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#kind-1111-as-reply-to-kind-1-notes">June amendment&lt;/a> removed the prohibition on using NIP-22 against kind 1 notes, a &lt;a href="https://github.com/nostr-protocol/nips/pull/2448">merged addition&lt;/a> to &lt;a href="https://nostrcompass.org/en/topics/nip-30/">NIP-30&lt;/a> (custom emoji) lists kind &lt;code>1111&lt;/code> among the events that may carry &lt;code>emoji&lt;/code> tags, with a shortcode in &lt;code>content&lt;/code> resolved by that tag. &lt;a href="https://github.com/v0l/snort">Snort&lt;/a>, a web Nostr client, now &lt;a href="https://github.com/v0l/snort/commit/420ed60e2ff43bd373f2583e171a77002ec9f3a0">writes every reply as kind 1111&lt;/a>, loads those comments through uppercase &lt;code>E&lt;/code>/&lt;code>A&lt;/code> root-scope tags, and still accepts an opt-in &lt;a href="https://nostrcompass.org/en/topics/nip-10/">NIP-10&lt;/a> (kind 1 reply tags) path for older notes. &lt;a href="https://github.com/soapbox-pub/ditto">Ditto&lt;/a>, a combined Mastodon server and Nostr relay, &lt;a href="https://github.com/soapbox-pub/ditto/commit/8a0ffc6e3a5d9202ffc452fa0de8ae33b5883384">publishes every reply as a NIP-22 comment&lt;/a>, kind &lt;code>1111&lt;/code> for text and kind &lt;code>1244&lt;/code> for voice, while continuing to render existing kind 1 replies. Clients that only understand NIP-10 will not see the new form. Top-level posts remain kind 1.&lt;/p>
&lt;p>A &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> (Nostr Wallet Connect) &lt;code>pay_invoice&lt;/code> request currently has no standard way for the client to specify a routing-fee ceiling. An &lt;a href="https://github.com/nostr-protocol/nips/pull/2444">open fee-ceiling proposal&lt;/a> adds an optional &lt;code>max_fee&lt;/code> parameter, in millisatoshis, to &lt;code>pay_invoice&lt;/code>. Wallets that honor the budget MUST NOT send a payment whose routing cost exceeds &lt;code>amount + max_fee&lt;/code> and MUST return &lt;code>FEE_LIMIT_EXCEEDED&lt;/code>, defined as no debit and no payment attempted. Supporting implementations MUST include &lt;code>fees_paid&lt;/code> in the response so the client can reconcile. Implementations without fee-limit support ignore the unknown parameter, and clients should treat a missing &lt;code>fees_paid&lt;/code> field as a sign the cap may not have been enforced. The change adds no event kinds and remains a proposal until it merges.&lt;/p>
&lt;p>An &lt;a href="https://github.com/nostr-protocol/nips/pull/2451">open NIP-32 language-label proposal&lt;/a> would standardize &lt;code>[&amp;quot;l&amp;quot;, &amp;quot;&amp;lt;BCP-47&amp;gt;&amp;quot;, &amp;quot;lang&amp;quot;]&lt;/code> for author-declared text language. Because the single-letter &lt;code>l&lt;/code> tag is already relay-indexable, clients could request a Japanese feed with &lt;code>{&amp;quot;#l&amp;quot;:[&amp;quot;ja&amp;quot;]}&lt;/code> without a relay upgrade or unreliable post-download language detection. The draft also migrates the language examples in NIP-66 relay reports, NIP-68 image metadata, and NIP-71 audio tracks to the same namespace. Labels remain unverified author assertions, and the change is not merged.&lt;/p>
&lt;h3 id="nostr-wallet-connect">Nostr Wallet Connect&lt;/h3>
&lt;p>After a timeout, reconnect, or missed notification, a wallet-connect client needs a way to ask for one payment record without knowing which Bitcoin payment protocol created it. An &lt;a href="https://github.com/nostr-wallet-connect/nwc/pull/5">open payment-lookup draft&lt;/a> in the &lt;a href="https://github.com/nostr-wallet-connect/nwc">NWC extension repository&lt;/a> defines optional NWC-09 &lt;code>lookup_payment&lt;/code> beside NIP-47 core. The request uses exactly one selector: a stable wallet-scoped &lt;code>transaction_id&lt;/code>, the BOLT11-compatible &lt;code>payment_hash&lt;/code> and/or &lt;code>invoice&lt;/code> fields already used by &lt;code>lookup_invoice&lt;/code>, or a &lt;code>payment_type&lt;/code> plus a typed &lt;code>lookup&lt;/code> object defined by another extension. A successful result returns a common envelope (&lt;code>transaction_id&lt;/code>, &lt;code>type&lt;/code>, &lt;code>state&lt;/code>, &lt;code>payment_type&lt;/code>, &lt;code>amount&lt;/code> in msats, timestamps, optional &lt;code>fees_paid&lt;/code> and &lt;code>metadata&lt;/code>, and a discriminated &lt;code>details&lt;/code> object) and MUST resolve to exactly one record visible to that connection. The wallet MUST NOT reveal whether an inaccessible record exists, and a selector that matches several visible records returns &lt;code>MULTIPLE_MATCHES&lt;/code>. States are &lt;code>pending&lt;/code>, &lt;code>accepted&lt;/code>, &lt;code>settled&lt;/code>, &lt;code>failed&lt;/code>, &lt;code>expired&lt;/code>, and &lt;code>canceled&lt;/code>. The same proposal adds NWC-12 BOLT12 offer and payment details that reuse that envelope. Both documents are still drafts.&lt;/p>
&lt;h3 id="naps">NAPs&lt;/h3>
&lt;p>An open &lt;a href="https://github.com/napplet/naps/pull/97">NAP-DISPLAY draft&lt;/a> would let a napplet ask its host for pixel displays it is allowed to use. It builds on the separately &lt;a href="https://nostrcompass.org/en/topics/nip-5d/">unmerged NIP-5D web-applets proposal&lt;/a>, which Newsletter #17 introduced and which remains outside the merged NIP set. The draft defines &lt;code>display.list&lt;/code>, which would return opaque stable identifiers with logical width, height, and a runtime-chosen type (&lt;code>lcd&lt;/code>, &lt;code>eink&lt;/code>, &lt;code>led-matrix&lt;/code>, or &lt;code>other&lt;/code>), and &lt;code>display.push&lt;/code>, which would submit a non-empty batch of coordinate-addressed three-byte sRGB pixels. Runtime discovery would map logical RGB onto native color depth, orientation, and refresh and MAY rotate, reorder, quantize, dither, or coalesce updates. Shell policy would control which displays a napplet may list or write and MAY reject, rate-limit, or cap batches. Before applying any pixel, the runtime would validate the whole batch, so a failed push would change nothing on the device. Success would mean the batch was accepted, not that hardware refresh had finished.&lt;/p>
&lt;h3 id="marmot">Marmot&lt;/h3>
&lt;p>An &lt;a href="https://github.com/marmot-protocol/marmot/pull/417">open Marmot experiment&lt;/a> would replace the withdrawn External Commit draft for same-account enrollment with a bounded Commit shape. &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot&lt;/a>, the MLS group-messaging protocol on Nostr, assigns data-less component &lt;code>0x800d&lt;/code> (&lt;code>marmot.same-account-membership.v1&lt;/code>) as a negotiated behavior marker in that draft. While it is required, a current leaf may author either exactly one inline same-account Add or one to four inline sibling Removes, each with a normal UpdatePath and ordinary convergence priority, and every Commit MUST leave at most five current leaves for any one account. Pairing uses a short-lived sponsor-displayed QR (&lt;code>marmot-pairing-v1:&lt;/code>) whose secret feeds HKDF-SHA256 and ChaCha20-Poly1305 over a carrier-independent channel. Local-only kind &lt;code>453&lt;/code> proofs bind the session to the shared account key and are never relayed. After a matching Welcome, the joiner&amp;rsquo;s first application payload is a non-rendered kind &lt;code>452&lt;/code> acknowledgement bound to the Welcome and GroupInfo digests, so a byte-identical Welcome can be recovered without consuming the KeyPackage again. The paired sponsor is the joiner&amp;rsquo;s trust root for that branch and does not prove global finality. A companion account-sync document remains exploratory and non-interoperable. The experiment is not part of the adopted base profile.&lt;/p>
&lt;h2 id="six-years-of-nostr-augusts">Six Years of Nostr Augusts&lt;/h2>
&lt;p>Augusts follow one interoperability problem: how a client names a target and attaches feedback. The &lt;a href="https://github.com/nostr-protocol/nostr">original protocol repository&lt;/a> recorded no August 2021 commits, so the signed-event core sat still. &lt;a href="https://nostrcompass.org/en/topics/nip-25/">NIP-25&lt;/a> (reactions) then left the kind-1-only box in 2022. Regular replaceable records gained empty-identifier &lt;code>naddr&lt;/code> and &lt;code>a&lt;/code> coordinates in 2023; in 2024, the separate &lt;a href="https://github.com/nostr-protocol/nips/commit/ca3c52e3e74f0a4679f1c6c0d9ac6461ea748d2d">parameterized-replaceable class was renamed addressable events&lt;/a> without a wire-format change. Reactions moved onto external media in 2025. &lt;a href="https://nostrcompass.org/en/topics/nip-22/">NIP-22&lt;/a> (comment threads) kind 1111 reached producing clients in 2026. The progression is from an idle protocol document to a shared reply and reaction vocabulary that works across notes, replaceable records, and off-network objects.&lt;/p>
&lt;h3 id="august-2021">August 2021&lt;/h3>
&lt;p>The &lt;a href="https://api.github.com/repos/nostr-protocol/nostr/commits?since=2021-08-01T00:00:00Z&amp;amp;until=2021-08-31T23:59:59Z">August 2021 commit window&lt;/a> on the original protocol repository is empty. The last change before that inactive month was the June 18 NIP-05 draft, which added DNS-domain identifiers as a human-readable pointer to a public key. &lt;a href="https://nostrcompass.org/en/topics/nip-05/">NIP-05&lt;/a> (domain identifiers) later moved to a well-known JSON file, but in mid-2021 it was still a DNS TXT lookup. August did not extend that identifier work or add a new event kind or relay message.&lt;/p>
&lt;p>The same empty window appears in the tools that already existed beside the specification. &lt;a href="https://github.com/fiatjaf/noscl/commits?since=2021-08-01&amp;amp;until=2021-09-01">noscl&lt;/a>, a command-line client created in January 2021, recorded no August commits; neither did &lt;a href="https://github.com/nbd-wtf/go-nostr/commits?since=2021-08-01&amp;amp;until=2021-09-01">go-nostr&lt;/a> or &lt;a href="https://github.com/nbd-wtf/nostr-tools/commits?since=2021-08-01&amp;amp;until=2021-09-01">nostr-tools&lt;/a>. Protocol activity resumed only at year-end, when the repository assigned &lt;a href="https://nostrcompass.org/en/topics/nip-09/">NIP-09&lt;/a> (event deletion requests) and replaced the DNS scheme with a well-known JSON identifier file. August 2021 is the inactive stage between the June identifier draft and December&amp;rsquo;s deletion and well-known-JSON work, while the &lt;a href="https://fiatjaf.com/nostr.html">signed-event and relay model&lt;/a> held as written.&lt;/p>
&lt;h3 id="august-2022">August 2022&lt;/h3>
&lt;p>On August 19, a &lt;a href="https://github.com/nostr-protocol/nips/commit/7af2540c6e392d5cb789c743b1dd237294388649">NIP-25 edit&lt;/a> expanded kind 7 reaction targets from kind 1 text notes to other notes. The kind 7 event and the &lt;code>+&lt;/code>/&lt;code>-&lt;/code> convention were already in the draft. That interoperability change let a like, dislike, or emoji attach to a profile, a follow list, or any later event kind that reused the same &lt;code>e&lt;/code> and &lt;code>p&lt;/code> tags.&lt;/p>
&lt;p>The current &lt;a href="https://github.com/nostr-protocol/nips/blob/master/25.md">NIP-25 specification&lt;/a> keeps that generalization: a reaction indicates user reactions to other events, and an addressable target also receives an &lt;code>a&lt;/code> tag with &lt;code>kind:pubkey:d-tag&lt;/code> coordinates. &lt;a href="https://github.com/vitorpamplona/amethyst/blob/main/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip25Reactions/ReactionEvent.kt">Amethyst&lt;/a>, an Android client, implements that contract in its reaction builder. Its builder accepts any event, writes &lt;code>e&lt;/code>, &lt;code>p&lt;/code>, and &lt;code>k&lt;/code> tags, and adds an &lt;code>a&lt;/code> tag when the target is an addressable event. This generalized reaction targets beyond kind 1; later August changes added stable coordinates and comment-context tags.&lt;/p>
&lt;p>Relay software was also turning tag rules into storage behavior. On August 17, nostr-rs-relay &lt;a href="https://github.com/scsibug/nostr-rs-relay/commit/035cf34673ae23407bda6656eef505b3178482ab">stopped treating every hexadecimal-looking tag value as a binary index key&lt;/a>. It limited that optimization to single-letter tags and lowercase hexadecimal values, preserving ordinary text tags instead of decoding them into a form that filters could not match. The same month therefore joined two sides of interoperability: specifications broadened what an interaction could target, while a relay corrected how those target tags were indexed and retrieved.&lt;/p>
&lt;h3 id="august-2023">August 2023&lt;/h3>
&lt;p>On August 24, &lt;a href="https://nostrcompass.org/en/topics/nip-19/">NIP-19&lt;/a> (bech32 identifiers) &lt;a href="https://github.com/nostr-protocol/nips/commit/208dee210249f84496ddfa823542d023e23b3edb">defined how to encode a non-parameterized replaceable event as an naddr&lt;/a>. The identifier field, the &lt;code>d&lt;/code> tag, became an empty string for kinds that replace by pubkey and kind alone, such as metadata and contact lists. Five days later, &lt;a href="https://nostrcompass.org/en/topics/nip-01/">NIP-01&lt;/a> (the base event and relay protocol) &lt;a href="https://github.com/nostr-protocol/nips/commit/e50bf508d9014cfb19bfa8a5c4ec88dc4788d490">added the matching a-tag format&lt;/a>: &lt;code>kind:pubkey:&lt;/code> with a trailing colon and no identifier. Clients could now point at a replaceable record without waiting for a specific event id that the next replace would invalidate.&lt;/p>
&lt;p>The &lt;a href="https://github.com/nostr-protocol/nips/blob/master/19.md">current NIP-19 text&lt;/a> still tells implementers to use an empty string for those replaceable events. &lt;a href="https://github.com/nbd-wtf/nostr-tools/blob/master/nip19.ts">nostr-tools&lt;/a>, the JavaScript identifier library, encodes that field through &lt;code>naddrEncode&lt;/code>, so a caller can pass an empty identifier and produce a shareable coordinate. The August 2023 work turned replaceable state into something a comment, a reaction, or a share link could name after the underlying event had been superseded. The next August standardized terminology for the related parameterized-replaceable class, while later comment tags reused the coordinate grammar as &lt;code>A&lt;/code> and &lt;code>a&lt;/code>.&lt;/p>
&lt;p>Private payloads were becoming portable at the same time. On August 24, rust-nostr &lt;a href="https://github.com/nostrdevkit/nostr/commit/39e581d398d926ff37a6b57a1c6d5fceae270d77">added NIP-44 encrypt and decrypt functions to its JavaScript bindings&lt;/a>, exposing the versioned conversation-key scheme to web applications alongside native Rust callers. On August 22, Amethyst &lt;a href="https://github.com/vitorpamplona/amethyst/commit/fa4257ad7d7afa76ccb368b4cf6cadefa39461ba">separated NIP-44 encryption from the messaging event format&lt;/a>, reflecting the protocol split between how content is encrypted and how an application transports it. Stable coordinates made public objects easier to reference; reusable encryption APIs made private content easier to move between implementations without coupling it to one message kind.&lt;/p>
&lt;p>The same month also brought funding for adjacent key-isolation, interface, and education work. An &lt;a href="https://github.com/OpenSats/website/commit/acd33f11b7529c34a846e8c4b4a6c63e7187f970">August 17 OpenSats grant round&lt;/a> allocated its Nostr Fund grants to Amber, shared Nostr interface design, and Nostr use-case education. Amber&amp;rsquo;s grant focused on keeping signing keys in a dedicated Android application through NIP-46, while the design and education grants addressed onboarding and reusable application patterns. The wider Nostr system was advancing through specification commits, key isolation, interface work, and funded developer education as shared infrastructure.&lt;/p>
&lt;h3 id="august-2024">August 2024&lt;/h3>
&lt;p>On August 20, the specifications &lt;a href="https://github.com/nostr-protocol/nips/commit/ca3c52e3e74f0a4679f1c6c0d9ac6461ea748d2d">renamed &amp;ldquo;parameterized replaceable event&amp;rdquo; to &amp;ldquo;addressable event&amp;rdquo;&lt;/a> across NIP-01 and sixteen other documents, including long-form articles, live activities, lists, calendars, and classified listings. The wire format did not change. &lt;code>kind:pubkey:d-tag&lt;/code> remained the coordinate. What changed is that every specification that already used those coordinates now used the same word for them.&lt;/p>
&lt;p>That vocabulary is the one current implementations ship. &lt;a href="https://github.com/nostr-protocol/nips/blob/master/01.md">NIP-01&lt;/a> stores addressable events as the latest record per kind, pubkey, and &lt;code>d&lt;/code> tag. &lt;a href="https://github.com/nostr-protocol/nips/blob/master/19.md">NIP-19&lt;/a> calls an naddr &amp;ldquo;a nostr addressable event coordinate.&amp;rdquo; Amethyst&amp;rsquo;s reaction path, cited above, types the target as &lt;code>AddressableEvent&lt;/code> before writing the &lt;code>a&lt;/code> tag. The 2023 coordinate extension and 2024 terminology change both use the &lt;code>kind:pubkey:d-tag&lt;/code> coordinate grammar, while NIP-01 continues to distinguish regular replaceable events from addressable events. A later comment can therefore fetch an addressable discussion by uppercase &lt;code>A&lt;/code> without caring which event id currently occupies that address.&lt;/p>
&lt;p>Storage protocols were applying the same preference for explicit identifiers. On August 27, Blossom&amp;rsquo;s BUD-04 &lt;a href="https://github.com/hzrd149/blossom/commit/4325aa79891cb4d68448ce16e5fa5519058eae4b">allowed one authorization event to carry multiple blob-hash &lt;code>x&lt;/code> tags&lt;/a>, so a client could authorize a bounded batch of uploads, mirrors, or deletions without pretending that the hashes described one object. Four days later, the project &lt;a href="https://github.com/hzrd149/blossom/commit/95eb92e70768b0a2d5bab3dc42a5e3418f9055ec">clarified its blob descriptor and added an example&lt;/a>. Nostr events were coordinating content-addressed media operations while the bytes stayed on media servers, separating signed authorization from storage transport.&lt;/p>
&lt;p>On August 29, remote signing became more tolerant of imperfect relay sets. go-nostr changed its NIP-46 client so &lt;a href="https://github.com/nbd-wtf/go-nostr/commit/5edb54efee52f469fe62180c20d2876fe9c72910">one faulty relay could not block a request sent through other configured relays&lt;/a>: relay connections and publication attempts run independently, and the call proceeds once any connection succeeds. On August 19, OpenSats also &lt;a href="https://github.com/OpenSats/website/commit/b0ac18552a80c662b6ca33381abeed5c3d833a4c">announced long-term support for Amethyst creator Vitor Pamplona&lt;/a>, including work on NIP-17 private messages, cross-platform libraries, and the outbox model. The protocol vocabulary, resilient transport, privacy work, and sustained maintenance funding were converging around the same goal: clients that could keep working across devices and uneven relay conditions.&lt;/p>
&lt;h3 id="august-2025">August 2025&lt;/h3>
&lt;p>On August 22, &lt;a href="https://github.com/nostr-protocol/nips/pull/2020">NIP-25 gained external-content reactions&lt;/a>. A reaction to something that is not a native Nostr event must be kind 17 and must carry &lt;a href="https://nostrcompass.org/en/topics/nip-73/">NIP-73&lt;/a> (external content identifiers) &lt;code>k&lt;/code> and &lt;code>i&lt;/code> tags, replacing the older website &lt;code>r&lt;/code> tag. The examples in the merged text are a web URL (&lt;code>k=web&lt;/code>) and a podcast episode identified by show GUID and item GUID, with Fountain URLs as hints. Reactions had left kind 1 in 2022. They now left the Nostr event set.&lt;/p>
&lt;p>&lt;a href="https://blog.fountain.fm/p/1-3">Fountain 1.3&lt;/a>, published August 15, 2025, shipped those likes before the specification merge and said they are powered by Nostr so other podcast apps can read them. Today&amp;rsquo;s &lt;a href="https://github.com/nostr-protocol/nips/blob/master/25.md">NIP-25 document&lt;/a> still uses Fountain&amp;rsquo;s podcast GUID example. By August 2025, a reaction coordinate could name a podcast episode or a web page with the same identifier grammar a comment later uses for an external root.&lt;/p>
&lt;h3 id="august-2026">August 2026&lt;/h3>
&lt;p>This August moved comment threads into the clients that write ordinary replies. &lt;a href="https://nostrcompass.org/en/newsletters/2026-06-24-newsletter/#kind-1111-as-reply-to-kind-1-notes">The June amendment&lt;/a>, later merged, removed the line that had told clients not to use NIP-22 comments on short notes. &lt;a href="https://nostrcompass.org/en/topics/nip-30/">NIP-30&lt;/a> (custom emoji) then &lt;a href="https://github.com/nostr-protocol/nips/pull/2448">added kind 1111&lt;/a> beside notes, reactions, and user statuses, so a comment can carry the same emoji tags those other kinds already used. The specification work is the permission. The client work is the rollout.&lt;/p>
&lt;p>&lt;a href="https://github.com/v0l/snort/commit/420ed60e2ff43bd373f2583e171a77002ec9f3a0">Snort&lt;/a>, a web client, now publishes NIP-22 comments for kind 1 targets by default, subscribes to threads through uppercase &lt;code>E&lt;/code>/&lt;code>A&lt;/code> root tags, and accepts kind 1111 in notifications. &lt;a href="https://github.com/soapbox-pub/ditto/commit/8a0ffc6e3a5d9202ffc452fa0de8ae33b5883384">Ditto&lt;/a>, a community web client, publishes every reply as a NIP-22 comment, kind 1111 for text and 1244 for voice, including replies to kind 1 notes, while still reading &lt;a href="https://nostrcompass.org/en/topics/nip-10/">NIP-10&lt;/a> (note threading) replies. The six-year shift is visible in those defaults: 2022 generalized the reaction, 2023 and 2024 named the coordinate, 2025 pointed reactions off-network, and 2026 made the comment the shared reply event across those same targets.&lt;/p>
&lt;p>Private-group infrastructure was defining recovery as an interoperability requirement. Marmot&amp;rsquo;s August 13 &lt;a href="https://github.com/marmot-protocol/marmot/commit/4a2bc65f8db5866cec3b2a127dedb37818eaf207">durability and restart contract&lt;/a> specifies which local MLS and publication state must survive a restart, and requires clients to reconcile persisted state before continuing group operations. That extends the August progression beyond naming a target: a mature client must also preserve enough cryptographic and delivery state to resume safely after interruption. Shared event shapes matter only when implementations can recover the state needed to use them.&lt;/p>
&lt;hr>
&lt;p>Send a NIP-17 DM to share a project or news item through the &lt;a href="https://github.com/andotherstuff/nostr-compass">Nostr Compass project&lt;/a>.&lt;/p></content:encoded></item><item><title>Nostr Compass #36</title><link>https://nostrcompass.org/en/newsletters/2026-08-19-newsletter/</link><pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-08-19-newsletter/</guid><description>&lt;p>Welcome back to &lt;a href="https://nostrcompass.org">Nostr Compass&lt;/a>, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> hardens relay auth and encrypts stored secrets, &lt;a href="https://github.com/forgesworn/cambium">Cambium&lt;/a> signs for websites under relay-auth load, &lt;a href="https://github.com/greenart7c3/Citrine">Citrine&lt;/a> hosts groups and static sites on a phone relay, &lt;a href="https://github.com/VectorPrivacy/Vector">Vector&lt;/a> queues moderation under spam and syncs mutes across devices, &lt;a href="https://github.com/hedwig-corp/bitchat-to-sonar">Sonar&lt;/a> adds threaded mesh replies, &lt;a href="https://github.com/nostria-app/nostria">Nostria&lt;/a> publishes podcasts, and &lt;a href="https://github.com/formstr-hq/nail">Nail&lt;/a> bridges email as gift-wrapped events. Releases cover MDK group state, badge minting, QR signer pairing, Android browser signing, and shared wallet-connect. Protocol work reaches comment patches, encrypted file metadata, thread formatting, Marmot restart guarantees, and Concord membership lists. Deep dives: badges and comments.&lt;/p></description><content:encoded>&lt;p>Welcome back to &lt;a href="https://nostrcompass.org">Nostr Compass&lt;/a>, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> hardens relay auth and encrypts stored secrets, &lt;a href="https://github.com/forgesworn/cambium">Cambium&lt;/a> signs for websites under relay-auth load, &lt;a href="https://github.com/greenart7c3/Citrine">Citrine&lt;/a> hosts groups and static sites on a phone relay, &lt;a href="https://github.com/VectorPrivacy/Vector">Vector&lt;/a> queues moderation under spam and syncs mutes across devices, &lt;a href="https://github.com/hedwig-corp/bitchat-to-sonar">Sonar&lt;/a> adds threaded mesh replies, &lt;a href="https://github.com/nostria-app/nostria">Nostria&lt;/a> publishes podcasts, and &lt;a href="https://github.com/formstr-hq/nail">Nail&lt;/a> bridges email as gift-wrapped events. Releases cover MDK group state, badge minting, QR signer pairing, Android browser signing, and shared wallet-connect. Protocol work reaches comment patches, encrypted file metadata, thread formatting, Marmot restart guarantees, and Concord membership lists. Deep dives: badges and comments.&lt;/p>
&lt;h2 id="top-stories">Top Stories&lt;/h2>
&lt;h3 id="amber-650-closes-a-relay-auth-confused-deputy-and-encrypts-stored-secrets">Amber 6.5.0 closes a relay-auth confused deputy and encrypts stored secrets&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> is an Android &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. &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.5.0">Version 6.5.0&lt;/a> closes four disclosed gaps: a &lt;a href="https://github.com/greenart7c3/Amber/security/advisories/GHSA-vx4h-56qj-wcp7">confused deputy in relay authentication&lt;/a> that let any caller obtain a kind &lt;code>22242&lt;/code> &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> event for relays the user never approved; a &lt;a href="https://github.com/greenart7c3/Amber/security/advisories/GHSA-h9fv-9247-3582">NIP-46 replay gap&lt;/a>; &lt;a href="https://github.com/greenart7c3/Amber/security/advisories/GHSA-5fjp-ghh8-wch8">plaintext connection secrets and local keys&lt;/a> now envelope-encrypted at rest; and an &lt;a href="https://github.com/greenart7c3/Amber/security/advisories/GHSA-8844-q5vh-9j8f">eight-item hardening batch&lt;/a> covering caller authorization before decrypt, fail-closed permission parsing, plain-&lt;code>ws://&lt;/code> warnings, secure QR screens, log redaction, lazy key zeroing on logout, and optional unlocked-device Keystore use.&lt;/p>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.5.1">Version 6.5.1&lt;/a> re-encrypts stored NIP-46 secrets when the Keystore key rotates after toggling the unlocked-device requirement and fixes a permission-editor crash. &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.5.2">Version 6.5.2&lt;/a> stops decrypting columns the applications list never renders, caches the Keystore handle, warms the account cache at startup, and debounces relay status notifications.&lt;/p>
&lt;p>&lt;a href="https://nostrcompass.org/en/newsletters/2026-08-12-newsletter/#amber-640-makes-every-grouped-signing-decision-explicit">Last week&amp;rsquo;s 6.4.0&lt;/a> made grouped signing decisions explicit; 6.5.x changes what Amber will authorize at all.&lt;/p>
&lt;h3 id="cambium-040-signs-for-websites-and-sheds-relay-auth-bursts">Cambium 0.4.0 signs for websites and sheds relay-auth bursts&lt;/h3>
&lt;p>&lt;a href="https://github.com/forgesworn/cambium">Cambium&lt;/a> is an Android &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> proxy to a Heartwood hardware signer over &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a>. Six releases shipped in two days.&lt;/p>
&lt;p>&lt;a href="https://github.com/forgesworn/cambium/releases/tag/v0.4.0">Version 0.4.0&lt;/a> extends signing to websites. A page can request a signature through a validated &lt;code>nostrsigner:&lt;/code> callback without inheriting the permissions granted to native applications, which keeps a browser tab from borrowing another app&amp;rsquo;s approval. The same release fixes the specification&amp;rsquo;s minimal event shape: an event carrying only &lt;code>kind&lt;/code> and &lt;code>content&lt;/code> now signs correctly, with Cambium supplying the paired NIP-46 identity, the current timestamp, and an empty tag array before handing the event to rust-nostr. Native rust-nostr instrumentation became a required continuous-integration gate in the same change.&lt;/p>
&lt;p>&lt;a href="https://github.com/forgesworn/cambium/releases/tag/v0.3.6">Version 0.3.6&lt;/a> repairs pairing against spec-following signers. Cambium&amp;rsquo;s older rust-nostr build accepted only the literal string &lt;code>ack&lt;/code> as the result of a NIP-46 &lt;code>connect&lt;/code> call, so a signer that answers by echoing the bunker URI&amp;rsquo;s secret, which is what the current specification asks for and what Heartwood&amp;rsquo;s firmware does, ended pairing with an unexpected-response error. Moving from rust-nostr 0.44.2 to 0.44.8 makes both forms acceptable, verified against live hardware and against &lt;code>nak bunker&lt;/code>, which still answers &lt;code>ack&lt;/code>.&lt;/p>
&lt;p>The 0.4.1 through 0.4.3 releases are about admission control under load. &lt;a href="https://github.com/forgesworn/cambium/releases/tag/v0.4.1">Version 0.4.1&lt;/a> gives reactions, posts, deletions, and encryption a reserved queue slot ahead of relay authentication and background decryption, bounds queued calls, discards them once the caller has timed out, and returns a terminal unavailable result on overload instead of opening a foreground signing screen. &lt;a href="https://github.com/forgesworn/cambium/releases/tag/v0.4.2">Version 0.4.2&lt;/a> discards timed-out or long-idle NIP-46 sessions before the next request and lets concurrent copies of the same kind &lt;code>22242&lt;/code> authentication event share one hardware signature. &lt;a href="https://github.com/forgesworn/cambium/releases/tag/v0.4.3">Version 0.4.3&lt;/a> admits at most one distinct authentication challenge per identity into the hardware worker, never retries authentication internally, and opens a sixty-second per-identity cooldown after a timeout while still answering exact cached duplicates. The measurements in the release notes come from a GrapheneOS phone driving &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a>: a cold-start burst produced thirty-three immediate overload responses and thirteen completed requests with no signer timeouts, and a fresh login during an authentication burst returned 1.254 seconds after approval.&lt;/p>
&lt;h3 id="citrine-310-turns-a-phone-relay-into-a-group-host-and-a-site-host">Citrine 3.1.0 turns a phone relay into a group host and a site host&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Citrine">Citrine&lt;/a> is an on-device Android relay. &lt;a href="https://github.com/greenart7c3/Citrine/releases/tag/v3.1.0">Version 3.1.0&lt;/a> adds three capabilities that change what the relay can host.&lt;/p>
&lt;p>Support for &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a>, the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/29.md">relay-based group specification&lt;/a> where the relay itself holds membership and moderation state, means a phone can host a group instead of joining one. Support for &lt;a href="https://nostrcompass.org/en/topics/nip-86/">NIP-86&lt;/a>, the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/86.md">relay management API&lt;/a> that exposes administrative actions over authenticated JSON-RPC, arrives with a settings screen, so allowlists and bans can be driven from the API as well as from the app. Support for &lt;a href="https://nostrcompass.org/en/topics/nip-5a/">NIP-5A&lt;/a> &lt;a href="https://github.com/nostr-protocol/nips/blob/master/5A.md">static websites&lt;/a> lets the relay serve nsites to web clients, with a modernized browse list carrying icons, search, sort-by-last-update, install progress, descriptions, and a configurable set of relays for fetching them that defaults to &lt;code>nsite.run&lt;/code>, &lt;code>nos.lol&lt;/code>, and &lt;code>nostr.land&lt;/code>.&lt;/p>
&lt;p>The moderation surface grew alongside it in the &lt;a href="https://github.com/greenart7c3/Citrine/releases/tag/v3.1.0">same release&lt;/a>. Banning a public key locally now offers to purge that author&amp;rsquo;s stored events, a configurable &lt;code>REJECTED_KINDS&lt;/code> list blocks kinds the operator does not want to store, and access control can import from existing lists. A rebroadcast tool pushes stored events back out to selected relays, which gives a phone-held archive a way to reseed the network. The release also removes the WebSocket &lt;code>permessage-deflate&lt;/code> extension, tightens the query hot path, fixes Tor failing to start or stop when the expose-via-Tor setting changes, and moves logs into a local database with logcat limited to debug builds.&lt;/p>
&lt;h3 id="vector-042-makes-community-moderation-survive-a-spam-wave">Vector 0.4.2 makes community moderation survive a spam wave&lt;/h3>
&lt;p>&lt;a href="https://github.com/VectorPrivacy/Vector">Vector&lt;/a> is a desktop and Android &lt;a href="https://github.com/concord-protocol/concord">Concord&lt;/a> messenger. &lt;a href="https://github.com/VectorPrivacy/Vector/releases/tag/v0.4.2">Version 0.4.2&lt;/a> focuses on moderation under load.&lt;/p>
&lt;p>Rapid bans previously overwrote each other. They now queue, stack, and settle as a single operation, so banning a wave of accounts costs one key rotation instead of one per account. Accepting an invitation to a community that has since been dissolved now explains why and removes the invitation from every device the user owns, and dissolving a community the user owns clears it from their community list everywhere, a fix that arrived in &lt;a href="https://github.com/VectorPrivacy/Vector/releases/tag/v0.4.3">version 0.4.3&lt;/a>. Community messages that arrive during a background catch-up no longer ring notifications as though they had just been sent, and the typing indicator expires from the moment it was sent so a delayed signal cannot linger in a channel.&lt;/p>
&lt;p>The sharded community list defined by &lt;a href="https://github.com/concord-protocol/concord">Concord&lt;/a> took a cross-client review pass with Armada, the other Concord client. Renames no longer inflate the list, ties resolve identically on both clients, and unchanged data is no longer republished to relays. Muting also moved out of the direct-message path: a user can now mute someone straight from a community with no prior message history, and the mute applies to notifications and badges across channels and direct messages while leaving the messages themselves visible. Pinned messages became a shared channel surface with clickable links, and edits to a pinned message follow it wherever it appears. Block lists, mutes, and nicknames now sync between a user&amp;rsquo;s devices, as do pinned chats. Version 0.4.3 also stops Vector from announcing that the user is typing when a different Nostr client is signed in as the same identity, and unblocks Tor bootstrap on Windows, which had frozen at fifteen percent on both x64 and ARM64.&lt;/p>
&lt;h3 id="sonar-brings-threaded-replies-to-a-mesh-messenger-with-nip-c7">Sonar brings threaded replies to a mesh messenger with NIP-C7&lt;/h3>
&lt;p>&lt;a href="https://github.com/hedwig-corp/bitchat-to-sonar">Sonar&lt;/a> is a Bluetooth mesh and Nostr messenger. &lt;a href="https://github.com/hedwig-corp/bitchat-to-sonar/releases/tag/v0.1-alpha.13.1">Version 0.1-alpha.13.1&lt;/a> adds Signal-style replies on &lt;a href="https://github.com/nostr-protocol/nips/blob/master/C7.md">NIP-C7&lt;/a> kind &lt;code>9&lt;/code> chat, plus mentions, bounded Bluetooth reassembly, backup caps, mesh-path signature verification, and FCM push fallback. &lt;a href="https://github.com/hedwig-corp/bitchat-to-sonar/releases/tag/v0.1-alpha.13.2">Versions 0.1-alpha.13.2&lt;/a> and &lt;a href="https://github.com/hedwig-corp/bitchat-to-sonar/releases/tag/v0.1-alpha.13.3">0.1-alpha.13.3&lt;/a> fix chat-open crashes on Android and iOS keyboard overlap.&lt;/p>
&lt;h3 id="nostria-starts-publishing-podcasts-and-asks-relays-to-count">Nostria starts publishing podcasts and asks relays to count&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostria-app/nostria">Nostria&lt;/a> is a web client. &lt;a href="https://github.com/nostria-app/nostria/releases/tag/v4.1.70">Version 4.1.70&lt;/a> and &lt;a href="https://github.com/nostria-app/nostria/releases/tag/v4.1.71">4.1.71&lt;/a> add podcast publishing for premium subscribers, with episodes as signed Nostr events. &lt;a href="https://github.com/nostria-app/nostria/releases/tag/v4.1.69">Version 4.1.69&lt;/a> uses &lt;a href="https://nostrcompass.org/en/topics/nip-45/">NIP-45&lt;/a> &lt;code>COUNT&lt;/code> for reaction, reply, and zap totals in feeds and completes localization. &lt;a href="https://nostrcompass.org/en/newsletters/2026-08-12-newsletter/#nostria-4167-expands-encrypted-community-administration">Last week&amp;rsquo;s 4.1.67&lt;/a> expanded encrypted-community administration.&lt;/p>
&lt;h2 id="tagged-releases">Tagged Releases&lt;/h2>
&lt;h3 id="mdk-0914-fail-closed-group-history-through-faster-group-creation">MDK 0.9.14: fail-closed group history through faster group creation&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/mdk">MDK&lt;/a> is the Rust development kit for &lt;a href="https://github.com/marmot-protocol/marmot">Marmot&lt;/a>, an encrypted group-messaging protocol carried over Nostr. &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.9.12">Version 0.9.12&lt;/a> makes several group-state paths fail closed instead of guessing. A missing fork anchor is now a hard error (&lt;a href="https://github.com/marmot-protocol/mdk/pull/1329">PR #1329&lt;/a>), a leave proposal is persisted atomically so a crash cannot leave a half-applied departure (&lt;a href="https://github.com/marmot-protocol/mdk/pull/1360">PR #1360&lt;/a>), and incident replay refuses to guess a format on manifest-less newline-delimited JSON streams (&lt;a href="https://github.com/marmot-protocol/mdk/pull/1140">PR #1140&lt;/a>). Convergence testing widened at the same time, with retained-history cross-route recovery (&lt;a href="https://github.com/marmot-protocol/mdk/pull/1350">PR #1350&lt;/a>), cross-adapter convergence assurance (&lt;a href="https://github.com/marmot-protocol/mdk/pull/1372">PR #1372&lt;/a>), and generalized isolated convergence campaigns (&lt;a href="https://github.com/marmot-protocol/mdk/pull/1357">PR #1357&lt;/a>). Relay rejection diagnostics are preserved instead of collapsed into a generic failure (&lt;a href="https://github.com/marmot-protocol/mdk/pull/1361">PR #1361&lt;/a>).&lt;/p>
&lt;p>&lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.9.13">Version 0.9.13&lt;/a> landed on 18 August with storage format v2 (&lt;a href="https://github.com/marmot-protocol/mdk/pull/1421">PR #1421&lt;/a>), migration rails, and delta writes replacing live account snapshots (&lt;a href="https://github.com/marmot-protocol/mdk/pull/1435">PR #1435&lt;/a>), plus faster invite catch-up (&lt;a href="https://github.com/marmot-protocol/mdk/pull/1444">PR #1444&lt;/a>) and macOS bindings (&lt;a href="https://github.com/marmot-protocol/mdk/pull/1402">PR #1402&lt;/a>). &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.9.14">Version 0.9.14&lt;/a> followed on 19 August with group-creation polish: pre-uploaded founding images (&lt;a href="https://github.com/marmot-protocol/mdk/pull/1498">PR #1498&lt;/a>), KeyPackage batching (&lt;a href="https://github.com/marmot-protocol/mdk/pull/1494">PR #1494&lt;/a>), atomic initial message retention (&lt;a href="https://github.com/marmot-protocol/mdk/pull/1497">PR #1497&lt;/a>), and profile publication with account-owned relays (&lt;a href="https://github.com/marmot-protocol/mdk/pull/1495">PR #1495&lt;/a>). &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/marmotkit-v0.9.14">MarmotKit 0.9.14&lt;/a> and &lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/wn-agent-v0.9.14">wn-agent 0.9.14&lt;/a> ship with the core crate.&lt;/p>
&lt;h3 id="divine-mobile-1020-minting-a-badge-without-leaving-the-app">Divine Mobile 1.0.20: minting a badge without leaving the app&lt;/h3>
&lt;p>&lt;a href="https://github.com/divinevideo/divine-mobile">Divine Mobile&lt;/a> is a short-video client that publishes and retrieves video through Nostr. &lt;a href="https://github.com/divinevideo/divine-mobile/releases/tag/1.0.20">Version 1.0.20&lt;/a> lets a user mint a &lt;a href="https://nostrcompass.org/en/topics/nip-58/">NIP-58&lt;/a> badge, the signed award events described in this issue&amp;rsquo;s first deep dive, and hand it to someone without leaving the app. Tapping a badge on a profile explains what earning it required, which is the part of the specification that usually goes unimplemented because the definition event and the award event are stored separately.&lt;/p>
&lt;p>The rest of &lt;a href="https://github.com/divinevideo/divine-mobile/releases/tag/1.0.20">the release&lt;/a> is client work: a light theme, crop, rotate, and flip in the stop-motion editor, drafts one tap from the recorder, caption timing against the video, a feed that de-prioritizes already-watched material, screen-reader support across the editor, recorder, and profile tabs, reduced-motion handling, and account settings that manage a Divine email and password and link or unlink accounts. Deleted videos now leave local state, and bookmarks persist. &lt;a href="https://nostrcompass.org/en/newsletters/2026-08-12-newsletter/#divine-mobile-1019-tightens-accounts-private-messages-and-publishing">Last week&amp;rsquo;s 1.0.19&lt;/a> hardened account isolation and private-message validation; badge issuance is a new publishing surface on top of that.&lt;/p>
&lt;h3 id="cliprelay-020-pairing-a-signer-with-a-camera">ClipRelay 0.2.0: pairing a signer with a camera&lt;/h3>
&lt;p>&lt;a href="https://github.com/tajava2006/cliprelay">ClipRelay&lt;/a> synchronizes a clipboard between devices over Nostr. &lt;a href="https://github.com/tajava2006/cliprelay/releases/tag/android%2Fv0.2.0">Android version 0.2.0&lt;/a> adds &lt;code>nostrconnect://&lt;/code> QR login, so a user can sign in with a signer app on another phone, and adds camera scanning of bunker URLs, which removes the habit of pasting a secret-bearing string through a messenger. Bunker connection now times out after sixty seconds instead of hanging, and the retry button after a failed Amber login works. &lt;a href="https://github.com/tajava2006/cliprelay/releases/tag/desktop%2Fv0.2.0">Desktop version 0.2.0&lt;/a> carries the timeout and login-tab fixes.&lt;/p>
&lt;p>&lt;a href="https://github.com/tajava2006/cliprelay/releases/tag/android%2Fv0.1.4">Version 0.1.4&lt;/a> added sensitive-clipboard sync with short relay expiry, pinned signer session relays, and a liveness probe that requires a real round trip instead of a locally synthesized &lt;code>EOSE&lt;/code>. &lt;a href="https://nostrcompass.org/en/newsletters/2026-08-12-newsletter/#cliprelay-013-restores-relay-and-signer-connections-after-idle-periods">Last week&amp;rsquo;s 0.1.3&lt;/a> restored connections after idle periods.&lt;/p>
&lt;h3 id="bark-139-a-browser-signer-that-runs-on-android">Bark 1.3.9: a browser signer that runs on Android&lt;/h3>
&lt;p>&lt;a href="https://github.com/forgesworn/bark">Bark&lt;/a> is a browser extension that provides the &lt;a href="https://nostrcompass.org/en/topics/nip-07/">NIP-07&lt;/a> &lt;code>window.nostr&lt;/code> interface, the object a web page calls to request a signature or an encryption operation. &lt;a href="https://github.com/forgesworn/bark/releases/tag/v1.3.9">Version 1.3.9&lt;/a> declares Android support for the Firefox build, so the add-ons listing installs on a phone. Firefox on Android implements no windows API, so every approval that opened a popup window would have been denied outright; the approval surface now falls back to a foreground tab where dismissing denies, a review action foregrounds it, and the background closes it once the request settles. The release notes record verification on a Pixel 10 Pro XL running GrapheneOS with Firefox 153.0.4, and state plainly that Chromium on Android compiles out the extension subsystem, so no Chromium-derived Android browser can run Bark at all.&lt;/p>
&lt;p>&lt;a href="https://github.com/forgesworn/bark/releases/tag/v1.3.8">Version 1.3.8&lt;/a> fixed a NIP-46 interoperability defect in the other direction. Bark probed for a compact Heartwood signing dialect by sending the event as a JSON object, which strictly typed signers including &lt;code>nak&lt;/code> and bunkers built on rust-nostr cannot parse and silently drop, so signing hung. The probe is now sent only to signers that identified themselves as Heartwood, and every other signer receives a standard &lt;code>sign_event&lt;/code> call from the first signature onward.&lt;/p>
&lt;h3 id="bray-300-and-toll-booth-600-move-to-a-shared-wallet-connect-library">Bray 3.0.0 and Toll Booth 6.0.0 move to a shared wallet-connect library&lt;/h3>
&lt;p>&lt;a href="https://github.com/forgesworn/bray">Bray&lt;/a> and &lt;a href="https://github.com/forgesworn/toll-booth">Toll Booth&lt;/a> both pay through &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> Nostr Wallet Connect, the specification that lets an application request payments from a wallet over encrypted Nostr events. &lt;a href="https://github.com/forgesworn/bray/releases/tag/v3.0.0">Bray 3.0.0&lt;/a> and &lt;a href="https://github.com/forgesworn/toll-booth/releases/tag/v6.0.0">Toll Booth 6.0.0&lt;/a> each declare a breaking change adopting &lt;a href="https://github.com/forgesworn/nwc-kit">nwc-kit&lt;/a> for wallet payments, and Toll Booth removes its payer credential flow in the same change. Both publish reproducible builds whose output was byte-identical across two independent runners, with the tarball hash printed in the release notes so a reader can verify the registry artifact.&lt;/p>
&lt;p>Three Toll Booth patches followed: &lt;a href="https://github.com/forgesworn/toll-booth/releases/tag/v6.0.1">6.0.1&lt;/a> pins the negotiated deploy host key, &lt;a href="https://github.com/forgesworn/toll-booth/releases/tag/v6.1.1">6.1.1&lt;/a> pins &lt;code>cashu-ts&lt;/code> to the version its patch targets, and &lt;a href="https://github.com/forgesworn/toll-booth/releases/tag/v6.1.2">6.1.2&lt;/a> restores an image build.&lt;/p>
&lt;h3 id="noornote-134-joining-encrypted-communities-from-an-invite-link">NoorNote 1.3.4: joining encrypted communities from an invite link&lt;/h3>
&lt;p>&lt;a href="https://github.com/77elements/noornote">NoorNote&lt;/a> is a Nostr client for desktop, web, and Android. &lt;a href="https://github.com/77elements/noornote/releases/tag/v1.3.4">Version 1.3.4&lt;/a> adds encrypted Armada and Concord communities as an addon: a user joins through an invite link, sees joined communities listed in settings, and receives activity notifications. The same release adds a control for hiding external quote posts, the highlight notes that quote a paragraph of a web article, either globally or per author, with reposts of them hidden too and the user&amp;rsquo;s own highlights kept visible. Profile resolution was also repaired, so profiles no longer render as a truncated public key or as an anonymous placeholder.&lt;/p>
&lt;p>&lt;a href="https://github.com/77elements/noornote/releases/tag/v1.3.5">Version 1.3.5&lt;/a> adds an expander for long notes and corrects the layout of the Armada invite-link input. &lt;a href="https://nostrcompass.org/en/newsletters/2026-08-12-newsletter/#noornote-132-moves-article-discovery-into-the-social-graph">Last week&amp;rsquo;s 1.3.2&lt;/a> moved article discovery into the social graph; community membership is a separate surface.&lt;/p>
&lt;h3 id="mostro-moves-dispute-chat-off-gift-wrap">Mostro moves dispute chat off gift wrap&lt;/h3>
&lt;p>&lt;a href="https://github.com/MostroP2P/mostro">Mostro&lt;/a> is a peer-to-peer trading daemon whose orders and messages travel as Nostr events, with &lt;a href="https://github.com/MostroP2P/mostro-core">mostro-core&lt;/a> as its shared library and &lt;a href="https://github.com/MostroP2P/mobile">Mostro Mobile&lt;/a> as its client. &lt;a href="https://github.com/MostroP2P/mobile/releases/tag/v1.3.2">Mobile 1.3.2&lt;/a> migrates dispute chat from &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> gift wrap to a kind &lt;code>14&lt;/code> chat envelope and backs the backlog with durable per-conversation cursors. &lt;a href="https://github.com/MostroP2P/mostro-core/releases/tag/v0.14.5">mostro-core 0.14.5&lt;/a> serializes the rumor identifier inside the gift wrap (&lt;a href="https://github.com/MostroP2P/mostro-core/pull/164">PR #164&lt;/a>), &lt;a href="https://github.com/MostroP2P/mostro-core/releases/tag/v0.14.4">0.14.4&lt;/a> fixes a ratings average bug (&lt;a href="https://github.com/MostroP2P/mostro-core/pull/163">PR #163&lt;/a>), and &lt;a href="https://github.com/MostroP2P/mobile/releases/tag/v1.3.1">Mobile 1.3.1&lt;/a> switches to Blossom servers that retain encrypted chat attachments. Use daemon &lt;a href="https://github.com/MostroP2P/mostro/releases/tag/v0.18.2">0.18.2&lt;/a> or &lt;a href="https://github.com/MostroP2P/mostro/releases/tag/v0.18.4">0.18.4&lt;/a>.&lt;/p>
&lt;h3 id="nym-373522-encrypted-group-chats-and-an-encrypted-local-store">NYM 3.73.522: encrypted group chats and an encrypted local store&lt;/h3>
&lt;p>&lt;a href="https://github.com/Spl0itable/NYM">NYM&lt;/a> is a Nostr client with its own assistant integration. &lt;a href="https://github.com/Spl0itable/NYM/releases/tag/v3.73.522">Version 3.73.522&lt;/a> encrypts the local SQLite store after &lt;a href="https://github.com/Spl0itable/NYM/releases/tag/v3.73.521">3.73.521&lt;/a> refines encrypted group chat, and &lt;a href="https://github.com/Spl0itable/NYM/releases/tag/v3.73.520">3.73.520&lt;/a> fixes a content-security-policy break and duplicate-new-message presentation.&lt;/p>
&lt;h3 id="morganite-004-verifying-a-blob-before-it-is-cached">Morganite 0.0.4: verifying a blob before it is cached&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Morganite">Morganite&lt;/a> is an Android &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> server, the media protocol where a file is addressed by the SHA-256 hash of its content and served from any host that holds it. &lt;a href="https://github.com/greenart7c3/Morganite/releases/tag/v0.0.4">Version 0.0.4&lt;/a> verifies a blob&amp;rsquo;s hash during download in a single pass before caching it, which is the check that makes content addressing meaningful on the receiving side. The release also tracks cache size incrementally instead of rescanning the directory on every save, moves blocking network calls onto input and output threads, reuses Tika instances for MIME detection, and persists logs to a local database.&lt;/p>
&lt;h2 id="newly-discovered">Newly Discovered&lt;/h2>
&lt;h3 id="nail-brings-email-onto-nostr-as-gift-wrapped-events">Nail brings email onto Nostr as gift-wrapped events&lt;/h3>
&lt;p>&lt;a href="https://github.com/formstr-hq/nail">Nail&lt;/a> is an MIT-licensed mail bridge and web client from the Formstr team, the group behind &lt;a href="https://github.com/formstr-hq/nostr-forms">Formstr&lt;/a> and &lt;a href="https://github.com/formstr-hq/nostr-calendar">nostr-calendar&lt;/a>. It went to launch on 18 August with &lt;a href="https://github.com/formstr-hq/nail/pull/7">PR #7&lt;/a>, a 22-file change that added &lt;code>k&lt;/code> tags to mail events, key recovery in settings, and a welcome message. Its deployment runs at &lt;a href="https://mailstr.app">mailstr.app&lt;/a>, which serves the bridge&amp;rsquo;s own &lt;code>_smtp&lt;/code> &lt;a href="https://nostrcompass.org/en/topics/nip-05/">NIP-05&lt;/a> record, the DNS-based scheme that maps a name at a domain to a Nostr public key.&lt;/p>
&lt;p>The mail itself is a Nostr event. The client&amp;rsquo;s &lt;a href="https://github.com/formstr-hq/nail/blob/main/client/src/lib/nostr/constants.ts">constants&lt;/a> define a kind &lt;code>1301&lt;/code> mail rumor carried inside a kind &lt;code>1059&lt;/code> &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> gift wrap, so a message reaches its recipient through the same metadata-hiding envelope used for private direct messages. Delivery relays come from a kind &lt;code>10050&lt;/code> &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> inbox list with a kind &lt;code>10002&lt;/code> &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> relay list behind it, folders are kind &lt;code>1985&lt;/code> &lt;a href="https://github.com/nostr-protocol/nips/blob/master/32.md">NIP-32&lt;/a> labels under a &lt;code>mail&lt;/code> namespace, and client settings live in a kind &lt;code>30078&lt;/code> &lt;a href="https://nostrcompass.org/en/topics/nip-78/">NIP-78&lt;/a> application-data event. Attachments larger than 60,000 bytes go to &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> instead of into the event, because &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> caps encrypted plaintext at 65,535 bytes. An address is an npub at a domain, and a local domain with no NIP-05 record is treated as a mailbox that does not exist.&lt;/p>
&lt;p>The bridge half is a Node LMTP server that runs beside a &lt;a href="https://github.com/mailcow/mailcow-dockerized">mailcow&lt;/a> deployment without patching it: Postfix routes matching domains to the bridge, and the bridge injects replies back through SMTP. That design forces an honest answer to the hardest question in an email bridge, which is what a &lt;code>From&lt;/code> header proves. Nail&amp;rsquo;s &lt;a href="https://github.com/formstr-hq/nail/blob/main/client/src/lib/mail/receive.ts">receive path&lt;/a> grades every message into one of four provenance states: the configured bridge sealed it and refuses to relay a sender it did not verify upstream, the user sealed it themselves, the address&amp;rsquo;s NIP-05 record resolves to the sealing key, or nothing corroborates the header at all. In that last case the interface falls back to the sealing public key, which is the only identity the event can actually prove. Bridge API calls are authenticated with &lt;a href="https://nostrcompass.org/en/topics/nip-98/">NIP-98&lt;/a> signed HTTP events.&lt;/p>
&lt;h3 id="glow-stores-wallet-labels-on-relays-under-a-passkey-derived-identity">Glow stores wallet labels on relays under a passkey-derived identity&lt;/h3>
&lt;p>&lt;a href="https://breez.technology/glow/">Glow&lt;/a> is a Breez self-custodial Lightning wallet. Passkey login derives a Nostr identity, and wallet labels list from and save to relays under that identity, with byte-identical duplicates collapsed across partial relay coverage.&lt;/p>
&lt;h2 id="in-development">In Development&lt;/h2>
&lt;h3 id="amethyst-rebuilds-its-relay-authentication-decision-flow">Amethyst rebuilds its relay authentication decision flow&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> is an Android Nostr client. A block of merged work reshapes how it handles &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> client-to-relay authentication. The permissions interface and the decision flow were redesigned (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3899">PR #3899&lt;/a>), authentication now waits for a challenge to resolve instead of timing out (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3905">PR #3905&lt;/a>), new accounts default to always authenticating with relays (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3931">PR #3931&lt;/a>), and an &amp;ldquo;always log in&amp;rdquo; choice is honored for relays the account does not use itself (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3937">PR #3937&lt;/a>). Authentication also recognizes &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> groups and Concord communities as joined venues (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3906">PR #3906&lt;/a>), which is what stops a relay-hosted group from looking like an unfamiliar relay every time it is opened.&lt;/p>
&lt;p>Two other changes touch protocol surfaces. Proof-of-work mining under &lt;a href="https://nostrcompass.org/en/topics/nip-13/">NIP-13&lt;/a> refreshes &lt;code>created_at&lt;/code> while it mines and gains a GPU path analysis (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3911">PR #3911&lt;/a>), and full-screen napplet hosts handle input-method insets (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3932">PR #3932&lt;/a>). A guided first-run key backup with a settings entry point also merged (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3909">PR #3909&lt;/a>), alongside the ability to mute public chats (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3939">PR #3939&lt;/a>).&lt;/p>
&lt;h3 id="nostrord-implements-an-unmerged-encryption-key-proposal">nostrord implements an unmerged encryption-key proposal&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostrord/nostrord">nostrord&lt;/a> is a Nostr chat client organized around relay-scoped groups. It merged an implementation of NIP-4e, an unmerged proposal to decouple message encryption from the identity key that Compass &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-15-newsletter/">last described in the 15 July issue&lt;/a>. The account announces its own kind &lt;code>10044&lt;/code> encryption key, holds the private half locally, and decrypts inbound direct messages in process, which takes a bunker or browser extension out of the read path entirely (&lt;a href="https://github.com/nostrord/nostrord/pull/261">PR #261&lt;/a>). Device pairing over kinds &lt;code>4454&lt;/code> and &lt;code>4455&lt;/code> moves that key to a second device, and a self-archive republishes history addressed to the new key. Sending was addressed to the announced key first (&lt;a href="https://github.com/nostrord/nostrord/pull/247">PR #247&lt;/a>), and a follow-up fixed pairing that negotiated successfully without handing the key over (&lt;a href="https://github.com/nostrord/nostrord/pull/271">PR #271&lt;/a>). The pull request states that the wire format follows the deployed Jumble implementation where it diverges from the open proposal, which places this specification&amp;rsquo;s working definition in shipped code instead of in the document.&lt;/p>
&lt;p>Group identity was tightened in the same batch. A group identifier is now unique only within its relay (&lt;a href="https://github.com/nostrord/nostrord/pull/269">PR #269&lt;/a>), so the same identifier on two relays is treated as two groups (&lt;a href="https://github.com/nostrord/nostrord/pull/272">PR #272&lt;/a>), and thread posts render as forum posts (&lt;a href="https://github.com/nostrord/nostrord/pull/274">PR #274&lt;/a>). Connection churn that produced repeated kind &lt;code>22242&lt;/code> signing prompts was also stopped (&lt;a href="https://github.com/nostrord/nostrord/pull/268">PR #268&lt;/a>), which is the same class of signer pressure Cambium spent three releases on this week.&lt;/p>
&lt;h3 id="nostream-adds-a-relay-monitor-and-mints-invite-codes">nostream adds a relay monitor and mints invite codes&lt;/h3>
&lt;p>&lt;a href="https://github.com/cameri/nostream">nostream&lt;/a> is a TypeScript relay implementation. It merged a cluster worker and probe scheduler that publish &lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a> relay monitoring events, the discovery specification that lets a monitor announce liveness and capability data about other relays (&lt;a href="https://github.com/cameri/nostream/pull/724">PR #724&lt;/a>), with a settings schema and defaults (&lt;a href="https://github.com/cameri/nostream/pull/689">PR #689&lt;/a>) and integration tests (&lt;a href="https://github.com/cameri/nostream/pull/733">PR #733&lt;/a>). A command-line tool now mints &lt;a href="https://nostrcompass.org/en/topics/nip-43/">NIP-43&lt;/a> invite codes, the relay access metadata scheme that gates admission (&lt;a href="https://github.com/cameri/nostream/pull/732">PR #732&lt;/a>), and the relay finally advertises &lt;a href="https://nostrcompass.org/en/topics/nip-13/">NIP-13&lt;/a> proof of work in its supported list (&lt;a href="https://github.com/cameri/nostream/pull/680">PR #680&lt;/a>), which it had implemented without announcing. Data vending machine jobs also gained a persistence migration and repository (&lt;a href="https://github.com/cameri/nostream/pull/727">PR #727&lt;/a>), and the relay now traps &lt;a href="https://nostrcompass.org/en/topics/nip-90/">NIP-90&lt;/a> (data-vending-machine job requests) and records them through the job repository (&lt;a href="https://github.com/cameri/nostream/pull/729">PR #729&lt;/a>).&lt;/p>
&lt;h3 id="rust-nostr-fixes-a-gift-wrap-identifier-and-rejects-protected-reposts">rust-nostr fixes a gift-wrap identifier and rejects protected reposts&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostrdevkit/nostr">rust-nostr&lt;/a> is the Rust library and software development kit behind a large share of the Rust and mobile client work in this issue. It now ensures the rumor identifier is computed before the gift-wrap seal is encrypted (&lt;a href="https://github.com/nostrdevkit/nostr/pull/1444">PR #1444&lt;/a>), the same class of defect Mostro fixed in its own library this week. Its local relay rejects a repost of a &lt;a href="https://nostrcompass.org/en/topics/nip-70/">NIP-70&lt;/a> protected event (&lt;a href="https://github.com/nostrdevkit/nostr/pull/1445">PR #1445&lt;/a>), which is the protection that specification exists to provide, and NIP-47 response parsing tolerates missing and null amounts (&lt;a href="https://github.com/nostrdevkit/nostr/pull/1450">PR #1450&lt;/a>) instead of failing on a wallet that omits them. Relay URL parsing was hardened (&lt;a href="https://github.com/nostrdevkit/nostr/pull/1451">PR #1451&lt;/a>).&lt;/p>
&lt;h3 id="ndk-adds-post-quantum-direct-messages-and-drops-a-gpl-dependency">NDK adds post-quantum direct messages and drops a GPL dependency&lt;/h3>
&lt;p>&lt;a href="https://github.com/relaystr/ndk">NDK&lt;/a> is a Dart development kit for Nostr. It merged hybrid post-quantum encryption for direct messages using ML-KEM-1024, the lattice key-encapsulation mechanism standardized as FIPS 203 (&lt;a href="https://github.com/relaystr/ndk/pull/713">PR #713&lt;/a>), placing it alongside the classical key agreement instead of in place of it. A separate change replaced a GPL-3.0-only Dilithium implementation with &lt;code>fips204&lt;/code>, the ML-DSA signature standard (&lt;a href="https://github.com/relaystr/ndk/pull/712">PR #712&lt;/a>), which removes a licensing constraint for applications embedding the kit. Connections also moved to one identity each (&lt;a href="https://github.com/relaystr/ndk/pull/710">PR #710&lt;/a>).&lt;/p>
&lt;h3 id="nostter-adds-bookmark-lists-profile-badges-and-blossom-uploads">Nostter adds bookmark lists, profile badges, and Blossom uploads&lt;/h3>
&lt;p>&lt;a href="https://github.com/SnowCait/nostter">Nostter&lt;/a> is a web client. It merged support for both the standard and the legacy shapes of &lt;a href="https://nostrcompass.org/en/topics/nip-51/">NIP-51&lt;/a> bookmark lists (&lt;a href="https://github.com/SnowCait/nostter/pull/2311">PR #2311&lt;/a>), updated its handling of NIP-58 profile badges (&lt;a href="https://github.com/SnowCait/nostter/pull/2281">PR #2281&lt;/a>), added a Blossom media uploader (&lt;a href="https://github.com/SnowCait/nostter/pull/2298">PR #2298&lt;/a>), and now shows a &lt;a href="https://nostrcompass.org/en/topics/nip-05/">NIP-05&lt;/a> identifier, the DNS-based verification name, in the mention autocomplete (&lt;a href="https://github.com/SnowCait/nostter/pull/2303">PR #2303&lt;/a>).&lt;/p>
&lt;h3 id="zap-cooking-binds-admin-routes-to-signed-requests-and-encrypts-stored-wallet-connections">Zap Cooking binds admin routes to signed requests and encrypts stored wallet connections&lt;/h3>
&lt;p>&lt;a href="https://github.com/zapcooking/frontend">Zap Cooking&lt;/a> is a recipe site built on Nostr long-form events. A security batch encrypts stored Nostr Wallet Connect connection strings at rest inside a NIP-44 envelope (&lt;a href="https://github.com/zapcooking/frontend/pull/622">PR #622&lt;/a>), replaces a spoofable public-key comparison on administrative routes with &lt;a href="https://nostrcompass.org/en/topics/nip-98/">NIP-98&lt;/a> HTTP authentication, the scheme that signs an event to authorize an HTTP request (&lt;a href="https://github.com/zapcooking/frontend/pull/626">PR #626&lt;/a>), and clears account data on logout while bounding pending NIP-46 records (&lt;a href="https://github.com/zapcooking/frontend/pull/627">PR #627&lt;/a>).&lt;/p>
&lt;h2 id="protocol-and-spec-work">Protocol and Spec Work&lt;/h2>
&lt;h3 id="nips">NIPs&lt;/h3>
&lt;p>No pull request merged into &lt;a href="https://github.com/nostr-protocol/nips">nostr-protocol/nips&lt;/a> during this window. Six proposals opened after the previous issue closed, three of them on 18 August after the draft first circulated.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2438">NIPs PR #2438&lt;/a> proposes NIP-9A, comment-based patching. A patch is a kind &lt;code>1111&lt;/code> comment referencing the patched event as its parent whose &lt;code>content&lt;/code> begins with the literal label &lt;code>PATCH&lt;/code>, followed by patch lines. A line beginning with a number edits the target&amp;rsquo;s &lt;code>content&lt;/code> in the form &lt;code>&amp;lt;index&amp;gt; -&amp;lt;deleted&amp;gt; +&amp;lt;inserted&amp;gt; &amp;lt;inserted characters&amp;gt;&lt;/code>, counted in unicode characters instead of bytes, and a line beginning with &lt;code>t&lt;/code> replaces a human-facing tag such as &lt;code>title&lt;/code>, &lt;code>description&lt;/code>, &lt;code>subject&lt;/code>, or &lt;code>picture&lt;/code>. The design is deliberately backwards compatible: a client that does not understand the format displays the patch as an ordinary labeled comment, and a client that does understand it applies the patch and hides the comment. The proposal names kinds &lt;code>1&lt;/code>, &lt;code>11&lt;/code>, &lt;code>1111&lt;/code>, &lt;code>24&lt;/code>, and &lt;code>1621&lt;/code> as patchable and asks both writers and readers to refuse patches that are too large, too numerous, or published long after the original event, which is an explicit attempt to keep the feature from becoming a general editing channel for immutable events.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2437">NIPs PR #2437&lt;/a> proposes file encryption for &lt;a href="https://github.com/nostr-protocol/nips/blob/master/94.md">NIP-94&lt;/a>, the file-metadata specification that describes an uploaded file in a kind &lt;code>1063&lt;/code> event. It adds three optional tags: &lt;code>encryption-algorithm&lt;/code>, with &lt;code>aes-gcm&lt;/code> as the only listed value, plus a hex-encoded &lt;code>decryption-key&lt;/code> and &lt;code>decryption-nonce&lt;/code>. The tag semantics shift accordingly, with &lt;code>m&lt;/code> describing the MIME type before encryption, &lt;code>x&lt;/code> holding the hash of the encrypted file, and &lt;code>ox&lt;/code> holding the hash of the original, and any &lt;code>thumb&lt;/code>, &lt;code>image&lt;/code>, and &lt;code>fallback&lt;/code> sources encrypted under the same key and nonce. The stated purpose is that a public Blossom operator hosting the bytes cannot tell what they are, and the author frames the change as copying &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17&lt;/a> private-message encryption properties into file metadata so the same treatment works inside an &lt;code>imeta&lt;/code> tag.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2436">NIPs PR #2436&lt;/a> amends NIP-7D, the forum-thread specification built on kind &lt;code>11&lt;/code> thread events with &lt;a href="https://nostrcompass.org/en/topics/nip-22/">NIP-22&lt;/a> kind &lt;code>1111&lt;/code> comments as replies. It adds a formatting section stating that a thread post can be formatted like a kind &lt;code>1&lt;/code> note, with inline images, links, and &lt;a href="https://nostrcompass.org/en/topics/nip-27/">NIP-27&lt;/a> references, and could also support Djot, a lightweight markup language with an unambiguous grammar. The author&amp;rsquo;s argument is that leaving formatting unspecified invites an eventual Markdown implementation by default, and the pull request points at squalk as an existing Djot implementation.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2439">NIPs PR #2439&lt;/a> adds &lt;code>assign&lt;/code> and &lt;code>unassign&lt;/code> methods to &lt;a href="https://nostrcompass.org/en/topics/nip-86/">NIP-86&lt;/a> (relay management commands), so a relay administrator can grant admin permissions to another pubkey without sharing the master key.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2442">NIPs PR #2442&lt;/a> succeeds the audio-track proposal &lt;a href="https://nostrcompass.org/en/newsletters/2026-01-13-newsletter/">Compass covered in January&lt;/a> while that draft remained open; the earlier pull request has since closed and this one ships in production at lightning.fm as kind &lt;code>31337&lt;/code> track events, with kind &lt;code>31339&lt;/code> release objects, band profiles, per-track contributors, and optional &lt;a href="https://nostrcompass.org/en/topics/nip-57/">NIP-57&lt;/a> zap splits while keeping sales in &lt;a href="https://nostrcompass.org/en/topics/nip-99/">NIP-99&lt;/a>. The interop contract is published at &lt;a href="https://lightning.fm/interop">lightning.fm/interop&lt;/a>, and the desktop publisher and self-hosted seller daemon are open source.&lt;/p>
&lt;h3 id="marmot">Marmot&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/marmot/pull/416">Marmot PR #416&lt;/a> merged on 13 August and adds a durability and restart contract to the protocol core. The adopted documents already defined deterministic convergence, retained candidate-parent material, publish-before-apply ordering, and fail-closed behavior on missing history, without one unambiguous rule for what happens when a process is interrupted at the seams between them. The change defines recoverable logical facts, restart equivalence, publish and convergence interruption boundaries, observer-atomic transitions, handling of missing or corrupt material, and application-effect recovery, then adds crash and restart conformance scenarios for each. It leaves transactions, journals, snapshots, replay strategy, schedulers, and storage formats implementation-defined, and states that it requires no wire encoding change. The specific failure it forecloses is a publication externally accepted but not locally confirmed, or a partially applied selected branch, producing implementation-dependent protocol results after a restart.&lt;/p>
&lt;h3 id="concord-and-cords">Concord and CORDs&lt;/h3>
&lt;p>&lt;a href="https://github.com/concord-protocol/concord/pull/18">Concord PR #18&lt;/a>, covered previously in last week&amp;rsquo;s issue as an open proposal, has now merged on 15 August. It shards the encrypted community list across kind &lt;code>33302&lt;/code> events, removes the fifty-membership limit, and prunes retired entries so the list stays inside relay size limits. Vector&amp;rsquo;s release notes this week record the client-side half of that change, including tie resolution and the decision to stop republishing unchanged data.&lt;/p>
&lt;p>&lt;a href="https://github.com/concord-protocol/concord/pull/22">Concord PR #22&lt;/a> proposes community-owned audio and video brokers. The CORD-02 metadata entity would carry an optional &lt;code>av_brokers&lt;/code> list beside its relays, evolving by edition like the rest of that entity, and the CORD-07 rendezvous would draw from that list, or from the member&amp;rsquo;s own broker when the community publishes none, ordered by the existing room-keyed tie-break. The broker tag on presence remains readable and useful for reporting a residual split, and the proposal&amp;rsquo;s argument for demoting it from routing is direct: routing on it lets a fellow member&amp;rsquo;s untrusted input outrank the community&amp;rsquo;s own instruction.&lt;/p>
&lt;p>&lt;a href="https://github.com/concord-protocol/concord/pull/23">Concord PR #23&lt;/a> makes an existing implementation behavior normative in CORD-05. Before persisting a join, the owner&amp;rsquo;s genesis metadata edition must open under the delivered keys, with rotated planes anchoring on the compaction pair. The pull request states up front that this was never a live vulnerability: Vector&amp;rsquo;s bundle acceptance already refuses a bundle whose delivered root cannot open the owner&amp;rsquo;s genesis and never parks an invitation for a community already held, and Armada already drops any bundle that would move a held community&amp;rsquo;s base. The gap was that neither behavior was required by the specification, so a specification-faithful client could have shipped the vulnerable version.&lt;/p>
&lt;p>&lt;a href="https://github.com/hzrd149/blossom">Blossom upgrade documents&lt;/a>, &lt;a href="https://github.com/napplet/naps">Napplet application proposals&lt;/a>, and the &lt;a href="https://github.com/GammaMarkets/market-spec">Gamma Markets specification&lt;/a> recorded no changes in this window.&lt;/p>
&lt;h2 id="nip-deep-dive">NIP Deep Dive&lt;/h2>
&lt;h3 id="badges-nip-58">Badges (NIP-58)&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-58/">NIP-58&lt;/a>, defined by its &lt;a href="https://github.com/nostr-protocol/nips/blob/master/58.md">primary specification&lt;/a>, gives one Nostr identity a way to award a named token to another, and gives the recipient control over whether it appears on their profile. The problem it addresses is that any statement about a person on Nostr is otherwise just a note: there is no structure that says who issued a claim, what the claim is called, what it looks like, or whether the subject accepted it. Badges give that claim three separate signed events with three separate authors&amp;rsquo; intentions encoded in them.&lt;/p>
&lt;p>The &lt;a href="https://github.com/nostr-protocol/nips/blob/master/58.md">mechanics&lt;/a> are built from an addressable definition, an award, and a display list. A badge definition is a kind &lt;code>30009&lt;/code> event published by the issuer, addressable through its &lt;code>d&lt;/code> tag, so the issuer can revise the badge&amp;rsquo;s &lt;code>name&lt;/code>, &lt;code>description&lt;/code>, &lt;code>image&lt;/code>, and &lt;code>thumb&lt;/code> tags later without changing the identifier anything else points at. The award is a kind &lt;code>8&lt;/code> event published by the same issuer, carrying an &lt;code>a&lt;/code> tag holding the &lt;code>30009:&amp;lt;issuer-pubkey&amp;gt;:&amp;lt;d-identifier&amp;gt;&lt;/code> coordinate of the definition and one or more &lt;code>p&lt;/code> tags naming recipients. The display list is a kind &lt;code>30008&lt;/code> event published by the recipient with the fixed &lt;code>d&lt;/code> value &lt;code>profile_badges&lt;/code>, listing &lt;code>a&lt;/code> and &lt;code>e&lt;/code> tag pairs where the &lt;code>a&lt;/code> tag is the definition coordinate and the &lt;code>e&lt;/code> tag is the specific award event. Those pairs are ordered and are read as pairs: an &lt;code>a&lt;/code> tag whose matching award is absent, or an &lt;code>e&lt;/code> tag whose matching definition is absent, is ignored, so a half-referenced badge silently does not render.&lt;/p>
&lt;p>The design tradeoffs are visible in what the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/58.md">specification&lt;/a> refuses to do. There is no revocation mechanism and no expiry, so an award is a permanent statement by the issuer about a moment in time, and an issuer who changes their mind can only change the definition the award points at. There is no transfer, so a badge cannot circulate as a token. There is no notion of a trusted issuer registry, which pushes the entire trust question to the client and the reader: a badge is worth exactly what its issuer&amp;rsquo;s public key is worth to the person looking at it. The specification also grants clients latitude to display fewer badges than the recipient listed and to choose which image size to render, which keeps a profile from becoming a wall of graphics chosen entirely by third parties.&lt;/p>
&lt;p>The closest adjacent specification is &lt;a href="https://nostrcompass.org/en/topics/nip-51/">NIP-51&lt;/a>, the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/51.md">list specification&lt;/a>, and comparing the two shows why badges need three events instead of one. A list is a single author curating references; the author of the list is the author of the claim. A badge splits authorship in half, with the issuer signing that the award happened and the recipient signing that they accept its display. Neither party can produce the visible result alone, which is what separates a badge from a self-applied label.&lt;/p>
&lt;p>A live kind &lt;code>8&lt;/code> award recovered from &lt;a href="https://nos.lol">nos.lol&lt;/a> and &lt;a href="https://relay.primal.net">relay.primal.net&lt;/a> this week:&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;08504dec368939bd63849a349cab83dea0ac199a852129dbf68cf35fe5c64e96&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;bef514bd58c8ceea4beb9e6b84a8d983935f7be26f49e14df68098f1ba64156e&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">1787051248&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">8&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;30009:bef514bd58c8ceea4beb9e6b84a8d983935f7be26f49e14df68098f1ba64156e:blocks_orange_league&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;92dfa05d915196a7a09152fa3f57871debfd422e1d278ac5af266a70c3350b1f&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>&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;Badge awarded!&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;5bf0218dfec5e56b47339b0b4b992cceedd2e18798fb3d47cafea51850c00827f66251e4a3e08190370e04a5e1d4d092eeb441141b7219acdd18b80290a022f8&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>Current implementations cover issuance, display, and reading. &lt;a href="https://github.com/divinevideo/divine-mobile/releases/tag/1.0.20">Divine Mobile 1.0.20&lt;/a> mints and awards a badge inside the app and explains an earned badge when a reader taps it, &lt;a href="https://github.com/SnowCait/nostter/pull/2281">Nostter PR #2281&lt;/a> updates profile badge handling in a web client, and &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> publishes award events carrying its own client tag, one of which appears in relay data alongside the example above.&lt;/p>
&lt;h3 id="comments-nip-22">Comments (NIP-22)&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-22/">NIP-22&lt;/a>, defined by its &lt;a href="https://github.com/nostr-protocol/nips/blob/master/22.md">primary specification&lt;/a>, provides a general comment event for replying to things that are not short text notes. Short-note threading already had &lt;a href="https://nostrcompass.org/en/topics/nip-10/">NIP-10&lt;/a>, whose tag conventions grew around kind &lt;code>1&lt;/code> and its reply chains. NIP-22 exists because a video, an article, a calendar event, a wiki page, or a URL needs a reply structure that identifies what kind of thing is being replied to, and that works when the target is addressable, or is an external resource with no Nostr event at all.&lt;/p>
&lt;p>The &lt;a href="https://github.com/nostr-protocol/nips/blob/master/22.md">mechanics&lt;/a> turn on a case distinction. A comment is a kind &lt;code>1111&lt;/code> event that carries two sets of tags: uppercase tags describing the root of the discussion and lowercase tags describing the immediate parent. &lt;code>E&lt;/code>, &lt;code>A&lt;/code>, and &lt;code>I&lt;/code> name a root event, a root addressable coordinate, or a root external identifier, &lt;code>K&lt;/code> names the root&amp;rsquo;s kind, and &lt;code>P&lt;/code> names the root author. The lowercase &lt;code>e&lt;/code>, &lt;code>a&lt;/code>, &lt;code>i&lt;/code>, &lt;code>k&lt;/code>, and &lt;code>p&lt;/code> name the same facts about the parent, which is the root itself for a top-level comment and another kind &lt;code>1111&lt;/code> comment for a nested reply. Splitting them means a client can fetch an entire discussion with one filter on the uppercase root tags, without walking the reply chain, while still rendering nesting correctly from the lowercase parent tags. The &lt;code>I&lt;/code> and &lt;code>i&lt;/code> variants carry external identifiers in the &lt;a href="https://nostrcompass.org/en/topics/nip-73/">NIP-73&lt;/a> format, which is what lets a comment thread attach to a web page, a podcast episode, or a book.&lt;/p>
&lt;p>The tradeoffs are mostly about what NIP-22 declines to absorb. The &lt;a href="https://github.com/nostr-protocol/nips/blob/master/22.md">specification&lt;/a> states that comments must not be used to reply to kind &lt;code>1&lt;/code> notes, which keeps two threading models from competing over the same objects and leaves NIP-10 in place where it already works. Nesting is permitted but the root stays fixed, so a deep thread never loses its anchor even when intermediate events are unavailable. The kind tags are the load-bearing part: a client that fetches a comment without its target can still tell what it is looking at from &lt;code>K&lt;/code> and &lt;code>k&lt;/code>, and decide whether it can render that kind at all. What the specification does not provide is any ordering or moderation model, so display order, collapsing, and hiding are entirely client policy.&lt;/p>
&lt;p>Compared to &lt;a href="https://github.com/nostr-protocol/nips/blob/master/10.md">NIP-10&lt;/a>, the difference lies in typing. NIP-10 assumes the target is a note and encodes position in a thread; NIP-22 encodes the target&amp;rsquo;s identity and kind explicitly and assumes nothing else about it. That explicit typing is why the newer proposals in this issue reach for kind &lt;code>1111&lt;/code>: a comment already carries a machine-readable statement about what it is attached to.&lt;/p>
&lt;p>A live kind &lt;code>1111&lt;/code> comment recovered from &lt;a href="https://nos.lol">nos.lol&lt;/a> and &lt;a href="https://relay.primal.net">relay.primal.net&lt;/a> this week, replying to another comment under a video:&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;c8d335f8bfea58ecd1a943d6000fb2045f4bddf4a36c67df53eb661671f7ab45&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;3e911baba55ae247339cf805dd6ff49ad2cd6bee84ac44e088ce66450c49104f&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">1787062681&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">1111&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;1c492f2bac17b79d66934a340fa43d8d30d0aea4c9fa329346c05573ef912d70&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;482d024b8acfde50e7429e5ac561d764f3a53a8b4fb0b6975369d9f0926ef839&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;34236:482d024b8acfde50e7429e5ac561d764f3a53a8b4fb0b6975369d9f0926ef839:e64ba9ea157b1a315caff51dbca656ed73ce817d4494e3966adf24055a86f5c5&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:#e6db74">&amp;#34;K&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;34236&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;482d024b8acfde50e7429e5ac561d764f3a53a8b4fb0b6975369d9f0926ef839&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;7a14723b9ef999e74b1757a0fb74942cb6c121138d4ddafe096a57a67ed0a442&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;8b69e548402afa997343d73e8088224a440f256350f6257b61acc4bb1fa4af4f&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;1111&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;8b69e548402afa997343d73e8088224a440f256350f6257b61acc4bb1fa4af4f&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;Divine&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;31990:d95aa8fc0eff8e488952495b8064991d27fb96ed8652f12cdedc5a4e8b5ae540:divine-mobile&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;wss://relay.divine.video&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;niiice&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;a5517fdea07647efa7ab1730fbea8df882690bba667e93ea5aeba4a73be6a49af1ee17c045535483650caf41dbbcb0897d5803fa39b59f395fd6f9bb193bb789&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 uppercase tags hold the video and its author while the lowercase &lt;code>e&lt;/code> and &lt;code>k&lt;/code> point at the parent comment, which is the shape the specification describes. Implementations reading and writing kind &lt;code>1111&lt;/code> include &lt;a href="https://github.com/divinevideo/divine-mobile">Divine Mobile&lt;/a>, whose client tag appears in the event above, &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a>, whose comments appear in the same relay results, and &lt;a href="https://github.com/nostrord/nostrord/pull/274">nostrord&lt;/a>, which renders thread posts as forum posts this week. The proposed patch format in &lt;a href="https://github.com/nostr-protocol/nips/pull/2438">NIPs PR #2438&lt;/a> builds on the same kind.&lt;/p>
&lt;hr>
&lt;p>Send a NIP-17 DM to share a project or news item through the &lt;a href="https://github.com/andotherstuff/nostr-compass">Nostr Compass project&lt;/a>.&lt;/p></content:encoded></item><item><title>Nostr Compass #35</title><link>https://nostrcompass.org/en/newsletters/2026-08-12-newsletter/</link><pubDate>Wed, 12 Aug 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-08-12-newsletter/</guid><description>&lt;p>Welcome back to &lt;a href="https://nostrcompass.org">Nostr Compass&lt;/a>, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/nostr-wot/nostr-wot-extension">nostr-wot-extension&lt;/a> adds post-quantum keys and opt-in protected messages beside existing Nostr identities. &lt;a href="https://github.com/divinevideo/divine-mobile">Divine&lt;/a> tightens account isolation, private-message validation, and publish confirmation; &lt;a href="https://github.com/marmot-protocol/mdk">MDK&lt;/a> strengthens encrypted-group convergence and recovery; and &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> makes grouped signing decisions explicit. Releases improve wallet connections, encrypted chat, social discovery, device sync, and remote signing, while protocol work covers identity and encrypted communities. The deep dives explain authenticated deletion requests and decentralized reporting.&lt;/p></description><content:encoded>&lt;p>Welcome back to &lt;a href="https://nostrcompass.org">Nostr Compass&lt;/a>, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/nostr-wot/nostr-wot-extension">nostr-wot-extension&lt;/a> adds post-quantum keys and opt-in protected messages beside existing Nostr identities. &lt;a href="https://github.com/divinevideo/divine-mobile">Divine&lt;/a> tightens account isolation, private-message validation, and publish confirmation; &lt;a href="https://github.com/marmot-protocol/mdk">MDK&lt;/a> strengthens encrypted-group convergence and recovery; and &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> makes grouped signing decisions explicit. Releases improve wallet connections, encrypted chat, social discovery, device sync, and remote signing, while protocol work covers identity and encrypted communities. The deep dives explain authenticated deletion requests and decentralized reporting.&lt;/p>
&lt;h2 id="top-stories">Top Stories&lt;/h2>
&lt;h3 id="nostr-wot-extension-040-adds-post-quantum-keys-beside-a-nostr-identity">nostr-wot-extension 0.4.0 adds post-quantum keys beside a Nostr identity&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-wot/nostr-wot-extension/releases/tag/v0.4.0">nostr-wot-extension 0.4.0&lt;/a> is a browser extension for managing Nostr identities and signing. Accounts created from a 24-word seed can now derive ML-KEM-1024 encryption and ML-DSA-87 signing keys alongside their existing Nostr key. A one-click flow publishes a kind &lt;code>10203&lt;/code> attestation that binds the Nostr public key to both post-quantum public keys and includes an ML-DSA proof of possession. Accounts imported from a 12-word mnemonic, bare &lt;code>nsec&lt;/code>, remote signer, or read-only key cannot use the derivation flow, and the extension explains that limitation in the account view.&lt;/p>
&lt;p>The release also adds opt-in post-quantum direct messages. It combines the ML-KEM shared secret with the existing &lt;a href="https://github.com/nostr-protocol/nips/blob/master/44.md">NIP-44 encrypted-message conversation key&lt;/a> through HKDF, then keeps the normal NIP-59 metadata-hiding gift-wrap layers for relay delivery. Encryption never silently falls back after a recipient opts in, while decryption selects the appropriate path automatically. This protects the new message path against later recovery of a present-day Nostr private key, but it does not replace secp256k1 event signatures; the release explicitly leaves that larger migration for future coordination with relays and clients.&lt;/p>
&lt;h3 id="divine-mobile-1019-tightens-accounts-private-messages-and-publishing">Divine Mobile 1.0.19 tightens accounts, private messages, and publishing&lt;/h3>
&lt;p>&lt;a href="https://github.com/divinevideo/divine-mobile/releases/tag/1.0.19">Divine Mobile 1.0.19&lt;/a> is a mobile short-video client that publishes and retrieves videos through Nostr. Its account switcher now builds each signed-in identity around an account-scoped container, and a publishing fix prevents a video from being sent under the wrong account. Relay publication paths now wait for an &lt;code>OK&lt;/code> response with explicit success semantics, while a relay &lt;code>CLOSED&lt;/code> frame can terminate its own pending query instead of leaving the request hanging.&lt;/p>
&lt;p>&lt;a href="https://github.com/divinevideo/divine-mobile/pull/6368">Private-message handling&lt;/a> rejects unauthenticated rumor fields and unsigned seals, restores four missing-message cases, and routes group conversations from fully followed participants into the inbox. The release also preserves the tags on addressable video events when lists are updated and consumes observed deletion requests so removed videos disappear from local state. Those changes follow the per-relay query timeout work covered last week, but move the focus from retrieval isolation to identity boundaries, message validation, and publish confirmation.&lt;/p>
&lt;h3 id="mdk-0911-hardens-marmot-group-convergence-and-recovery">MDK 0.9.11 hardens Marmot group convergence and recovery&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.9.11">MDK 0.9.11&lt;/a> is a Rust development kit for Marmot, an encrypted group-messaging protocol carried over Nostr. The release builds a larger convergence and recovery system around the group state machine: stale convergence passes reopen at the current group tip, inbound capability projections commit atomically, deferred messages receive bounded lifetimes across restarts, and commit-addressed checkpoints help recover an identity&amp;rsquo;s own commit forks. Non-stable sends can be queued and recovered, while an epoch-stall path escalates to backfill and sent messages survive convergence work.&lt;/p>
&lt;p>&lt;a href="https://github.com/marmot-protocol/mdk/pull/1201">Storage and host integrations&lt;/a> receive a parallel hardening pass. MDK securely deletes pruned SQLite projections, zeroizes imported private keys, NIP-49 encrypted-key export intermediates, and OpenMLS serialization buffers, and redacts group image keys from debug output. Account import can resume after interruption, iOS and Android private-storage paths are repaired, and hosts can explicitly close storage before suspension. New lightweight roster and local-membership projections reduce what applications must read, while the Hermes connector can deliver several agent-generated images as one Marmot album.&lt;/p>
&lt;h3 id="nostria-4167-expands-encrypted-community-administration">Nostria 4.1.67 expands encrypted-community administration&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostria-app/nostria/releases/tag/v4.1.67">Nostria 4.1.67&lt;/a> is a web and desktop social client for Nostr. It builds on the experimental NIP-29 relay-managed groups and Concord encrypted communities introduced in 4.1.53, adding community dissolution, icon and banner administration, encrypted photo uploads with compressed previews, a full reaction picker, and a dual-pane layout that keeps a community open while the user reads notes or articles. The release also adds threaded messaging and a combined hub for public, group, and private chats.&lt;/p>
&lt;h3 id="amber-640-makes-every-grouped-signing-decision-explicit">Amber 6.4.0 makes every grouped signing decision explicit&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.4.0">Amber 6.4.0&lt;/a> is an Android signer that keeps Nostr private keys separate from the applications requesting signatures. Its redesigned multi-request screen provides Approve and Deny controls for each request and each group, replacing the previous selection-and-confirm flow. Denied requests sent through Amber&amp;rsquo;s relay-mediated bunker interface now receive proper error responses, so the requesting client can distinguish rejection from a stalled signer.&lt;/p>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber/tree/v6.4.0">Amber&amp;rsquo;s tagged source&lt;/a> also adds localized, human-readable labels for 113 more event kinds across every shipped locale. The additions include Concord group events, NIP-51 Git repository bookmarks, and NIP-53 room-presence events, giving users more context about unfamiliar data before they approve a signature. A concurrent-map guard also fixes a relay-subscription crash that could produce a &lt;code>NegativeArraySizeException&lt;/code>.&lt;/p>
&lt;h3 id="safebox-acorn-separates-a-portable-recovery-component-from-the-web-app">Safebox Acorn separates a portable recovery component from the web app&lt;/h3>
&lt;p>&lt;a href="https://github.com/trbouma/safebox-acorn">Safebox Acorn&lt;/a> is a standalone Python component and command-line interface for safeguarding user-controlled keys, funds, and records with Nostr-backed state. Extracting Acorn from the broader Safebox web application lets another Python project install the runtime and use its key, Nostr profile, relay, record, Cashu, Lightning, and cryptographic helpers without taking on the web interface. Its current record-protection primitives can generate a fresh 256-bit key, derive one from separately supplied entropy, and encode the exact key as a checksummed 24-word recovery phrase.&lt;/p>
&lt;p>The project&amp;rsquo;s &lt;a href="https://trbouma.github.io/safebox-acorn/recovery-and-continuity/">recovery and continuity guide&lt;/a> frames Acorn as the replaceable protocol component inside a household or community Safebox. The design keeps encrypted state available through a local relay and independent replicas so recovery does not depend on one appliance, application, relay, mint, or service provider. The documentation is careful about the present boundary: protected-record encryption remains under design, so applications should not make records depend on the new record-protection key until that profile has been implemented and reviewed.&lt;/p>
&lt;h2 id="tagged-releases">Tagged Releases&lt;/h2>
&lt;h3 id="mostro-core-0142-changes-the-encrypted-chat-envelope">Mostro Core 0.14.2 changes the encrypted chat envelope&lt;/h3>
&lt;p>&lt;a href="https://github.com/MostroP2P/mostro-core">Mostro Core&lt;/a> is the Rust library of shared types and peer-to-peer functions used by the Mostro exchange daemon and its clients. &lt;a href="https://github.com/MostroP2P/mostro-core/releases/tag/v0.14.2">Version 0.14.2&lt;/a> replaces gift-wrapped chat messages with kind 14 envelopes that use separate conversation-encryption and signing keys derived from the peers&amp;rsquo; shared secret. The new reader validates the author, signature, recipient, timestamp, and content size, while legacy gift-wrap helpers remain available so clients can read both formats during migration.&lt;/p>
&lt;h3 id="mostro-0181-starts-a-cashu-escrow-path-and-hardens-the-daemon">Mostro 0.18.1 starts a Cashu escrow path and hardens the daemon&lt;/h3>
&lt;p>&lt;a href="https://github.com/MostroP2P/mostro">Mostro&lt;/a> is a peer-to-peer Lightning exchange daemon that coordinates orders through Nostr. &lt;a href="https://github.com/MostroP2P/mostro/releases/tag/v0.18.1">Version 0.18.1&lt;/a> lays the foundation for a Cashu escrow backend, including configuration, database helpers, mint integration, startup wiring, and the first lock action. It can also use prices announced by a trusted node over Nostr and advertises proof-of-work requirements for first contact in its replaceable info event. The release updates its Nostr dependency for a NIP-44 denial-of-service fix, removes private keys from restore-session logs, rejects unauthorized cooperative-cancel messages, hardens LNURL fetches against server-side request forgery and hangs, validates payout invoices, and restores hold-invoice subscriptions after a restart.&lt;/p>
&lt;h3 id="lawallet-nwc-230-adds-nostr-notifications-and-zap-receipts">LaWallet NWC 2.3.0 adds Nostr notifications and zap receipts&lt;/h3>
&lt;p>&lt;a href="https://github.com/lawalletio/lawallet-nwc">LaWallet NWC&lt;/a> is an open-source Lightning Address platform that connects wallets through &lt;a href="https://nostrcompass.org/en/topics/nip-47/">Nostr Wallet Connect&lt;/a>. &lt;a href="https://github.com/lawalletio/lawallet-nwc/releases/tag/v2.3.0">Version 2.3.0&lt;/a> lets each wallet send received and forwarded notifications as configurable Nostr events, including a recipient &lt;code>p&lt;/code> tag, selected relays, templated content, and optional &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encryption; retries reuse the same signed event ID. It also accepts zap requests and publishes signed &lt;a href="https://nostrcompass.org/en/topics/nip-57/">NIP-57&lt;/a> kind 9735 receipts after settlement, while a new address capability view shows whether the resolved address supports NIP-05, NIP-57, and related Lightning Address protocols.&lt;/p>
&lt;h3 id="nostr-double-ratchet-typescript-00166-binds-public-invites-to-session-keys">nostr-double-ratchet TypeScript 0.0.166 binds public invites to session keys&lt;/h3>
&lt;p>&lt;a href="https://github.com/irislib/nostr-double-ratchet">nostr-double-ratchet&lt;/a> provides TypeScript and Rust primitives for end-to-end encrypted direct and group messaging over Nostr relays. &lt;a href="https://github.com/irislib/nostr-double-ratchet/releases/tag/nostr-double-ratchet-ts-v0.0.166">TypeScript 0.0.166&lt;/a> requires an invite response to prove ownership of its session key, preventing a reusable public invite from binding one Nostr identity to another party&amp;rsquo;s session. The release also rejects malformed rumor fields and tightens payload validation; existing sessions continue to work, but an updated inviter rejects proofless responses from older invitees.&lt;/p>
&lt;h3 id="cln-nip47-020-expands-and-isolates-nwc-requests">cln-nip47 0.2.0 expands and isolates NWC requests&lt;/h3>
&lt;p>&lt;a href="https://github.com/daywalker90/cln-nip47">cln-nip47&lt;/a> is a Core Lightning plugin that exposes a node to wallets through &lt;a href="https://nostrcompass.org/en/topics/nip-47/">Nostr Wallet Connect&lt;/a>. &lt;a href="https://github.com/daywalker90/cln-nip47/releases/tag/v0.2.0">Version 0.2.0&lt;/a> adds NWC methods to create, cancel, and settle hold invoices plus a &lt;code>hold_invoice_accepted&lt;/code> notification, and it advertises the method set that the connected node actually supports. Transaction-list responses now stop at 500 entries and about 128 kB, request events are deduplicated by event ID, and one client&amp;rsquo;s failed notification no longer prevents delivery to other clients. The release also removes the two multi-payment methods that are no longer part of the NWC specification.&lt;/p>
&lt;h3 id="cliprelay-013-restores-relay-and-signer-connections-after-idle-periods">ClipRelay 0.1.3 restores relay and signer connections after idle periods&lt;/h3>
&lt;p>&lt;a href="https://github.com/tajava2006/cliprelay">ClipRelay&lt;/a> synchronizes a user&amp;rsquo;s clipboard between devices through Nostr relays, encrypting the content to the same identity with &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a>. The matching &lt;a href="https://github.com/tajava2006/cliprelay/releases/tag/desktop/v0.1.3">desktop&lt;/a> and &lt;a href="https://github.com/tajava2006/cliprelay/releases/tag/android/v0.1.3">Android&lt;/a> 0.1.3 releases add a text box for sending typed text directly to another device&amp;rsquo;s clipboard. They also test liveness with real relay round trips after idle periods, escalating from resubscription to socket replacement and a rebuilt connection pool, while stalled &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> signer calls now time out and rebuild automatically.&lt;/p>
&lt;h3 id="noornote-132-moves-article-discovery-into-the-social-graph">NoorNote 1.3.2 moves article discovery into the social graph&lt;/h3>
&lt;p>&lt;a href="https://github.com/77elements/noornote">NoorNote&lt;/a> is a Nostr client for social posts, encrypted messages, long-form articles, and other event types across web, desktop, and Android. &lt;a href="https://github.com/77elements/noornote/releases/tag/v1.3.2">Version 1.3.2&lt;/a> replaces its flat global article feed with discovery drawn from first-, second-, and third-degree contacts, giving readers an article timeline rooted in their follow graph. It also collapses bursts of replayed direct messages from unknown senders into one rolling notification instead of producing a stack of toasts as relay history arrives.&lt;/p>
&lt;h3 id="bray-240-adds-a-compact-remote-signing-dialect">Bray 2.4.0 adds a compact remote-signing dialect&lt;/h3>
&lt;p>&lt;a href="https://github.com/forgesworn/bray">Bray&lt;/a> is a Nostr MCP server that gives software agents and people tools for relay access, identity, publishing, and remote signing. &lt;a href="https://github.com/forgesworn/bray/releases/tag/v2.4.0">Version 2.4.0&lt;/a> accepts a signing request whose event is an object as well as the stringified form used by &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a>, and adds &lt;code>sign_event_compact&lt;/code>, which returns only the event ID, signature, public key, and timestamp. That smaller request and response format reduces memory use for constrained hardware signers, while the standard &lt;code>sign_event&lt;/code> flow remains unchanged and both dialects produce a signature over the received event&amp;rsquo;s ID.&lt;/p>
&lt;h2 id="newly-discovered">Newly Discovered&lt;/h2>
&lt;h3 id="pact-brings-mutually-consented-agent-bonds-to-nostr">Pact brings mutually consented agent bonds to Nostr&lt;/h3>
&lt;p>&lt;a href="https://github.com/bobodread876/pact">Pact&lt;/a>, newly discovered this week, is an early-stage relationship layer for software agents built on MATE.md and a draft NIP-BD transport. Its signed, mutually consented bonds are held by the agents&amp;rsquo; own keys and can be published over Nostr, while private bonds use &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59&lt;/a> gift wrapping. The monorepo includes an MCP server, TypeScript SDK, command-line client, self-hostable daemon, and web interface. Its latest repository activity predates this issue&amp;rsquo;s weekly window, so this is a discovery note rather than a claim of a new release.&lt;/p>
&lt;h2 id="in-development">In Development&lt;/h2>
&lt;h3 id="nostrord-keeps-group-muting-synchronized-between-devices">nostrord keeps group muting synchronized between devices&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostrord/nostrord">nostrord&lt;/a> is a cross-platform client for relay-managed communities. &lt;a href="https://github.com/nostrord/nostrord/pull/250">PR #250&lt;/a> stores each account&amp;rsquo;s per-group mute choices in a self-encrypted &lt;a href="https://nostrcompass.org/en/topics/nip-78/">NIP-78&lt;/a> (application-specific data) kind &lt;code>30078&lt;/code> event, so a setting made on one device can follow the user to another without revealing the group list to the relay. The replaceable record uses newest-event ordering, listens for live changes, and rolls the interface back when signing or publication fails instead of leaving local state out of sync. Muted groups also stop contributing visible unread totals while retaining their unread position for the next visit.&lt;/p>
&lt;h3 id="amethyst-completes-concords-invite-lifecycle">Amethyst completes Concord&amp;rsquo;s invite lifecycle&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> is an Android Nostr client whose encrypted-community support implements the Concord protocol. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3888">PR #3888&lt;/a> lets invite links survive a community refounding by reissuing their bundles at the same addressable coordinates, while a ban check prevents a removed member from using that recovery path. It also implements the encrypted CORD-05 invite list on both the app and &lt;code>amy&lt;/code> command-line client, adds per-link revocation tombstones, and requires relay confirmation before deleting the only stored signing key that can retire a link. The same work gives &lt;code>amy&lt;/code> the control-key delivery, refounding, rekeying, and stranded-member recovery paths needed to follow later community epochs.&lt;/p>
&lt;h3 id="buzz-carries-each-communitys-appearance-across-desktop-and-mobile">Buzz carries each community&amp;rsquo;s appearance across desktop and mobile&lt;/h3>
&lt;p>&lt;a href="https://github.com/block/buzz">Buzz&lt;/a> is a Nostr-based community workspace with desktop and mobile clients. Merged desktop &lt;a href="https://github.com/block/buzz/pull/3653">PR #3653&lt;/a> and mobile &lt;a href="https://github.com/block/buzz/pull/3767">PR #3767&lt;/a> store each community&amp;rsquo;s theme, accent, and system-mode choice as an encrypted NIP-78 record on that community&amp;rsquo;s relay. Both clients share the same versioned payload and keep identity-scoped local caches, so changing communities or accounts cannot apply the wrong appearance while the relay is unavailable. Replacement ordering, guarded writes, and resubscription after a closed connection let the two clients converge again after reconnecting.&lt;/p>
&lt;p>&lt;a href="https://github.com/block/buzz/releases/tag/desktop-v0.5.10">Buzz Desktop 0.5.10&lt;/a> followed before the issue cutoff with a performance and reliability pass. It removes regressions introduced after 0.5.9, accelerates channel loading, bounds initial timeline retention, coalesces read-state persistence, preserves fresh channel timelines, and stops the relay ingest worker from crashing on reactions to project events. It also adds sending a thread message to a channel and narrows desktop search to the intended scope.&lt;/p>
&lt;h2 id="protocol-and-spec-work">Protocol and Spec Work&lt;/h2>
&lt;h3 id="nips">NIPs&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2435">NIPs PR #2435&lt;/a> is an open amendment to NIP-34, which standardizes git repository collaboration through Nostr events. It adds an optional &lt;code>b&lt;/code> tag to a pull-request event so the author can name a target branch other than the repository&amp;rsquo;s default. The proposal matches support already implemented in ngit and GitWorkshop, but has not entered the specification.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2434">NIPs PR #2434&lt;/a> is an open proposal for post-quantum identity keys. It derives post-quantum encryption and signing keys beside the existing secp256k1 key from a NIP-06 mnemonic key-derivation seed, then binds the public keys to the Nostr identity with a kind &lt;code>10203&lt;/code> attestation. The draft limits its claim to protecting the confidentiality of earlier messages if secp256k1 is later broken; it does not replace today&amp;rsquo;s event signatures.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2431">NIPs PR #2431&lt;/a> is an open NIP-07 amendment for browser signers. A client could attach the public key it expects to signing or encryption requests, requiring the signer to use that account or reject the call. This would keep a page from silently continuing under a different identity after the user switches accounts in the signer.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/1813">NIPs PR #1813&lt;/a> remains an open double-ratchet proposal after substantive work during the window. It specifies forward-secret encrypted conversations whose keys advance with messages, with an implementation already available in the nostr-double-ratchet library and Iris. It is still a draft, not a merged NIP.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2433">NIPs PR #2433&lt;/a> opened and closed without merging during the window. It proposed clarifying NIP-42 relay errors so &lt;code>auth-required&lt;/code> would mean another authentication could change the result, while &lt;code>restricted&lt;/code> would mean it could not. The distinction addressed connections authenticated for one key but still missing authorization for another; the closed status means the wording did not enter the specification.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2378">NIPs PR #2378&lt;/a>, which was covered previously while still proposed, has now closed without merging. Its proposed agent passports, discovery, task, marketplace, invoice, and connection events therefore remain outside the NIP set.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/commit/656cecc7c0a815b6a2b218d3b5d6f078b3f4dbab">NIPs commit 656cecc&lt;/a> merged a documentation-only correction to NIP-29. It adds a &lt;code>previous&lt;/code> tag to the group metadata example, showing how a replacement event can identify the event it supersedes. This clarifies an example and does not introduce a new protocol feature.&lt;/p>
&lt;h3 id="concord-and-cords">Concord and CORDs&lt;/h3>
&lt;p>&lt;a href="https://github.com/concord-protocol/concord/pull/18">CORD PR #18&lt;/a> would shard encrypted Community Lists across kind &lt;code>33302&lt;/code> events, remove the 50-membership limit, and prune retired entries to stay within relay limits. Two other open proposals add &lt;a href="https://github.com/concord-protocol/concord/pull/16">private mention locators&lt;/a> and a &lt;a href="https://github.com/concord-protocol/concord/pull/17">pause signal&lt;/a> that suspends chat without discarding messages.&lt;/p>
&lt;p>&lt;a href="https://github.com/concord-protocol/concord/pull/15">CORD-02 PR #15&lt;/a> merged on August 6 and restricts writes to a community&amp;rsquo;s control plane. Owners and staff hold a new &lt;code>control_root&lt;/code> signing secret, while all members retain the derived public key and read key needed to verify and decrypt moderation state. The write key is a spam barrier, not a substitute for the inner actor signatures and roster checks that establish authority.&lt;/p>
&lt;p>&lt;a href="https://github.com/concord-protocol/concord/pull/12">CORD PR #12&lt;/a>, covered previously as an open draft, has now closed without merging. Its control-plane portion was superseded by the narrower merged CORD-02 amendment above, while restricted-write channels and the other draft material did not enter the specification.&lt;/p>
&lt;h2 id="nip-deep-dive">NIP Deep Dive&lt;/h2>
&lt;h3 id="event-deletion-requests-nip-09">Event Deletion Requests (NIP-09)&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-09/">NIP-09&lt;/a>, defined by the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/09.md">primary specification&lt;/a>, gives an event author a signed way to ask relays and clients to stop serving one or more of that author&amp;rsquo;s events. It does not erase every copy. It carries the author&amp;rsquo;s intent through the same relay network that distributed the original event.&lt;/p>
&lt;p>The request is an ordinary signed kind &lt;code>5&lt;/code> event. Its tags contain one or more &lt;code>e&lt;/code> references to specific event IDs or &lt;code>a&lt;/code> references to addressable-event coordinates, and the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/09.md#event-deletion-request">NIP-09 tag rules&lt;/a> say it should include a &lt;code>k&lt;/code> tag for each referenced event kind. The optional &lt;code>content&lt;/code> can explain the reason. For an &lt;code>a&lt;/code> reference, a relay should remove every version at that coordinate whose timestamp is no later than the request&amp;rsquo;s &lt;code>created_at&lt;/code>, which prevents an old deletion request from suppressing a later replacement.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/09.md#relay-behavior">Authorship is the security boundary&lt;/a>. A relay should stop publishing a referenced event only when its &lt;code>pubkey&lt;/code> matches the deletion request&amp;rsquo;s &lt;code>pubkey&lt;/code>, and a client must perform that check before hiding an event. A relay may not possess the referenced event and therefore may be unable to validate the relationship when accepting the request, so clients cannot treat relay acceptance as proof that the deletion was authorized. The specification also asks relays to retain the kind &lt;code>5&lt;/code> request because another client may already hold the original event and encounter the request later.&lt;/p>
&lt;p>Here is a &lt;a href="https://primal.net/e/6f39fd3d0d593d97dd093f21fabe8f78895579d6979a6ecf14e169bd85bb0943">signed kind &lt;code>5&lt;/code> event&lt;/a>:&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;6f39fd3d0d593d97dd093f21fabe8f78895579d6979a6ecf14e169bd85bb0943&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;5877220aaae6e54a6f974602d5995c0fe24a3ea7ddabd8644bec795b9da00743&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">1786465675&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">5&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;f3d47f8b813928c5baf7ac993846be0220dc37a2e7c7b128fb49a4b92711f131&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;30091&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;30091:5877220aaae6e54a6f974602d5995c0fe24a3ea7ddabd8644bec795b9da00743:survey:0ad5cebc-608b-47d7-97fd-9e6c47787199&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-survey&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;Public survey summary deleted during privacy refresh&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;846be83b038dc5f91af0c9d03a4ac81aff9bc4cfde7d85c849fa2fdae890f75cc444a4072f45aa18883b0b3871e15381b220182d6e366892f0c9c6f9c0557244&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>Deletion remains a cooperative policy, not revocation of a signed object. A relay, cache, screenshot, or offline client can preserve the original bytes, and deleting the kind &lt;code>5&lt;/code> request itself does not undo it. Clients may hide the target, mark it as disowned, or display the request reason, but should tell users that universal deletion cannot be guaranteed. This differs from &lt;a href="https://github.com/nostr-protocol/nips/blob/master/40.md">NIP-40&lt;/a>, where an &lt;code>expiration&lt;/code> tag asks relays to stop storing an event after a time chosen when the event is published. NIP-09 handles a later author decision and can point to already-distributed events.&lt;/p>
&lt;p>Current implementations apply that policy at different layers. &lt;a href="https://github.com/divinevideo/divine-mobile/pull/6623">Divine PR #6623&lt;/a> removes deleted videos from the client&amp;rsquo;s event store, &lt;a href="https://github.com/hoytech/strfry/pull/251">strfry PR #251&lt;/a> extends valid deletion requests to gift-wrap recipients, and &lt;a href="https://github.com/vitorpamplona/amethyst/blob/278ddd27904dc721e54ffaca8803307d154f2e1d/README.md">Amethyst&lt;/a> declares NIP-09 support in its client. &lt;a href="https://github.com/nostrord/nostrord/blob/862855e8e7130f509c458c6b4d36a3bd660f16d8/composeApp/src/commonMain/kotlin/org/nostr/nostrord/network/NostrGroupClient.kt">nostrord&amp;rsquo;s group client&lt;/a> supplies another current implementation path.&lt;/p>
&lt;h3 id="reporting-nip-56">Reporting (NIP-56)&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-56/">NIP-56&lt;/a>, defined by the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/56.md">primary specification&lt;/a>, standardizes a signed report about an account, event, or referenced blob. It separates the report signal from the moderation decision, allowing each client or relay to choose which reporters it trusts and what response fits its policy.&lt;/p>
&lt;p>A report uses kind &lt;code>1984&lt;/code> and must identify the reported account in a &lt;code>p&lt;/code> tag. Reporting a note also requires an &lt;code>e&lt;/code> tag for the event ID. The third value of the tag carries one of the specified categories: &lt;code>nudity&lt;/code>, &lt;code>malware&lt;/code>, &lt;code>profanity&lt;/code>, &lt;code>illegal&lt;/code>, &lt;code>spam&lt;/code>, &lt;code>impersonation&lt;/code>, or &lt;code>other&lt;/code>. A report about a blob can use its hash in an &lt;code>x&lt;/code> tag, an &lt;code>e&lt;/code> tag for the event that referenced the blob, and an optional &lt;code>server&lt;/code> tag for a location. Optional &lt;code>L&lt;/code> and &lt;code>l&lt;/code> tags from &lt;a href="https://github.com/nostr-protocol/nips/blob/master/32.md">NIP-32&lt;/a> can add a namespaced label when the fixed category list is not precise enough.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/blob/master/56.md#reporting">The event proves only that one key made an allegation&lt;/a>. The reported content does not become false, illegal, or removable merely because a valid kind &lt;code>1984&lt;/code> exists, and an open relay cannot safely count anonymous reports as votes. The specification advises against automatic relay moderation because reports are easy to game, while allowing relay administrators to act on reports from moderators they already trust. A client can instead weight reports through a user&amp;rsquo;s social graph, for example by blurring content after several trusted contacts flag the same account.&lt;/p>
&lt;p>Here is a &lt;a href="https://primal.net/e/17301ea66066d34af9ba0b6957ed9d9d8854b9436939e682e21e7a5a8768e4b2">signed kind &lt;code>1984&lt;/code> event&lt;/a>:&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;17301ea66066d34af9ba0b6957ed9d9d8854b9436939e682e21e7a5a8768e4b2&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;1ff02fb5cdc633c1be55368ab655490ec25d2f5dc2e364d4703bc3196d99eab1&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">1786465319&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">1984&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;3a72b02cc05ee07310dc580874b6a9ca8271c6518b90655bd2e98003c9601e68&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;impersonation&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;6362e415410feb19e0505654a4660e8456b6b2aec5ae39173a0429a6a8e5fa1381c9488198ca2982db43ee8198af056f2a25537705c763784062056d0ab2eb1a&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/nostr-protocol/nips/tree/master">NIP-56 and NIP-09 solve different problems&lt;/a>. A kind &lt;code>1984&lt;/code> report can target somebody else&amp;rsquo;s account or event, but confers no deletion authority. A kind &lt;code>5&lt;/code> request expresses the original author&amp;rsquo;s intent and is valid only against that author&amp;rsquo;s own events. Neither guarantees removal: NIP-56 deliberately delegates action to local moderation policy, while NIP-09 depends on relays and clients honoring an authenticated request.&lt;/p>
&lt;p>Implementations expose those choices in different products. &lt;a href="https://github.com/divinevideo/divine-mobile/pull/6591">Divine PR #6591&lt;/a> corrects report delivery in a short-video client, &lt;a href="https://github.com/Conduit-BTC/conduit-mono/pull/250">Conduit PR #250&lt;/a> reads reports as bounded context for marketplace participants, and &lt;a href="https://github.com/nostrord/nostrord/blob/862855e8e7130f509c458c6b4d36a3bd660f16d8/composeApp/src/commonMain/kotlin/org/nostr/nostrord/nostr/Nip56.kt">nostrord&amp;rsquo;s NIP-56 module&lt;/a> publishes and processes report events. &lt;a href="https://github.com/vitorpamplona/amethyst/blob/278ddd27904dc721e54ffaca8803307d154f2e1d/README.md#nip-support">Amethyst&lt;/a> also lists current NIP-56 support.&lt;/p>
&lt;hr>
&lt;p>Send a NIP-17 DM to share a project or news item through the &lt;a href="https://github.com/andotherstuff/nostr-compass">Nostr Compass project&lt;/a>.&lt;/p></content:encoded></item><item><title>Nostr Compass #34</title><link>https://nostrcompass.org/en/newsletters/2026-08-05-newsletter/</link><pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-08-05-newsletter/</guid><description>&lt;p>Welcome back to &lt;a href="https://github.com/andotherstuff/nostr-compass">Nostr Compass&lt;/a>, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://sandstr.app/">Sandstr&lt;/a> lets newcomers explore simulated Nostr clients without creating keys or installing an app. &lt;a href="https://github.com/0ceanSlim/nostr-mill">nostr-mill&lt;/a> adds per-event signer consent and cross-client key recovery, while &lt;a href="https://github.com/nostrord/nostrord">nostrord&lt;/a> expands relay-hosted groups, signers, moderation, uploads, and highlights. Protocol work spans Nostr event formats, wallet connections, relay discovery, napplets, Marmot, and Concord; the deep dives explain relay-assisted search and portable highlights.&lt;/p>
&lt;h2 id="top-stories">Top Stories&lt;/h2>
&lt;h3 id="nostr-mill-160-puts-signing-consent-and-account-recovery-in-the-browser">nostr-mill 1.6.0 puts signing consent and account recovery in the browser&lt;/h3>
&lt;p>&lt;a href="https://github.com/0ceanSlim/nostr-mill/releases/tag/v1.6.0">nostr-mill 1.6.0&lt;/a> is an embeddable browser account picker and signer. It now asks for consent by event kind and shows decoded content and tags before signing, with time-limited grants and a permissions manager. The release also fixes a first-session bug that let categories configured to prompt every time sign without asking. Its optional Google onboarding can import an existing &lt;code>nsec&lt;/code>, stores the key encrypted in the user&amp;rsquo;s Drive app-data folder, supports multiple identities, and can export a &lt;a href="https://nostrcompass.org/en/topics/nip-49/">NIP-49&lt;/a> (encrypted private-key format) &lt;code>ncryptsec&lt;/code>.&lt;/p></description><content:encoded>&lt;p>Welcome back to &lt;a href="https://github.com/andotherstuff/nostr-compass">Nostr Compass&lt;/a>, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://sandstr.app/">Sandstr&lt;/a> lets newcomers explore simulated Nostr clients without creating keys or installing an app. &lt;a href="https://github.com/0ceanSlim/nostr-mill">nostr-mill&lt;/a> adds per-event signer consent and cross-client key recovery, while &lt;a href="https://github.com/nostrord/nostrord">nostrord&lt;/a> expands relay-hosted groups, signers, moderation, uploads, and highlights. Protocol work spans Nostr event formats, wallet connections, relay discovery, napplets, Marmot, and Concord; the deep dives explain relay-assisted search and portable highlights.&lt;/p>
&lt;h2 id="top-stories">Top Stories&lt;/h2>
&lt;h3 id="nostr-mill-160-puts-signing-consent-and-account-recovery-in-the-browser">nostr-mill 1.6.0 puts signing consent and account recovery in the browser&lt;/h3>
&lt;p>&lt;a href="https://github.com/0ceanSlim/nostr-mill/releases/tag/v1.6.0">nostr-mill 1.6.0&lt;/a> is an embeddable browser account picker and signer. It now asks for consent by event kind and shows decoded content and tags before signing, with time-limited grants and a permissions manager. The release also fixes a first-session bug that let categories configured to prompt every time sign without asking. Its optional Google onboarding can import an existing &lt;code>nsec&lt;/code>, stores the key encrypted in the user&amp;rsquo;s Drive app-data folder, supports multiple identities, and can export a &lt;a href="https://nostrcompass.org/en/topics/nip-49/">NIP-49&lt;/a> (encrypted private-key format) &lt;code>ncryptsec&lt;/code>.&lt;/p>
&lt;p>The &lt;a href="https://github.com/0ceanSlim/nostr-mill/releases/tag/v1.6.0">experimental relay backup&lt;/a> derives a strong recovery phrase with scrypt and HKDF, wraps the key as &lt;code>ncryptsec&lt;/code>, verifies fetched events, and requires a relay quorum before recovery. &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a> (Android signer intents) login now uses Amber&amp;rsquo;s clipboard return path, and &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> (relay-mediated remote signing) connections are quiet by default. Branding controls and responsive permission screens round out the release without changing existing integrations unless an operator opts in.&lt;/p>
&lt;h3 id="nostrord-250-gives-relay-groups-stable-relay-specific-identities">nostrord 2.5.0 gives relay groups stable, relay-specific identities&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostrord/nostrord/releases/tag/v2.5.0">nostrord 2.5.0&lt;/a> is a cross-platform client for relay-hosted communities. It now derives a &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> (relay-managed groups) identity from both group ID and host relay, scopes membership and admin badges the same way, accepts group &lt;code>naddr&lt;/code> deep links, and synchronizes private-group threads across devices.&lt;/p>
&lt;p>The &lt;a href="https://github.com/nostrord/nostrord/releases/tag/v2.5.0">release&lt;/a> also adds a &lt;a href="https://nostrcompass.org/en/topics/nip-56/">NIP-56&lt;/a> (report events) moderation inbox, Amber login through NIP-55, rate-limit backoff for NIP-46 signer traffic, &lt;a href="https://nostrcompass.org/en/topics/nip-84/">NIP-84&lt;/a> (portable highlights) rendering with retries for unresolved references, and media uploads through Blossom or &lt;a href="https://nostrcompass.org/en/topics/nip-96/">NIP-96&lt;/a> (HTTP file storage). Google login now backs up the key before account creation and confirms disconnects. Thread replies gain richer content and admin deletion, while desktop keychain and mobile keyboard fixes keep those protocol features usable.&lt;/p>
&lt;h3 id="primal-android-3525-updates-remote-signing-and-follow-list-filtering">Primal Android 3.5.25 updates remote signing and follow-list filtering&lt;/h3>
&lt;p>&lt;a href="https://github.com/PrimalHQ/primal-android-app/releases/tag/3.5.25">Primal Android 3.5.25&lt;/a> is a mobile Nostr client with feeds, search, and remote signing. It updates its remote signer for current protocol behavior, adds a follow mute list, opens search from Explore, repairs stalled relay connections automatically, exposes request timeouts in the interface, rejects invalid follow-list entries, and refreshes fallback relay URLs. Feed prefetching, lower memory use, and a 100 MB cache ceiling reduce the cost of keeping those feeds current. Single-image notes now use the full content width, and profile controls and media preloading receive smaller interaction and ordering fixes.&lt;/p>
&lt;h3 id="nostur-1302-expands-private-replies-and-media-in-direct-messages">Nostur 1.30.2 expands private replies and media in direct messages&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostur-com/nostur-ios-public/releases/tag/527">Nostur 1.30.2&lt;/a> is an Apple-platform Nostr client. It always exposes the private-reply action, adds per-conversation DM media caches with limits and clearing controls, improves name and tag completion in posts and chats, shows referenced messages in live chat, and includes the room title in chat notifications. Feed pagination and nested-reply fixes address retrieval and conversation rendering regressions.&lt;/p>
&lt;h3 id="chama-570-adds-arbiter-records-and-cached-trade-recovery">Chama 5.7.0 adds arbiter records and cached trade recovery&lt;/h3>
&lt;p>&lt;a href="https://github.com/jesuspirate/chama/releases/tag/v5.7.0">Chama 5.7.0&lt;/a> coordinates peer trades and arbitration through signed Nostr event chains. It displays an arbiter&amp;rsquo;s locked amount, bond tenure, and funding outpoint; records when a backup replaced an absent arbiter; and defines dormant kind &lt;code>38136&lt;/code> fault attestations that require both principals&amp;rsquo; signatures. An explicit repair retries incomplete relay histories against the durable device cache and republishes recovered events, while failed publishes queue for the next connection. The release also prevents cross-device duplicate arbiter-premium payments by treating the author&amp;rsquo;s kind &lt;code>38113&lt;/code> event as the payment record.&lt;/p>
&lt;h3 id="auditable-voting-01165-restores-delegated-ballot-delivery">Auditable Voting 0.1.165 restores delegated ballot delivery&lt;/h3>
&lt;p>&lt;a href="https://github.com/tidley/auditable-voting/releases/tag/v0.1.165">Auditable Voting 0.1.165&lt;/a> conducts verifiable ballots while separating voter credentials from ballot contents. It restores delegated blind-ballot issuance through authenticated delegation delivery and control-DM backfill, keeps blind-credential direct messages on configured private relays, and updates the audit proxy to 0.1.52.&lt;/p>
&lt;h3 id="sandstr-lets-newcomers-test-drive-nostr-clients-with-mock-data">Sandstr lets newcomers test-drive Nostr clients with mock data&lt;/h3>
&lt;p>&lt;a href="https://sandstr.app/">Sandstr&lt;/a> provides interactive browser simulations of Nostr clients so a newcomer can compare their interfaces before installing one or creating a keypair. Its August 3 launch includes reference-verified reproductions of Damus, Amethyst, Primal, Snort, YakiHonne, Coracle, and Wisp, plus clearly labeled early previews of Gossip, Keychat, and Olas. Everything runs locally against mock data, so the simulations do not generate keys or connect to relays. Each simulation links onward to the real client&amp;rsquo;s website and source repository, making Sandstr an onboarding and interface-comparison tool rather than another Nostr client. It shows how feeds, profiles, threads, direct messages, search, zaps, and relay controls feel without asking a first-time user to make an identity or security decision up front.&lt;/p>
&lt;h3 id="mineracks-signer-pairs-a-browser-extension-with-a-desktop-bunker">mineracks signer pairs a browser extension with a desktop bunker&lt;/h3>
&lt;p>&lt;a href="https://github.com/mineracks/mineracks-signer">mineracks signer&lt;/a> provides two signing surfaces from the same project. Its browser extension implements &lt;a href="https://nostrcompass.org/en/topics/nip-07/">NIP-07&lt;/a> so web applications can request signatures without receiving the private key, while the desktop application exposes a &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote signer for clients that communicate through relays.&lt;/p>
&lt;p>The project&amp;rsquo;s &lt;a href="https://github.com/mineracks/mineracks-signer/releases/tag/desktop-v0.1.0">desktop 0.1.0 release&lt;/a> stores key material using NIP-49 encrypted-key encoding and keeps the decrypted key inside the Rust process rather than passing it to the interface. Each request shows the calling application and requested action, while per-application auto-approval is optional and revocable. The first desktop build supports Apple Silicon but not Intel Macs.&lt;/p>
&lt;h2 id="releases">Releases&lt;/h2>
&lt;h3 id="jumble-2681-adds-proof-of-work-controls-and-comment-previews">Jumble 26.8.1 adds proof-of-work controls and comment previews&lt;/h3>
&lt;p>&lt;a href="https://github.com/CodyTseng/jumble/releases/tag/v26.8.1">Jumble 26.8.1&lt;/a> is a web and desktop Nostr client. It remembers proof-of-work difficulty for publishing, displays verified-work badges, previews linked comments above external content, saves images from the full-screen viewer, and expands long profile biographies on demand. Reaction notifications now discard unsupported event kinds, relay disconnect notices are less noisy, default relays were refreshed, and a media-autoplay conflict was fixed.&lt;/p>
&lt;h3 id="nostr-calendar-210-restores-private-form-signer-binding">nostr-calendar 2.1.0 restores private-form signer binding&lt;/h3>
&lt;p>&lt;a href="https://github.com/formstr-hq/nostr-calendar/releases/tag/v2.1.0">nostr-calendar 2.1.0&lt;/a> publishes calendars, events, and form responses as Nostr data. It binds private-form submissions to the active signer, saves intentional duplicate events to relays, fixes relay fetching, parses calendar dates in local time, and adds app notifications plus an iOS client. The signer correction prevents a stale identity from producing an unusable encrypted response.&lt;/p>
&lt;h3 id="manent-200-adds-tagging-and-search-for-saved-notes">Manent 2.0.0 adds tagging and search for saved notes&lt;/h3>
&lt;p>&lt;a href="https://github.com/dtonon/manent/releases/tag/v2.0.0">Manent 2.0.0&lt;/a> is a personal archive for signed Nostr notes. It adds local tags and search, letting a reader organize and retrieve saved events without modifying their signed contents.&lt;/p>
&lt;h3 id="nosvelte-061-closes-empty-subscriptions-after-eose">nosvelte 0.6.1 closes empty subscriptions after EOSE&lt;/h3>
&lt;p>&lt;a href="https://github.com/akiomik/nosvelte/releases/tag/v0.6.1">nosvelte 0.6.1&lt;/a> provides reactive Svelte components and hooks for relay data. Empty searches now settle at End of Stored Events, cancellation closes the underlying &lt;code>REQ&lt;/code>, retries clear stale errors, and list hooks return their documented empty value. It also recognizes addressable events regardless of where their &lt;code>d&lt;/code> tag appears, replaces superseded metadata and articles, deduplicates reactions by event ID, and keeps every event from a relay&amp;rsquo;s first batch.&lt;/p>
&lt;h2 id="unreleased-changes">Unreleased Changes&lt;/h2>
&lt;h3 id="nmp-ties-relay-admission-to-declarations-and-broadens-group-queries">NMP ties relay admission to declarations and broadens group queries&lt;/h3>
&lt;p>&lt;a href="https://github.com/pablof7z/nmp">NMP&lt;/a> is a TypeScript toolkit for building Nostr applications and relay-backed group interfaces. &lt;a href="https://github.com/pablof7z/nmp/pull/1254">PR #1254&lt;/a> makes relay admission follow the owner of the declaration that authorizes it, keeping the permission decision attached to signed Nostr state. &lt;a href="https://github.com/pablof7z/nmp/pull/1255">PR #1255&lt;/a> generalizes &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> relay-managed group queries instead of assuming one narrow lookup shape. Both changes are merged but have not yet appeared in a tagged release.&lt;/p>
&lt;h3 id="mosaico-derives-managed-group-identity-from-relay-records">Mosaico derives managed-group identity from relay records&lt;/h3>
&lt;p>&lt;a href="https://github.com/pablof7z/mosaico">Mosaico&lt;/a> is a Nostr client for browsing and administering relay-managed communities. &lt;a href="https://github.com/pablof7z/mosaico/pull/758">PR #758&lt;/a> derives a managed group&amp;rsquo;s identity from the relay that hosts its authoritative records. &lt;a href="https://github.com/pablof7z/mosaico/pull/757">PR #757&lt;/a> observes the group&amp;rsquo;s published record when resolving administration state. This keeps two similarly named groups on different relays distinct and gives clients a relay-backed source for their management metadata.&lt;/p>
&lt;h3 id="divine-isolates-slow-relays-during-multi-relay-queries">Divine isolates slow relays during multi-relay queries&lt;/h3>
&lt;p>&lt;a href="https://github.com/divinevideo/divine-mobile">Divine&lt;/a> is a mobile short-video client that publishes and retrieves videos over Nostr. &lt;a href="https://github.com/divinevideo/divine-mobile/pull/6673">PR #6673&lt;/a> gives each relay query its own timeout instead of letting one stalled connection consume the timeout budget for an entire request. Results from responsive relays can therefore arrive while the slow endpoint is abandoned independently. The change improves retrieval without treating one relay as authoritative for the combined result.&lt;/p>
&lt;h3 id="rust-nostr-hardens-encryption-hashes-and-reconciliation">rust-nostr hardens encryption, hashes, and reconciliation&lt;/h3>
&lt;p>&lt;a href="https://github.com/rust-nostr/nostr">rust-nostr&lt;/a> is a Rust library and toolkit for Nostr clients, relays, and protocol implementations. &lt;a href="https://github.com/rust-nostr/nostr/pull/1421">PR #1421&lt;/a> reduces allocation in its &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> versioned-encryption path, while &lt;a href="https://github.com/rust-nostr/nostr/pull/1423">PR #1423&lt;/a> introduces typed hashes that make incompatible digest values harder to mix accidentally. &lt;a href="https://github.com/rust-nostr/nostr/commit/21e31c28da3dfadedb5fa6e58c712647f16e5f69">Commit 21e31c2&lt;/a> prevents a malformed &lt;a href="https://nostrcompass.org/en/topics/nip-77/">NIP-77&lt;/a> Negentropy set-reconciliation message from disconnecting the local relay. The merged work tightens both encrypted payload handling and reconciliation failure behavior before the next release.&lt;/p>
&lt;h3 id="zeus-serializes-nwc-payments-before-charging-spending-budgets">Zeus serializes NWC payments before charging spending budgets&lt;/h3>
&lt;p>&lt;a href="https://github.com/ZeusLN/zeus">Zeus&lt;/a> is a mobile Bitcoin and Lightning wallet that can expose wallet operations through Nostr Wallet Connect. &lt;a href="https://github.com/ZeusLN/zeus/pull/4305">PR #4305&lt;/a> counts pending payments against a &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> Nostr Wallet Connect budget instead of waiting for settlement. &lt;a href="https://github.com/ZeusLN/zeus/pull/4303">PR #4303&lt;/a> serializes payment handling so concurrent requests cannot race through the same authorization limit. The merged pair closes a budget-enforcement gap on the wallet&amp;rsquo;s Nostr control surface.&lt;/p>
&lt;h3 id="nostr-components-shares-one-relay-connection-attempt">Nostr Components shares one relay connection attempt&lt;/h3>
&lt;p>&lt;a href="https://github.com/saiy2k/nostr-components">Nostr Components&lt;/a> is a reusable web-component library for adding Nostr data and interactions to applications. &lt;a href="https://github.com/saiy2k/nostr-components/pull/105">PR #105&lt;/a> lets components mounted at the same time share an in-flight relay connection attempt. Each consumer still receives the resulting connection, but concurrent mounts no longer open duplicate sockets while the first handshake is pending. The change reduces avoidable relay load in applications assembled from several independent components.&lt;/p>
&lt;h2 id="nip-updates-and-protocol-spec-work">NIP Updates and Protocol Spec Work&lt;/h2>
&lt;h3 id="nostr-event-formats-and-discovery">Nostr event formats and discovery&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2430">NIP PR #2430&lt;/a> proposes sticker packs as addressable kind &lt;code>30031&lt;/code> definitions and a user&amp;rsquo;s installed packs as replaceable kind &lt;code>10031&lt;/code>. Each sticker tag carries a shortcode, SHA-256 hash, and MIME type; the image remains on a &lt;a href="https://github.com/nostr-protocol/nips/blob/master/B7.md">NIP-B7&lt;/a> (Blossom blob storage) server. The open draft therefore standardizes pack identity and installation without placing image bytes in events.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2429">NIP PR #2429&lt;/a> proposes kind &lt;code>31436&lt;/code> addressable Gopher documents. Each event holds one UTF-8 text or menu node, and signed nodes under one pubkey form a gopherhole that any relay-backed RFC 1436 bridge can serve. The open proposal uses ordinary addressable-event storage rather than binding the publication to one Gopher hostname.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2428">NIP PR #2428&lt;/a> proposes epoch-ticketed private groups. A group rotates membership credentials between epochs, and clients present the ticket for the current epoch to participate. The draft targets private chat without asking a relay to treat a permanent bearer token as lifetime membership.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2425">NIP PR #2425&lt;/a>, covered as a proposal last week, has now merged a URI clarification into &lt;a href="https://nostrcompass.org/en/topics/nip-b0/">NIP-B0&lt;/a> (addressable web bookmarks). It distinguishes omitted HTTPS prefixes from explicit URI schemes when a bookmark stores its target in the &lt;code>d&lt;/code> tag, preventing clients from reconstructing an ambiguous destination.&lt;/p>
&lt;h3 id="payments-and-wallet-connections">Payments and wallet connections&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2419">NIP PR #2419&lt;/a>, covered as a proposal in the July 22 issue, has now merged a smaller &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> (Nostr Wallet Connect) core. Connection URIs, encrypted relay transport, capability discovery, encryption negotiation, and common methods stay in the NIP; notifications, hold invoices, keysend, transaction history, metadata, and deep-link pairing move to a dedicated extension repository. Existing connections remain compatible while wallets can implement optional contracts independently.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-wallet-connect/nwc/pull/2">NWC PR #2&lt;/a>, covered as a proposal last week, has now merged BIP-321 payment methods into that extension repository. BIP-321 provides a common Bitcoin payment URI that can carry different rails, so NWC callers can request or send a payment without adding a new core RPC for each underlying instruction type.&lt;/p>
&lt;h3 id="napplet-host-capabilities">Napplet host capabilities&lt;/h3>
&lt;p>&lt;a href="https://github.com/napplet/naps/pull/95">NAP PR #95&lt;/a> proposes catalog discovery for Nostr-distributed sandbox applications. A napplet asks its host which applications and capabilities are available, and the host returns policy-filtered metadata instead of exposing its full local environment. The contract supports launch decisions without granting execution authority during discovery.&lt;/p>
&lt;p>&lt;a href="https://github.com/napplet/naps/pull/33">NAP PR #33&lt;/a> proposes shell-mediated file and blob uploads. A napplet supplies bytes and intent; the host selects a NIP-96 or Blossom rail, signs authorization, reports progress, and returns URLs, hashes, MIME data, and ready-to-attach &lt;a href="https://nostrcompass.org/en/topics/nip-94/">NIP-94&lt;/a> (file metadata) tags. Storage credentials and HTTP authority never enter the napplet.&lt;/p>
&lt;h3 id="marmot-encrypted-groups">Marmot encrypted groups&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/marmot/pull/410">Marmot PR #410&lt;/a> merged convergence and deferred-input rules. Clients distinguish an object that lacks a current epoch dependency from stale or invalid input, keep it eligible for refetch after resource refusal, and retry when another commit changes the decryption context. A domain-separated state commitment gives conformance tests a shared convergence oracle without adding a production wire field.&lt;/p>
&lt;h3 id="concord-community-planes">Concord community planes&lt;/h3>
&lt;p>&lt;a href="https://github.com/concord-protocol/concord/pull/14">Concord PR #14&lt;/a> merged CORD-08 disappearing messages. One community metadata value sets the lifetime; chat rumors and encrypted wraps carry a &lt;a href="https://nostrcompass.org/en/topics/nip-40/">NIP-40&lt;/a> (event expiration) tag, while deletion events and the kind &lt;code>1740&lt;/code> timer notice are exempt. The signed timer travels with community state, though relay deletion remains a retention request rather than a cryptographic erasure guarantee.&lt;/p>
&lt;p>&lt;a href="https://github.com/concord-protocol/concord/pull/13">Concord PR #13&lt;/a> merged rotation-proof pinning into CORD-04. Each channel has one replace-entire pin list on the control plane; entries carry the original signed seal plus per-message NIP-44 expansion keys, allowing a new member to verify the author and plaintext without receiving an old epoch key. Private lists can remain sealed to a channel epoch, caps bound list size, and author deletions remove pins without forking the control-plane chain.&lt;/p>
&lt;h2 id="nip-deep-dive">NIP Deep Dive&lt;/h2>
&lt;h3 id="search-capability-nip-50">Search Capability (NIP-50)&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-50/">NIP-50&lt;/a>, defined in the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/50.md">primary specification&lt;/a>, adds an optional search filter for relays. Ordinary Nostr filters work when a client already knows an author, event kind, identifier, or tag; NIP-50 addresses discovery when the input is a human query such as &lt;code>best nostr apps&lt;/code>.&lt;/p>
&lt;p>The &lt;a href="https://github.com/nostr-protocol/nips/blob/master/50.md#search-filter-field">NIP-50 wire format&lt;/a> adds a &lt;code>search&lt;/code> string to a normal filter inside a &lt;code>REQ&lt;/code> message. A request can combine that field with &lt;code>kinds&lt;/code>, &lt;code>authors&lt;/code>, &lt;code>ids&lt;/code>, tag filters, and &lt;code>limit&lt;/code>, and one REQ can carry several independent filters. A supporting relay should match primarily against event &lt;code>content&lt;/code>, may use other fields when the event kind makes that useful, and should sort by its own relevance score before applying &lt;code>limit&lt;/code>. That order differs from the usual newest-first event stream.&lt;/p>
&lt;p>The query string can include the specification&amp;rsquo;s &lt;a href="https://github.com/nostr-protocol/nips/blob/master/50.md#extensions">&lt;code>key:value&lt;/code> extensions&lt;/a>. It names &lt;code>include:spam&lt;/code>, &lt;code>domain:&lt;/code>, &lt;code>language:&lt;/code>, &lt;code>sentiment:&lt;/code>, and &lt;code>nsfw:&lt;/code>; a relay should ignore extensions it does not implement. Clients discover declared support through the relay&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> &lt;code>supported_nips&lt;/code> field, but they may still send the filter elsewhere if they are prepared to reject unrelated responses.&lt;/p>
&lt;p>The &lt;a href="https://github.com/nostr-protocol/nips/blob/master/50.md">NIP-50 specification&lt;/a> deliberately does not standardize tokenization, stemming, ranking, language detection, sentiment analysis, or spam classification. Two compliant relays can return different events and different ordering for the same query. That makes the relay an index and ranking provider, not a source of truth. The specification recommends querying several supporting relays, checking whether returned events satisfy the client&amp;rsquo;s use case, and dropping relays whose results have poor precision.&lt;/p>
&lt;p>This differs from exact &lt;a href="https://github.com/nostr-protocol/nips/blob/master/01.md">NIP-01 filtering&lt;/a>. An &lt;code>authors&lt;/code> or &lt;code>#t&lt;/code> filter has deterministic matching semantics that a client can verify directly, while a search match may depend on an index and an opaque score. NIP-50 retains NIP-01&amp;rsquo;s signed event envelope and relay transport, but accepts variation in recall and ordering to make open-ended retrieval possible.&lt;/p>
&lt;p>The event below is a real search result returned by a NIP-50 search relay for a relay-discovery query, with the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/01.md#events-and-signatures">seven NIP-01 event fields&lt;/a> populated and a valid signature.&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;2943d6b43bcbf0ee4a8b4cac912111be0309607b8bb435ae40529989bea7f6c5&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;3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d&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">1785771175&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;I&amp;#39;ve been working on a customizable client (mostly relay feeds, but a ton of other things and subtle details too). It&amp;#39;s called Hallway for reasons I don&amp;#39;t remember and it&amp;#39;s a fork of Fevela which is a fork of Jumble, but very rewritten for speed and simplicity...&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;5b058b89dab9bd09d81bdc10eff95536125b87fbcbbc97f08d835c1272b2a3190cc3d340e42f54acb0d7e0e4b00355ab91292d0305c84a2d73b538319c0da12c&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>Current clients use the same filter in different discovery surfaces. &lt;a href="https://github.com/nostria-app/nostria/blob/d291c2ab091c60c36f99c90241e2fd9da1b0c4bc/src/app/services/relays/search-relay.ts">Nostria&lt;/a> sends NIP-50 searches to dedicated search relays, &lt;a href="https://github.com/soapbox-pub/ditto/blob/04adb2d242ab6f5807fd27ae3e0cb9beab091641/src/hooks/useSearchEvents.ts">Ditto&lt;/a> searches events through its relay pool, and &lt;a href="https://github.com/77elements/noornote/blob/bf1f9b431552497dc1779ea0d8fed2c3c28e6070/src/services/orchestration/SearchOrchestrator.ts">NoorNote&lt;/a> coordinates relay-backed searches for long-form reading. Their different result handling reflects the latitude NIP-50 leaves to relays and clients.&lt;/p>
&lt;h3 id="highlights-nip-84">Highlights (NIP-84)&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-84/">NIP-84&lt;/a>, defined by its &lt;a href="https://github.com/nostr-protocol/nips/blob/master/84.md">primary specification&lt;/a>, assigns kind &lt;code>9802&lt;/code> to a highlight. It turns a selected passage, or a reference to non-text media, into a signed event that can move between reading, social, and annotation clients.&lt;/p>
&lt;p>The &lt;a href="https://github.com/nostr-protocol/nips/blob/master/84.md#format">event&amp;rsquo;s &lt;code>content&lt;/code>&lt;/a> contains the selected text and may be empty when the source is audio, video, or another non-text medium. A highlight points to a Nostr source with an &lt;code>a&lt;/code> tag for an addressable event or an &lt;code>e&lt;/code> tag for an ordinary event; an &lt;code>r&lt;/code> tag identifies a web URL. URL-producing clients should remove tracking and other non-useful query parameters before publishing so cosmetic URL variants do not fragment references to the same source.&lt;/p>
&lt;p>Optional &lt;a href="https://github.com/nostr-protocol/nips/blob/master/84.md#attribution">&lt;code>p&lt;/code> tags&lt;/a> attribute the source to one or more Nostr pubkeys. Their fourth value may identify a role such as &lt;code>author&lt;/code> or &lt;code>editor&lt;/code>, and a &lt;code>context&lt;/code> tag can preserve surrounding text when the selection alone would be unclear. A quote highlight adds a &lt;code>comment&lt;/code> tag instead of publishing a second kind &lt;code>1&lt;/code> note: the source &lt;code>r&lt;/code> tag receives the &lt;code>source&lt;/code> marker, while pubkeys or URLs mentioned in the comment carry &lt;code>mention&lt;/code>, letting renderers distinguish attribution from the user&amp;rsquo;s response.&lt;/p>
&lt;p>The &lt;a href="https://github.com/nostr-protocol/nips/blob/master/84.md">kind &lt;code>9802&lt;/code> definition&lt;/a> makes a highlight a regular event rather than a replaceable one. Repeating or correcting a selection creates another signed event, and removing one relies on the normal deletion-request flow and relay retention policy. The specification does not define byte offsets, selectors, or a canonical document snapshot, so a client may be unable to relocate a passage after its web source changes. Public highlights also reveal reading interests; private annotation requires a separate encryption and sharing design.&lt;/p>
&lt;p>NIP-84 differs from a &lt;a href="https://github.com/nostr-protocol/nips/blob/master/23.md">NIP-23 long-form event&lt;/a>, which publishes an entire article as kind &lt;code>30023&lt;/code>; a highlight quotes or points into material that may remain elsewhere. It also differs from a &lt;a href="https://github.com/nostr-protocol/nips/blob/master/51.md">NIP-51 bookmark set&lt;/a>, which stores a replaceable collection of references. NIP-84 makes each selection independently signed, attributable, discoverable, and discussable.&lt;/p>
&lt;p>The highlight below is a real kind &lt;code>9802&lt;/code> event published from Primal&amp;rsquo;s iOS client, recovered from public relays. It carries the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/01.md#events-and-signatures">seven NIP-01 event fields&lt;/a> with a valid signature, an &lt;code>a&lt;/code> tag pointing at a &lt;a href="https://github.com/nostr-protocol/nips/blob/master/23.md">NIP-23 long-form event&lt;/a>, a &lt;code>p&lt;/code> tag attributing the article&amp;rsquo;s author, and a &lt;code>context&lt;/code> tag preserving the surrounding passage.&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;0d57c07cfdfe8ec00711e2af88a666b61fc35c167b90b02dfb5db7ffba7b794a&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;07367baec8e73c076b14e47fba3b0d5c014d559d7986a7172a79a8a64419d7c2&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">1785797755&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">9802&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;context&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Quantum computers will break secp256k1 which nostr relies on for its public private key pair. This means that given an npub, a quantum computer will be able to derive your nsec, read all your encrypted data and sign events as you.&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;This is a highlight created in https://primal.net iOS application&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:1ec454734dcbf6fe54901ce25c0c7c6bca5edd89443416761fadc321d38df139:nostr-quantum-preparation&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;1ec454734dcbf6fe54901ce25c0c7c6bca5edd89443416761fadc321d38df139&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;mention&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;Quantum computers will break secp256k1 which nostr relies on for its public private key pair. This means that given an npub, a quantum computer will b&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;219f3c1e572d1a087d667dc0d3a5443c77c0db3a5d42ce4e630604901ac63d2c879a86269d81e220bb77fd48b1579adafc333075e53c6eb0a108791fdd4a1622&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 format already crosses client boundaries. &lt;a href="https://github.com/nostrord/nostrord/releases/tag/v2.5.0">nostrord 2.5.0&lt;/a> added NIP-84 rendering this week, &lt;a href="https://github.com/77elements/noornote/blob/bf1f9b431552497dc1779ea0d8fed2c3c28e6070/src/components/ui/note-rendering/HighlightRenderer.ts">NoorNote&lt;/a> renders highlight events in its long-form client, and &lt;a href="https://github.com/soapbox-pub/ditto/blob/04adb2d242ab6f5807fd27ae3e0cb9beab091641/src/hooks/useCreateHighlight.ts">Ditto&lt;/a> publishes them from selected content. Those implementations cover reading, creation, and social rendering without requiring one service to own the annotation.&lt;/p>
&lt;hr>
&lt;p>Send a NIP-17 DM to share a project or news item through the &lt;a href="https://github.com/andotherstuff/nostr-compass">Nostr Compass project&lt;/a>.&lt;/p></content:encoded></item><item><title>Nostr Compass #33</title><link>https://nostrcompass.org/en/newsletters/2026-07-29-newsletter/</link><pubDate>Wed, 29 Jul 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-07-29-newsletter/</guid><description>&lt;p>Welcome back to &lt;a href="https://github.com/andotherstuff/nostr-compass">Nostr Compass&lt;/a>, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.13.1">Amethyst 1.13.1&lt;/a> follows version 1.13.0&amp;rsquo;s Nostr-app launch with NIP-29 host-relay authentication and authenticated Blossom-download retries. &lt;a href="https://github.com/tidley/nostr-codex-phone/releases/tag/v0.2.68">Code Call&lt;/a> keeps remote coding sessions moving from a phone, &lt;a href="https://github.com/DanConwayDev/gitworkshop">GitWorkshop&lt;/a> coordinates maintainers and repository synchronization, and &lt;a href="https://github.com/pablof7z/mosaico/releases/tag/v0.1.2">Mosaico&lt;/a> gives coding agents a shared Nostr awareness layer. &lt;a href="https://dev.nostrolo.gy/relays">Nostrology&lt;/a> maps how profiles divide read and write duties across their published relay lists. Android releases from &lt;a href="https://github.com/DestBro/mafrend-zapstore/releases/tag/v1.0">Mafrend&lt;/a>, &lt;a href="https://github.com/Letdown2491/hanami-android/releases/tag/v0.1.0">Hanami&lt;/a>, and &lt;a href="https://github.com/Cordn-msg/cordn-web/releases/tag/v0.2.1">Cordn&lt;/a> lead the tagged releases, while &lt;a href="https://github.com/jmcorgan/fips/pull/126">FIPS adds an OpenWrt access layer&lt;/a> and an &lt;a href="https://github.com/jmcorgan/fips/pull/129">open PR proposes a FreeBSD port&lt;/a>. Protocol coverage reports NIPs, BUDs, NAPs, Marmot, Gamma Markets, Concord, and NWC, while &lt;a href="https://github.com/nostr-protocol/nips/commits/master/">Six Years of Nostr Julys&lt;/a> follows July changes from early domain lookup through relay-group state.&lt;/p></description><content:encoded>&lt;p>Welcome back to &lt;a href="https://github.com/andotherstuff/nostr-compass">Nostr Compass&lt;/a>, your weekly guide to Nostr.&lt;/p>
&lt;p>&lt;strong>This week:&lt;/strong> &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.13.1">Amethyst 1.13.1&lt;/a> follows version 1.13.0&amp;rsquo;s Nostr-app launch with NIP-29 host-relay authentication and authenticated Blossom-download retries. &lt;a href="https://github.com/tidley/nostr-codex-phone/releases/tag/v0.2.68">Code Call&lt;/a> keeps remote coding sessions moving from a phone, &lt;a href="https://github.com/DanConwayDev/gitworkshop">GitWorkshop&lt;/a> coordinates maintainers and repository synchronization, and &lt;a href="https://github.com/pablof7z/mosaico/releases/tag/v0.1.2">Mosaico&lt;/a> gives coding agents a shared Nostr awareness layer. &lt;a href="https://dev.nostrolo.gy/relays">Nostrology&lt;/a> maps how profiles divide read and write duties across their published relay lists. Android releases from &lt;a href="https://github.com/DestBro/mafrend-zapstore/releases/tag/v1.0">Mafrend&lt;/a>, &lt;a href="https://github.com/Letdown2491/hanami-android/releases/tag/v0.1.0">Hanami&lt;/a>, and &lt;a href="https://github.com/Cordn-msg/cordn-web/releases/tag/v0.2.1">Cordn&lt;/a> lead the tagged releases, while &lt;a href="https://github.com/jmcorgan/fips/pull/126">FIPS adds an OpenWrt access layer&lt;/a> and an &lt;a href="https://github.com/jmcorgan/fips/pull/129">open PR proposes a FreeBSD port&lt;/a>. Protocol coverage reports NIPs, BUDs, NAPs, Marmot, Gamma Markets, Concord, and NWC, while &lt;a href="https://github.com/nostr-protocol/nips/commits/master/">Six Years of Nostr Julys&lt;/a> follows July changes from early domain lookup through relay-group state.&lt;/p>
&lt;h2 id="top-stories">Top Stories&lt;/h2>
&lt;h3 id="amethyst-1131-follows-its-nostr-apps-launch-with-authenticated-group-and-blossom-access">Amethyst 1.13.1 follows its Nostr apps launch with authenticated group and Blossom access&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.13.0">Amethyst 1.13.0&lt;/a>, released July 28 for the Android and multiplatform Nostr client, opens napplets and NIP-5A nsites inside an isolated, keyless browser process. A consent-gated &lt;code>window.nostr&lt;/code> bridge can sign and use selected capabilities through the active account, while per-site and per-account permission screens let users review or revoke those grants. Favorite apps can stay pinned in the bottom bar without sharing cookies, login state, or grants across accounts.&lt;/p>
&lt;p>The same &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.13.0">1.13.0 release&lt;/a> adds Git repository trees, issues, and pull requests alongside Concord communities, NIP-29 relay groups, Buzz group chat, wiki pages, and RSS feeds. Those surfaces let a user move between code, community, publishing, and social views under the same Nostr identity.&lt;/p>
&lt;p>Payments and identity also widened in &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.13.0">version 1.13.0&lt;/a>. Amethyst can create and pay BOLT12 offers, automatically start remote-signer accounts, add Blossom fallback servers, and expand Web of Trust controls for badges, communities, and relay groups. The July 29 &lt;a href="https://github.com/vitorpamplona/amethyst/releases/tag/v1.13.1">1.13.1 follow-up&lt;/a> adds a &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3767">CORD-02 dissolution seal&lt;/a>, kind &lt;code>9008&lt;/code> &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3779">group and channel deletion&lt;/a>, &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3788">NIP-29 host-relay authentication&lt;/a>, and authenticated &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3789">BUD-01 retries&lt;/a> for gated Blossom downloads.&lt;/p>
&lt;h3 id="code-call-0268-adds-a-worker-folder-browser-after-0266-introduced-catch-up">Code Call 0.2.68 adds a worker-folder browser after 0.2.66 introduced catch-up&lt;/h3>
&lt;p>&lt;a href="https://github.com/tidley/nostr-codex-phone/releases/tag/v0.2.68">Code Call 0.2.68&lt;/a>, an Android remote for computer-side coding sessions, replaces its special-case workspace list with a folder browser rooted at the worker directory. A user can enter nested allowed folders, select one for an OpenCode session, and return to parent folders; &lt;a href="https://github.com/tidley/nostr-codex-phone/releases/tag/v0.2.67">version 0.2.67&lt;/a> opens that browser when a session is spawned.&lt;/p>
&lt;p>The earlier &lt;a href="https://github.com/tidley/nostr-codex-phone/releases/tag/v0.2.66">0.2.66 release&lt;/a> can ask a routed worker for a concise catch-up from the latest phone message. Other releases from the same week keep &lt;a href="https://github.com/tidley/nostr-codex-phone/releases/tag/v0.2.51">multiple sessions independent&lt;/a>, accept replies only from the &lt;a href="https://github.com/tidley/nostr-codex-phone/releases/tag/v0.2.56">expected sender&lt;/a>, and keep the inbox connected to &lt;a href="https://github.com/tidley/nostr-codex-phone/releases/tag/v0.2.59">every configured worker relay&lt;/a> for background delivery. Requests and replies travel inside &lt;a href="https://nostrcompass.org/en/topics/nip-17/">NIP-17 (Private Direct Messages)&lt;/a>, while locally encrypted &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> attachments &lt;a href="https://github.com/tidley/nostr-codex-phone/releases/tag/v0.2.55">retain their original file type after decryption&lt;/a>.&lt;/p>
&lt;h3 id="gitworkshop-coordinates-maintainers-and-keeps-repository-sync-independent">GitWorkshop coordinates maintainers and keeps repository sync independent&lt;/h3>
&lt;p>&lt;a href="https://primal.net/e/869e01f9a74d98f468a66f3b83865d198a82cc718c1db36324398b1b88a17c60">GitWorkshop&amp;rsquo;s July 27 signed release&lt;/a> adds Android login through &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55 (Android Signer Application)&lt;/a> to the browser-based &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34 (&lt;code>git&lt;/code> stuff)&lt;/a> forge. Its &lt;a href="https://github.com/DanConwayDev/gitworkshop">source repository&lt;/a> now coordinates lead maintainers recursively, preserves each maintainer&amp;rsquo;s relay hints, and keeps repository synchronization independent from invitation acceptance. Cross-repository work-item references connect related work across repositories, while GRASP copies repository data to selected Git endpoints without coupling that transfer to invitation delivery. The developer-signed &lt;a href="https://primal.net/e/01d0939e9960cb82f1f7aba6f1900af2c61ce384e38352221bf9d5878116ae2d">3.1.1 update&lt;/a> repairs Android signer intent delivery, recursive maintainer resolution, and path-preserving repository links.&lt;/p>
&lt;h3 id="mosaico-012-lets-coding-agents-share-status-over-nostr">Mosaico 0.1.2 lets coding agents share status over Nostr&lt;/h3>
&lt;p>&lt;a href="https://github.com/pablof7z/mosaico/releases/tag/v0.1.2">Mosaico 0.1.2&lt;/a> lets coding-agent sessions in Claude Code, Codex, Goose, Hermes, OpenCode, and Grok publish short status updates over &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29 (Relay-based Groups)&lt;/a>. Sessions can find related active work across hosts without sharing their transcripts or context.&lt;/p>
&lt;p>Named Codex profile discovery and Goose&amp;rsquo;s Top Of Mind view surface that shared status inside both harnesses (&lt;a href="https://github.com/pablof7z/mosaico/pull/618">PR #618&lt;/a>, &lt;a href="https://github.com/pablof7z/mosaico/pull/619">PR #619&lt;/a>). The release restores hosted agents&amp;rsquo; ability to join the public awareness layer, and setup now requires an explicit relay choice (&lt;a href="https://github.com/pablof7z/mosaico/pull/626">PR #626&lt;/a>, &lt;a href="https://github.com/pablof7z/mosaico/pull/629">PR #629&lt;/a>). Mosaico remains an awareness layer, not an agent host, orchestrator, or transcript merger.&lt;/p>
&lt;h3 id="nostrology-maps-relay-list-concentration-from-published-nip-65-events">Nostrology maps relay-list concentration from published NIP-65 events&lt;/h3>
&lt;p>&lt;a href="https://dev.nostrolo.gy/relays">Nostrology&amp;rsquo;s relay observatory&lt;/a> derives its dataset from each profile&amp;rsquo;s latest &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65 (Relay List Metadata)&lt;/a> kind &lt;code>10002&lt;/code> event, following the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/65.md">published specification&lt;/a>. It separates read, write, and combined relay roles, charts how many relays each profile lists, and exposes the underlying counts in a sortable table. At the July 29 publication review, the page contained 34,430 distinct relay URL values and grouped 520,468 profiles at exactly one listed relay, compared with 150,657 at three and 60,710 at four.&lt;/p>
&lt;p>The same &lt;a href="https://dev.nostrolo.gy/relays">Nostrology snapshot&lt;/a> shows overlapping concentration around &lt;code>relay.momostr.pink&lt;/code> at 298,859 profiles, &lt;code>relay.damus.io&lt;/code> at 287,181, &lt;code>nos.lol&lt;/code> at 279,468, and &lt;code>relay.primal.net&lt;/code> at 225,336. Those counts measure published relay-list entries, not availability: the raw table can include malformed URLs and local addresses, while the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/65.md">NIP-65 specification&lt;/a> defines routing metadata and does not test relay health. The observatory makes adoption and data-quality problems visible without treating a listed relay as a live one.&lt;/p>
&lt;h2 id="tagged-releases">Tagged Releases&lt;/h2>
&lt;h3 id="kairos-011-adds-reminders-and-a-local-astraea-instruction">Kairos 0.1.1 adds reminders and a local Astraea instruction&lt;/h3>
&lt;p>&lt;a href="https://primal.net/e/ffb054280008dc3ba488d5d3a2cbfec6c4123489a874683545a29a466682fd90">Kairos 0.1.1&lt;/a> adds due-date reminders, an explicit local instruction to Astraea, and stricter relay and URL handling. The &lt;a href="https://primal.net/e/6e02430844abdabf5421bbf5745a09ef2870e4ade93f56627ee14ba8db58a00a">0.1.0 signed release&lt;/a> introduced the &lt;a href="https://github.com/Lwb89dev/kairos">offline-first task manager&lt;/a>, whose optional sync layer writes &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44 (Encrypted Payloads)&lt;/a>-encrypted records to user-selected relays. Kairos uses deterministic task coordinates and encrypted tombstones with &lt;a href="https://nostrcompass.org/en/topics/nip-09/">NIP-09 (Event Deletion Request)&lt;/a> deletion requests, while local-only tasks never leave the device.&lt;/p>
&lt;h3 id="bray-230-gives-its-cli-general-gift-wrapping-and-a-local-blossom-test-surface">Bray 2.3.0 gives its CLI general gift wrapping and a local Blossom test surface&lt;/h3>
&lt;p>&lt;a href="https://github.com/forgesworn/bray/releases/tag/v2.3.0">Bray 2.3.0&lt;/a>, a Nostr SDK and command-line toolkit, can gift-wrap and unwrap arbitrary events through &lt;a href="https://nostrcompass.org/en/topics/nip-59/">NIP-59 (Gift Wrap)&lt;/a>, with signing routed through &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46 (Nostr Connect)&lt;/a> when a bunker holds the key. &lt;a href="https://github.com/forgesworn/bray/pull/75">PR #75&lt;/a> also gives the bundled test relay &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42 (Authentication of clients to relays)&lt;/a> challenges and exposes the remaining Blossom client commands. &lt;a href="https://github.com/forgesworn/bray/pull/77">PR #77&lt;/a> adds an in-memory BUD-01/02 server whose signed authorization binds each upload or deletion to one blob, while &lt;a href="https://github.com/forgesworn/bray/pull/76">PR #76&lt;/a> adds named event kinds, shorthand tags, and &lt;a href="https://nostrcompass.org/en/topics/nip-77/">NIP-77&lt;/a> ID-reconciliation flags that avoid downloading events a caller already holds.&lt;/p>
&lt;h3 id="buzz-desktop-050-tightens-invitations-search-and-relay-identity-updates">Buzz Desktop 0.5.0 tightens invitations, search, and relay identity updates&lt;/h3>
&lt;p>After last week&amp;rsquo;s Armada and Buzz workspace coverage, &lt;a href="https://github.com/block/buzz/releases/tag/v0.5.0">Buzz Desktop 0.5.0&lt;/a> adds use-limited invite links (&lt;a href="https://github.com/block/buzz/pull/3141">PR #3141&lt;/a>) and search filters for author, channel, and time bounds (&lt;a href="https://github.com/block/buzz/pull/2871">PR #2871&lt;/a>). &lt;a href="https://github.com/block/buzz/pull/2862">PR #2862&lt;/a> retrieves join policies through the desktop app&amp;rsquo;s native network layer, and &lt;a href="https://github.com/block/buzz/pull/2607">PR #2607&lt;/a> republishes an agent&amp;rsquo;s identity record after a persona rename reaches the relay. The release also updates its Nostr dependency for a &lt;a href="https://github.com/block/buzz/pull/3135">NIP-44 remote-denial-of-service advisory&lt;/a> and repairs local-storage recovery, thread positioning, relay reconnection, and Linux and Windows runtime paths.&lt;/p>
&lt;h3 id="shosho-100-expands-its-live-streaming-marketplace">Shosho 1.0.0 expands its live-streaming marketplace&lt;/h3>
&lt;p>&lt;a href="https://github.com/r0d8lsh0p/shosho-releases/releases/tag/v1.0.0">Shosho 1.0.0&lt;/a> redesigns the live-streaming marketplace around creators, live sessions, clips, and products that users can find through configurable relay search. A unified notification feed now collects mentions, reactions, reposts, and zaps and supports replies without leaving the feed. Viewers can publish clips from live streams or replays, while the release also improves threaded chat, clip replies, profile loading, and network usage.&lt;/p>
&lt;h3 id="mafrend-v10-previews-place-based-nostr-chat-on-android">Mafrend v1.0 previews place-based Nostr chat on Android&lt;/h3>
&lt;p>&lt;a href="https://github.com/DestBro/mafrend-zapstore/releases/tag/v1.0">Mafrend v1.0&lt;/a> is the first public Android alpha of a planned place-based Nostr chat app. Its &lt;a href="https://mafrend.com">project page&lt;/a> labels the feature set as still in active development and describes each map location as a dedicated chat room for conversations around a place. A public release repository carries the installable Zapstore package while the main app remains private.&lt;/p>
&lt;h3 id="hanami-010-gives-blossom-servers-a-signer-mediated-android-path">Hanami 0.1.0 gives Blossom servers a signer-mediated Android path&lt;/h3>
&lt;p>&lt;a href="https://github.com/Letdown2491/hanami-android/releases/tag/v0.1.0">Hanami 0.1.0&lt;/a>, an Android companion for &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> servers, lets people sign in, upload, and download from a phone. The app uses &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55 (Android Signer Application)&lt;/a> for approval-mediated signing and a native &lt;a href="https://nostrcompass.org/en/topics/nip-98/">NIP-98 (HTTP Auth)&lt;/a> handshake for the server session. Hanami locks its web shell and signing bridge to the chosen server origin, keeping credentials with the signer while the server&amp;rsquo;s existing web interface supplies the application experience. The first public release requires Android 8 or later, a reachable Hanami server, and a compatible signer app.&lt;/p>
&lt;h3 id="cordn-launches-its-nostr-identity-group-chat-on-android">Cordn launches its Nostr-identity group chat on Android&lt;/h3>
&lt;p>Cordn, a private group-messaging client, now gives Android users Nostr identity onboarding, profile links through &lt;a href="https://nostrcompass.org/en/topics/nip-05/">NIP-05 (Mapping Nostr Keys to DNS-Based Internet Identifiers)&lt;/a>, and verified links that open Cordn destinations in the app. The &lt;a href="https://github.com/Cordn-msg/cordn-web/releases/tag/v0.2.1">0.2.1 release published July 24&lt;/a> introduces that native line alongside the existing web client. Messages use &lt;a href="https://nostrcompass.org/en/topics/mls/">MLS&lt;/a>, a group-encryption protocol, with coordinator-assisted delivery, so groups retain ordered encrypted conversations without requiring an email address or phone number.&lt;/p>
&lt;h3 id="nostur-1301-fixes-threads-and-duplicate-posts-after-1300-expands-sharing">Nostur 1.30.1 fixes threads and duplicate posts after 1.30.0 expands sharing&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostur-com/nostur-ios-public/releases/tag/1.30.1">Nostur 1.30.1&lt;/a>, a Nostr client for iPhone, iPad, and Mac, lets people work through nested reply threads without the expansion and collapse failures that disrupted the new layout. It also prevents the same draft from publishing twice, including when media-upload callbacks repeat. The release follows &lt;a href="https://github.com/nostur-com/nostur-ios-public/releases/tag/1.30.0">1.30.0&lt;/a>, which added disappearing direct messages and a share-sheet route for sending media into Nostr, so the app now pairs new messaging and publishing paths with fixes to their everyday thread and posting flows.&lt;/p>
&lt;h3 id="formstr-drive-002-pairs-nostr-file-metadata-with-blossom-blobs">Formstr Drive 0.0.2 pairs Nostr file metadata with Blossom blobs&lt;/h3>
&lt;p>&lt;a href="https://github.com/formstr-hq/formstr-drive/releases/tag/v0.0.2">Formstr Drive 0.0.2&lt;/a>, a Nostr-native file manager, gives users in-app previews and the option to open office documents in Nostr Docs. Underneath, it stores large files as chunked &lt;a href="https://nostrcompass.org/en/topics/blossom/">Blossom&lt;/a> blobs and deletes the remote blob when a user removes a file. A local relay keeps the app&amp;rsquo;s Nostr metadata close at hand while Blossom holds the file data, separating file organization from the large bytes themselves.&lt;/p>
&lt;h3 id="noornote-131">NoorNote 1.3.1&lt;/h3>
&lt;p>&lt;a href="https://github.com/77elements/noornote/releases/tag/v1.3.1">NoorNote 1.3.1&lt;/a>, a Nostr client for web, desktop, and Android, adds disappearing-message timers and configures working default DM relays for newly created accounts. It filters global articles without cover images and routes repost notifications into the article reader. The preceding &lt;a href="https://github.com/77elements/noornote/releases/tag/v1.3.0">1.3.0 release&lt;/a> added &lt;a href="https://nostrcompass.org/en/topics/nip-53/">NIP-53 (live activities)&lt;/a> cards, &lt;a href="https://nostrcompass.org/en/topics/nip-68/">NIP-68 (Picture-first feeds)&lt;/a> person tags, a &lt;a href="https://nostrcompass.org/en/topics/nip-78/">NIP-78 (application-data)&lt;/a> soft mute, and relay-seen status for notes.&lt;/p>
&lt;h3 id="algia-00133">algia 0.0.133&lt;/h3>
&lt;p>&lt;a href="https://github.com/mattn/algia/releases/tag/v0.0.133">algia 0.0.133&lt;/a>, a Go command-line client for Nostr, follows &lt;a href="https://github.com/mattn/algia/releases/tag/v0.0.132">0.0.132&lt;/a>, which added &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29 (Relay-based Groups)&lt;/a> listing, timelines, posting, reactions, deletions, and join and leave flows. The same release added &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42 (Authentication of clients to relays)&lt;/a> pre-authentication for relays configured to require it. Version 0.0.133 then added local-image uploads to regular, channel, and group posting commands, attaching the resulting URLs and &lt;a href="https://nostrcompass.org/en/topics/nip-92/">NIP-92 (Media Attachments)&lt;/a> tags to each event. Image-only posts work as well, and group posts target the group&amp;rsquo;s relay media store by default while other posts use configured file servers.&lt;/p>
&lt;h3 id="swift-nostr-070">swift-nostr 0.7.0&lt;/h3>
&lt;p>For Swift applications, &lt;a href="https://github.com/yysskk/swift-nostr/releases/tag/0.7.0">swift-nostr 0.7.0&lt;/a>, a Nostr library for Apple platforms, lets one &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46 remote signer&lt;/a> drive every client feature through its signing abstraction. The release adds &lt;a href="https://nostrcompass.org/en/topics/nip-98/">NIP-98 (HTTP Auth)&lt;/a> and &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29 (Relay-based Groups)&lt;/a> support, including group joining, posting, and moderation flows. It also validates &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44 (Encrypted Payloads, Versioned)&lt;/a> padding against the official vectors, rejecting payloads that carry a valid MAC over noncanonical padding.&lt;/p>
&lt;h3 id="lawallet-nwc-200">lawallet-nwc 2.0.0&lt;/h3>
&lt;p>&lt;a href="https://github.com/lawalletio/lawallet-nwc/releases/tag/v2.0.0">LaWallet NWC 2.0.0&lt;/a>, a Nostr-connected wallet and &lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47 (Nostr Wallet Connect)&lt;/a> service, adds passkey login that derives the Nostr signing key in the browser with the WebAuthn PRF extension. The server never receives that secret, and the same passkey can recover the same key on another synced device. Accounts can now link and merge multiple Nostr pubkeys, while the optional listener service relays wallet-connect events and retries webhook delivery after an unreachable endpoint.&lt;/p>
&lt;h3 id="mdk-0910">MDK 0.9.10&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/mdk/releases/tag/v0.9.10">MDK 0.9.10&lt;/a>, the Rust implementation of the &lt;a href="https://nostrcompass.org/en/topics/marmot/">Marmot protocol&lt;/a>, retains pending sends while a transport is inactive and &lt;a href="https://github.com/marmot-protocol/mdk/pull/1157">supervises relay-notification forwarding&lt;/a> so inbound delivery recovers after lag, panic, or closure. &lt;a href="https://github.com/marmot-protocol/mdk/pull/1159">PR #1159&lt;/a> adds durable, paginated conversation history and full reply context for local agents, and &lt;a href="https://github.com/marmot-protocol/mdk/pull/1167">PR #1167&lt;/a> republishes the current signed KeyPackage event instead of generating a replacement. The release also preserves manual chat ordering, supports terminal group disbanding, and expands Web of Trust-ranked search, relay policy APIs, and language bindings.&lt;/p>
&lt;h3 id="pakstr-031">pakstr 0.3.1&lt;/h3>
&lt;p>&lt;a href="https://git.nostrdev.com/stuff/pakstr/releases/tag/v0.3.1">pakstr 0.3.1&lt;/a> lets web teams packaging a Nostr client for Android supply runtime configuration and an API proxy without rebuilding the app shell. Its &lt;a href="https://git.nostrdev.com/stuff/pakstr/releases">same-day release series&lt;/a> added an Amber signer bridge, &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44 (encrypted payloads)&lt;/a> encryption and decryption, and corrected Android permission injection before the 0.3.x runtime-configuration work. The scaffold keeps bundled web assets local while deployment-specific settings arrive at runtime, and the proxy gives the wrapped app a controlled route for API requests alongside its ordinary relay connections.&lt;/p>
&lt;h3 id="ditto-2342">Ditto 2.34.2&lt;/h3>
&lt;p>&lt;a href="https://gitlab.com/soapbox-pub/ditto/-/releases/v2.34.2">Ditto 2.34.2&lt;/a>, a customizable Nostr social client, renders user statuses as cards in feeds, detail pages, and quote embeds, including custom emoji, expiry, and optional link previews. Zaps with comments now appear as replies beneath the referenced post. The release also retains the &lt;a href="https://gitlab.com/soapbox-pub/ditto/-/releases/v2.34.1">optional profile globe button from 2.34.1&lt;/a> for owners who publish a &lt;a href="https://nostrcompass.org/en/topics/nip-5a/">NIP-5A (website manifest)&lt;/a> root site, and fixes homepage navigation, live-stream search, external-link handling, and broken custom emoji.&lt;/p>
&lt;h3 id="earthly-009">Earthly 0.0.9&lt;/h3>
&lt;p>&lt;a href="https://github.com/zeSchlausKwab/earthly/releases/tag/v0.0.9">Earthly 0.0.9&lt;/a>, a collaborative map editor built on Nostr, now keeps likes visible when a map entity drawer closes, reopens, or refreshes. Its &lt;a href="https://nostrcompass.org/en/topics/nip-57/">NIP-57 (Lightning zaps)&lt;/a> flow sends valid zap-request JSON so Lightning providers can publish verified receipts to publicly reachable relays, including during local development. Generated invoices remain visible across entity-surface changes, and the app shows confirmation after a verified receipt arrives.&lt;/p>
&lt;h2 id="in-development">In Development&lt;/h2>
&lt;h3 id="keep-adds-kind-scoped-nip-44-v3-signing-and-tightens-approval-policy">Keep adds kind-scoped NIP-44 v3 signing and tightens approval policy&lt;/h3>
&lt;p>Keep merged five Android signer changes that carry &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44 (Encrypted Payloads)&lt;/a> v3 encrypt and decrypt requests through both &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55 (Android Signer Application)&lt;/a> transports and its &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46 (Nostr Connect)&lt;/a> bunker. &lt;a href="https://github.com/privkeyio/keep-android/pull/451">PRs #451&lt;/a>, &lt;a href="https://github.com/privkeyio/keep-android/pull/452">#452&lt;/a>, and &lt;a href="https://github.com/privkeyio/keep-android/pull/453">#453&lt;/a> keep v3 grants separate from v2, scope them by event kind, reject missing or invalid kinds, and preserve approval requests opened from notifications. &lt;a href="https://github.com/privkeyio/keep-android/pull/454">PRs #454&lt;/a> and &lt;a href="https://github.com/privkeyio/keep-android/pull/455">#455&lt;/a> stop treating the Basic signing policy as Auto and move the global selection into the core-owned encrypted store. The Keep maintainers merged all five changes after the latest tagged Android release.&lt;/p>
&lt;h3 id="routstrd-changes-its-default-network-bind-after-an-unauthenticated-exposure">Routstrd changes its default network bind after an unauthenticated exposure&lt;/h3>
&lt;p>Routstrd &lt;a href="https://github.com/Routstr/routstrd/pull/56">PR #56&lt;/a> changes the local Nostr inference router&amp;rsquo;s default bind address from all network interfaces to &lt;code>127.0.0.1&lt;/code>. The former default exposed unauthenticated wallet balance, history, access, send, refund, API-key, provider, client, usage, and daemon-stop endpoints to any host that could reach the port. Operators can still configure a non-local bind explicitly, but the merged change makes a fresh deployment local-only by default and has not yet appeared in a tagged release.&lt;/p>
&lt;h3 id="imwald-android-clarifies-offline-publishing-status">Imwald Android clarifies offline publishing status&lt;/h3>
&lt;p>Imwald Android, an Android Nostr client, now treats acknowledgement from a local relay as a completed publish only when every configured target is local. Its &lt;a href="https://git.imwald.eu/silberengel/imwald-android/commit/f4de9f61df35110c77d2e5f99d764c0df176962b">offline-publishing and outbox fix&lt;/a> keeps remote delivery pending when a local relay has accepted the event but configured remote relays have not, so the publish report distinguishes device-local storage from relay delivery.&lt;/p>
&lt;h3 id="fips-adds-an-openwrt-access-layer-a-freebsd-port-remains-under-review">FIPS adds an OpenWrt access layer; a FreeBSD port remains under review&lt;/h3>
&lt;p>The Nostr-native Free Internetworking Peering System now lets an OpenWrt router expose an open &lt;code>!FIPS&lt;/code> access network through &lt;a href="https://github.com/jmcorgan/fips/pull/126">merged PR #126&lt;/a>. The parallel, still-open &lt;a href="https://github.com/jmcorgan/fips/pull/129">FreeBSD PR #129&lt;/a> proposes porting the daemon, TUN data path, &lt;code>.fips&lt;/code> name resolution, service management, and native package build. The OpenWrt merge broadens access today, while the FreeBSD work would extend it to another general-purpose operating system.&lt;/p>
&lt;p>A July 26 &lt;a href="https://primal.net/e/d0afe733f75e909341ab7f39834883968df097472238a474df3a3346c5d38f51">FIPS project update&lt;/a> reported more than 300 nodes on its public UDP overlay and a broader mesh approaching 2,000 nodes. The &lt;a href="https://github.com/jmcorgan/fips">FIPS repository&lt;/a> spent the same week hardening concurrent network tests, rekey continuity, hop-limit behavior, firewall checks, and NAT-lab isolation. The repository work gives operators reproducible checks for those behaviors as the network grows.&lt;/p>
&lt;h3 id="zap-cooking-schedules-posts-and-binds-scanner-requests">Zap Cooking schedules posts and binds scanner requests&lt;/h3>
&lt;p>Zap Cooking, a Nostr recipe-sharing and meal-planning app, can now retain a scheduled post in encrypted storage and publish it when due through a periodic relay sweep (&lt;a href="https://github.com/zapcooking/frontend/pull/566">PR #566&lt;/a>, &lt;a href="https://github.com/zapcooking/frontend/pull/569">PR #569&lt;/a>). That gives users a scheduled-publishing path without leaving unsigned post content exposed in the scheduler&amp;rsquo;s database.&lt;/p>
&lt;p>Its fridge scanner now authenticates the exact request body with &lt;a href="https://nostrcompass.org/en/topics/nip-98/">NIP-98&lt;/a> HTTP authentication, so membership checks rely on the key that signed the scan request instead of a pubkey supplied in its body (&lt;a href="https://github.com/zapcooking/frontend/pull/599">PR #599&lt;/a>).&lt;/p>
&lt;h3 id="citrine-turns-an-android-device-into-a-manageable-relay">Citrine turns an Android device into a manageable relay&lt;/h3>
&lt;p>Citrine, an Android-hosted Nostr relay, can now send events it has stored to external relays, giving an operator a way to rebroadcast local history (&lt;a href="https://github.com/greenart7c3/Citrine/pull/179">PR #179&lt;/a>). It also adds &lt;a href="https://nostrcompass.org/en/topics/nip-86/">NIP-86 (Relay Management API)&lt;/a> commands so compatible clients can administer the relay (&lt;a href="https://github.com/greenart7c3/Citrine/pull/150">PR #150&lt;/a>).&lt;/p>
&lt;p>Group operators can administer &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> relay-based groups through Amber signing in &lt;a href="https://github.com/greenart7c3/Citrine/pull/178">PR #178&lt;/a>, while &lt;a href="https://github.com/greenart7c3/Citrine/pull/174">PR #174&lt;/a> keeps Tor-backed relay configuration and lifecycle state aligned through restarts.&lt;/p>
&lt;h3 id="wired-recovers-complete-conversations-in-the-browser">Wired recovers complete conversations in the browser&lt;/h3>
&lt;p>Wired, a browser-based Nostr client, now follows feed roots, replies, and referenced events to completion instead of stopping at fixed breadth or result limits (&lt;a href="https://github.com/smolgrrr/Wired/pull/148">PR #148&lt;/a>, &lt;a href="https://github.com/smolgrrr/Wired/pull/147">PR #147&lt;/a>, &lt;a href="https://github.com/smolgrrr/Wired/pull/146">PR #146&lt;/a>). Users can therefore recover deeper threads and feed context when the relevant events are available from their relays.&lt;/p>
&lt;p>The browser also preserves relay hints on referenced events and uses them only for still-missing context, restoring conversations that configured relays do not carry (&lt;a href="https://github.com/smolgrrr/Wired/pull/145">PR #145&lt;/a>, &lt;a href="https://github.com/smolgrrr/Wired/pull/144">PR #144&lt;/a>). Incomplete retrieval is kept distinct from a completed snapshot, so a partial response does not overwrite the prior cached view.&lt;/p>
&lt;h2 id="protocol-and-spec-work">Protocol and Spec Work&lt;/h2>
&lt;h3 id="nips-nip-34-hosting-boundary-group-migration-and-three-live-drafts">NIPs: NIP-34 hosting boundary, group migration, and three live drafts&lt;/h3>
&lt;p>Two specification changes merged this week. &lt;a href="https://github.com/nostr-protocol/nips/commit/6d2979b3f503a8539c983efbcdcf901bbcf9ed23">NIP-34 commit 6d2979b&lt;/a> removes GRASP hosting instructions from the &lt;code>kind:1618&lt;/code> pull-request description, leaving hosting and fallback behavior outside the event contract. &lt;a href="https://github.com/nostr-protocol/nips/commit/db5fe3de8c5d1443b634c9bbf66ecb004f337057">NIP-29 commit db5fe3d&lt;/a> defines how relay-group metadata migrates to another relay and how clients distinguish a valid move from a fork that continues independently.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2424">PR #2424&lt;/a> proposes mutual &lt;code>kind:10045&lt;/code> key-set declarations. The reciprocal requirement would prevent one identity from attaching another key unilaterally. &lt;a href="https://github.com/nostr-protocol/nips/pull/2421">PR #2421&lt;/a> proposes BOLT12 zap intents and payer proofs that clients can validate against the target, amount, offer, and settled payment without depending on a recipient-operated receipt server.&lt;/p>
&lt;p>&lt;a href="https://github.com/nostr-protocol/nips/pull/2425">PR #2425&lt;/a> would let NIP-B0 bookmarks retain non-HTTP schemes such as &lt;code>nostr:&lt;/code> alongside web URLs. That would keep native Nostr identifiers, payment requests, and other application schemes intact inside the same private or public bookmark lists that already carry web addresses.&lt;/p>
&lt;h3 id="mill-implements-a-draft-for-cloud-account-key-backup">Mill implements a draft for cloud-account key backup&lt;/h3>
&lt;p>Mill &lt;a href="https://primal.net/e/6362d9b00662fa64200530f8a29ae547521bac0a1e3c9379ef9086eac7d2030b">announced&lt;/a> an implemented &lt;a href="https://github.com/0ceanSlim/nostr-mill/blob/main/docs/nip-cloud-key-backup.md">cloud-account key-backup draft&lt;/a> that combines a Google OIDC account identifier with a high-entropy passphrase to derive a disposable backup key. Its &lt;a href="https://github.com/0ceanSlim/nostr-mill/blob/main/src/nipbackup.js">reference implementation&lt;/a> encrypts the user&amp;rsquo;s real key as a &lt;a href="https://nostrcompass.org/en/topics/nip-49/">NIP-49 (Private Key Encryption)&lt;/a> &lt;code>ncryptsec&lt;/code>, then stores it in a provisional parameterized-replaceable kind &lt;code>30049&lt;/code> event on configured relays. The project &lt;a href="https://github.com/0ceanSlim/nostr-mill/commit/eeb4b9114d02114b703a6823ad36ca8063b224da">merged the backup flow to main&lt;/a>, but no post-v1.0.0 release includes it, and the backup flow remains disabled unless an operator supplies dedicated &lt;code>backupRelays&lt;/code>. A versioned relay set remains provisional, and the draft warns that published ciphertext remains available for offline passphrase guessing. Readers should treat the design as an implemented experiment that depends on a high-entropy passphrase.&lt;/p>
&lt;h3 id="buds-blossom-servers-may-identify-unknown-uploads-from-their-bytes">BUDs: Blossom servers may identify unknown uploads from their bytes&lt;/h3>
&lt;p>&lt;a href="https://github.com/hzrd149/blossom/pull/110">BUD-02 PR #110&lt;/a> proposes recommending server-side MIME detection when an uploader omits &lt;code>Content-Type&lt;/code> or sends &lt;code>application/octet-stream&lt;/code>. A Blossom server would inspect the first bytes with a maintained file-type library, preserve a specific client-supplied type, and fall back to the generic binary type when detection fails. That would keep images, audio, video, and agent-produced files renderable without making byte sniffing mandatory for every upload.&lt;/p>
&lt;h3 id="naps-conventions-replace-numbered-tracks-as-capture-and-filesystem-contracts-develop">NAPs: conventions replace numbered tracks as capture and filesystem contracts develop&lt;/h3>
&lt;p>&lt;a href="https://github.com/napplet/naps/pull/87">PR #87&lt;/a> removes the numbered cross-napplet protocol track and keeps runtime capabilities under named contracts while application messages converge on &lt;code>napplet:&amp;lt;archetype&amp;gt;/&amp;lt;intent&amp;gt;&lt;/code> convention URIs. The merged &lt;a href="https://github.com/napplet/naps/pull/89">topic-identity change&lt;/a> separates a stable, queryless convention path from per-message payload data, and &lt;a href="https://github.com/napplet/naps/pull/90">PR #90&lt;/a> applies that transposition rule to discovery and handler metadata.&lt;/p>
&lt;p>Two NAP drafts extend the trusted shell boundary. &lt;a href="https://github.com/napplet/naps/pull/94">NAP-CAPTURE PR #94&lt;/a> keeps microphone consent, platform permission, limits, retention, and teardown in the runtime while returning a bounded media artifact to a sandboxed napplet. &lt;a href="https://github.com/napplet/naps/pull/88">NAP-FS PR #88&lt;/a> is the parallel virtual-filesystem proposal, with policy-bound handles instead of unrestricted host paths.&lt;/p>
&lt;h3 id="marmot-the-specification-defines-a-terminal-group-state">Marmot: the specification defines a terminal group state&lt;/h3>
&lt;p>&lt;a href="https://github.com/marmot-protocol/marmot/pull/409">Marmot PR #409&lt;/a> adds an authenticated, irreversible &lt;code>Disbanded&lt;/code> state because MLS itself has no group-deletion operation. An authorized admin commit moves a group out of &lt;code>Active&lt;/code>, blocks old branches, messages, and Welcomes from reviving it, and gives existing groups an explicit compatibility path before they can disband. The preceding &lt;a href="https://github.com/marmot-protocol/marmot/pull/408">specification issue sweep&lt;/a> also reconciled group-state authority, convergence, key packages, acknowledgements, media rules, registry language, and 200 tracked specification issues.&lt;/p>
&lt;h3 id="gamma-markets-no-public-specification-changes-landed">Gamma Markets: no public specification changes landed&lt;/h3>
&lt;p>The &lt;a href="https://github.com/GammaMarkets/market-spec">Gamma Markets specification repository&lt;/a> recorded no public commits or pull-request activity from July 21 through July 28. Its published order, settlement, and market-data documents remain the current baseline; this no-change entry keeps Gamma visible in the weekly specification sweep.&lt;/p>
&lt;h3 id="concord-read-and-write-capabilities-may-split-inside-one-plane">Concord: read and write capabilities may split inside one plane&lt;/h3>
&lt;p>&lt;a href="https://github.com/concord-protocol/concord/pull/12">Concord PR #12&lt;/a> remains an open draft for planes whose readers should not all be writers. It moves the Control Plane toward separate read and write stream capabilities and sketches restricted-write channels, invites, and rekey scopes. The write key is a spam gate in the draft, while signed inner actors and roster checks continue to carry authority.&lt;/p>
&lt;h3 id="nwc-one-wallet-method-can-choose-between-bolt11-and-bolt12">NWC: one wallet method can choose between BOLT11 and BOLT12&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostr-wallet-connect/nwc/pull/2">NWC PR #2&lt;/a> proposes optional &lt;code>pay&lt;/code> and &lt;code>receive&lt;/code> methods for BIP-321 payment URIs. A wallet service can advertise support, choose one compatible BOLT11 invoice or BOLT12 offer from a URI, reject a mismatched Bitcoin network before payment, and report which instruction type it used. The proposal stays outside the NWC core so wallets without BIP-321 or BOLT12 support do not have to implement it.&lt;/p>
&lt;h2 id="six-years-of-nostr-julys">Six Years of Nostr Julys&lt;/h2>
&lt;p>This July history follows recurring Nostr problems: readable identifiers, relay filtering, portable application data, privacy, and interoperability. Across six years, each layer turns a narrow fix into shared infrastructure: names become profiles, filters become application contracts, and relay-carried state expands from notes to live rooms and groups. It begins with &lt;a href="https://github.com/nbd-wtf/nostr-tools/commit/1ce00bd3b6909f78f212a7a172cf845b55280599">the first NIP-05 implementation&lt;/a> and ends with &lt;a href="https://github.com/nostr-protocol/nips/commit/2f4b09335c54a993d483bc220195e3f4a33df1ec">this month&amp;rsquo;s addressable-discovery merge&lt;/a>, then examines the July changes that developed those themes.&lt;/p>
&lt;h3 id="july-2021">July 2021&lt;/h3>
&lt;p>On July 19, 2021, &lt;a href="https://github.com/nbd-wtf/nostr-tools/commit/1ce00bd3b6909f78f212a7a172cf845b55280599">nostr-tools commit 1ce00bd&lt;/a> added a &lt;code>nip05.js&lt;/code> module and raised the package to version 0.5.0. Its &lt;code>keyFromDomain&lt;/code> function built a DNS TXT request for &lt;code>_nostrkey.&amp;lt;domain&amp;gt;&lt;/code>, posted the binary query to one of eight rotating DNS-over-HTTPS providers, and returned the first key in the answer. A browser client could therefore translate a human-controlled domain into a public key without operating a DNS resolver or relying on one hard-coded provider.&lt;/p>
&lt;p>That first approach solved lookup but not names within a domain, and its trust boundary sat in DNS plus the selected resolver. The modern &lt;a href="https://github.com/nostr-protocol/nips/blob/master/05.md">NIP-05 specification&lt;/a> moved discovery to &lt;code>/.well-known/nostr.json&lt;/code>, where a domain maps local names to pubkeys and can attach relay hints. The 2021 code records the earlier design pressure: public keys were portable, but people still needed identifiers they could read, verify, and move between clients.&lt;/p>
&lt;h3 id="july-2022">July 2022&lt;/h3>
&lt;p>On July 10, &lt;a href="https://github.com/nostr-protocol/nips/commit/3771186c0351656a675576051b75d253f26c0f0b">NIP-12 commit 3771186&lt;/a> limited generic relay queries to single-letter tags. That decision made filters such as &lt;code>#r&lt;/code>, &lt;code>#g&lt;/code>, and &lt;code>#t&lt;/code> useful for URL references, geohashes, and hashtags without asking relays to index every arbitrary metadata key. Ten days later, the first &lt;a href="https://github.com/nostr-protocol/nips/commit/9f9a864ce1e1ebfdcfdd4835cd60807440f038e8">NIP-20 web-comments draft&lt;/a> used that query model directly: a kind &lt;code>34&lt;/code> comment carried a normalized webpage URL in an &lt;code>r&lt;/code> tag, allowing a site and independent clients to recover the same discussion from relays.&lt;/p>
&lt;p>Relay policy and social feedback followed. The original &lt;a href="https://github.com/nostr-protocol/nips/commit/f51ce9dc0efaf61f39a76e112c310a9f58af1c87">NIP-22 commit&lt;/a> let relays reject events whose &lt;code>created_at&lt;/code> timestamp was implausibly old, and &lt;a href="https://github.com/nostr-protocol/nips/commit/8bef0e9d79ebb4b11f8fd2bea11dc8f1668bc9d0">commit 8bef0e9&lt;/a> added future timestamps to the same policy. On July 30, &lt;a href="https://github.com/nostr-protocol/nips/commit/dcbd504639d20d1b0ae6bb837609710645781b88">NIP-25 commit dcbd504&lt;/a> defined kind &lt;code>7&lt;/code> reactions with target &lt;code>e&lt;/code> and &lt;code>p&lt;/code> tags; the next commit assigned &lt;code>-&lt;/code> to a negative reaction, and &lt;a href="https://github.com/nostr-protocol/nips/commit/6903ff5b2c395a550a26069f6e2b5460ae1fdca6">commit 6903ff5&lt;/a> made &lt;code>+&lt;/code> the explicit generic like. Together, these commits specified relay timestamp rejection, tag-based retrieval, web comments, and reaction tags for clients that adopted the drafts.&lt;/p>
&lt;h3 id="july-2023">July 2023&lt;/h3>
&lt;p>July 2023 pushed coordination beyond short notes. The &lt;a href="https://github.com/nostr-protocol/nips/commit/e057fa01ca3928a32bdc0e9a44c27f946f267041">NIP-37 lost-key draft&lt;/a> explored irreversible key retirement, social recovery thresholds, and precommitted replacement keys while explicitly refusing to call the result universal key rotation. Five days later, &lt;a href="https://github.com/nostr-protocol/nips/commit/141197c564d97073f0293e3b2f367f0b6b3619c2">NIP-53&lt;/a> introduced addressable kind &lt;code>30311&lt;/code> live activities and kind &lt;code>1311&lt;/code> chat messages, giving streams, stages, and live rooms a shared event model for hosts, participants, status, and conversation.&lt;/p>
&lt;p>Applications also began advertising work and commerce. The first &lt;a href="https://github.com/nostr-protocol/nips/commit/67e950a2009e81df1b8c91b0a2ade0596e83f168">Data Vending Machine draft&lt;/a> described kind &lt;code>68001&lt;/code> job requests, kind &lt;code>68002&lt;/code> results, bids, expirations, chaining, and competitive providers for tasks such as transcription, summarization, and translation. On July 13, the &lt;a href="https://github.com/nostr-protocol/nips/commit/451c06a3c572a13afe45c1d80616f8e6dd9bb1de">classified-listing draft&lt;/a> added addressable kind &lt;code>30402&lt;/code> offers with title, summary, price, location, and status metadata. Those drafts later became NIP-90 and NIP-99, but their July forms already separated a request or listing from the server that displayed it.&lt;/p>
&lt;p>Payment routing became composable too. The July 31 &lt;a href="https://github.com/nostr-protocol/nips/commit/5d63b1570c490007252b10e757f7f68ef1f4b717">NIP-57 zap-splits merge&lt;/a> changed a single &lt;code>zap&lt;/code> destination into a weighted list of recipient pubkeys and relay hints. A client could divide one zap among collaborators, omit unweighted recipients when some weights were present, and show the split before payment. The change standardized a signed-event representation for weighted zap recipients and relay hints, allowing compatible clients to present the split before payment.&lt;/p>
&lt;h3 id="july-2024">July 2024&lt;/h3>
&lt;p>On July 4, &lt;a href="https://github.com/nostr-protocol/nips/commit/c60ca888efbdc9b8fa4bbfbace372409d0b2161a">NIP-29 commit c60ca88&lt;/a> added the &lt;code>kind:9007&lt;/code> relay moderation action for creating a group. Six days later, &lt;a href="https://github.com/nostr-protocol/nips/commit/ae1906ec7943a6bd756f05d2cd2fb2a041398921">NIP-70&lt;/a> defined protected events: a &lt;code>-&lt;/code> tag tells a relay to accept publication only from the event&amp;rsquo;s authenticated author. One change gave relays an explicit group-state transition; the other let authors prevent third parties from replaying otherwise valid signed events into relays.&lt;/p>
&lt;p>On July 16, one &lt;a href="https://github.com/nostr-protocol/nips/commit/506b38916ab67a37b2d98b46b62cf0c0c5fde5a4">Cashu specification commit&lt;/a> introduced both NIP-60 wallets and NIP-61 nutzaps. NIP-60 placed wallet metadata in kind &lt;code>37375&lt;/code>, unspent proofs in encrypted kind &lt;code>7375&lt;/code> events, and optional transaction history in kind &lt;code>7376&lt;/code>. NIP-61 paired the recipient&amp;rsquo;s kind &lt;code>10019&lt;/code> mint and relay preferences with P2PK-locked kind &lt;code>7337&lt;/code> nutzaps. Wallet state and bearer tokens could now move through relays, while redemption still depended on Cashu mint proofs and careful prevention of double claims.&lt;/p>
&lt;p>Two late-July edits tightened deterministic state. &lt;a href="https://github.com/nostr-protocol/nips/commit/9c54549f1842245b842d8a66f3bade744da24189">NIP-01 commit 9c54549&lt;/a> required event IDs as the tie-breaker after equal &lt;code>created_at&lt;/code> timestamps, so clients could sort identical result sets the same way. The &lt;a href="https://github.com/nostr-protocol/nips/commit/722ac7a58695a365be0dbb6eccb33ccd7890a8c7">NIP-09 deletion merge&lt;/a> clarified that kind &lt;code>5&lt;/code> requests may target event IDs or addressable coordinates and should include &lt;code>k&lt;/code> tags identifying the kinds that relays should delete. Both changes narrowed places where two correct implementations could otherwise disagree.&lt;/p>
&lt;h3 id="july-2025">July 2025&lt;/h3>
&lt;p>Ecash discovery gained its own social directory on July 16. &lt;a href="https://github.com/nostr-protocol/nips/commit/1afb6da049e57dd628ef46a3b0f90300653a66ee">NIP-87 commit 1afb6da&lt;/a> defined kind &lt;code>38172&lt;/code> Cashu-mint records, kind &lt;code>38173&lt;/code> Fedimint records, and kind &lt;code>38000&lt;/code> recommendations that can point to those records with relay hints. Wallets could query trusted authors&amp;rsquo; recommendations before connecting to a mint, while the specification warned that unfiltered global discovery could steer users toward malicious operators.&lt;/p>
&lt;p>One week later, a draft specified portable Nostr event records for voice messages. The first &lt;a href="https://github.com/nostr-protocol/nips/commit/e50f37a527ace39cc3057827d52295c6b6de1112">NIP-A0 commit&lt;/a> assigned kind &lt;code>1222&lt;/code> to a voice-message root and kind &lt;code>1244&lt;/code> to a reply, carrying an audio URL plus media metadata. The July 27 &lt;a href="https://github.com/nostr-protocol/nips/commit/4984b057c20397eae919ee5e463bc8a5d3fb2dc0">format follow-up&lt;/a> recommended Opus in an Ogg container and standardized a compressed waveform. Clients could exchange short audio without agreeing on one recorder, host, or waveform representation.&lt;/p>
&lt;p>Private messaging and wallet connections then added protocol state for read tracking, encryption selection, and payment progress. &lt;a href="https://github.com/nostr-protocol/nips/commit/3d76da368e157934e056d95b3b3d8d6eaa105b09">NIP-17 commit 3d76da3&lt;/a> defined a replaceable kind &lt;code>30016&lt;/code> record whose ordered &lt;code>seen&lt;/code> tags let a client distinguish read messages from gaps it may have missed. On July 31, &lt;a href="https://github.com/nostr-protocol/nips/commit/f30a43bd37e08516923b96dd0d860122c9ffe04e">NIP-47 encryption negotiation&lt;/a> let wallet services advertise NIP-44 v2 or legacy NIP-04, while the &lt;a href="https://github.com/nostr-protocol/nips/commit/0595d438aaa163dd33ed00748026698a411a0861">transaction-state commit&lt;/a> added &lt;code>pending&lt;/code>, &lt;code>settled&lt;/code>, &lt;code>accepted&lt;/code>, &lt;code>expired&lt;/code>, and &lt;code>failed&lt;/code> states. Delivery, encryption, and payment progress became explicit protocol data instead of local inference.&lt;/p>
&lt;h3 id="july-2026">July 2026&lt;/h3>
&lt;p>This July began by connecting ordinary web addresses to relay queries. &lt;a href="https://github.com/nostr-protocol/nips/commit/2f4b09335c54a993d483bc220195e3f4a33df1ec">Addressable-discovery commit 2f4b093&lt;/a> defines a &lt;code>/.well-known/nostr.json?ad=&amp;lt;path&amp;gt;&lt;/code> lookup whose answer contains a Nostr filter and relay list. A normal browser can still open the original URL as HTML, while a Nostr client can query the corresponding &lt;code>/.well-known/nostr.json?ad=&amp;lt;path&amp;gt;&lt;/code> endpoint for a filter and relay list that resolve the address to a group, nsite, feed, event, or other native object. The pattern revisits 2021&amp;rsquo;s domain-to-key problem at a broader layer: one human-readable URL can now name both an identity and a query.&lt;/p>
&lt;p>NIP-29 then grew from flat relay groups into structured spaces. The July 16 &lt;a href="https://github.com/nostr-protocol/nips/commit/223ddb3b0c282f2a133adb9f4a9c098a31b36937">subgroup commit&lt;/a> added parent and ordered-child relations; adjacent commits added invite-code suffixes, banners, ordered pin snapshots, and addressable-event pins. On July 22, the &lt;a href="https://github.com/nostr-protocol/nips/commit/db5fe3de8c5d1443b634c9bbf66ecb004f337057">migration and fork clarification&lt;/a> defined when metadata legitimately moves a group to another relay and when a still-active branch is an independent fork. The group identifier stayed simple while hierarchy, presentation, and relay changes became explicit state.&lt;/p>
&lt;p>Two smaller edits clarified implementation boundaries. &lt;a href="https://github.com/nostr-protocol/nips/commit/f0af20484c5e0d12e2d1936f87c5a6681a08daff">NIP-46 commit f0af204&lt;/a> requires a remote signer to return an error for unknown or unsupported methods instead of leaving a client to time out silently. &lt;a href="https://github.com/nostr-protocol/nips/commit/6d2979b3f503a8539c983efbcdcf901bbcf9ed23">NIP-34 commit 6d2979b&lt;/a> removes GRASP-specific hosting directions from the pull-request event description. One gives callers a terminal response; the other keeps a portable git event from silently inheriting one server protocol.&lt;/p>
&lt;hr>
&lt;p>Send a NIP-17 DM to share a project or news item through the &lt;a href="https://github.com/andotherstuff/nostr-compass">Nostr Compass project&lt;/a>.&lt;/p></content:encoded></item><item><title>Nostr Compass #32</title><link>https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/</link><pubDate>Wed, 22 Jul 2026 00:00:00 +0000</pubDate><guid>https://nostrcompass.org/en/newsletters/2026-07-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://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#indiesats-drops-its-publisher-role-and-relaunches-as-open-nostr-music-infrastructure">IndieSats&lt;/a> retires key custody, its whitelist, and its mandatory revenue cut, relaunching as an open relay, player, and discovery layer where artists publish under their own keys. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#nostrord-v230-ships-group-moderation-mute-lists-and-onion-relays">Nostrord v2.3.0&lt;/a> lands group moderation, mute lists, and onion relays the same week five &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#protocol-work-and-nip-updates">NIP-29 spec PRs merge&lt;/a>. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#zapstore-110-makes-the-device-key-portable-and-adds-background-auto-updates">Zapstore 1.1.0&lt;/a> introduces a portable encrypted device key with Amber backup and opt-in background auto-updates. The &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#the-favorite-follow-sets-list-kind-merges-and-immediately-moves-house">favorite-follow-sets list kind&lt;/a> merges and opens a renumbering PR within days. And the &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#the-iris-projects-ship-a-pubsub-library-a-browser-fips-runtime-and-a-social-graph-20-in-one-week">Iris projects&lt;/a> ship nostr-pubsub, the fips-ts browser runtime, and nostr-social-graph 2.0.0 in a single 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://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#indiesats-drops-its-publisher-role-and-relaunches-as-open-nostr-music-infrastructure">IndieSats&lt;/a> retires key custody, its whitelist, and its mandatory revenue cut, relaunching as an open relay, player, and discovery layer where artists publish under their own keys. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#nostrord-v230-ships-group-moderation-mute-lists-and-onion-relays">Nostrord v2.3.0&lt;/a> lands group moderation, mute lists, and onion relays the same week five &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#protocol-work-and-nip-updates">NIP-29 spec PRs merge&lt;/a>. &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#zapstore-110-makes-the-device-key-portable-and-adds-background-auto-updates">Zapstore 1.1.0&lt;/a> introduces a portable encrypted device key with Amber backup and opt-in background auto-updates. The &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#the-favorite-follow-sets-list-kind-merges-and-immediately-moves-house">favorite-follow-sets list kind&lt;/a> merges and opens a renumbering PR within days. And the &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#the-iris-projects-ship-a-pubsub-library-a-browser-fips-runtime-and-a-social-graph-20-in-one-week">Iris projects&lt;/a> ship nostr-pubsub, the fips-ts browser runtime, and nostr-social-graph 2.0.0 in a single week.&lt;/p>
&lt;p>Tagged releases bring &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#amber-v630-groups-bunker-signing-approvals-and-adds-expert-list-support">Amber v6.3.0&lt;/a> with grouped bunker-signing approvals, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#armada-v0370-opens-buzz-workspaces-from-a-second-client">Armada v0.37.0&lt;/a> with a second client for Buzz workspaces, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#divine-mobile-1017-hardens-relay-security-and-dm-delivery">Divine Mobile 1.0.17&lt;/a> with durable NIP-17 delivery and strict TLS validation, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#nak-v0202-adds-nip-34-pull-request-workflows">nak v0.20.2&lt;/a> with NIP-34 pull-request commands.&lt;/p>
&lt;p>On the unreleased side, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#snort-rewrites-query-synchronization-around-eose-proven-coverage">Snort&lt;/a> records EOSE-proven cache coverage, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#shopstr-binds-payment-validation-to-signed-receipts-and-server-side-prices">Shopstr&lt;/a> closes two payment-integrity gaps, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#mostr-bridges-activitypub-private-chats-and-nostr-dms">Mostr&lt;/a> bridges ActivityPub private chats to Nostr DMs, &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#nostream-merges-eight-prs-without-cutting-a-release">nostream&lt;/a> merges the access-control stack this week&amp;rsquo;s Deep Dive covers, and &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#amethyst-lands-v1130-pre-release-qa-on-napplet-isolation-and-concord-authority">Amethyst&lt;/a> reaches 88 merged PRs with full NIP-88 polls on Desktop.&lt;/p>
&lt;p>The NIPs repository merges five PRs this week, including the &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#protocol-work-and-nip-updates">NIP-29 cluster&lt;/a> and &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#the-favorite-follow-sets-list-kind-merges-and-immediately-moves-house">kind:10011 favorite follow sets&lt;/a>, and opens debates on &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#protocol-work-and-nip-updates">NIP-47 simplification&lt;/a> and &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#protocol-work-and-nip-updates">trusted relay assertions&lt;/a>. The Deep Dive covers &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#nip-deep-dive-nip-42-and-nip-43">NIP-42 and NIP-43, the relay access-control pair&lt;/a>.&lt;/p>
&lt;hr>
&lt;h2 id="lead-stories">Lead stories&lt;/h2>
&lt;h3 id="indiesats-drops-its-publisher-role-and-relaunches-as-open-nostr-music-infrastructure">IndieSats drops its publisher role and relaunches as open Nostr music infrastructure&lt;/h3>
&lt;p>&lt;a href="https://zapstore.dev">IndieSats&lt;/a> is a Nostr-based music platform that until this week acted as a publisher: it held keys for artists, ran a whitelist, and took a mandatory 2% cut of revenue. In a &lt;a href="https://njump.me/nevent1qqsr4awwnfndnnz77zanjxarw6nd0uld0ckayxp2navz0u9tzzwfweqpzamhxue69uhhyetvv9ujuurjd9kkzmpwdejhgtczyquwq70hxz22lzytw65rnnjewg0lj8a74khxa8h9j47q38pdnqy3kqcyqqqqqqgz8083u">pivot announcement published on July 20&lt;/a>, the project retired all three of those roles at once. The relaunched platform is three pieces of open infrastructure: an open relay, a player, and a discovery layer. Artists now publish music under their own Nostr profiles. The 2% track-level platform share is optional but selected by default when an artist publishes, and artists can clear it to retain the full payment; the platform also honors &lt;a href="https://nostrcompass.org/en/topics/nip-09/">NIP-09&lt;/a> kind:5 deletion requests so artists can remove their work. A &lt;a href="https://zapstore.dev/apps/com.indiesats.app">v1.1.5 update published July 21&lt;/a> changed track publication to the event format expected by Amethyst and other Nostr music clients and made relay delivery explicit. For a space that usually talks about protocols replacing platforms, this is a live case of a platform voluntarily disassembling itself into protocol pieces.&lt;/p>
&lt;h3 id="nostrord-v230-ships-group-moderation-mute-lists-and-onion-relays">Nostrord v2.3.0 ships group moderation, mute lists, and onion relays&lt;/h3>
&lt;p>&lt;a href="https://github.com/nostrord/nostrord">Nostrord&lt;/a>, the group-chat client for Android, iOS, web, and desktop, shipped &lt;a href="https://github.com/nostrord/nostrord/releases/tag/v2.3.0">v2.3.0&lt;/a> with wired-up group moderation actions on all UIs (&lt;a href="https://github.com/nostrord/nostrord/pull/192">PR #192&lt;/a>), consent-gated group invites with cross-relay detection (&lt;a href="https://github.com/nostrord/nostrord/pull/195">PR #195&lt;/a>), cross-platform &lt;a href="https://nostrcompass.org/en/topics/nip-51/">NIP-51&lt;/a> mute lists (&lt;a href="https://github.com/nostrord/nostrord/pull/188">PR #188&lt;/a>), and Tor .onion relay support. Its release lands the same week the underlying &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> spec merged five PRs covering subgroups, message pinning, banners, and invite codes (details in this week&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#protocol-work-and-nip-updates">protocol section&lt;/a>), so group chat on Nostr now has both a deeper spec and a client exercising most of it, which shortens the feedback loop for everyone else building on relay groups.&lt;/p>
&lt;h3 id="zapstore-110-makes-the-device-key-portable-and-adds-background-auto-updates">Zapstore 1.1.0 makes the device key portable and adds background auto-updates&lt;/h3>
&lt;p>&lt;a href="https://github.com/zapstore/zapstore">Zapstore&lt;/a> is a Nostr-native app store where releases are signed by developer keys and no central operator vouches for them. &lt;a href="https://github.com/zapstore/zapstore/releases/tag/1.1.0">Version 1.1.0&lt;/a>, the first release covered here since early March, closes the two biggest gaps with conventional app stores. For updates, opt-in background downloads now run over Wi-Fi and install silently or staged, so apps stay current without manual trips through the store. Identity continuity comes from a portable encrypted device key that users can back up through &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> over &lt;a href="https://nostrcompass.org/en/topics/nip-55/">NIP-55&lt;/a>, the Android signer interface, so a phone migration preserves the device identity. Version 1.1.0 also moves the app catalog onto relays as device-signed kind:10067 events, adds &lt;a href="https://nostrcompass.org/en/topics/nip-56/">NIP-56&lt;/a> verified reporting from the overflow menu so users can flag problematic apps in a way other clients can consume, and verifies the C1 proof attached to a release before any install proceeds, tightening the link between what a developer signed and what a device runs.&lt;/p>
&lt;h3 id="the-favorite-follow-sets-list-kind-merges-and-immediately-moves-house">The favorite-follow-sets list kind merges and immediately moves house&lt;/h3>
&lt;p>A spec-coordination story played out inside a single week. &lt;a href="https://github.com/nostr-protocol/nips/pull/2413">PR #2413&lt;/a> merged on July 15, standardizing a replaceable list kind for favorite follow sets under &lt;a href="https://nostrcompass.org/en/topics/nip-51/">NIP-51&lt;/a> (lists): a dedicated kind for a user&amp;rsquo;s curated sets of followed accounts. Within days it turned out the assigned kind:10011 was already in use elsewhere, so a follow-up &lt;a href="https://github.com/nostr-protocol/nips/pull/2417">PR #2417&lt;/a> is now open to renumber the list to kind:10021. Nothing has shipped against the merged kind yet, which makes this the cheap moment to renumber; once clients start publishing kind:10011 events, the collision would get expensive to unwind. Developers building list-consuming features should track the renumbering PR, not the merged text, until it resolves.&lt;/p>
&lt;h3 id="the-iris-projects-ship-a-pubsub-library-a-browser-fips-runtime-and-a-social-graph-20-in-one-week">The Iris projects ship a pubsub library, a browser FIPS runtime, and a social-graph 2.0 in one week&lt;/h3>
&lt;p>Three releases from the Iris orbit landed together, and they interlock. &lt;a href="https://github.com/mmalmi/nostr-pubsub">nostr-pubsub&lt;/a> is a transport-neutral publish/subscribe library for Nostr events; its &lt;a href="https://github.com/mmalmi/nostr-pubsub/releases">first tracked releases, v0.1.3 through v0.5.2&lt;/a>, deliver a browser relay carrier built on nostr-tools&amp;rsquo; SimplePool, event verification at the transport boundary so invalid signatures never reach subscribers, and bounded historical queries. &lt;a href="https://github.com/mmalmi/fips-ts">fips-ts&lt;/a> brings &lt;a href="https://nostrcompass.org/en/topics/fips/">FIPS&lt;/a>, the Noise-over-secp256k1 peer transport previously available as a Rust stack, into the browser as a TypeScript runtime: releases &lt;a href="https://github.com/mmalmi/fips-ts/releases">0.0.24 through 0.0.30&lt;/a> added a WebRTC datachannel carrier, Nostr-based signaling for peer discovery, a recent-peer cache, and an IndexedDB adapter for browser storage, and the runtime is wire-compatible with the reference Rust implementation. The third piece, &lt;a href="https://github.com/mmalmi/nostr-social-graph/releases/tag/v2.0.0">nostr-social-graph v2.0.0&lt;/a>, is a major version of the social-graph library: signed roster operations for Nostr identity graphs, device-approval flows bootstrapped from a canonical three-field URI, and FIPS transport identity facets with shared Rust and TypeScript test vectors. The connective framing is the &lt;a href="https://stack.iris.to/">Iris Stack&lt;/a>, the project&amp;rsquo;s integration lab tying these libraries together with Blossom, Hashtree, and encrypted messaging. Taken together, a web app can now discover peers over Nostr, open an encrypted FIPS channel to them, and maintain a signed social graph, all in TypeScript.&lt;/p>
&lt;hr>
&lt;h2 id="tagged-releases">Tagged releases&lt;/h2>
&lt;h3 id="amber-v630-groups-bunker-signing-approvals-and-adds-expert-list-support">Amber v6.3.0 groups bunker signing approvals and adds Expert List support&lt;/h3>
&lt;p>&lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> is an Android &lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> remote signer. &lt;a href="https://github.com/greenart7c3/Amber/releases/tag/v6.3.0">v6.3.0&lt;/a> adds grouped multi-request approval so users can review and approve a batch of bunker signatures at once. The release also adds support for Expert List (kind 12022) and Expert Pack (kind 32022) events, a privacy mode that hides sensitive content on screen, and a change to fetch an account&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-65/">NIP-65&lt;/a> relay list before its profile metadata so signer flows start from the user&amp;rsquo;s actual relay set. This follows the v6.2.x line covered in the 2026-07-08 issue.&lt;/p>
&lt;h3 id="nostrord-v220-follow-up">Nostrord v2.2.0 follow-up&lt;/h3>
&lt;p>With &lt;a href="https://nostrcompass.org/en/newsletters/2026-07-22-newsletter/#nostrord-v230-ships-group-moderation-mute-lists-and-onion-relays">v2.3.0&lt;/a> leading this week&amp;rsquo;s News section, the tagged-release slot notes only what the lead does not: v2.3.0 follows v2.2.0&amp;rsquo;s DM controls covered in #31, making this the client&amp;rsquo;s second consecutive weekly release.&lt;/p>
&lt;h3 id="armada-v0370-opens-buzz-workspaces-from-a-second-client">Armada v0.37.0 opens Buzz workspaces from a second client&lt;/h3>
&lt;p>&lt;a href="https://gitlab.com/soapbox-pub/armada">Armada&lt;/a>, a Discord-style Nostr client, released &lt;a href="https://gitlab.com/soapbox-pub/armada/-/commit/7a0d0ade51fb8a7bafa4513d2881d275bb2c7dde">v0.37.0&lt;/a> with support for Buzz relays as an enhanced &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a> workspace mode, detected through the relay&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> metadata. The client renders Buzz forum posts and comments as kinds 45001 and 45003, folds edits and deletions into stream timelines, and adds presence, workflow, job, huddle, and shared-canvas surfaces. Its Projects workspace reads &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> repository announcements, patches, pull requests, issues, and status events directly from the relay (&lt;a href="https://gitlab.com/soapbox-pub/armada/-/commit/7d5603a3e21d564301d667113d28de4407d6f642">implementation commit&lt;/a>), giving Buzz workspaces a second client for both conversation and repository work.&lt;/p>
&lt;h3 id="wisp-v120-adds-a-multi-account-switcher-and-collapsible-reply-threads">Wisp v1.2.0 adds a multi-account switcher and collapsible reply threads&lt;/h3>
&lt;p>&lt;a href="https://github.com/barrydeen/wisp">Wisp&lt;/a> is a privacy-oriented Nostr client with built-in wallet support. &lt;a href="https://github.com/barrydeen/wisp/releases/tag/v1.2.0">v1.2.0&lt;/a> adds a multi-account switcher for moving between profiles without re-login, collapsible reply threads for long conversations, stripping of tracking parameters from note links before they open, and a wallet transaction-history view. The release follows the Wisp update covered in the 2026-07-08 issue.&lt;/p>
&lt;h3 id="divine-mobile-1017-hardens-relay-security-and-dm-delivery">Divine Mobile 1.0.17 hardens relay security and DM delivery&lt;/h3>
&lt;p>&lt;a href="https://github.com/divinevideo/divine-mobile">Divine Mobile&lt;/a>, a Nostr short-video client, released &lt;a href="https://github.com/divinevideo/divine-mobile/releases/tag/1.0.17">1.0.17&lt;/a> with a persistent stop-motion editor and tighter Nostr paths. Direct messages now wait for relay &lt;code>OK&lt;/code> responses, retry through a durable queue, and route through recipients&amp;rsquo; kind 10050 inbox-relay lists (&lt;a href="https://github.com/divinevideo/divine-mobile/pull/6046">PR #6046&lt;/a>); NIP-46 pairing preserves &lt;code>auth_url&lt;/code> challenges as recoverable signer steps (&lt;a href="https://github.com/divinevideo/divine-mobile/pull/6151">PR #6151&lt;/a>). &lt;a href="https://github.com/divinevideo/divine-mobile/pull/6278">PR #6278&lt;/a> removes permissive certificate acceptance from production relay WebSockets and HTTP requests used for NIP-96 uploads, LNURL, and zaps, restoring platform TLS validation outside debug loopback connections. Interrupted uploads can also resume from the server&amp;rsquo;s last confirmed offset, so a backgrounded publish no longer restarts from zero.&lt;/p>
&lt;h3 id="cliprelay-v012-new-project-syncs-clipboards-across-devices-over-nostr-relays">ClipRelay v0.1.2 (new project) syncs clipboards across devices over Nostr relays&lt;/h3>
&lt;p>&lt;a href="https://github.com/tajava2006/cliprelay">ClipRelay&lt;/a> is a newly launched cross-platform app (Android, macOS, Windows, Linux) that syncs your clipboard across your own devices: copy on one machine, paste on another. All traffic moves through Nostr relays as &lt;a href="https://nostrcompass.org/en/topics/nip-44/">NIP-44&lt;/a> encrypted events addressed to yourself, so there is no server to run and no account to create; the private key stays outside the app. &lt;a href="https://github.com/tajava2006/cliprelay/releases">v0.1.2&lt;/a> fixes a subtle sync failure where a machine waking from sleep kept publishing but silently stopped receiving, and tightens the relay-status indicators that previously reported dead subscriptions as healthy. This is ClipRelay&amp;rsquo;s first appearance in the newsletter.&lt;/p>
&lt;h3 id="sonar-v01-alpha11-continues-the-alpha-line">Sonar v0.1-alpha.11 continues the alpha line&lt;/h3>
&lt;p>&lt;a href="https://github.com/hedwig-corp/bitchat-to-sonar">Sonar&lt;/a>, last week&amp;rsquo;s lead story, cut &lt;a href="https://github.com/hedwig-corp/bitchat-to-sonar/releases/tag/v0.1-alpha.11">v0.1-alpha.11&lt;/a> with work on the Rust mesh link engine, BLE and mesh fixes, and relay diagnostics; an incremental follow-up to the alpha line covered in #31.&lt;/p>
&lt;h3 id="nak-v0202-adds-nip-34-pull-request-workflows">nak v0.20.2 adds NIP-34 pull-request workflows&lt;/h3>
&lt;p>&lt;a href="https://github.com/fiatjaf/nak">nak&lt;/a>, the Nostr command-line tool, released &lt;a href="https://github.com/fiatjaf/nak/releases/tag/v0.20.2">v0.20.2&lt;/a> with commands to create, pull, and merge &lt;a href="https://nostrcompass.org/en/topics/nip-34/">NIP-34&lt;/a> pull requests and to pull individual patches, and it allows pushes without rewriting a repository announcement. The &lt;a href="https://github.com/fiatjaf/nak/compare/v0.20.1...v0.20.2">11-commit release range&lt;/a> also adds parent-group handling for &lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a>, queries more outbox relays, makes relay connection timeouts configurable, and fixes bunker selection when only the default &lt;code>--sec&lt;/code> value exists.&lt;/p>
&lt;h3 id="the-weeks-smaller-launches">The week&amp;rsquo;s smaller launches&lt;/h3>
&lt;p>Four smaller releases deserve one line each: &lt;a href="https://github.com/sanah9/noscall/releases/tag/v0.6.0-release">noscall v0.6.0&lt;/a>, the Nostr calling app, migrated its push notifications to UnifiedPush, keeping call signaling off Google&amp;rsquo;s push infrastructure; &lt;a href="https://github.com/mmalmi/nostr-vpn/releases/tag/v4.1.3">nostr-vpn v4.1.3&lt;/a>, a mesh VPN that uses Nostr for signaling, unified its exit-DNS policy across platforms and now restores the original route and DNS state after WireGuard or private-exit sessions; &lt;a href="https://github.com/ChadFarrow/stablekraft-app/releases/tag/v1.3.0">StableKraft v1.3.0&lt;/a>, the Nostr-plus-Lightning music and podcast aggregator covered in April, added native Android lock-screen and headset controls plus a playback-scoped wake lock so audio survives Doze; and new Zapstore app Hakari backs up a weight logger over encrypted Nostr events.&lt;/p>
&lt;h3 id="amethyst-lands-v1130-pre-release-qa-on-napplet-isolation-and-concord-authority">Amethyst lands v1.13.0 pre-release QA on napplet isolation and Concord authority&lt;/h3>
&lt;p>&lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> merged 88 PRs this week ahead of its v1.13.0 release. &lt;a href="https://github.com/vitorpamplona/amethyst/pull/3650">PR #3650&lt;/a> is a pre-release QA pass covering napplet account isolation, Concord authority fixes, and around 30 other fixes. The late-window work adds full Desktop &lt;a href="https://github.com/nostr-protocol/nips/blob/master/88.md">NIP-88&lt;/a> poll rendering, creation, voting, declared-relay tallying, and kind 1068 search (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3664">PR #3664&lt;/a>); NIP-50 search now ranks results by BM25 relevance while large tag watchers use bounded merging (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3663">PR #3663&lt;/a>). A separate relay-store pass selects query indexes by measured cost, adds tag-author-kind indexes, and serializes each live event once per fanout (&lt;a href="https://github.com/vitorpamplona/amethyst/pull/3660">PR #3660&lt;/a>), with reported benchmark reductions from 149 to 4 milliseconds for one query shape and from 14.2 to 0.66 milliseconds for a common DM-room query.&lt;/p>
&lt;hr>
&lt;h2 id="unreleased-changes">Unreleased changes&lt;/h2>
&lt;h3 id="snort-rewrites-query-synchronization-around-eose-proven-coverage">Snort rewrites query synchronization around EOSE-proven coverage&lt;/h3>
&lt;p>&lt;a href="https://github.com/v0l/snort">Snort&lt;/a>, a web Nostr client, rewrote its query and cache-synchronization path in &lt;a href="https://github.com/v0l/snort/commit/8a627700d8a5af9527cb68655d844dd14a3ac79d">commit 8a62770&lt;/a>. The client now records which query windows reached EOSE, uses those watermarks to skip covered cache ranges, centralizes event dispatch behind one relay-pool listener, and sends search filters only to relays whose NIP-11 documents advertise &lt;a href="https://nostrcompass.org/en/topics/nip-50/">NIP-50&lt;/a>. Follow-up fixes serialize concurrent watermark updates and correct inclusive timeline boundaries, while &lt;a href="https://github.com/v0l/snort/commit/9d1721b8b5696a6f96f462170c469c232cabe672">commit 9d1721b&lt;/a> restores a live subscription to the chunked follows feed so events arriving after page load do not freeze outside its cached windows.&lt;/p>
&lt;h3 id="shopstr-binds-payment-validation-to-signed-receipts-and-server-side-prices">Shopstr binds payment validation to signed receipts and server-side prices&lt;/h3>
&lt;p>&lt;a href="https://github.com/shopstr-eng/shopstr">Shopstr&lt;/a>, a Nostr marketplace client, closed two payment-integrity gaps. &lt;a href="https://github.com/shopstr-eng/shopstr/pull/552">PR #552&lt;/a> makes Zapsnag verify each kind 9735 receipt&amp;rsquo;s signature, signer, embedded zap request, recipient and product tags, BOLT11 amount, and optional preimage against the invoice payment hash before treating it as a purchase. &lt;a href="https://github.com/shopstr-eng/shopstr/pull/449">PR #449&lt;/a> moves Cashu quote creation behind a Shopstr API route that resolves the listing and recomputes its price server-side, so a browser-modified amount cannot determine the mint invoice.&lt;/p>
&lt;h3 id="mostr-bridges-activitypub-private-chats-and-nostr-dms">Mostr bridges ActivityPub private chats and Nostr DMs&lt;/h3>
&lt;p>&lt;a href="https://gitlab.com/soapbox-pub/mostr">Mostr&lt;/a>, an ActivityPub-to-Nostr bridge, now carries one-to-one Pleroma ChatMessage objects and encrypted Nostr DMs in both directions (&lt;a href="https://gitlab.com/soapbox-pub/mostr/-/commit/36ee547035f9287029f71656c472fe029a7ab31b">commit 36ee547&lt;/a>). ActivityPub private chats become kind 4 events addressed to the Nostr recipient, while kind 4 messages sent to bridged Fediverse users are decrypted and federated as ChatMessage objects. The bridge limits these events to configured DM relays gated by &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> and authenticates with a separate relay key. This interoperability path uses legacy &lt;a href="https://nostrcompass.org/en/topics/nip-04/">NIP-04&lt;/a> encryption. NIP-17 gift wrapping remains outside this implementation.&lt;/p>
&lt;h3 id="nostream-merges-eight-prs-without-cutting-a-release">nostream merges eight PRs without cutting a release&lt;/h3>
&lt;p>&lt;a href="https://github.com/Cameri/nostream">nostream&lt;/a>, the TypeScript relay implementation, merged eight PRs this week without cutting a release. The headline pair is &lt;a href="https://github.com/Cameri/nostream/pull/702">PR #702&lt;/a> and &lt;a href="https://github.com/Cameri/nostream/pull/676">PR #676&lt;/a>, which together give relay operators a working authentication-plus-membership access-control stack; this week&amp;rsquo;s NIP Deep Dive walks through exactly that handshake. &lt;a href="https://github.com/Cameri/nostream/pull/694">PR #694&lt;/a> fixes generic &lt;code>#e&lt;/code>, &lt;code>#p&lt;/code>, &lt;code>#g&lt;/code>, and similar tag filters that could return one copy of an event for every matching tag row, reducing duplicate protocol traffic within a subscription.&lt;/p>
&lt;h3 id="fips-v041-tightens-the-iris-transport-layer">FIPS v0.4.1 tightens the Iris transport layer&lt;/h3>
&lt;p>&lt;a href="https://github.com/jmcorgan/fips">jmcorgan/fips&lt;/a> shipped &lt;a href="https://github.com/jmcorgan/fips/releases/tag/v0.4.1">v0.4.1&lt;/a>, a maintenance release capping antipoison state, fixing convergence and MTU handling, and cutting CPU use. The browser TypeScript runtime &lt;a href="https://github.com/mmalmi/fips-ts">fips-ts&lt;/a> from the Iris project cluster is wire-compatible with this Rust transport, so fixes here propagate directly to browser interoperability.&lt;/p>
&lt;hr>
&lt;h2 id="protocol-work-and-nip-updates">Protocol work and 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-29/">NIP-29&lt;/a> (Relay-based Groups): Subgroups&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2319">PR #2319&lt;/a>, merged 2026-07-16): NIP-29 defines relay-hosted groups where membership, roles, and chat history live on a single relay as addressable &lt;code>kind:39000&lt;/code>-series events, with moderation actions carried by &lt;code>kind:9000&lt;/code>-series admin events. This PR lets a group declare itself a subgroup by adding a &lt;code>parent&lt;/code> tag to its metadata, pointing at the &lt;code>d&lt;/code> identifier of another group on the same relay. Subgroups are ordinary groups in every other respect: membership does not cascade (joining a parent grants no membership in any child), admin roles do not inherit (each subgroup&amp;rsquo;s &lt;code>kind:39001&lt;/code> admins list is authoritative for its own scope), and each subgroup keeps its own independent &lt;code>kind:9000&lt;/code>/&lt;code>kind:9001&lt;/code> member events. Relays that support the hierarchy advertise it in their NIP-11 relay information document under a &lt;code>nip29&lt;/code> object with &lt;code>&amp;quot;subgroups&amp;quot;: true&lt;/code>, so clients can discover the capability before attempting to create nested communities.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a>: Message pinning&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2379">PR #2379&lt;/a>, merged 2026-07-15; &lt;a href="https://github.com/nostr-protocol/nips/pull/2416">PR #2416&lt;/a>, merged 2026-07-17): Group admins can now pin messages inside a relay-based group. The mechanism adds a new moderation event, &lt;code>kind:9010&lt;/code> &lt;code>update-pin-list&lt;/code>, which carries the full ordered pin list as &lt;code>e&lt;/code> tags referencing regular event ids, and a new optional group-level event, &lt;code>kind:39005&lt;/code> &lt;em>group pinned events&lt;/em>, which the relay regenerates to mirror the most recent accepted pin list. Each &lt;code>kind:9010&lt;/code> replaces the whole list, so one new list expresses pinning, unpinning, reordering, or clearing. The follow-up PR #2416 extends the format so &lt;code>a&lt;/code> tags are also accepted in the pin list, letting admins pin addressable events (long-form posts, wiki pages, and other parameterized replaceable content) alongside ordinary chat messages. Relays may cap the number of pins, and the merged spec text recommends displaying pins in the order the tags appear.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-29/">NIP-29&lt;/a>: Banner tag and invite-code suffix&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2383">PR #2383&lt;/a>, merged 2026-07-16; &lt;a href="https://github.com/nostr-protocol/nips/pull/2380">PR #2380&lt;/a>, merged 2026-07-16): Two display-and-onboarding additions to group metadata. PR #2383 adds an optional &lt;code>banner&lt;/code> tag to the &lt;code>kind:39000&lt;/code> group metadata event, joining the existing &lt;code>name&lt;/code>, &lt;code>picture&lt;/code>, and &lt;code>about&lt;/code> fields so clients can render a header image for a group page. PR #2380 defines an invite-code suffix for group share links: an invite code may be appended to the group&amp;rsquo;s &lt;code>naddr&lt;/code> identifier as &lt;code>naddr1...?invite=&amp;lt;code&amp;gt;&lt;/code>. Because the bech32 character set does not include &lt;code>?&lt;/code>, the portion before the suffix remains a valid naddr on its own, so clients that do not understand the extension can still resolve the group. Clients that do understand it pre-fill the &lt;code>code&lt;/code> tag on the &lt;code>kind:9021&lt;/code> join request, which pairs with the existing &lt;code>kind:9009&lt;/code> &lt;code>create-invite&lt;/code> moderation event to simplify admission to closed groups.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-51/">NIP-51&lt;/a> (Lists): Favorite follow sets, kind:10011&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2413">PR #2413&lt;/a>, merged 2026-07-15): NIP-51 defines the standard list kinds, split between replaceable &lt;code>kind:10000&lt;/code>-series lists (one per user) and addressable &lt;code>kind:30000&lt;/code>-series sets (many per user, keyed by &lt;code>d&lt;/code> tag). This PR adds &lt;code>kind:10011&lt;/code>, &lt;em>favorite follow sets&lt;/em>, a standard replaceable list whose &lt;code>a&lt;/code> tags point at &lt;code>kind:30000&lt;/code> follow sets. The mirror of &lt;code>kind:10012&lt;/code> (relay feeds), which holds &lt;code>a&lt;/code> tags referencing &lt;code>kind:30002&lt;/code> relay sets, the new kind lets a user bookmark named follow sets, such as curated lists of pubkey collections published by themselves or others, and have clients surface them for one-tap following or feed switching. Note that this kind number is already contested: see the open renumbering PR below.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-46/">NIP-46&lt;/a> (Nostr Connect): Silent-timeout guidance&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2375">PR #2375&lt;/a>, merged 2026-07-15): NIP-46 is the remote-signing protocol where a client sends encrypted JSON-RPC-style requests to a signer (bunker) over relays and waits for an encrypted response. The merged change is one sentence of wire behavior: requests made with unknown or unsupported methods MUST be replied to with an error. Previously a signer that received a method it did not implement could never respond, leaving the client hanging until its own timeout fired with no way to distinguish &amp;ldquo;unsupported method&amp;rdquo; from &amp;ldquo;signer offline.&amp;rdquo; The mandated error reply lets clients fail fast and surface a meaningful error before the local timeout.&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>kind:10011 renumbering to kind:10021&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2417">PR #2417&lt;/a>): Moves the newly merged favorite follow sets list from &lt;code>kind:10011&lt;/code> to &lt;code>kind:10021&lt;/code>, because &lt;code>10011&lt;/code> is already in use elsewhere. The renumbering PR was open within days of the original merge, so clients implementing favorite follow sets should track this PR and target the final number, not &lt;code>10011&lt;/code>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;a href="https://nostrcompass.org/en/topics/nip-47/">NIP-47&lt;/a> (Nostr Wallet Connect): Core simplification&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2419">PR #2419&lt;/a>): Proposes narrowing NIP-47, the wallet-connect protocol that lets apps request Lightning payments from a remote wallet over Nostr, into a smaller core spec. Optional and more specialized functionality would move out of &lt;code>47.md&lt;/code> into a dedicated extensions repository, &lt;a href="https://github.com/nostr-wallet-connect/nwc">nostr-wallet-connect/nwc&lt;/a>, where extension specs can evolve independently of the core. The stated goal is to keep the core small, stable, and easy to implement, following the direction agreed in earlier NWC calls of separating a minimal wallet-connect layer from richer optional behaviors. Given how widely NIP-47 is deployed across wallets and apps, anyone that speaks NWC should track the restructuring discussion.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Trusted Relay Assertions (draft, no number assigned)&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2418">PR #2418&lt;/a>): Proposes a standard for publishing trust evaluations about Nostr relays, positioned as the &amp;ldquo;what we conclude&amp;rdquo; layer alongside &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> (what a relay claims about itself) and &lt;a href="https://nostrcompass.org/en/topics/nip-66/">NIP-66&lt;/a> (what monitors measured). Assertion providers would compute trust scores from observed metrics, operator reputation, and user reports; clients would query these assertions when choosing which relays to connect to. The draft introduces &lt;code>kind:30385&lt;/code> (addressable Trusted Relay Assertion, carrying score, reliability, quality, accessibility, operator, policy, and jurisdiction tags), &lt;code>kind:10385&lt;/code> (replaceable Trusted Provider List, the user&amp;rsquo;s chosen assertion providers), and reuses &lt;a href="https://nostrcompass.org/en/topics/nip-32/">NIP-32&lt;/a> labels for relay and operator reports. No NIP number has been assigned yet; this is an early-stage draft.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>AND operator for filters (&amp;ldquo;NIP-91&amp;rdquo;, proposed, number not yet in the repo)&lt;/strong> (&lt;a href="https://github.com/nostr-protocol/nips/pull/2252">PR #2252&lt;/a>): Under NIP-01, tag filters are OR-only: a filter &lt;code>&amp;quot;#t&amp;quot;: [&amp;quot;meme&amp;quot;, &amp;quot;cat&amp;quot;]&lt;/code> matches events with either tag. This proposal adds an &lt;code>&amp;amp;&lt;/code> modifier for indexable tags, so &lt;code>&amp;quot;&amp;amp;t&amp;quot;: [&amp;quot;meme&amp;quot;, &amp;quot;cat&amp;quot;]&lt;/code> returns only events carrying both tags. Relays perform the intersection server-side and return a narrower result. Compatibility rules give AND precedence over OR, ignore AND values in OR on supporting relays, and require clients to include standard &lt;code>#&lt;/code> OR tags for relays that lack the extension; clients intersect those broader results locally. This PR reopens an earlier proposal and lists relay implementations including a nostr-rs-relay docker image, netstr, and a Snort worker relay. NIP-91 appears only in the PR branch and remains absent from the repository README&amp;rsquo;s NIP index, so the number is provisional.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Nostr web applets (&amp;ldquo;NIP-5D&amp;rdquo;, proposed, number not yet in the repo)&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 or webviews to communicate with a hosting application (&amp;ldquo;shell&amp;rdquo;). The spec is deliberately a thin core: it specifies the message envelope, sandbox rules (napplet iframes MUST use &lt;code>sandbox=&amp;quot;allow-scripts&amp;quot;&lt;/code> without &lt;code>allow-same-origin&lt;/code>, and shells MUST NOT expose &lt;code>window.nostr&lt;/code> NIP-07 inside the iframe), sender identification via the unforgeable &lt;code>MessageEvent.source&lt;/code> window reference, not &lt;code>event.origin&lt;/code>, and manifest-based capability negotiation. Actual protocol messages for signing, relay access, storage, and inter-napplet communication are delegated to NAP (Nostr Applet Protocol) extension specs, each owning a capability domain, with signing and encryption always mediated by the shell so keys never enter the sandbox. The proposal depends on the NIP-5A napplet manifest spec and is timely this week: Amethyst&amp;rsquo;s v1.13.0 pre-release work includes napplet account isolation, making client-side napplet hosting an active implementation area. As with &amp;ldquo;NIP-91&amp;rdquo; above, the 5D number is provisional.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="nip-deep-dive-nip-42-and-nip-43">NIP Deep Dive: NIP-42 and NIP-43&lt;/h2>
&lt;p>Running a relay that is not open to everyone used to mean inventing everything yourself. A paid or invite-only relay operator had to maintain a whitelist out of band, usually a text file of pubkeys collected over DMs, with no standard way to tell a connected client &amp;ldquo;prove who you are&amp;rdquo; and no standard way for a user to ask for admission or know whether they were a member. Every relay that wanted gated reads or gated writes built its own private mechanism, and clients could not interoperate with any of them. &lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> standardizes the proof-of-identity half of that problem, and &lt;a href="https://nostrcompass.org/en/topics/nip-43/">NIP-43&lt;/a> standardizes the membership half. This week nostream, the TypeScript relay, merged the pair end to end: &lt;a href="https://github.com/Cameri/nostream/pull/702">PR #702&lt;/a> restricts reads of encrypted kinds to authenticated recipients, and &lt;a href="https://github.com/Cameri/nostream/pull/676">PR #676&lt;/a> adds join and leave request event strategies, both merged on July 20.&lt;/p>
&lt;h3 id="nip-42-authentication-of-clients-to-relays">NIP-42: Authentication of clients to relays&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-42/">NIP-42&lt;/a> answers one question: who is on this connection? A relay that wants to gate reads or writes sends an &lt;code>AUTH&lt;/code> message carrying a challenge string, at connect time or on demand when a request needs authentication. A client replies with its own &lt;code>AUTH&lt;/code> message containing a signed ephemeral event, kind 22242, and the relay answers with an &lt;code>OK&lt;/code> message exactly as if the auth event were an ordinary write. Authentication then holds for the duration of the connection. A sequence of &lt;code>AUTH&lt;/code> messages can authenticate several pubkeys on one connection.&lt;/p>
&lt;p>The signed auth event is a compact object: a &lt;code>pubkey&lt;/code>, a &lt;code>created_at&lt;/code>, kind 22242, a &lt;code>relay&lt;/code> tag, a &lt;code>challenge&lt;/code> tag, empty &lt;code>content&lt;/code>, and a &lt;code>sig&lt;/code> over the event &lt;code>id&lt;/code>. Because kind 22242 is ephemeral — relays must never store or broadcast it — no published example exists to embed; the field walk below covers what it carries.&lt;/p>
&lt;p>The &lt;code>pubkey&lt;/code> is the identity being proved, since the relay verifies the &lt;code>sig&lt;/code> over the event &lt;code>id&lt;/code> against it. Kind 22242 sits in the ephemeral range: the event is a connection-level credential, and relays must never store it or broadcast it to other clients. A &lt;code>relay&lt;/code> tag binds the signature to one relay URL so a captured auth event cannot be replayed against a different relay, while the &lt;code>challenge&lt;/code> tag binds it to the specific challenge string issued on this connection and blocks later replay. Its &lt;code>created_at&lt;/code> must be close to the current time, within roughly a ten-minute window, so a stale auth event expires on its own. An empty &lt;code>content&lt;/code> field confirms that nothing is being published.&lt;/p>
&lt;p>The spec also defines two machine-readable prefixes that make gating visible to clients. A relay that rejects a subscription because the client has not authenticated yet answers with a &lt;code>CLOSED&lt;/code> message starting with &lt;code>auth-required:&lt;/code>, and a rejected write gets an &lt;code>OK&lt;/code> with the same prefix. A client that authenticated but still lacks permission for the action gets &lt;code>restricted:&lt;/code> instead. That distinction is what &lt;a href="https://github.com/Cameri/nostream/pull/702">nostream&amp;rsquo;s PR #702&lt;/a> builds on: reads of encrypted kinds can now be closed with &lt;code>auth-required:&lt;/code> until the requesting pubkey proves it is the recipient.&lt;/p>
&lt;h3 id="nip-43-relay-access-metadata-and-requests">NIP-43: Relay Access Metadata and Requests&lt;/h3>
&lt;p>&lt;a href="https://nostrcompass.org/en/topics/nip-43/">NIP-43&lt;/a> answers the follow-up question: now that the relay knows who you are, what are you allowed to do? Where NIP-42 is a handshake on a live connection, NIP-43 is a set of published events that describe membership state and let users ask to change it. On the relay side, a kind 13534 event, signed by the pubkey in the relay&amp;rsquo;s &lt;a href="https://nostrcompass.org/en/topics/nip-11/">NIP-11&lt;/a> &lt;code>self&lt;/code> field, lists one &lt;code>member&lt;/code> tag per pubkey, with optional role arguments pointing at role definitions published as kind 33534. Kind 8000 announces a member being added and kind 8001 announces a removal, both signed by the same relay key with a &lt;code>p&lt;/code> tag for the affected member. On the user side, kind 28934 is a join request carrying an invite code in a &lt;code>claim&lt;/code> tag, kind 28935 is an ephemeral invite-code event the relay generates on the fly when a user requests a claim, and kind 28936 is a leave request.&lt;/p>
&lt;p>A join request is a similarly small object, and no public relay implements NIP-43 yet, so there is no real kind 28934 event to embed; the field walk below covers what it carries.&lt;/p>
&lt;p>The &lt;code>pubkey&lt;/code> is the user asking for admission, and kind 28934 marks the event as a join request. Its &lt;code>-&lt;/code> tag is the &lt;a href="https://nostrcompass.org/en/topics/nip-70/">NIP-70&lt;/a> protected-event marker, telling relays to accept the event only from its author. A &lt;code>claim&lt;/code> tag carries the invite code obtained out of band, and &lt;code>created_at&lt;/code> must be now, plus or minus a few minutes, so an old request cannot be replayed. Relays answer the claim with an &lt;code>OK&lt;/code> message, reuse the NIP-42 &lt;code>restricted:&lt;/code> prefix for failures such as an expired or invalid code, update the kind 13534 list, and may publish a kind 8000 add-member event. Membership is deliberately not derived from a single event: the spec treats the relay-signed list as one input, and a client deciding whether someone is currently a member should consult both the relay&amp;rsquo;s kind 13534 and the member&amp;rsquo;s own events. Clients must only send join, invite, or leave requests to relays that advertise this NIP in the &lt;code>supported_nips&lt;/code> section of their NIP-11 document, and &lt;a href="https://github.com/Cameri/nostream/pull/676">nostream&amp;rsquo;s PR #676&lt;/a> is the relay-side machinery that turns those request kinds into actual membership changes.&lt;/p>
&lt;h3 id="history">History&lt;/h3>
&lt;p>NIP-42 is the older of the two by a wide margin. It entered the NIPs repository on January 2, 2023, in &lt;a href="https://github.com/nostr-protocol/nips/commit/c80be21c">commit c80be21c&lt;/a>, where fiatjaf drastically simplified an earlier relay-auth NIP drafted by semisol, collapsing a more complex challenge scheme into the single signed ephemeral event the spec still uses today. NIP-43 arrived much later, on October 30, 2025, when hodlbod&amp;rsquo;s &lt;a href="https://github.com/nostr-protocol/nips/pull/1079">PR #1079&lt;/a> merged, adding relay access metadata and requests built directly on top of NIP-42&amp;rsquo;s &lt;code>restricted:&lt;/code> prefix. The two-and-a-half-year gap reflects how long paid and private relay operators used ad-hoc whitelists before the membership layer got a standard.&lt;/p>
&lt;h3 id="implementations">Implementations&lt;/h3>
&lt;p>On the relay side, &lt;a href="https://github.com/Cameri/nostream">nostream&lt;/a> now ships both halves after this week&amp;rsquo;s merges. &lt;a href="https://github.com/hoytech/strfry">strfry&lt;/a> implements NIP-42, validating kind 22242 auth events in its ingester and issuing challenges from its config. &lt;a href="https://github.com/scsibug/nostr-rs-relay">nostr-rs-relay&lt;/a> handles the AUTH handshake in its connection layer with tests covering the challenge and timestamp window. &lt;a href="https://github.com/fiatjaf/khatru">khatru&lt;/a>, the Go relay framework, tracks the authenticated pubkey per connection so policies can gate reads and writes on it. On the client side, &lt;a href="https://github.com/vitorpamplona/amethyst">Amethyst&lt;/a> signs kind 22242 responses to relay challenges, including per-stream auth for its Concord encrypted communities. The two NIPs split access control along a clean line: NIP-42 is proof of identity, scoped to one connection, one challenge, and a few minutes of validity, and it says nothing about policy. NIP-43 is policy, expressed as ordinary relay events: who is a member, who was added or removed, and how a user requests those transitions. The gap implementers should keep in mind is that nothing yet standardizes finer-grained permissions beyond NIP-43&amp;rsquo;s optional role metadata, so any relay doing more than a binary member/non-member split is designing that layer on its own.&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 #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>June&amp;rsquo;s &lt;a href="https://github.com/nostr-protocol/nips/commits/master/">repository history&lt;/a> follows Nostr from protocol infancy to a composable application substrate. In 2021 the work still fit inside one protocol repository. In 2022 the standards process and first serious clients became separate projects. The 2023 public wave made relays, payments, and richer identities urgent; 2024 replaced early signing and messaging shortcuts; 2025 carried those contracts into private groups, git collaboration, media, and commerce; and 2026 launched products that use Nostr as one layer inside agent workspaces, exchanges, and developer tools. The progression is from proving signed events can move through relays to making that fact an implementation detail.&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> and &lt;a href="https://github.com/fiatjaf/nostr">&lt;code>fiatjaf/nostr&lt;/code>&lt;/a> repository still held nearly the whole public project. A handful of developers could review each change, and the reference implementation was a Python script. This was not yet a client ecosystem; it was a claim that users could sign events and choose relays without a platform assigning their identity.&lt;/p>
&lt;p>There was no dedicated NIPs repository, so proposals and implementation examples still shared the &lt;a href="https://github.com/nostr-protocol/nostr/commits?since=2021-06-01&amp;amp;until=2021-07-01">main protocol history&lt;/a>. That compact scope was a strength at this stage: a new implementer could understand the protocol end to end. The cost was that every new behavior still depended on the same small group, a limit that the repository split and client wave of 2022 would begin to remove.&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 enough proposers to justify the separate &lt;a href="https://github.com/nostr-protocol/nips">&lt;code>nostr-protocol/nips&lt;/code>&lt;/a> repository created in May. Roughly twenty specifications now covered the basic event format, follow lists, encrypted DMs, relay metadata, and bech32 identifiers. Moving the documents out of the original code repository changed the project&amp;rsquo;s governance: clients could evolve independently while shared wire behavior received explicit proposals and review.&lt;/p>
&lt;p>The first public web clients, including Astral and Anigma, were live in early forms, and William Casarin&amp;rsquo;s &lt;a href="https://github.com/damus-io/damus/commits?since=2022-06-01&amp;amp;until=2022-07-01">Damus repository&lt;/a> was moving toward TestFlight distribution. The user base was still small and developer-heavy, but the system now had two multiplying surfaces: more people could build applications without maintaining the specification, and more people could improve the specification without owning the original client.&lt;/p>
&lt;h3 id="june-2023-post-damus-adoption-surge">June 2023: post-Damus adoption surge&lt;/h3>
&lt;p>By June 2023, the public wave that followed Damus&amp;rsquo;s App Store launch had changed the engineering problem. &lt;a href="https://github.com/PrimalHQ">Primal&lt;/a> and Iris were building for people who had not followed the protocol&amp;rsquo;s early chats, while &lt;a href="https://github.com/hoytech/strfry">strfry&lt;/a> offered a high-performance relay for operators facing more traffic. The network no longer needed only more implementations; it needed clients and relays that could remain responsive as users, follows, and event histories grew.&lt;/p>
&lt;p>Protocol work therefore concentrated on routing and value transfer. &lt;a href="https://github.com/nostr-protocol/nips/blob/master/65.md">NIP-65 relay lists&lt;/a> gave the emerging outbox model a portable source of truth, while &lt;a href="https://github.com/nostr-protocol/nips/blob/master/57.md">NIP-57 zaps&lt;/a> connected events and identities to Lightning receipts. The stage change was practical: identity and publishing had drawn users in, but selective relay routing and wallet interoperability were what let the larger network behave like more than one overloaded public feed.&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, signing had begun moving out of individual clients. The &lt;a href="https://github.com/nostr-protocol/nips/blob/master/46.md">NIP-46 specification&lt;/a>, &lt;a href="https://github.com/kind-0/nsecbunkerd">nsecBunker&lt;/a>, and &lt;a href="https://github.com/greenart7c3/Amber">Amber&lt;/a> gave web and Android applications ways to request signatures without importing a user&amp;rsquo;s secret key. This reversed an early assumption: portability no longer meant copying an nsec into every client, but letting specialized signers enforce a boundary around it.&lt;/p>
&lt;p>Messaging changed for the same reason. &lt;a href="https://github.com/nostr-protocol/nips/blob/master/17.md">NIP-17&lt;/a> combined NIP-44 encryption with NIP-59 gift wrapping to reduce the metadata exposed by NIP-04, while &lt;a href="https://github.com/nostr-protocol/nips/blob/master/89.md">NIP-89&lt;/a> let clients recommend handlers for event types they did not render. MLS-over-Nostr discussions began in this environment. Privacy and application discovery were becoming cross-client contracts, preparing the ground for private groups and richer event-specific applications rather than one client trying to contain every feature.&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, MLS-over-Nostr had the formal &lt;a href="https://github.com/marmot-protocol/marmot">Marmot specification&lt;/a> and &lt;a href="https://github.com/marmot-protocol/whitenoise">White Noise&lt;/a> as a public implementation. &lt;a href="https://github.com/nostr-protocol/nips/blob/master/34.md">NIP-34 git events&lt;/a>, ngit, and GitWorkshop had also matured into a usable code-review flow. These projects shared a design stage: they used relays for coordination while moving sensitive group state or repository objects into purpose-built layers rather than treating a text-note client as the whole application.&lt;/p>
&lt;p>Commerce and media followed the same pattern. &lt;a href="https://github.com/nostr-protocol/nips/blob/master/60.md">NIP-60&lt;/a> wallets and NIP-61 nutzaps brought Cashu state into portable events; Wavlake, Divine, and &lt;a href="https://github.com/nostr-protocol/nips/blob/master/99.md">NIP-99 marketplace implementations&lt;/a> used dedicated event kinds for music, video, and listings. Nostr was becoming less visibly “a social network” as applications kept the identity and relay substrate but introduced domain-specific storage, payments, moderation, and presentation.&lt;/p>
&lt;h3 id="june-2026-a-launch-heavy-month">June 2026: a launch-heavy month&lt;/h3>
&lt;p>June 2026 carried launches that treated Nostr as one component inside larger products. &lt;a href="https://github.com/block/buzz">Buzz&lt;/a> opened a self-hosted workspace-as-relay pattern for humans and agents; &lt;a href="https://napplet.run">Napplets&lt;/a> defined a trust boundary for composable apps over Nostr and Blossom; and &lt;a href="https://conduit.market">Conduit&lt;/a> put marketplace applications beside its own protocol documents. These projects were no longer asking whether signed events could support collaboration. They were deciding which work belonged in events, which belonged in blobs or local state, and which permissions a host should retain.&lt;/p>
&lt;p>&lt;a href="https://www.bitblik.app">BitBlik&lt;/a> used Nostr in a peer-to-peer fiat-Lightning exchange, &lt;a href="https://github.com/JeroenOnNostr/codedeck">CodeDeck&lt;/a> carried coding sessions over encrypted relays, and &lt;a href="https://github.com/mehmetefeumit/Haven-App">Haven&lt;/a> applied Marmot outside a conventional messenger. The distance from the &lt;a href="https://github.com/nostr-protocol/nostr">2021 prototype repository&lt;/a> is not just more projects. It is a change in abstraction: teams could begin with portable identity, relay discovery, encryption, and payments as existing pieces, then spend their design effort on the application-specific boundary above them.&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>May&amp;rsquo;s &lt;a href="https://github.com/nostr-protocol/nips/commits/master/">specification history&lt;/a> traces a progression from one social-graph event to an ecosystem able to coordinate wallets, media, calendars, private groups, and synchronization. In 2021 a single contact-list commit carried follows, petnames, and relay hints. In 2022 the NIPs became a community standards project. The 2023 adoption wave produced a burst of new application contracts; 2024 tested and simplified them; 2025 formalized efficient sync while clients became products; and 2026 composed those pieces across MLS messaging, calendars, and multi-device state. The useful history is not how many PRs landed. It is how each May moved a constraint from private client behavior into an interoperable layer.&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).&lt;/p>
&lt;p>The same event, now documented as &lt;a href="https://github.com/nostr-protocol/nips/blob/master/02.md">NIP-02&lt;/a>, became the portable answer to “who does this person follow,” “what do they call them,” and “where do they read.” This was Nostr&amp;rsquo;s first durable state beyond a note: one replaceable event let a user carry part of their social context between clients. The authorship convention added in the same commit also gave later specifications explicit provenance.&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.&lt;/p>
&lt;p>The new standards process quickly became implementation infrastructure. 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.&lt;/p>
&lt;p>The next cluster moved Nostr from social interactions toward service boundaries. v0l proposed &lt;a href="https://github.com/nostr-protocol/nips/commit/29f26e7">NIP-98 HTTP Auth&lt;/a>, the authentication primitive later used by NIP-96 and Blossom. 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 application layer moved as fast, which is why the specification burst mattered. 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.&lt;/p>
&lt;p>The month&amp;rsquo;s deeper theme was replacing first-generation shortcuts. 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.&lt;/p>
&lt;p>Client releases showed those contracts moving into ordinary product behavior. 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.&lt;/p>
&lt;p>The same month also preserved a useful before-state for private groups. 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.&lt;/p>
&lt;p>Client releases completed the transition from protocol efficiency to user-facing products. 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>.&lt;/p>
&lt;p>The Formstr team showed the same composition pattern in public scheduling. It opened a coordinated NIP submission 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.&lt;/p>
&lt;p>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-years-of-nostr-aprils">Six Years of Nostr Aprils&lt;/h2>
&lt;p>April gives a clean cross-section of Nostr&amp;rsquo;s development path. The &lt;a href="https://github.com/nostr-protocol/nostr">original protocol repository&lt;/a> was nearly still in 2021; clients and specifications began separating into their own projects in 2022; the post-Damus application wave expanded what events needed to represent in 2023; private messaging and git-over-Nostr became durable contracts in 2024; Blossom and relay-list cleanup consolidated those contracts in 2025; and grants plus implementation hardening pushed them toward broader adoption in 2026. Each April moved complexity out of one experimental document and into a wider set of interoperable, maintained surfaces.&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, the &lt;a href="https://fiatjaf.com/nostr.html">original protocol text&lt;/a> still described a small document and a few experiments rather than a public client market or a visible relay network. There was no NIPs repository and no separate standards process. Nostr&amp;rsquo;s important achievement at this stage was restraint: the relay/key/event model was complete enough to attract implementations without pretending that client behavior, moderation, payments, or media had already been solved.&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. Early &lt;a href="https://github.com/damus-io/damus/commits?since=2022-04-01&amp;amp;until=2022-04-30">Damus commits&lt;/a> added chatroom behavior, profiles, and app icons, while &lt;a href="https://github.com/nbd-wtf/nostr-tools">nostr-tools&lt;/a> became the JavaScript path for client experiments. NIP-12 generic tag queries and the new kinds list moved the protocol toward a registry model. When fiatjaf moved the NIPs on May 1, April 2022 became the last month in which application code and the standards process still looked like one small project.&lt;/p>
&lt;h3 id="april-2023-post-damus-application-expansion">April 2023: post-Damus application expansion&lt;/h3>
&lt;p>April 2023 arrived after &lt;a href="https://github.com/damus-io/damus">Damus&amp;rsquo;s public launch&lt;/a> and Nostr&amp;rsquo;s first large user influx. 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. The network&amp;rsquo;s new constraint was no longer finding an implementation; it was making many independently built clients interpret a rapidly widening event vocabulary consistently.&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>&lt;a href="https://github.com/damus-io/damus">Damus&lt;/a>, Snort, Iris, Coracle, and Amethyst were no longer demos around a specification; they were production clients dealing with onboarding, feeds, spam, zaps, media, and relay selection. April&amp;rsquo;s protocol work reads like the backlog those clients created. Counting, marketplace, media, emoji, and identity-link changes did not represent unrelated novelty; together they mark the point where Nostr&amp;rsquo;s shared contract expanded beyond notes and follows because products already needed it to.&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 while Amethyst, Primal, Gossip, nostr-tools, NDK, and rust-nostr implemented adjacent surfaces. OpenSats then announced long-term support for &lt;a href="https://opensats.org/blog/pablofz7-receives-lts-grant">PabloF7z&lt;/a>, &lt;a href="https://opensats.org/blog/stuart-bowman-receives-lts-grant">Stuart Bowman&lt;/a>, and &lt;a href="https://opensats.org/blog/hzrd149-receives-lts-grant">hzrd149&lt;/a>. Durable privacy and git collaboration now required durable maintainers, so funding shifted from isolated project grants toward the people carrying relays, libraries, and client infrastructure across release cycles.&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 &lt;a href="https://github.com/nostr-protocol/nips/commits/master/">NIPs commits&lt;/a> sharpened 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, a maintenance stage that only becomes valuable after independent clients depend on the same text.&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="six-years-of-nostr-marches">Six Years of Nostr Marches&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/newsletters/2026-03-04-newsletter/#six-years-of-nostr-februaries">Last month&amp;rsquo;s newsletter&lt;/a> followed the protocol from the NIP-01 rewrite through the Damus wave to mesh and agent systems. March&amp;rsquo;s &lt;a href="https://github.com/nostr-protocol/nips/commits/master/">repository trail&lt;/a> shows Nostr changing scale in a different way: two specification edits in 2021, a small tool-building culture in 2022, SDK and wallet infrastructure after the 2023 adoption shock, slower consensus work in 2024 and 2025, then products in 2026 that use Nostr underneath networking, software distribution, and games. The arc is from defining event behavior to composing mature pieces without asking users to think about the relay layer.&lt;/p>
&lt;h3 id="march-2021-one-repository-one-field-of-view">March 2021: One Repository, One Field of View&lt;/h3>
&lt;p>Four months into its existence, Nostr still fit inside one small protocol repository. On March 4, fiatjaf &lt;a href="https://github.com/nostr-protocol/nostr/commit/dcd8cc3">added links to nostwitter instances&lt;/a>, pointing readers of the specification to working deployments. That documentation change captures the first stage: protocol and application discovery lived together, and finding a client meant following links from the specification itself.&lt;/p>
&lt;p>The important filter boundary had actually landed on February 15, when &lt;a href="https://github.com/nostr-protocol/nostr/commit/54dfb466">commit 54dfb46 added &lt;code>kind&lt;/code> to the basic filter definition&lt;/a>. By March, working nostwitter instances could build on that distinction between event types. The sequence matters more than a monthly commit count: a small filter primitive made it possible for later notes, contacts, payments, files, and application-specific events to share relays without being retrieved as one undifferentiated stream.&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 &lt;a href="https://github.com/scsibug/nostr-rs-relay">nostr-rs-relay repository&lt;/a> shows the other side of that stage: the relay network and active user base were still small, and Damus and Nostream had not appeared. March&amp;rsquo;s work was infrastructure for a developer community using its own tools. That quiet reliability work was what made the following month&amp;rsquo;s client experiments possible; growth came after people could keep a relay and a daily-use client running.&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>March 2026 is the month where disparate threads converged into working systems. The &lt;a href="https://github.com/marmot-protocol/mdk">Marmot Development Kit&lt;/a> shipped its first public release with encrypted media and multi-language bindings; &lt;a href="https://github.com/shopstr-eng/shopstr">Shopstr&lt;/a> and Milk Market opened MCP commerce surfaces; and &lt;a href="https://github.com/nostr-protocol/nips/blob/master/42.md">NIP-42 relay authentication&lt;/a> landed across signer, relay, and bunker software. &lt;a href="https://github.com/damus-io/notedeck">Notedeck&lt;/a> also moved software-release discovery onto Nostr events. Pieces that had been separate specifications in earlier years were now being coordinated across complete product stacks.&lt;/p>
&lt;p>The same composability appeared outside conventional clients. &lt;a href="https://github.com/BigBrotr/bigbrotr">BigBrotr&lt;/a> scanned relay data for leaked private keys and exposed a DVM checker, &lt;a href="https://github.com/mmalmi/nostr-vpn">nostr-vpn&lt;/a> used Nostr keys and relays for peer discovery before handing traffic to WireGuard, and &lt;a href="https://github.com/VectorPrivacy/Vector">Vector&amp;rsquo;s DOOM implementation&lt;/a> combined Nostr discovery, Marmot encryption, and QUIC transport for a real-time game. These projects were interesting not because March produced many releases, but because Nostr had become one reusable coordination layer inside systems whose primary purpose was no longer posting notes.&lt;/p>
&lt;p>The &lt;a href="https://github.com/nostr-protocol/nips/commits/master/">NIPs commit history&lt;/a> records the maintenance work underneath those products: wiki markup, bech32 input limits, boolean relay queries, and trusted assertions all changed during the month, while agent, WASM, and search proposals remained under review. The contrast with 2021 is the point. A filter-key addition once represented the whole month; by 2026 maintainers were refining many established contracts while applications combined them beyond the social-client category.&lt;/p>
&lt;h3 id="looking-ahead">Looking Ahead&lt;/h3>
&lt;p>Six Marches trace a clear arc from one maintainer adding a filter key to independent teams composing discovery, encryption, payments, storage, and transport. &lt;a href="https://github.com/nostr-dev-kit/ndk/commit/09e5e03">NDK&amp;rsquo;s first commit&lt;/a> marks the middle of that transition: after the 2023 growth wave, reusable SDKs let later projects begin above the raw relay protocol. The surface area in 2026 would have been unrecognizable in 2021, but the signed-event and relay model remained stable enough that new work accumulated around it instead of forking 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> (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="six-years-of-nostr-februaries">Six Years of Nostr Februaries&lt;/h2>
&lt;p>&lt;a href="https://nostrcompass.org/en/newsletters/2026-01-28-newsletter/#six-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. February&amp;rsquo;s &lt;a href="https://github.com/nostr-protocol/nostr/commits/master/">protocol history&lt;/a> follows a related but distinct progression: the wire model was rewritten in 2021, contributors and implementations multiplied in 2022, public attention forced rapid standardization in 2023, maintainers documented compatibility boundaries in 2024, wallets and infrastructure consolidated in 2025, and applications pushed beyond social feeds in 2026. Each stage begins where the previous February&amp;rsquo;s bottleneck ended.&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://github.com/nostr-protocol/nips/blob/master/04.md">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://github.com/nostr-protocol/nips/blob/master/44.md">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 &lt;a href="https://techcrunch.com/2023/02/02/damus-pulled-from-apples-app-store-in-china-after-two-days/">TechCrunch&lt;/a> and CoinDesk covered the removal, amplifying awareness of both the app and the protocol. Public-key and relay counts rose quickly enough that enthusiast-run infrastructure had to absorb a consumer-app growth event. That pressure explains why the same month produced an unusually dense specification cycle rather than merely more clients.&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://github.com/nostr-protocol/nips/pull/716">NIP-17&amp;rsquo;s pull request&lt;/a>, open since the previous July, was working toward a replacement for the aging NIP-04 encryption using NIP-44&amp;rsquo;s audited cryptography and NIP-59 gift wrapping. NIP-04 exposed sender-recipient metadata to relays; NIP-17 hid the sender behind disposable outer keys. The design work showed a network revisiting an early convenience after public use made its privacy cost concrete.&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. 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 turned protocol growth into operational policy. &lt;a href="https://github.com/nostr-protocol/nips/pull/1840">NIP-62&amp;rsquo;s merge&lt;/a> defined a signed request for relays to remove an author&amp;rsquo;s stored events, while &lt;a href="https://github.com/nostr-protocol/nips/blob/master/60.md">Cashu wallet events&lt;/a>, nutzaps, and quote tags were simplified around behavior clients were already implementing. These were not headline-grabbing new social primitives; they were the compatibility and lifecycle rules a relay ecosystem needs after users begin treating events as durable state and money.&lt;/p>
&lt;p>The implementation layer was maturing at the same time. &lt;a href="https://github.com/damus-io/notedeck">Notedeck&lt;/a> carried its alpha into broader testing, &lt;a href="https://github.com/0ceanSlim/grain">GRAIN&lt;/a> shipped a Go relay release, and the first Nostr-to-MCP bridges connected &lt;a href="https://github.com/nostr-protocol/nips/blob/master/90.md">NIP-90 job events&lt;/a> to agent tooling. By this stage Nostr was no longer expanding only by adding event kinds: desktop clients, relay implementations, and external protocol bridges were becoming independently maintained product surfaces.&lt;/p>
&lt;h3 id="february-2026-beyond-social-media">February 2026: Beyond Social Media&lt;/h3>
&lt;p>February 2026, documented across Compass issues #8 through #11, spanned peer-to-peer trading, app distribution, private messaging, agent tooling, and mesh networking. &lt;a href="https://github.com/MostroP2P/mostro">Mostro&lt;/a> shipped its first public beta for decentralized peer-to-peer Bitcoin trading, &lt;a href="https://github.com/zapstore/zapstore">Zapstore&lt;/a> reached 1.0 after its release-candidate cycle, and &lt;a href="https://github.com/marmot-protocol/whitenoise">White Noise&lt;/a> delivered real-time Marmot-encrypted messaging with external signer support. Mature protocol components now supported markets, app distribution, and private group coordination rather than only public social feeds.&lt;/p>
&lt;p>Competing AI-agent proposals arrived alongside a DVM coordination design extending &lt;a href="https://github.com/nostr-protocol/nips/blob/master/90.md">NIP-90&lt;/a>. &lt;a href="https://github.com/ContextVM">ContextVM&lt;/a> connected Model Context Protocol tooling to Nostr transport, while &lt;a href="https://github.com/CentauriAgent/burrow">Burrow&lt;/a> applied Marmot-encrypted messaging to both agents and humans. The notable transition was architectural: identity, payments, job requests, and private channels could now be composed for machine participants as well as people.&lt;/p>
&lt;p>&lt;a href="https://github.com/jmcorgan/fips">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>Six Februaries show a progression from wire-format foundations to developer growth, public pressure, compatibility discipline, infrastructure products, and new application domains. The turning point is visible between the 2021 &lt;a href="https://github.com/nostr-protocol/nostr/commit/33a1a70">NIP-01 rewrite&lt;/a> and 2026&amp;rsquo;s mesh and agent systems: public adoption did not replace the early EVENT/REQ/CLOSE model. It forced maintainers to add privacy, lifecycle, routing, and composition rules around it until the same event network could support work far beyond a social timeline.&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="six-years-of-nostr-januaries">Six 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. January&amp;rsquo;s &lt;a href="https://github.com/nostr-protocol/nostr/commits/master/">repository record&lt;/a> shows the next stages more clearly: a tiny group testing a fixed key/event/relay model in 2021, developer discovery in 2022, the Damus-led public break in 2023, metadata-protecting protocol work in 2024, clients learning to coordinate across relays in 2025, and signer and security infrastructure becoming products in 2026. The point is not six inventories. It is how each January exposed the next constraint after the previous stage worked.&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 in the early &lt;a href="https://github.com/nostr-protocol/nostr">&lt;code>nostr-protocol/nostr&lt;/code> specification&lt;/a>: users identified by secp256k1 public keys, posts cryptographically signed with Schnorr signatures, and relays serving as independent storage rather than a federated cluster. This deliberately small, Bitcoin-native base mattered because the network could add clients and relays without reopening identity or event authenticity first.&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>January refined rather than introduced NIP-59. A &lt;a href="https://github.com/nostr-protocol/nips/commit/1a2b21b6">January 9 clarification&lt;/a> and &lt;a href="https://github.com/nostr-protocol/nips/commit/f3589b99">January 31 fix&lt;/a> tightened gift-wrapping behavior after the proposal had entered the repository in August 2023. Gift Wrap builds on &lt;a href="https://github.com/paulmillr/nip44">NIP-44&amp;rsquo;s encryption standard&lt;/a> to hide sender identity from relays by wrapping an encrypted message 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, while paid-relay admission fees remained too small to fund most operators. The same visibility also attracted projects trading on Nostr&amp;rsquo;s name: fiatjaf &lt;a href="https://www.aicoin.com/en/article/377704">publicly rejected the unrelated Nostr Assets Protocol&lt;/a> as an affinity scam. Growth had created both an operations problem and a credibility problem that the protocol document alone could not solve.&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 NIP-04 direct messages toward the metadata-protecting design in &lt;a href="https://github.com/nostr-protocol/nips/blob/master/17.md">NIP-17&lt;/a>, while the &lt;a href="https://github.com/nostr-protocol/nips/blob/master/65.md">NIP-65 relay-list model&lt;/a> gave clients a shared basis for outbox and inbox routing. January 2025 was therefore less about one breakout app than convergence: mature clients were replacing early shortcuts with portable encryption and relay-selection contracts, work that made the later multi-device and signer layers possible.&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 moved toward security infrastructure shared by multiple clients. 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 against audit findings, while signer and relay-trust discussions showed the same pressure elsewhere: security behavior was becoming cross-client plumbing rather than an application-local convention.&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 move from early development to discovery, breakout growth, protocol hardening, client convergence, and security infrastructure. The pattern is visible in the distance between the early &lt;a href="https://github.com/nostr-protocol/nostr">&lt;code>nostr-protocol/nostr&lt;/code> repository&lt;/a> and 2026&amp;rsquo;s audited signer, Marmot, and recovery work: once the relay/key/event base held, each stage pushed complexity away from user-held secrets and one-off client behavior into shared, reviewable interfaces. Nostr did not become mature by replacing its foundation; it became useful by learning where that foundation needed stronger contracts around 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>