Nostr Compass #21
- Lead stories
- MDK 0.8.0 adds MIP-05 notification primitives and addressable key packages
- LaWallet NWC v0.10.0 ships the full monorepo and end-user Wallet
- Amethyst stabilizes Nests with keep-alive, JWT resilience, and lifecycle subscriptions
- ngit v2.4.2 and v2.4.3 fix GRASP server detection and multi-remote state events
- GRAIN v0.5.4 lands production hardening and a silent data loss fix
- Mostro Core v0.10.1 adds PGP-signed release artifacts
- Tagged releases
- Clave v0.2.0 launches multi-account on iOS with NIP-46 (Nostr Connect) signing
- Wisp ships v1.0.3 → v1.0.5 stability work
- Amber 6.1.0-pre1 ships layout and stability fixes
- Routstr Core v0.4.3 improves payment, refund, and usage reporting
- Nostria v3.1.37 through v3.1.41 add Web Bookmarks and an Auto theme
- NoorNote v0.8.9 fixes desktop first-launch empty screen
- Kubo v0.3.4 through v0.4.1 ship a child-safe Nostr video platform with parent controls and Web of Trust feed curation
- Unreleased changes
- Sprout ships Desktop v0.0.4 and v0.0.5 alongside NIP-OA agent authentication and the pair-relay sidecar
- nostream adds Marmot relay support and NIP-25 reactions
- strfry adds per-connection observability and reduces nofiles ceiling
- Damus replaces Tenor GIFs with a Purple proxy and ships compaction UX
- Primal Android polishes Explore, alerts, and the NIP-05 verified badge
- Alby Hub adds NWC payments from app connections
- routstrd-auth: a Dockerized Routstrd for teams with NIP-98 auth and npub RBAC
- Routstrd integrates Hermes for daemon clients and remote mode
- diVine ships NIP-07 web sign-in and 16-locale key parity
- OpenChat ships 18 iterative UI improvements
- whitenoise-rs ships per-account database isolation and proposal upgrades
- whitenoise Flutter UI adds leave-group, terminology consistency, and Fastlane release scaffolding
- Angor 0.2.21 ships compact app flows alongside key provider and network-switch hardening
- Keydex polishes data layer, recovery flow, and steward owner-name display
- Newly tracked and discovered
- BitMacro Signer: a self-hostable NIP-46 bunker with client-side key encryption
- gnostr: a git implementation built directly on Nostr
- nostr-archive: a content-addressed archive spec on Nostr and Blossom
- flower-cache: a local Blossom cache server
- routstrd: the routstr daemon’s NIP-34 mirror
- micro-vpn-ansible: Ansible playbooks for VPN deployment over NIP-34
- Protocol work
- NIP Deep Dive: NIP-34 (git stuff)
- NIP Deep Dive: NIP-53 (Live Activities)
Welcome back to Nostr Compass, your weekly guide to Nostr.
This week: Marmot Protocol ships MDK 0.8.0 @White Noise with the first MIP-05 notification primitives, addressable NIP-51 (Lists) key packages, and a tightened security review pass. LaWallet NWC @ek42…v4pd ships v0.10.0 as the biggest release since OpenSats funding, bringing a full admin dashboard, end-user Wallet, end-to-end activity log, and a new LightningAddress 1→N and NWCConnection schema that unlocks per-address NIP-47 (Nostr Wallet Connect) routing. Amethyst @Amethyst lands a Nests stability sprint with audio gap elimination during JWT refresh, lifecycle-aware key data subscriptions, relay keep-alive reconnection, and an animated speaking-participant indicator. ngit (@DanConwayDev) ships v2.4.2 and v2.4.3 fixing GRASP server detection for PR submissions and multi-remote state-event filtering. GRAIN (@OceanSlim) ships v0.5.4 with production hardening and a silent data-loss fix in the Docker quick-start. Mostro Core @Mostro ships v0.10.1 with PGP-signed release artifacts as a follow-up to last week’s v0.10.0 P2P chat protocol module. Clave (@npub1uadpshqpn5ysf82lev8zngkvn07szmkq7mvf9lyc7ml7qxq6fqxsmrqt2s) launches v0.2.0 with multi-account support on iOS. nostream (@Cameri 🦦) merges Marmot relay support and NIP-25 (Reactions). Sprout (@block-opensource) ships 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. Routstrd @routstr integrates Hermes for daemon clients. The NIP discussions surface a brokerless hashrate market draft, a Curated Feeds proposal as a simpler alternative to DVM feeds, a Profile Colors NIP, and a Namecoin-anchored identity track. Two NIP deep dives cover NIP-34 (git stuff) and NIP-53 (Live Activities).
Lead stories
MDK 0.8.0 adds MIP-05 notification primitives and addressable key packages
MDK, the Rust core library for the Marmot protocol, shipped v0.8.0 on May 4. This release ships the first MIP-05 notification building blocks, moves MIP-00 key packages to addressable events so a user’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 PR #235, which give downstream clients enough information to deliver per-recipient push notifications without leaking group structure. Operational fixes also land: PR #273 restores mdk-core crates.io publishing, and PR #269 exposes the test_util module behind a test-utils Cargo feature so external client suites can share Marmot’s test harness. For client teams, the headline practical change is the addressable key package: a user’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.
LaWallet NWC v0.10.0 ships the full monorepo and end-user Wallet
LaWallet NWC, the LaWallet team’s NIP-47 Nostr Wallet Connect implementation, shipped v0.10.0 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 LightningAddress 1→N and NWCConnection 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 PR #191 covers onboarding, home, send/receive, scan, currencies, an activity feed, and an offline cache. PR #192 wires the first-run flow with confirm-root, community auto-import, and setup-now CTAs. PR #196 adds a live OpenAPI 3.1 reference rendered through Scalar with role-based access control documentation, and PR #193 brings full JSDoc coverage to the public lib/ surface so editor tooltips show the wallet API correctly during integration work.
Amethyst stabilizes Nests with keep-alive, JWT resilience, and lifecycle subscriptions
Amethyst, the feature-rich Android client, continued the NIP-53 Nests audio-room work covered in newsletter #20 with a stability sprint focused on the failure modes that broke calls in production. The audio-gap fix in PR #2733 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 PR #2730 reconnects disconnected relays without requiring a manual user action, and PR #2728 replaces the legacy KeyDataSourceSubscription with LifecycleAwareKeyDataSourceSubscription, which ties the subscription lifetime to the Android Activity lifecycle so background tabs do not leak open subscriptions. Android 12+’s ForegroundServiceStartNotAllowedException is now handled gracefully via PR #2727, and PR #2726 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 PR #2724, an animated outer-ring indicator that highlights the speaking participant in multi-speaker sessions. Debug coverage improved with PR #2731, which wires NestRx and NestTx logs across the listener and speaker paths so the next regression has a clean trail to follow, and PR #2732 refactors the settings screen UI with a card-based layout to make the Nests-related toggles easier to find.
ngit v2.4.2 and v2.4.3 fix GRASP server detection and multi-remote state events
ngit, the command-line tool and git plugin for NIP-34 collaboration, shipped v2.4.2 on April 28 and v2.4.3 on May 1. v2.4.2 fixes a URL-normalization mismatch where repo_grasps 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’s own GRASP server. v2.4.3 fixes a state-event ambiguity that surfaced when a repository has multiple nostr:// remotes sharing the same identifier: relays could return state events authored by maintainers of the other remote, and without filtering, the newest event won regardless of author and pointed refs at the wrong commits. State event candidates in run_list are now filtered to maintainers of the current remote’s repo announcement so the right state wins. Both fixes are exactly the kind of correctness work the GitWorkshop v2 release shipped last week pushes ngit to harden, since the in-browser PR merge button assumes the underlying GRASP push targets the right server.
GRAIN v0.5.4 lands production hardening and a silent data loss fix
GRAIN, the Go-based Nostr relay and client library, shipped v0.5.4 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.
Mostro Core v0.10.1 adds PGP-signed release artifacts
Mostro Core, the Rust library that provides peer-to-peer functionality for the Mostro daemon and other downstream applications, shipped v0.10.1 on April 28 as a follow-up to last week’s v0.10.0 P2P chat protocol module. The new release adds PGP-signed release artifacts and a verify-release flow so downstream packagers can confirm artifact provenance before vending the library.
Tagged releases
Clave v0.2.0 launches multi-account on iOS with NIP-46 (Nostr Connect) signing
Clave, the iOS NIP-46 remote-signing app that uses APNs for push delivery (covered in #20), shipped v0.2.0 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 PR #23, and PR #22 adds a signer_pubkey 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 njump (PR #19), 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 PR #16 through register-retry on cellular failure and an aggressive blank-NC sweep. Documentation gets a boost too: PR #18 ships a NIP-46 client compatibility doc, and PR #21 adds Nip46Lab as a neutral reference client for triage.
Wisp ships v1.0.3 → v1.0.5 stability work
Wisp (@utxo the webmaster 🧑💻), the Android client that graduated from beta in #20, shipped v1.0.3, v1.0.4, and v1.0.5 on May 4 with stability work. PR #506 adds Thumbhash for blurred image previews while full media loads, and PR #514 reduces bottom-tab switching jank. PR #515 reduces startup and feed-rendering work, and PR #516 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.
Amber 6.1.0-pre1 ships layout and stability fixes
Amber (@greenart7c3), the Android signer app for NIP-55 (Android Signer Application) and NIP-46, shipped v6.1.0-pre1 with a layout pass on the new-app connection flow and several reported-crash fixes. PR #416 fixes ActivityStatsBar layout and text overflow issues, PR #412 improves notification-permission handling and error resilience, and PR #411 ensures SignerActivity always closes after handling a request so the app does not retain a stale signing screen. PR #409 adds select/deselect-all functionality to the permissions list, and PR #410 shortens the displayed npub in the account-selection supporting text so multi-account device users can scan the list at a glance.
Routstr Core v0.4.3 improves payment, refund, and usage reporting
Routstr Core, the decentralized inference layer that combines Nostr for service discovery with Cashu (Chaumian e-cash on Nostr) micropayments for private usage billing, shipped v0.4.3 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.
Nostria v3.1.37 through v3.1.41 add Web Bookmarks and an Auto theme
Nostria (@sondreb), the multi-platform Nostr client, shipped v3.1.37 through v3.1.41 on April 30 and May 4. The releases add NIP-B0 (Web Bookmarks) support, an “Auto” theme that follows device settings, in-app PDF viewing, layout fixes for the media player in fullscreen, and an improved article and note editor.
NoorNote v0.8.9 fixes desktop first-launch empty screen
NoorNote (@alp), the cross-platform Nostr client, shipped v0.8.9 on April 28 fixing an empty-screen bug on the desktop app’s first launch where the welcome and login screen failed to render.
Kubo v0.3.4 through v0.4.1 ship a child-safe Nostr video platform with parent controls and Web of Trust feed curation
Kubo @kdst…nsze, a child-safe video platform on Nostr that lets parents curate their child’s content world through Web of Trust filters, shipped v0.3.4, v0.3.5, v0.4.0, and v0.4.1 across May 4 and May 5. The platform is a soft fork of Ditto @Team Soapbox 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 “Next post” button. Trust assignments come in three levels (View, Interact, Extend), so parents can grant individual profiles or NIP-72 (Moderated Communities) entire communities the right to contribute, interact with, or extend their child’s feed. Feed sources include relays, communities, follow packs, and individual profiles, with a feed preview before content goes live. Recent work covers a first-run parent tour, a seed kid-friendly Follow pack on every new kid, NIP-66 relay discovery with collapsible Browse-all and search-hide flags, kind 34236 vine play recording into kid watch history, kid “Request to interact” 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 kubo.watch.
Unreleased changes
Sprout ships Desktop v0.0.4 and v0.0.5 alongside NIP-OA agent authentication and the pair-relay sidecar
Sprout, Block’s Nostr client with a built-in relay, shipped Sprout Desktop v0.0.4 on May 5 and v0.0.5 on May 6, alongside roughly 80 merged PRs covering a major NIP-OA, NIP-43, and NIP-AB pairing pass. The flagship change in PR #471 wires NIP-OA agent authentication into the relay’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. PR #490 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 PR #491 materializes the agent_owner_pubkey 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 PR #467 as sprout-pair-relay, and PR #470 makes the desktop client auto-detect the NIP-43 relay and route the target to a /pair sidecar. Repository structure gets a pass via PR #476, which reorganizes the repository as a pnpm workspace, adds deep links, and scaffolds the new web client repos page, while PR #474 scaffolds the browser-based web client itself, and PR #479 wires the relay to serve the web UI directly with a redesigned repos page. The web client expands further with PR #485, which adds a repo detail page and clickable repo names. Desktop polish covers relay-access settings in PR #458, an onboarding flow that supports membership checks and bring-your-own-key in PR #457, a signed-and-notarized macOS build via PR #472 so the desktop binary clears Gatekeeper without manual override, a “keep awake while agents are active” setting in PR #484, and a prevent-sleep spawn convention with expiry badge in PR #487. Operational fixes include PR #486 raising MAX_HISTORICAL_LIMIT from 500 to 10,000 to support deeper backfill queries, PR #482 including p tags in kind:39000 events for DM channels, and PR #480 sweeping a long tail of profile, mention, deep link, channel link, and doctor page bugs.
nostream adds Marmot relay support and NIP-25 reactions
nostream, the Node.js relay implementation, merged a productive week of protocol additions. Marmot Protocol relay support covering MIPs 00 through 03 lands in PR #602, which gives the relay first-class storage and forwarding for Marmot-encrypted messaging events. The smaller protocol additions: NIP-25 reactions support in PR #589, geohash prefix matching for #g filters in PR #586 so location-based queries can match parent regions, and a tightened maxlimit check on subscription event requests in PR #600 to prevent malformed REQ messages from triggering unbounded queries. On the test and dependency side, PR #556 adds k6-based connection and message-rate-limit tests, PR #592 updates serialize-javascript to v7.0.3 closing a known dependency vulnerability, and PR #545 skips Redis auth when credentials are unset to make local development workflows quieter.
strfry adds per-connection observability and reduces nofiles ceiling
strfry (@Doug Hoyte), the C++ Nostr relay, merged 14 PRs targeting observability and operational hygiene. The headline change is PR #218, 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’s overall send queue degrades. On the performance side, PR #224 removes std::function heap allocations from the per-event monitor fanout and switches to direct map.find() lookups, cutting allocator pressure on busy relays. Metrics correctness improves with PR #225, which fires the nostr_events_total 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: PR #219 adds index bounds checks to the negentropy ingester, PR #235 reduces the nofiles ceiling from 1,000,000 to 524,288 to fit the kernel default range, and PR #238 removes a long-standing IP-header workaround that the modern proxy stack no longer needs.
Damus replaces Tenor GIFs with a Purple proxy and ships compaction UX
Damus @damus, the iOS Nostr client, merged PR #3737 replacing the Tenor GIF integration with a Damus Purple proxy, where Damus’s hosted subscription service relays GIF requests on behalf of the client so individual users do not directly query Tenor’s servers (a privacy improvement that also keeps Damus’s Apple-store posture clean). PR #3733 improves large-database compaction UX with progress feedback for users running compaction on multi-gigabyte nostrdb stores, and PR #3732 refines the compaction progress reporting and overall UI.
Primal Android polishes Explore, alerts, and the NIP-05 verified badge
Primal Android @primal merged PR #1043 fixing a flickering NIP-05 (Domain Verification) verified badge for users with _@domain identifiers, PR #1042 adding paste handling for any event link in the note editor, PR #1041 implementing an Explore landing tab with recent users and recent searches, PR #1045 implementing alerts filters, and PR #1038 adding a video duration badge in feeds.
Alby Hub adds NWC payments from app connections
Alby Hub @Alby merged PR #2267 allowing payments from app connections and PR #2268 simplifying the onchain receive routing logic, both shipped through Alby Hub’s NIP-47 (Nostr Wallet Connect) surface.
routstrd-auth: a Dockerized Routstrd for teams with NIP-98 auth and npub RBAC
routstrd-auth, 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 (commit 8d0fd30) with admin and user roles, a bootstrap role for first-run setup, and a PATCH /npubs endpoint for changing an npub’s role at runtime. Client endpoints adopt NIP-98 HTTP authentication with ownership tracking (commit 63da856), so a Nostr-signed HTTP request authenticates the caller and confirms the client belongs to that npub. A /usage endpoint reads directly from SQLite for fast accounting (commit 5badb4f), node cooldown drops from 5 minutes to 42 seconds, and Cloudron setup instructions (commit cef44d6) target operators who want a one-click deployment for their team. The project pairs with Routstrd (covered above) to extend Routstr from a single-operator daemon into team infrastructure.
Routstrd integrates Hermes for daemon clients and remote mode
Routstrd, the local daemon that orchestrates Routstr inference clients, merged PR #22 adding integration with Hermes Agent (Nous Research’s open-source AI agent), so the agent’s config file gets populated with the model providers and API keys that Routstrd discovers over Nostr. The integration writes ~/.hermes/config.yaml with a base model block and a custom_providers block, removing the need for the user to hand-configure Routstr providers in their AI agent. PR #21 refactors the clients module, PR #20 adds a remote command, PR #19 fixes the remote-mode clients list, and PR #16 makes the client ID required in the /clients/add endpoint to prevent ambiguous registrations.
diVine ships NIP-07 web sign-in and 16-locale key parity
diVine (@rabble), 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. PR #3994 adds NIP-07 (Browser Extension Signer) sign-in for the web build, PR #3992 translates 16 non-English locales to full key parity, and PR #3944 groups notifications by video and shows thumbnails while fixing a realtime flicker.
OpenChat ships 18 iterative UI improvements
OpenChat (@The Dude) shipped 18 releases in the v0.6.50 through v0.6.55 range covering iterative UI improvements.
whitenoise-rs ships per-account database isolation and proposal upgrades
whitenoise-rs, the Rust core library for the White Noise messenger, merged PR #796 (“Phase 18e”) moving message projection tables into per-account databases, and PR #792 doing the same for membership and push tables. PR #791 adds proposal upgrades so groups can extend their functionality with new proposal types when all members support them, and PR #794 fixes the Android keyring migration build alongside an MDK revision bump.
whitenoise Flutter UI adds leave-group, terminology consistency, and Fastlane release scaffolding
whitenoise, the Flutter mobile UI for the White Noise messenger, merged PR #604 adding a leave-group action from the chat list UI, PR #595 renaming contact actions to Follow and Unfollow across all locales for terminology consistency, and PR #601 adding Fastlane release scaffolding for the mobile build pipeline.
Angor 0.2.21 ships compact app flows alongside key provider and network-switch hardening
Angor @Angor, the Bitcoin crowdfunding platform with Nostr-published founder profiles and project announcements, shipped Angor 0.2.21 on May 6 rolling up a week of mobile and integration work. PR #802 and PR #810 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. PR #819 polishes the compact app flows, and PR #822 adds a project-search-by-ID surface in Find Projects so investors can resolve a project from its identifier alone. PR #804 adds a secure key provider, PR #807 fixes relay investment storage to use a network-specific derivation path, PR #805 corrects an inverted testnet/mainnet cache key in the MempoolSpaceIndexerApi, and PR #806 ensures a network switch properly clears all cached data and resets the UI state. PR #820 corrects integration test assertions for PaymentFlow.Reset and stale profile data, and PR #823 converts FindProjectsViewModel.cs from UTF-16 to UTF-8 so the source file matches the rest of the codebase.
Keydex polishes data layer, recovery flow, and steward owner-name display
Keydex, the social-recovery app for Nostr keys, merged PR #126 introducing a data-layer refactor plan, PR #122 fixing a black screen after the import-key, vault-backup, and save-recovery-plan sequence, and PR #121 correcting an owner-name display where the owner showed as “You” on steward devices, where the owner’s actual name should appear.
Newly tracked and discovered
BitMacro Signer: a self-hostable NIP-46 bunker with client-side key encryption
BitMacro Signer @at83…a4ty is a self-hostable Nostr signing tool that manages private keys using the NIP-46 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.
This week’s NIP-34 repo discovery surfaced 26 new repository announcements, of which four stand out.
gnostr: a git implementation built directly on Nostr
gnostr @5d9e…xq6k is a git implementation built directly on Nostr, distinct from git-remote-nostr in that it ships its own working-tree commands as a from-scratch Nostr-native version-control client.
nostr-archive: a content-addressed archive spec on Nostr and Blossom
nostr-archive 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.
flower-cache: a local Blossom cache server
flower-cache is a local Blossom cache server, useful for clients that want a hot local mirror of a remote Blossom server’s blob set without round-tripping the upstream on every blob fetch.
routstrd: the routstr daemon’s NIP-34 mirror
routstrd is the routstr daemon’s NIP-34 mirror, complementing the GitHub repository covered above.
micro-vpn-ansible: Ansible playbooks for VPN deployment over NIP-34
micro-vpn-ansible is a small Ansible playbook collection for deploying a micro VPN, hosted as a NIP-34 repository on relay.ngit.dev and mirrored on gitnostr.com. The repo’s canonical announcement carries three maintainers, making it a small example of how multi-maintainer collaboration is expressed in NIP-34 today.
Protocol work
NIP updates
- A brokerless hashrate market over Nostr (draft proposal): 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
nostr-protocol/nips, the draft leaves the economic design pieces (escrow custody, contract settlement, dispute resolution) as the load-bearing part still under debate. - Curated Feeds: a simpler alternative to DVM feeds (draft proposal): A draft argues that NIP-90 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.
- Profile Colors: deterministic visual identity (draft proposal): 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.
- Namecoin-Track NIPs: anchoring identity, relays, TLS, and reputation (draft cluster): 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.
NIP Deep Dive: NIP-34 (git stuff)
NIP-34 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.
A repository is announced as a kind 30617 addressable event whose d tag is a kebab-case identifier (typically the project name) and whose body includes name, description, one or more clone URLs, optional web URLs, a relays tag listing relays the maintainer monitors, and a maintainers tag with additional pubkeys allowed to manage the project. An r tag annotated with the euc (“earliest unique commit”) 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 30618) are an optional canonical pointer to current branch and tag heads, with refs/heads/<branch> and refs/tags/<tag> tag pairs and a HEAD tag for the default branch.
The canonical ngit repository announcement, signed by maintainer npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr, looks like this:
{
"id": "08bb929a05fd9bbb5e1b227a3850269f2f9615e9e830bd34e664b72df14dead6",
"pubkey": "a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd",
"created_at": 1758124128,
"kind": 30617,
"tags": [
["d", "ngit"],
["r", "26689f97810fc656c7134c76e2a37d33b2e40ce7", "euc"],
["name", "ngit"],
["description", "cli and git plugin for code collaboration over nostr"],
["clone", "https://codeberg.org/DanConwayDev/ngit-cli.git", "https://relay.ngit.dev/npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr/ngit.git"],
["web", "https://gitworkshop.dev/danconwaydev.com/ngit"],
["relays", "wss://relay.damus.io", "wss://nos.lol", "wss://relay.nostr.band"],
["maintainers", "a008def15796fba9a0d6fab04e8fd57089285d9fd505da5a83fe8aad57a3564d", "a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd"],
["alt", "git repository: ngit"]
],
"content": "",
"sig": "ad571d2ec44fcdb5d684281deb8aea3862b6660d73e66f1c921f381f2fec6869f4b9444414b4ffdafccd414f3489502af193401b35edcebd8f50dcebbbc0b37a"
}
Patches use kind 1617 and carry git format-patch output in the content body, referencing the target repository through an a tag of the form 30617:<maintainer-pubkey>:<d-tag>. Patch series chain through NIP-10 (Text Note Threading) e reply tags. Pull requests use kind 1618 and are intended for changesets larger than 60 KB; a PR points to a branch tip with a c tag (current commit ID), one or more clone tags listing where the commit can be fetched, and an optional merge-base tag. Before signing the PR event, clients SHOULD push the branch tip to refs/nostr/<event-id> on every clone URL the user can write to, and if they have no write access, fall back to a personal-fork repository announcement that lists alternative GRASP servers. Updates to the branch tip are published as kind 1619 PR Update events that reference the original PR through capital-letter E and P tags. Issues use kind 1621 with markdown content, and replies to any NIP-34 thread (issues, patches, PRs alike) follow standard NIP-22 (Comments) comment threading. Status events move a thread between Open (1630), Applied/Merged or Resolved (1631), Closed (1632), and Draft (1633); a 1631 can include merge-commit and applied-as-commits tags so clients render merge state without an external API call.
This week’s data shows where NIP-34 is being used in production. joinmarket-ng, the modern JoinMarket alternative implementation, accumulated 15 patches in the period across relay.ngit.dev. GitWorkshop.dev saw two new issues (one on file search, one on Nostr Connect sending wrong permissions). ngit-indexer, the relay implementation that discovers and syncs repository announcements across the network, saw two patches and an issue noting it was not advertising NIP-45 (Event Counting) in supported_nips.
The wider NIP-34 story is the same as last week’s GitWorkshop v2 launch: the in-browser PR merge button works because GRASP servers, ngit, and the nostr:// 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 NIP-34 topic page.
NIP Deep Dive: NIP-53 (Live Activities)
NIP-53 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.
A live stream is announced as a kind 30311 addressable event. Its d tag is the stable identifier, the streaming tag points at the playback URL, and the status tag carries one of planned, live, or ended. Each p tag carries a pubkey, a relay hint, a displayable role marker (Host, Speaker, Participant), and an optional fifth term: a SHA-256 of the activity’s full a tag signed by the participant’s private key. Without that proof, clients MAY display the participant as “invited” 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 pinned tags, and providers SHOULD keep the published participant list small (under 1000 users), treating the list as a sample, not a full roster.
A representative Nests-style audio room announcement looks like this:
{
"id": "8c1e6d7b3f2e9a4d5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a",
"pubkey": "82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2",
"created_at": 1746540000,
"kind": 30311,
"tags": [
["d", "nests-room-2026-05-05-protocol-discussion"],
["title", "Protocol discussion: NIP-34 git workflows"],
["summary", "Open call for ngit, GitWorkshop, and joinmarket-ng maintainers"],
["streaming", "https://moq.amethyst.social/rooms/protocol-discussion-2026-05-05"],
["starts", "1746543600"],
["status", "live"],
["current_participants", "12"],
["service", "wss://nests.amethyst.social/"],
["p", "a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd", "wss://relay.damus.io", "Host", "f1e0d7a8b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6"],
["p", "266815e0c9210dfa324c6cba3573b14bee49da4209a9456f9484e5106cd408a5", "wss://nos.lol", "Speaker"],
["p", "0057059046164d2238bbdbdf45fa2e106f59188289f6842d6bf362218ef4a58c", "", "Participant"],
["relays", "wss://relay.damus.io", "wss://nos.lol"],
["t", "nostr"],
["t", "nip-34"]
],
"content": "",
"sig": "5a3e8b7c1d2f4a6b9e8d7c6b5a4f3e2d1c0b9a8f7e6d5c4b3a2f1e0d9c8b7a6f5e4d3c2b1a0f9e8d7c6b5a4f3e2d1c0b9a8f7e6d5c4b3a2f1e0d9c8b7a6f5e4d3"
}
The first p tag includes a fifth-term signed proof, so clients render that participant as a confirmed Host. The other two p tags lack proofs, so they display as invited participants until they sign in.
NIP-53 separates the persistent room from the scheduled event held inside it. A kind 30312 Meeting Space defines a room with a d identifier, human-readable room name, summary, optional image, status (open, private, or closed), a service URL, optional API endpoint, hashtag t tags, and one or more provider p tags. A kind 30313 Conference Event represents a scheduled or ongoing meeting inside that room, referenced through an a tag pointing at 30312:pubkey:room-id with an optional relay hint. The room/event split is what gives NIP-53 conference-grade scheduling: a single room hosts many 30313 events over time, each with its own start, end, and roster, while the room’s hosts and providers stay stable. Listener presence is a separate kind 10312 regular replaceable event, with an a tag pointing at the activity and an optional hand tag for raised-hand signaling. Live chat uses kind 1311, where each chat message MUST include an a tag pointing at the activity record so chat is bound to one specific live activity.
The Nostr live-activity surface is intentionally thin: NIP-53 advertises the activity, while other NIPs handle adjacent concerns. Zaps to live streams use NIP-57 (Zaps) zap receipts (kind 9735) bound to the stream’s 30311 event, fundraising goals attached to a stream use NIP-75 (Zap Goals) zap goals, video recordings can be republished as NIP-71 (Video Events) video events, and remote signing for participation can use NIP-46 so a streamer never pastes an nsec into a streaming client.
This week’s signal lines up with the broader live-activity story. The Amethyst Nests stability sprint 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. Zap.stream (@Kieran) remains the longest-running NIP-53 client in production, Shosho @Shosho – Live Stream on Nostr shipped the v0.11 through v0.15 progression covered in newsletters #5 through #17 adding VOD, room presence, threaded chat, MP4 replays, and OBS-connected Shows, HiveTalk @z0lc…8ldk covers the video-conferencing case with Lightning zaps, Corny Chat @c0rn…tlvg and nostrnests @Nostr Nests cover the Clubhouse-style audio room case, and WaveFunc uses kind 1311 for internet radio station chat. The full implementation roster, the proof-of-agreement gating recommendation, and the room/event split rationale are on the NIP-53 topic page.
That’s it for this week. If you’re building something or have news to share, DM us on Nostr or find us at nostrcompass.org.
Write a comment