This week: Mostro adds signed identity rebinding. Amethyst brings private polls to Marmot groups and encrypted settings sync across devices. swift-nostr ships a check that refuses to sign events whose public key does not match the signer’s. We close with Six Years of Nostr Octobers, 2021–2026.

Top Stories

Mostro

Mostro, the Nostr-coordinated peer-to-peer exchange daemon, released 0.20.1. It adds signed identity rebinding, which last week’s issue described as unimplemented, and ships the previously source-only reputation exports. The bound identity signs a single-use authorization naming the node and new identity, valid for at most an hour. The daemon records the event ID and switches with a compare-and-swap, so a failed signature or lost race changes nothing. Operators also have an audited loopback-only RPC that requires an auth token and a reason. Rebinding does not revoke attestations already issued.

Later merges are not confirmed in a release. An opt-in fixed USD peg provider adds USDT, USDC and DOC to the Nostr mostro-rates feed only when the operator enables it. Network providers and relayed coin quotes do not turn it on implicitly. A follow-up renames the provider and its config key to pegged, replacing the unreleased stablecoins key. It also quotes BTC, LBTC and RBTC at a fixed 1:1 in sats and publishes the rates as kind 30078 events. These configured peg assumptions leave the peg and settlement unguaranteed. Live peg checks remain outside this mechanism. The provider is off by default. Accepted currencies still gate orders; client, protocol-book and peg-guard work is separate. Bond timelocks now run separately from escrow. Advertised order expiry is clamped, and the take window on the order book closes before a bond can expire. Existing 144-block maker bonds expire on upgrade, and those orders must be recreated. Running trades and Cashu mode are unaffected, but some operator configurations refuse to start until the bond timelock is adjusted.

Nostr WoT extension

The Nostr WoT extension, a browser signer with web-of-trust features, released 0.8.15 with an option to create the recovery key from 256 bits of the user’s own dice or coin entropy. Dice rolls are hashed with SHA-256 and coin flips are used as raw bits, in an isolated tab that does not show the recovery phrase. Onboarding now times out when relays are unreachable. Version 0.8.16 added standing grants for relay authentication (NIP-42), so users can approve AUTH once for all relays on a site or for every connected site (relay-authentication implementation). Relay or site denials override these grants, and revocations are rechecked before queued requests resolve. Broad scopes are always an explicit user choice and never apply to HTTP Auth (NIP-98). The queue cap stays at five, so excess requests still fail and retry. Version 0.8.18 merges import and recovery into one flow that detects key formats and previews the identity, and compatible Nosskey recovery keeps the same identity, existing accounts and original passkeys.

The separate developer SDK, nostr-wot-sdk, released 3.0.1 with stable identity 1.1 support. Passkey recovery, including through Nosskey, keeps the original pubkey, and provider, recovery and signing code now share one implementation (SDK recovery and provider source). Deprecated forwarder packages still work, but integrators should move to the maintained entry points.

Amethyst

Amethyst, the Android and desktop Nostr client, released version 1.20.0 with private polls and other Marmot encrypted group features. These include replaceable private votes, custom encrypted emoji, admin removal and reports, and media pinned to the group’s current epoch. The author did not rerun cross-client interoperability checks after review and did not test the change by hand on Android. Cache keys for competing branches that share an epoch number remain, and encrypted media keys can outlast disappearing messages. Settings sync stores six groups of app settings as encrypted NIP-78 data. Keys, signers, wallets, notifications, decks and read markers stay on each device. The first settings edit publishes all six groups. A read-only account keeps its settings local, and behavior across two signing devices is unverified.

Desktop system notifications follow the Notifications filter and skip throwaway outer gift wraps and muted DMs. Untrusted d tags over 255 bytes no longer cause errors. Kind lookups query only connected and account search relays, up to 200 events each. The apps use Quartz’s Kite JSON handling for frames, events, filters, and NIP-46 and NIP-55 messages, though signing over those two protocols was not verified on devices. A later library split moves Marmot and cordn protocol rules that other clients would need into shared libraries.

Merged source after 1.20.0, not yet in a release, runs the app’s Marmot receive path on the shared library. Every decrypted message is persisted idempotently. Joining records a baseline so the first membership change shows its row. A kind 445 message that arrives before its commit is held and replayed later, and admin catch-up commits staged departures. amy cordn migrate export disables the old home’s session commands until an import or the new resume command. The author ran loopback amy tests and library tests against local checkouts. The author did not manually exercise the live app receive path or run the Marmot interop suite. A breaking update to the proposed NIP-5D napplet format reads a napplet manifest hash as one /index.html artifact, replacing the old path aggregate, so legacy bundles need republishing. Required NAP domains that are unavailable fail closed, and optional ones stay absent. Icons get hash and decoder checks, storage is partitioned by manifest kind, artifact and snapshot, and resource blobs use canonical base64. Manual device testing, cross-client testing and live relay publication were not done.

Refusals in an external signer are now handled across coroutines that had no guard, so they no longer crash the app. PressStr ebooks, magazines and issues (kinds 33953, 34609 and 39731) now render. PDFs open in the in-app reader and EPUBs go to the system handler. Cards show file type and size, never download a large PDF just to preview it, and fetch issues only from the magazine’s author. The author did not report Android-device testing for this change. When rich previews are off, invoices and LNURLs appear as compact copyable labels without a Pay button, and invoice cards now show expiry times. amy gift wrap now dates the seal and the wrap at separate random times, each up to two days back. --no-backdate turns this off. The regular DM path gets its fix separately in Quartz. On desktop, each video card owns its playback, so cards with the same URL no longer take over each other’s video. The author tested this on macOS but not with a cold cache. A proposed Windows link fix opens links through rundll32 by its full path and falls back to AWT. The root cause was not reproduced, so this is a likely fix and not a confirmed one.

Myco adds encrypted napplet storage and signed update notices

Myco, an Android host for Nostr napplets, shipped 0.12.0 and 0.12.1. Napplets can now store NIP-44 self-encrypted data through the runtime, but apps with relay, outbox or mesh read grants can see the plaintext, so the data is not isolated per app. Users who logged in with Amber earlier must log in again to grant the new encrypt and decrypt permissions. Update notices are signed by a pinned publisher and reach only devices already running 0.12. Online, Myco can check Zapstore daily and Circle, while mesh-only mode asks only Circle, replacing the initial pause. An explicitly chosen local Blossom rail keeps files on the device with no server, up to 64 MiB per app per day. Failed uploads to an approved default server also keep a local copy. Neither path strips EXIF metadata. The releases also add Android TV support and a NAPFS file picker where the user chooses the files.

Tagged Releases

Monostr

Monostr, an Android Nostr social client, released 0.26.0, its latest version. Videos up to two minutes long are now compressed on the device, and location metadata is removed. Discover, search and onboarding offer curated follow lists. Threads and notifications now show Fediverse replies sent as NIP-22 comments.

Features from 0.25.0 remain. When a reply’s parent is missing, the app searches the reply’s relay hints and the parent author’s relays, which means briefly connecting to relays outside the user’s own list. Relays and live message subscriptions also reconnect whenever the device changes networks.

Sidecar

Sidecar, a Nostr browser extension and signer, released 1.16.3. The composer and highlight tool now publish to the account’s own relays and count only relays that acknowledge the event, then link to those relays. An acknowledgment shows the relay accepted the event, not that it will keep it. The expanded composer no longer falls back to the default relays in Settings. Each relay has its own 12-second deadline. Only a publish that fails on every relay is retried, once, on fresh sockets. Poll results also query four public relays for ballots. A change merged after the tag adds one more relay to catch ballots filed outside the usual relays. On one live poll, this raised the count from 21 votes to 23. That is one poll’s result and says nothing about completeness across the network. Counting still allows one ballot per person and ignores ballots cast after the poll closes. The earlier 1.16.1 limits standing signing grants to the account and site that approved them, and to a single addressable record when the event has a d tag. Grants never cover encryption or decryption. Profile, follow, mute and relay lists stay outside any grant. Deletions, zap requests, relay AUTH and wallet control are excluded too. A locked extension still asks for the PIN. Revoking a grant or forgetting a site clears its grants and approval windows.

A separate open pull request would make paying a CLINK offer count as a zap. It is queued under Unreleased in the changelog and does not implement Debits. The offer panel would pass a signed kind 9734 zap request with payer_data, so the service can publish a kind 9735 receipt. Receipts would go to the offer’s relay first and then the recipient’s relays, deduplicated and capped at six. The payer’s relays are not used. If an offer replies with code 3 and a successor offer that decodes, Sidecar would follow it once with a new request and a new signature. It would never write to the recipient’s profile. The change was still unmerged at the cutoff.

Roadbeacon

Roadbeacon, a location reporting client previously named Roadstr and distinct from the independent Roadstr app, released 0.4.0 under the new name as a new package with a new event format. Reports and votes now use shared, interoperable kinds 1315 and 1316, coordinates use exactly reconstructable integer frames, and the web version validates signatures. The package installs alongside the old one without migrating data. Older events remain valid on relays, but the new client cannot read them.

Jumble

Jumble, a Nostr web client, released v26.10.1. New features include a long-form article editor, muted words that sync across devices, system notifications, and readers for group and Git content. The pending-post and layout changes covered in a recent issue ship as part of this release.

A commit merged after the release adds an optional NIP-22 reply setting. It is off by default and saved as a local preference. When enabled, replies to kind 1 text notes go out as kind 1111 comments. Existing kind 1111 threads keep their root, and comments on other kinds or external content stay kind 1111. With the setting off, replies keep the legacy kind 1 behavior. The app warns that some clients may not display these comments.

nostr-idb

nostr-idb, a library that caches Nostr events in the browser’s IndexedDB, released 5.1.1 with query fixes. Exact-ID lookups now work for replaceable and addressable events, and every filter constraint and per-filter limit now applies, including to pending writes and subscription history. Cache pruning and zero-timestamp events are fixed. The in-memory cache size, maxMemoryEvents, defaults to maxEvents, and zero turns it off.

Manent

Manent, an encrypted notebook that syncs through Nostr, released 3.0.0 with voice notes. Recordings sync encrypted like other notes, and transcripts are generated offline with Whisper after the app downloads a model. The release also ships the relay authentication recovery covered earlier as source work, which now arrives through version 0.10.1 of NDK, the Nostr Development Kit library.

NoorNote

NoorNote, a desktop and web Nostr client, released 1.9.2 with device-local full-text search over notes and direct messages plus a cache-only mode. Version 1.9.3 restores readable dropdowns, menus and toasts after a transparent-glass regression in 1.9.2. These releases also ship the future-timestamp filter that earlier existed only in source. Profiles that fail to load now stay loading until the miss is confirmed.

Earthly

Earthly, a Nostr map authoring client, released 0.1.22 with relay and payment fixes. Relay authentication is now tied to the active account. Recovered subscriptions and counts tell an unavailable count apart from a real zero and keep counts across map revisions. Zap totals come from real zap receipts, and the app waits for wallet sync to finish before spending. Live Nostr Wallet Connect and mint payments remain untested (release integration).

Chama

Chama, an escrow trading client built on Nostr events, released 6.4.31, which checks seed backups before funding. Before this device’s on-chain trade key enters signed CREATE, JOIN or deposit terms, a relay must return the signed seed backup the device opened; a missing, retired or conflicting backup stops the trade. Retries resend the exact saved backup without a new seed. The readback shows availability then, not persistence. Multi-unit listings now use quantity orders. Version 6.4.30 counts storefront orders only when buyer-signed terms match the signed listing and guards against late outsider events on trades whose signed CREATE is dated 1 December 2026 or later, while earlier trades keep the old expiry behavior (trade-expiry and storefront validation).

An open pull request, unmerged at our source cutoff, would allow one wallet seed backup per identity. Startup would serialize first creation with an in-page queue and Web Locks, then reread relay state. Separate browsers rely only on that reread. A distributed lock and repair of existing conflicting backups remain outside this change. We did not test any money path.

Linky

Linky, a Cashu wallet that syncs through Nostr, added experimental on-chain transfers behind a flag in version 26.10.7 and the Android 26.10.8 build. A configured human operator completes send and receive requests within 24 hours for a fee, so transfers are neither atomic nor trustless. The coordination change uses custom Nostr app messages, NIP-78 operator configuration and a new link sync scope. That scope syncs the operator’s pending ecash sends so its other devices cannot pay, refund or settle the same send twice. A receive completes only when the user’s wallet gets the matching Cashu amount. Operator and user find each other only on recommended relays, not through NIP-65 relay lists or DM inbox lists, so losing every shared relay can break coordination.

LaWallet

LaWallet, a wallet and account service built on Nostr Wallet Connect, released version 2.9.0 and the Android 1.2.0 beta, both adding NFC card-assisted recovery to a new Nostr login (native recovery flow). Recovery needs a fresh, cryptographically verified card tap and a single-use recovery QR code valid for 15 minutes. Assets move in one transaction, roles do not transfer, old OAuth grants are revoked and the old login is left empty. Card recovery is on by default; account holders can disable it in Security settings and revoke outstanding codes. An unreachable wallet now shows a zero balance, which does not mean it is empty. The Android beta forces Sentry error reporting on in builds with a reporting endpoint, even after an earlier opt-out; local and F-Droid builds have no endpoint.

In source merged after the tag, the card callback can return OK before NWC settlement when the balance covers the payment, so point-of-sale systems must confirm their own invoice. A fixed payment cap replaces the balance-based limit. An open pull request, unmerged at our source cutoff, would allow sign-in with compatible passkeys from other apps through a configured provider or Nosskey recovery, confirming the account before issuing an expiring temporary session (#386). A provider can sign without importing the private key, and importing is a separate confirmed choice. Its screenshots show simulated demo responses, not proof of live cross-origin sign-in.

Another merge, also unconfirmed in a release, stops the NWC and Lightning address callback from replacing a user’s remote wallet after a make_invoice error alone. A liveness and balance check can keep the wallet and return a 503 instead. The service also remembers balances and protected-fund state, and it adds a Restore option. Its thresholds and the unknown earlier history limit what it can protect, so it does not guarantee that all funds are safe. No deployment or restored user accounts are claimed.

KithMoot

KithMoot, a Nostr-based app for room chat and calls, now works without its publisher’s public services. Between October 21 and 23 the publisher retired public meeting codes, the shared TURN service, file uploads and stored file reads. Invite links replace meeting codes, and public files default to Yakihonne with a first-send notice, though users can pick their own server. Calls still try a direct connection first, while Hide IP needs a working TURN server and never falls back to direct. In desktop 0.1.102 and Android 0.6.106, Cloudflare’s public STUN replaces the publisher’s, and users can set their own. Served backup copies were deleted, while offline encrypted copies remain. Desktop 0.1.109 and Android 0.6.121 block chat when device credentials expire while keeping drafts, and read the user’s own profile name separately from optional directory lookups. The ordinary call engine has not switched to the experimental realtime SDK preview, and the MLS group candidate stays off by default.

Desktop 0.1.110 adds sandboxed attachment viewers for images, audio, video and PDFs on desktop and the web. On desktop they run in a dedicated, non-persistent Electron renderer with no Node access, no application storage and no external network access. Streaming is bounded, and viewers are cleaned up when closed or when a message is retracted. The pull request’s WebKit run and an extra packaged hostile-SVG run stalled and are not claimed as verified, and none of this is a security certification. The macOS build is notarized, while Windows remains an unsigned preview.

A later merge, not shown to be in 0.1.110, renews expired device credentials by wall-clock time after sleep and before sending, keeping the draft while the signer responds. It follows a tester’s credential expiring overnight on a sleeping laptop. A signer request that never returns still holds renewal open, and Android has a separate unresolved renewal gap. An open pull request, unmerged at our source cutoff, would pause Help other people connect. The author says the app accepts a peer-assist pair without carrying its media, which can stop the fallback to a forwarder or TURN and leave a silent call. The library default would stay unchanged.

Marmot TS

marmot-ts, a TypeScript library for the Marmot encrypted group messaging protocol, shipped v0.8.0 and v0.9.0 with breaking changes. Encrypted media V2 adds source binding and decrypts delayed media after a restart, and Blossom upload descriptors, destinations and ciphertext are validated before signing. Persisted groups backfill in pages with retry for uncertain commits. Apps must now supply durable ingest and rewind stores whose adapters reject failed or timed-out reads. Legacy V1 groups must be recreated, since V1 helpers remain for history only.

Later merged source gives the key-package, invite and history watchers an optional AbortSignal. Their listeners are cleaned up promptly on return, throw or disposal, even while a storage read is still pending. Changes that arrive while a consumer is paused are latched and merged into one update. The underlying backend read continues after cancellation. Query failures still reject, and the change does not certify runtime interoperability.

Nostr mail client

nostr-mail-client, a mail client built on Nostr, released v0.19.0 with one login flow for bunker, nsec and ncryptsec, including approval of a remote signer’s auth_url. It now follows changes to DM, inbox, outbox and private relay lists without a fresh login, deduplicates mail notifications during sync, and syncs email signatures between devices in encrypted form. Email attachments over the 25 MB cap are discarded with a notice, and a Nostr-only address cannot receive replies sent from email.

Napplet conformance CLI

napplet/web, the web packages and tooling for napplets (web apps distributed as signed Nostr events), now ships last issue’s verification work in the versioned @napplet/conformance-cli 0.4.0. Before a headless run, the CLI checks the manifest’s event ID, signature and exact raw HTML hash, and it reports runtime binding, namespace and install failures separately from napplet errors. The embedded fallback covers only RESOURCE and GAMEPAD, so custom hosts must pass source and snapshot inputs explicitly.

Napplet’s deploy command now prepares Zapstore listings by default, capturing screenshots of each selected build and preparing a kind 32267 Software Application event; --no-screenshot and --no-zapstore disable these steps. Preparing metadata is not publishing a release, and the change adds no package release or asset event.

napplet-soy

napplet-soy, a workspace for building and publishing napplets, tagged its soyli command-line tool as v0.31.2 and v0.31.3, which are not a Studio deployment. Once Git delivery is confirmed, publishing marks included Git collaboration (NIP-34) proposals as merged after checking exact ancestry and target along with the current revision, and it reuses presigned statuses on resume. Newer proposal revisions stay open, and a tag containing a commit is not taken as proof that the target branch merged it. The source behind these tags also adds an initial Cashu wallet (NIP-60) view in a unified Manage workspace and keeps running napplets alive across tab changes. The earlier v0.31.1 updater tracks the stable GitHub repository ID, so installs keep their accounts and projects across the move to Soytec. Installs with the older updater must run the installer once.

The NIP-60 Cashu wallet redeems NIP-61 nutzaps and saves prepared mint outputs and signed relay updates before executing them, so uncertain requests can be recovered without repeating a payment. Wallets stay isolated per account and browser tabs cannot spend at the same time, but testing used fake mints and real-money interoperability is unverified. Contribution pages now support author-targeted zaps, paying the signed author of the chosen release or proposal.

The soyli v0.31.4 tag notes author contribution history and zaps, plus NIP-5D readiness, audio and testing changes. Domain calls no longer wait for the shell to report ready. A shared host coordinates audio that napplets own through NAPMEDIA without loosening iframe isolation. This tag is not a Studio deployment either. Five configured checks passed and five were skipped. Full conformance remains unproven, and the repaired apps await republication.

Pakstr

Pakstr, a command-line tool that builds Android apps and publishes them to Nostr, tagged v0.29.1. Before publishing, it reads the signer certificate an APK claims in its v2 or v3 signing block and matches its SHA-256 against the expected sidecar and identity proof (publishing review). Unsigned, malformed and multi-certificate APKs are refused, stale sidecars are removed on rebuild, and an invalid publishing nsec fails before the build. The parser does not verify the APK signature itself, which is left to Android and apksigner, so it catches stale, unsigned or wrong-certificate builds but cannot prove a build is not forged. ZIP64, multiple signers and key rotation are unsupported.

MDK

MDK, the SDK and runtime for Marmot encrypted groups, released stable v0.14.0. It ships media file handoff and storage, ordered offline catch-up, follow-list preservation and raw SQLCipher key rekeying, with MLS and the wire format unchanged. The 0.14.0 release guide and 0.14.0 integration guide require apps to ship a matching set of bindings, native library and headers, which MarmotKit 0.14.0 packages for Apple and Android. On Apple platforms the binary is a raw static XCFramework, so apps pair it with the matching Swift binding and copy its PrivacyInfo.xcprivacy resource into the wrapper product they assign; passing the release’s archive checks does not prove an App Store export will succeed. Database and storage migrate one way, rekeying every page once. Downgrades remain unsupported. Account media and handoff data should be excluded from backups. The WN agent remains prerelease, and the crates are not on crates.io. Known limits persist: history arriving more than five epochs late becomes undecryptable without notice. Media lost in flight across an epoch advance is unfixed; a group-context ordering compatibility issue also remains.

Tag ancestry shows the stable tag also carries five sync and media changes. Group subscription refreshes repack only changed REQ batch families; a failed family keeps its live routes for the next sync while the partial commit still reports a failed sync. Sends and group changes keep entering the durable queue when a pre-send refresh fails, though completion can stay CompletionUnknown. An unreachable relay’s REQ stays owed under the same ID until reconnect, so degraded coverage is not complete history. Onboarding repair approval waits for every discovery source and returns RetryableFailure when a declared source times out. Opt-in per-account media retention, from Keep forever down to 30 days, cleans media by received time or last explicit redownload, not last view, without deleting message history. Hosts must handle the new CleanedBySetting FFI value.

After the tag, merged source continued multi-device and push work that no release yet claims. Post-join history requests persist across commits and restarts, closing a gap between the Welcome and live messages. Counting members per account stops false notices about a person when a second device joins or leaves, and Welcome handling ignores deliveries meant for sibling devices without failing the join or consuming a key. For push, MDK gossips owner-signed records and tombstones after commits on new push gossip storage, re-shares tokens after membership adds and notifies all of a recipient’s devices, though the sender’s own devices still get no notification. Fresh random padding per trigger keeps deduplication from suppressing wake-ups. KeyPackage publishing adopts the account’s own relay lists and fails, preserving the stored list, if a list is incomplete or has no usable relay. Typed stale-epoch and unsettled media statuses tell apps whether to upload again or sync and resend, and transfer state changes arrive immediately with byte progress batched.

Newer account-device source is progress toward a later release, not a stable 0.15. Three October 28 nightlies, labeled testing-only, are pinned to commit b8d0a49, which predates later merges, so their assets do not contain all of it. MDK selects compatible KeyPackages per device for up to 20 recent devices per account, and signing out withdraws only this device’s publication slot. Fresh packages last 30 days plus one hour and refresh six to seven days after publication. Discovery seeks every device, but relay failures can omit some; re-inviting may help, with no guarantee of automatic recovery. Authenticated per-leaf capability checks replace the per-account cache. New groups require the account-devices component 0x800d when every founder supports it, and upgraded devices now advertise it. Such groups reject older devices lacking it, while existing groups stay unchanged. Under the requirement MDK rejects component data, unsupported leaves, more than 20 leaves per account and attempts to drop the requirement, leaving legacy and nonrequiring groups as they were. Separately, it refuses host-supplied initial data for app components whose schema has no data before any group, Welcome or event is created.

In 0x800d groups the engine gains own-account add and remove authority with parent-state-aware commit classification, separating self-update, self-remove, same-account and admin commits, with same-account privilege requiring by-value proposals. Matching Welcome handling accepts same-account Welcomes only in those groups and only after component state and signature checks; other groups still need an active admin. Own-account add and remove send intents get a fair scheduler turn, but app APIs do not expose same-account send intents yet. A device’s own leaf removal now decides its local membership, so a sibling’s presence no longer keeps a removed device’s member actions.

Push gossip adds durably queued kind 447 announces carrying 8-byte digest prefixes of records and tombstones, sent on join, on record change and on a seven-day message cadence, and peers repair missing owner-signed records through ranked, staggered responses with duplicate suppression and a 24-hour bound per leaf. In recovery, cut and cancel no longer invent fresh loss, and 24 attempts without progress park an obligation behind an incomplete-history warning. The coverage ledger runs only as a shadow recorder, while a time-sliced sweep resumes oldest-first slices with no production scheduler yet. Opt-in audit files expire 30 days after the last write, with cleanup at startup and hourly. Deletion can occur a day later; the separate key-reveal security log is excluded from that expiry.

A pairing crate uses ephemeral X25519, a commitment, a seven-emoji comparison the user checks on both screens, and HMAC confirmations ending in a ConfirmedLink. Its wire adapter covers transport only and is off by default pending a spec, the UI and the Welcome and group-link follow-ups are unfinished, and interoperability of this implementation remains unverified. Device-roster 0x800e source applies diff updates to a hidden single-account group, but advertising 0x800e requires a test-policy override, so production builds cannot yet create or join a device group.

Other MDK proposals remain open. One would stop treating a NIP-67 finish as proof of complete coverage, because the unscheduled sweep offers no completeness guarantee. Others would add checkpoint replay, automatic rejoin and 0x800d activation in existing groups. Three earlier native API proposals are still open in a fresh status check. Historical attachment recovery would inspect source slots and check authenticated digest and expiry before writing verified bytes to a private leased file, keeping the timeline network-free; a delivered copy is a snapshot that cannot be revoked. Filter-wide chat selection handles would cover every chat matching a filter beyond the loaded page while excluding later arrivals, and founding-admin selection for wn-agent group creation would pick invited founding admins and reject non-members before upload.

nosfry

nosfry, a Nostr relay written in Rust, released nosfry v0.2.0 for its native and Workers/SQL editions. It ships features unreleased at v0.1: NIP-09 deletion, NIP-40 expiration, NIP-42 AUTH with NIP-70 protected events, NIP-45 COUNT, NIP-77 Negentropy sync, NIP-62 vanish requests and the NIP-86 admin API. It also adds bounded subscriptions with an outbound budget and write policy, and describes permessage-deflate as on by default. Its performance and conformance claims are not independently reproduced, and it does not claim to interoperate with every implementation.

Four hardening changes merged on 25 October, after the 0.3 tag, and are not in a released binary. Worker connection and rate buckets aggregate IPv6 by /64 while the NIP-86 IP blocklist still matches exact addresses (#78), and NEG-OPEN scans charge the global sync memory budget in 1024-record steps during collection (#73). Same-timestamp tie groups keep a heap bounded by the query limit (#72). NIP-86 moderation snapshots apply to stored reads and live delivery as captured at request time, so an open request does not pick up new bans instantly (#68).

A further merge, also unreleased, bounds the writer by a 64 MiB byte budget and drains publish backlogs in larger transactions, each capped by work done, while keeping durable LMDB sync. The project’s benchmark figures come from its own probe variants, not our measurements.

nostream

nostream, a TypeScript Nostr relay, released nostream 3.7.0 and nostream 3.8.0. Version 3.7.0 ships the admin operations, audit logs, signed webhooks and metrics we earlier reported as source-only. It adds an opt-in lifecycle for paid writes and fixes ISO time parsing and expiry for LNbits 1 and later. Static mirroring is removed, and its settings are now ignored with a warning in favor of NIP-77 sync. The 3.7.0 container image failed to publish because its Docker tag contained an illegal @, and 3.8.0 fixes the tags and adds re-runs for failed image builds. Version 3.8.0 also brings pubkey and kind lists plus IP and rate-limit bypass controls to the admin API and console, with statistics on top publishers, IPs and rate-limit hits, and fixes a Redis key collision when switching rate-limit strategy or upgrading. The source alone does not confirm that the images now publish, and no deployed billing is claimed.

A separate Rust rewrite on the rewrite/main branch merged its first wire core that answers a real client in 740ef69, and at 2b2287f the strategy registry implements the 14 remaining strategy arms. This non-default prototype stays separate from TypeScript main and the stable 3.x releases, and its review and CI results come from the author. NIP-43 and NIP-56 handling stays off by default. A vanish request can still lose a race with a concurrent publish, so vanish is not a privacy guarantee. The author’s request for manual review of the access and identity code still stands.

swift-nostr

swift-nostr, a Swift Nostr SDK, published 0.9.0 on October 27. The release adds typed keys, event IDs, URLs, timestamps, coordinates and subscription IDs, EventTemplates that any local or remote signer can sign, typed errors, pool-owned subscriptions and RelayRoute routing through the pool, exact relays or the NIP-65 outbox. Event.verify now throws on a bad signature, so moving from 0.8 requires source changes. The earlier 0.8.0 was a hardening release whose notes say it verifies replaceable events, gift-wrap senders and NIP-46 and NWC responses, deduplicates multi-relay responses and adds signer-driven or shared-key NIP-44 encryption, with stricter zap checks as a breaking change. These are the author’s claims, not an audit.

The post-0.8 fixes we covered earlier now ship in 0.9.0. Signers refuse events whose public key differs from their own, and unsubscribing no longer opens a disconnected relay to send CLOSE. The core send call throws notConnected and subscribing connects explicitly, though NWC and NIP-46 transports still reconnect a dropped relay for a new request. NWC and remote-signer calls get typed errors and immediate cancellation, though an already-sent request may still be acted on. NWC notification and auth-challenge streams end when relays terminate, connection waits fail once all relay streams end, and filter tag queries are stored once for one JSON key per tag. A generic WalletConnectRequest supports custom single-response NIP-47 methods with the usual result_type and error checks, while multi_pay stays separate. An extensible RemoteSignerMethod calls NIP-46 methods beyond the built-in set and returns the result string; in both cases the wallet or signer must support the method. EventTemplate with signer.sign lets remote NIP-46 signers use helpers such as zap requests that once required a local EventSigner, with companion changes to several data models and NIP-29 and NIP-98 builders. That change alters the API, not the wire format.

Code merged after the 0.9.0 tag is not part of that release. A caller cancelling a send now keeps healthy relays, and DM open and result types are simpler, with the rumor author bound to the signer. FileAttachment unifies encrypted file metadata. A single setSigner and removeSigner pair stops a stale remote set from undoing sign-out; removeSigner stops AUTH replies but does not revoke remote requests already sent. Reconnect and deduplication settings get their own configuration types.

haps

haps, an installer for software signed with Nostr keys, released haps v0.1.22. It builds on haps v0.1.18, which ran Linux and macOS source builds in a private home directory and writable checkout with network access off by default. Explicit allow-build-network and allow-host-build options can override this. Windows source builds require host-build. Installed apps remain outside the sandbox. haps v0.1.19 added one audit-and-install confirmation that ties the pinned source and build recipe to the built payload hash, so a matching publisher binary can be installed under that reviewed build’s policy. Reusing a trusted review does not count as another independent audit. Installs from immutable signed catalogs still require an audit, and published warnings need a separate consent that defaults to No. Version 0.1.22 adds bounded lookups and complete-source publisher checks. Lookups now share short deadlines, with the client starting queries after the first relay connects, and snapshot searches return the verified results found within one 3-second budget. Before changing any source ref, publication refuses to run unless it finds a qualified bundled git helper, a separately installed helper matching the pinned companion binary, or a helper advertising complete-blob-dag-v1. Baseline dependency-review coverage, symlink and size guards and bounded retry are retained, which is not a new independent audit. One successful cold install does not show that intermittent transfer timeouts are fixed, and pinned helper bundles still depend on the host toolchain.

Swarm protects its admin API with NIP-98 authentication

Swarm, a Nostr-connected publishing and admin server, released v0.2.0 with NIP-98 HTTP authentication for its admin API alongside the existing dashboard cookie. The server checks the kind 27235 event’s signature, a timestamp window of five minutes past to one minute ahead, the HTTP method, path and query, the operator’s pinned pubkey and an optional payload hash. Accepting a forwarded host assumes a trusted proxy in front. The formerly public /environment endpoint now requires admin authentication.

A later merge, not confirmed in a release, adds opt-in crossposting to X for linked team members’ kind 1 notes. Scheduled notes and notes arriving over WebSocket go through the same path. Replies with e tags are skipped, nothing is backfilled and duplicates are removed by event ID. The CMS side uses NIP-98 authentication. Posting depends on local OAuth or a trusted delegate service, so it is neither decentralized nor trustless. Posting to the production X service has not been tested.

fips2go, an Android mesh client that finds peers and domain claims through Nostr adverts, released versions 0.9.6 through 0.10.0. Version 0.10 turns on direct links by default to the servers of up to two most recently verified domains, counting only domains pinned through DNSSEC or multiple resolvers. These links expose the phone’s public IP address and online timing to those servers and reveal its server choice to public relays, but users can switch them off. A TXT record already pinned for an exact server and port now resolves without a fresh Nostr claim, while new servers, moved ports and records without a port still wait. When a network switch needs new VPN routes but the configuration is unchanged, the app replaces only the tunnel and keeps its node, links and sessions. Hotspot changes, other configuration changes and failure fallback still rebuild the node.

fips-pub-domains answers pinned lookups before fetching claims

fips-pub-domains, which resolves Nostr-signed bindings from public domains to mesh addresses, released 0.2.9 and 0.2.10. A TXT record pinned for an exact server and port can now answer before the background claim fetch finishes, under the same pin policy, while a new server or port still waits for a claim. At desktop startup and after network changes, the resolver warms up to 16 pinned servers, revealing online presence to them and to routing nodes. During the first 20-second backoff it retries every three seconds and ends early once a server answers.

Two changes merged after these tags are unreleased. One adds a fips-ca ServiceClaim role with no port and its own DNSSEC chain and attestation, separate from fips-dns, without launching a new PKI or changing DNS binding policy. The other adds CLI verify and zone commands that read pin files without writing them. In this code, an attestation carries only its own previous witness and other role entries are reverified. A require-previous option refuses missing data but cannot tell an outage from a nonexistent record.

Codr

Codr v0.8.0, a bridge for controlling desktop coding sessions through White Noise encrypted chats, adds a worker update that is confirmed in the chat and must happen within ten minutes. It pulls ngit records from a pinned maintainer and checksum-verified Blossom bytes, with no GitHub fallback. It refuses connector or storage cohort changes, and if startup fails it restores the old executable. So far the update has only run against test fixtures. Files and media now reach a busy session without interrupting it, up to 25 MiB and four attachments. Optional Gemini transcription sends decrypted voice notes to Google and is off by default. Releases 0.4 to 0.7 delivered phone text into busy sessions, added /cancel and project, agent and model menus, and moved to MDK 0.14. Migrating from 0.13 works in one direction only and requires a backup and approval.

An opt-in owner-only control chat (control_chat=true, off by default) creates its group on the next worker start. /new starts a project session before any chat is linked. If creation is uncertain, it is not retried automatically.

An open pull request, unmerged at our source cutoff, would let group creation for a new coding session treat a transcript that has not been written yet as empty. Invalid or ambiguous transcripts would still be rejected. This would restore phone invitations for fresh /new sessions before the first prompt and would not change how sessions are authorized.

nostr-media

nostr-media 0.17, a WordPress plugin for hosting Nostr media, hardens Blossom mirroring. It now checks the signed kind 24242 hash authorization before fetching a mirror URL, refusing unauthorized requests without downloading. Fetches use WordPress’s safe HTTP API, which allows only public HTTP(S) hosts and validates redirects, capped at 20 seconds, three redirects and 128 MiB, and downloaded bytes are still hashed and checked. Authorization, X-SHA-256 and X-Content-Type headers match case-insensitively. Server-side request forgery protection is only as strong as WordPress’s safe API.

NosTube

NosTube, a video site built on Nostr, released server 0.1.25 and desktop 0.2.51 to drop trust in a compromised certificate authority. The server’s Rust relay no longer trusts it for WebSocket or HTTPS connections, and image builds now require a fixed Debian system CA bundle. The desktop release applies the same mitigation to its TLS layer and almond sidecar. These security claims come from the release notes. The later server 0.1.27 notes say DO NOT USE that image because it ships an outdated libbrotli1, and point to 0.1.28, which we have not confirmed as released.

bitchat

bitchat, a messenger running over Bluetooth mesh and Nostr, released 1.8.0 with performance work for Nostr location chats (geochat) and bounded timestamps on DM rumors. The app now recognizes the user’s own messages by sender ID, not nickname (sender-identity fix). Private groups pin their creator, and the mesh peer ID stays out of geohash DMs. The performance figures are the project’s own and unreproduced by us.

An open pull request, unmerged at our source cutoff, would keep geographic chat connected through relay outages by routing over the five nearest relays plus five shared backups, capped at ten connections per route (#1822). Messages would queue before the relay directory loads, and subscriptions and pending writes would migrate without an identity change. Validation is the author’s own, and the Android companion change is a separate pull request.

Another open pull request, also unmerged, would add live video over the iOS and macOS Bluetooth mesh using a custom LIVE_VIDEO_V1 format, not a Nostr transport. Public frames would be signed and freshness-checked. DM frames would travel inside Noise encryption; recordings would be sent as messages. The author reports that an Android-to-iPhone stream was received. Sending from an iPhone, iOS-to-iOS pairs and DM live video are untested.

ngit

ngit, the command-line tool for Git collaboration over Nostr, released v3.0.4. Relay connections, along with HTTPS on Android, no longer trust a compromised certificate authority. Interactive prompts now guard against blank input, and commands respect offline filters. Remote-tracking updates preserve commits that have not been published yet. Diagnostics also tell a missing source apart from a query that returned no results.

Hasheus

The file verification tool formerly called verify is now Hasheus and released 2.0.0. It checks files against hashes published on Nostr, now taking descriptions and URLs from trusted verifiers and hashing large files in chunks. The verified banner appears only on the exact published file. It also handles malformed profiles, deduplicates verifiers and errors on a missing relay. A matching checksum confirms the file, not the publisher’s claims about it.

Alby JS SDK

Alby’s JavaScript SDK released 9.0.0. NWC clients now give each published request a fixed 5-second wait for the relay’s OK and fail with Nip47PublishTimeoutError when it does not arrive, while per-method reply timeouts are unchanged. A reply that fails to decrypt now rejects, and relay failure text is kept (request-error handling). The breaking change removes the deprecated multi_* methods, and code using Nip47SingleMethod should move to Nip47Method. A relay OK means the relay accepted the request, not that a payment succeeded.

Alby Hub

Alby Hub, a self-hosted Lightning node that serves wallets over Nostr Wallet Connect, released 1.24.4. The patch removes trust in a compromised certificate authority from its native LDK and Go TLS connections, which the hub’s NWC wallet service depends on. It also fixes startup of the CLN hold-invoice plugin.

Orchard

Orchard, a Flatpak software catalog, released 0.3.0. The release links software release interoperability with NIP-82 and preparation of Flatpak assets for publishing through ngit or other NIP-82 tools. NIP-82 is a proposed software catalog spec that has not been assigned or accepted, so Orchard implements a draft that may still change.

Bell

Bell, an Android aggregator for Nostr conversations, gathers replies and quotes for multiple accounts into one chronological list. Its 0.1.0 notes exclude likes, zaps, plain reposts and generic mentions, and accounts sign through Amber or stay watch-only. Releases 0.6.0 through 0.9.0 added per-account mute rules and an unread-only view with multiselect mark-read. Their notes say recovery keeps exact signed replies and reactions without automatic duplicates. 0.10.0 and 0.10.1 let users hide individual posts on the device, with undo and restore. Hiding does not delete anything from relays, and new replies still appear. Spam reports cover both the post and its author, go out publicly from an explicitly chosen account and do not act as private blocks. 0.11.0 adds reposting after users review the original post and the sending account. An account avatar picks who replies, reacts or reposts. Being able to publish reposts does not mean plain repost notifications are now aggregated. Cached threads can stay incomplete, and opt-in background listening depends on Android power and network rules, with no promise of always-on or immediate delivery.

SkateSpots

SkateSpots is a community map of skate spots and shops. Version 1.7.4 added end-to-end encrypted community chat, in which a community bot approves new devices automatically and admins can also approve them. 1.7.0 made the community relay the authoritative source for spots and shops. 1.7.3 fixed Android invite QR codes for the private crew chat, which was introduced in earlier releases. Releases 1.7.8, 1.7.10, 1.7.15, 1.7.19, 1.7.20, 1.7.21 and 1.7.22 extend that crew chat. Unlike the community chat’s bot approval, an existing crew member approves new devices by QR, members and devices can be removed, and promoting a founder republishes the admin tag. Reactions, delete tombstones and read receipts travel as encrypted MLS controls. Tombstones are not hard deletes on relays, and automatic receipts come only from silent signers. A background watcher uses the member’s own key, never an admin key, and turns join requests into NIP-17 DMs or bell notices about once a minute. For Amber users, join notices wait until the bell is opened, while silent signers can preload them, so Amber is not prompted in the background. Unread counts use pending NIP-17 envelope IDs without decrypting them, exclude the user’s own sent copies and do not reveal or confirm a subject. Instant or continuous background delivery is not guaranteed. Releases 1.7.19 through 1.7.22 also add a global dataset search that runs only while the command palette is open, and they remember map and layer state. We have not independently device-tested or security-audited these changes.

Emanator

Emanator, a multi-account Nostr client, can now start NIP-17 private conversations in 1.5.0, where earlier releases only answered existing threads. Users pick a messaging-enabled sending account, then search contacts by name or NIP-05 or paste an npub or nprofile. Existing conversations are reused, and if the recipient lists no DM inbox the app offers best-effort delivery plus a legacy option. Under 1.4.1. Retries keep already-accepted signed events. Only old events no relay accepted can be re-signed and re-dated.

Feather

Feather, an Android Nostr client last covered in issue #45 during its 0.9 series, has since reached 1.8.4. The 1.x notes add native NIP-34 issue browsing and reporting over a repository’s advertised relays. Signed actions now wait in an on-device outbox that WorkManager delivers in the background, sending parents before replies. 1.8.0 adds kind 20 picture posts with saved drafts and offline delivery, and 1.8.4 adds optional muting after a successful report. Since 1.7.0, translation goes through the separate Offline Translator app and its language packs, with no cloud fallback.

OUTKAST

OUTKAST, an Android Nostr client, adds on-device Network discovery in 2.2.1, surfacing notes from unfollowed accounts that people you follow liked or reposted in the last 48 hours. The notes say ranking counts reactions, replies and zaps by number (not sat amounts), then weighs friend count and newness, with no ranking server. Once you follow 40 or more accounts, a note needs at least two friends behind it. Results stop at 100 notes with no older pages. The notes also describe custom feeds from chosen people or lists and a photo editor that saves edits as metadata-free JPEGs while unchanged originals upload untouched.

CustID

CustID, a Nostr signer app, now requires biometric approval for NIP-46 ASK requests on biometric-protected identities in 0.2.2-beta, though a recent authentication can satisfy the prompt. Remembered approve and reject rules, older approvals included, now apply silently over both NIP-46 and NIP-55. Enabling auto-approval first shows a confirmation warning, and cancelling it changes nothing. The beta also adds NIP-89 client tags to the events it publishes. They are on by default and show readers which app published an event, and a Privacy setting turns them off.

Nostr Vault

Nostr Vault, a Nostr client, adds opt-in FIPS device connections in 3.0.0, paired by address or QR code, so a Mac or spare phone at home can act as a vault. The vault syncs notes and history, fetches existing photos over the mesh and, once the mesh is enabled, starts with the relay after reboot. Public media posting still needs a public media server. The release also fixes cross-account races around follows and signup, waits for the user’s own write relays to acknowledge a post before reporting success, and keeps DMs from strangers behind Requests.

Holoboard

Holoboard, a board where people pay to place posts, ships Android 1.1.0 alongside a guided Add to board flow on its website and backend that ends in payment. Guests can submit text and links or an existing Nostr post. Prepared invoices resume in the same browser profile on the same device, and the invoice QR stays available without an account or a connected wallet. On its own, the APK only refreshes the launcher icon and splash screen, so the board changes depend on the matching website and backend. There is no email or password sign-in.

Hopp

Hopp, a podcast app with value-for-value boosts, moves past the 0.2.x identity and payment work covered in issue #45. Version 0.3.0 adds encrypted cross-device sync and restore over Nostr, with no Hopp server, covering subscriptions, progress, favourites, Up Next, listening habits and download settings. Restoring keeps the existing library, and a status view shows relay and pending state. The notes say boost shares with unknown outcomes are guarded against duplicate retries, and budgets now account for Release Boosting and Boost2Unlock.

Nostrautica

Nostrautica, an event companion app, adds offline event packs in 0.15.1 that save people, matches, talks, the event page, posts and profile pictures for venues with weak signal. Its chat gains mention names and edits with deletions, and pending sends can be retried or discarded. Version 0.16.0 moves to MarmotKit 0.14, a Marmot group messaging library, for offline catch-up with fewer group relay connections, and keeps unread messages through retention cleanup. The storage migration is one-way, so older app versions are unsupported afterward. The notes claim no change to interoperability with the White Noise messenger or the web.

Staircase

Staircase, a Nostr group chat app from relay.tools, adds a Frequent notification mode in 0.1.25 that checks roughly every 5 or 10 minutes, then disconnects. In deep sleep Android scheduling decides timing, so background delivery is neither instant nor guaranteed. Periodic and Frequent modes run one bounded check when the network returns, at most every two minutes; Instant mode is unchanged. Group-join status stops waiting once a request is handled or expires, without saying which. Custom coordinator relays stay under user control, not overwritten by a published list.

In Development

Coracle

Coracle, a Nostr web client, merged a routing fix on master. Clicking a menu item such as Lists or Groups while that same modal is already on top now does nothing. Previously each click stacked another identical panel. Escape closed them one at a time. Distinct modals and normal page navigation work as before. This is merged source, not tied to a release.

nostter

nostter, a Nostr web client, merged five fixes to its zap flow. A Nostr Wallet Connect pay_invoice reply now counts as success only with the right result type and a valid preimage, with the error field null or omitted. Malformed replies are rejected. The dedicated rx-nostr client is always disposed, even when setup fails. Ten seconds without a wallet reply is treated as an unknown result, not a failure. Invoice and signing errors appear inline and keep the amount and comment for a retry, and invoice failures are reported separately from NWC failures. The zap button stays enabled for repeat zaps. Its orange mark also appears when a QR invoice is shown, which does not confirm that a manual payment went through. Reopening the dialog resets it only when idle. Closing it after the invoice or signature arrives stops a new NWC payment, but a payment already submitted continues.

An open pull request would show a warning to check wallet history before paying through the QR fallback after an unknown result, and would suppress the automatic wallet launch. A timeout does not mean the wallet made no charge.

Pollerama

Pollerama, a polls and feed client, merged a per-relay request queue. The queue adjusts how many requests run at once, backs off when a relay rate-limits, splits oversized filters and normalizes relay URLs. The Mine packs view now keeps a standing subscription, so slow relay responses still appear. Known re-request issues in the app remain open, and direct messages were not tested with this change.

Grimoire

Grimoire, a Nostr social client, merged fixes to direct message sync. The history cursor no longer advances on merged relay pages that reach only partway back, and an abort guard stops a decryption pass from refilling messages and seen markers after logout wipes them. An aborted backfill stops before moving the cursor or marking history exhausted. Gaps remain: one answering relay can still mark history exhausted while others are missing, and a signer’s permanent refusal still advances the cursor.

nostr-vpn

nostr-vpn, a VPN that uses Nostr keys for peer discovery, merged a mobile reconnection fix. When a discovery probe is already due, the client now re-arms exhausted paths to known peers. It does so only when nothing has been received recently and no connected or pending path exists, and at most once every 300 seconds. Healthy and pending paths are left alone, and the wire format is unchanged. The author tested the fix against an isolated native fixture, not on cellular networks. A second merged change removes network join secrets from doctor bundles by leaving the enrollment join secret and raw daemon state out of diagnostic output. The Nostr private key was already redacted there. Bundles shared before this change stay exposed, so anyone who shared one should rotate the affected join secrets.

Several related changes are still open proposals and have not been merged or released. For stored secrets, one would keep network join secrets in platform secret storage through the existing migration path. Another would limit Windows machine sidecar secrets to SYSTEM and Administrators, covering the DPAPI files that hold Nostr node keys. That restriction applies only the next time a file is written, and there is a brief gap between file creation and the ACL. Custom config paths are not covered, and the author did not test on a multi-user Windows machine. For signed membership, one proposal would reject join approvals whose roster snapshot no longer matches disk, so the admin reloads and retries while preserving concurrently approved devices. Another would allow five minutes of admin clock skew and always require a configured join signer, even when the local admin list is empty, while keeping the binding to the request secret. A third would break ties between equal-timestamp rosters by artifact hash. Peers that see both rosters would choose the same single roster; each retains its own membership contents. A final proposal would require confirmation for deep-link join requests and paid exit providers. Join links on macOS and Linux would wait for an explicit Add-device step. macOS would also hold paid-provider links for confirmation. Running it natively on either platform was not demonstrated. All test results are reported by the author.

Buzz

Buzz, a community relay with desktop and mobile clients, merged group and agent work. Agents can authenticate under the project’s NIP-FI JWT spec, which verifies the issuer-asserted human owner; denying or disconnecting that owner ends its agents’ sessions, and owner community membership can admit an agent. Huddles also accept verified managed-agent records from the current user or Huddle owner besides the NIP-OA owner-attestation bot role. This fallback is a compatibility policy and does not trust unknown third-party records. It is not identity proof. Neither spec is an accepted NIP.

Open announcement channels can admit read-only guests through join_role=guest, and unlisted open channels are hidden from non-members’ discovery but readable to anyone with the channel ID. Admission events can add up to 100 members, with partial success possible. The channel-setting fix, reported last week as an open proposal, has now merged: Changes commit in one transaction with their requests and notices. A failed public-to-private switch rolls back fully, preventing removed members from reappearing through that rollback. On mobile, push setup failures no longer break the app, which retries a limited number of times and offers manual recovery, with mocked-channel tests and APNs device behavior unverified. Synced mutes no longer cause a blank startup, now checked against actual DM push subscriptions; this fix rests on one iPhone log. In the relay mesh, dead peer records expire after five minutes without heartbeats, while live connections are exempt.

Newer merges are not confirmed in a release. Kind 9000 membership additions now commit together with their roster writes: a failed change stores neither, and the same signed event can be retried. Kinds 9001, 9021 and 9022 keep the old gap. NIP-FI shadow-mode diagnostics now log the verified Nostr key and a fixed private reason for would-deny cases, without logging tokens or claims. This changes no admission or enforcement. Buzz’s own NIP-AP agent spec, a project document outside the accepted NIPs, now requires a client-defined agentType in settings. Launches with another type’s settings are refused, a missing field keeps its legacy meaning and retyping can discard the old type’s nested settings. Solo agent selection fails closed on malformed newest kind 30177 managed-agent policies. Older data remains excluded. It labels agents by their owner-managed name, while artwork and message authors still use profiles.

On mobile, hosted agent create, list and delete uses NIP-OA owner proof and kind 30177 registrations with durable same-identity retries, and keeps private instructions in secure storage. Its build-time hosted gate is off in App Store and internal builds, so this is not public availability. Hosted iOS invite cold start keeps the invite intent, imports a matching key and recovers from backup. Only the author tested the main path, and the membership fallback endpoint and fresh signup remain unresolved. Push enrollment recovery waits with exponential backoff and then replaces a saved request rejected with 401 by a bounded fresh challenge and App Attest key. It keeps intents after 400 or transient errors and treats an ordinary 404 normally. This recovery has not been checked on real devices. Message links to public channels the user has not joined fetch kind 39000 metadata and open read-only, while private channel and DM gates stay unchanged. Links queue during reconnects, and one slow lookup can delay later links by up to eight seconds.

Several open pull requests were unmerged at our source cutoff. A disabled-by-default buzz_v1 capability would replace client-side read state with caller-private NIP-98 sidebar, read-state and coverage APIs, plus per-person revisions and relay-only kind 24300 invalidation pings. Relays without the capability keep NIP-RS, and large databases must build their indexes concurrently first. Thread summaries would scan only the latest 1,000 replies, return the latest 10 authors and send live updates at most once per second per pod, so they would not list every past participant. Agent answers to reactions would thread under the reacted-to message, using the last valid NIP-25 e tag and falling back to the old anchor. Hermes-backed agents would get an agent-scoped MCP shell for posting to channels and DMs. It refuses to run without its bridge and redacts credentials, but installation, restart and live posting are unverified. An ACP adapter fix would send both v1 and v2 initialization names, fall back to stable v1 and pin the validated major version. This repairs agent transport and is not a Nostr protocol change. Mobile Read Aloud would use the phone’s text-to-speech engine and skip code, links and attachments. The engine the user selects decides where speech is processed. A standalone relay load generator would simulate humans and NIP-OA agents and fail runs that break set error and latency limits. It changes no relay code and does not prove production scale.

Mosaico

Mosaico, a daemon that coordinates agents in relay-based groups (NIP-29), merged heartbeat-based presence. An agent now counts as present in a channel only while it publishes a status event with an expiration timestamp (NIP-40) set 90 seconds ahead and renewed every 30 seconds. A locally running process no longer counts as presence on its own. Membership persists while an agent is offline, so it can resume. A rebuilt group read model is constructed once per relay change with a canonical arrival cursor, so chat is no longer lost when a broad group subscription is replaced.

Three later merges are not confirmed in a release. Replacement subscriptions now use fresh REQ IDs and open before the old one is closed. A retired profile is published outside the latency-critical path, and an agent leaving a channel withdraws its presence while still a NIP-29 member. The supporting probes are the author’s, not our measurements. Claim-first retry accounting is stored durably in schema 27 and survives relay replay. It backs off exponentially from 30 seconds to one hour on a single serial timer and gives up after 10 failures. A missing event is not treated as a deletion, and because the retained window holds 4,096 entries, delivery of every event is not guaranteed. Group-only snapshots now wake group consumers, and replacements with equal timestamps keep the lowest event ID as NIP-01 specifies. Content-only changes still wake the general consumer. A scoped fallback for a missing parent may wait for the next group change or a 15-second timeout.

Sonar

Sonar, a messenger combining Nostr, MLS encryption and Bluetooth Low Energy mesh, merged a startup fix for cellular connections. The PR traces slow first paint to the push relay attach holding a store lock. On Android, startup skips that lock when the local node is already open, as when push registration opened it before cold start. On iOS, the app tells the notification service extension to stop connecting and draining so the app can render.

Shopstr

Shopstr, a Nostr marketplace, merged the listing deletion support that was proposed last week. A seller’s signed event deletion request (NIP-09) now removes the listing from the cache and tombstones it, so a deleted item cannot reappear or be bought from the cache, while newer relistings still show. Some deletions are still missed: a deletion arriving before its listing is ignored, older requests without a k tag do not match the relay query, and past deletions are not backfilled. Relays may also keep the deleted events. Separately, malformed gift-wrapped messages no longer stall the Orders and My Listings views, and sellers can now view their own orders while other users still get a 403.

Three open pull requests, unmerged at our source cutoff, target order integrity. #665 would record each order’s participants once through NIP-98 registration, taking the buyer from authentication and the seller from the signed listing, and later writes could not change them. A failed registration would not stop checkout, and new unresolved orders would not be guessed from tags. Legacy orders are only covered up to a limited cutoff, and a gap in how status is stored by order ID stays unfixed. #666, which depends on #665, would apply gift-wrapped (NIP-59) order status messages only when they come from the order’s recorded buyer or seller, not just any authenticated sender. Unresolved orders stay pending, a buyer’s post-payment confirmation does not count as seller confirmation, and forged messages stay as chat without changing order state. #664 would read Cashu v2 keyset token metadata for escrow registration and rulings without a network keyset lookup and correct the proof sum. The create-order token decoding still needs a separate fix.

Conduit

Conduit, a Nostr marketplace with paired buyer and merchant apps, merged a single encrypted account record. Wallet metadata, seed, native identity, address, preferences and setup progress now live in one arbitrary custom app data (NIP-78) record, encrypted with versioned encrypted payloads (NIP-44) and checked for signature, owner and derived identity; both apps find it once the signer approves. The cutover is backward-incompatible: older backup and recovery paths are ignored, and legacy backups stay in place without automatic migration. Other merges add sign-in with an existing nsec, kept in local browser storage, require exact signed shipping terms when editing product families, and move checkout recovery to IndexedDB with readback before marking it saved.

Conduit also moved to NWC SDK 8.1.1, bringing its amount validation, bounded connection attempts, closed-pool handling and in-flight response fixes. Conduit’s wallet choice, encryption and payment policy are unchanged. App deployment remains unconfirmed. Two draft pull requests remained unmerged at our source cutoff. Pay activation would persist, read back and deliver payment state within a fixed two-minute execution window that retries do not reset. Nostr receipts, private account recovery and stock or fulfillment changes would each need separate signed evidence. Receipts kept for 24 hours afterward do not restore payment authority, and funded, device and maintainer checks are still open. Event-only products would mark NIP-99 kind 30402 listings as hidden with a conduit_event_only extension. They would stay out of the normal catalog and checkout and need an exact authorized event-occurrence assignment. The hidden signed data stays public, and other clients support only the standard hidden flag.

LNbits

LNbits, the Lightning wallet and accounts server, merged an option to send its Nostr notifications as NIP-17 private messages. Administrators can choose between legacy NIP-04 encrypted messages and NIP-17 private direct messages, which are the default for new settings. For NIP-17 the server looks up the recipient’s DM inbox relay list, using NIP-05 relays as discovery hints and as the destination when no list exists. A published empty list makes the send fail. Each send is limited to 30 seconds and needs at least one inbox relay to accept it, and it never falls back to NIP-04.

Zeus

Zeus, the mobile Bitcoin and Lightning wallet, included its fix for Nostr Wallet Connect budget accounting when the post-payment refresh fails in the v13.2.4-rc1 prerelease, along with the earlier fix making Nostr Wallet Connect make_invoice return its own invoice. Before the fix, a refresh error after a NIP-47 send skipped budget accounting and returned an error for a payment that may have succeeded. Now a returned preimage debits the budget through the existing fallback, and a timeout holds the amount as pending spend even if the payment is missing from the list. Other gaps, including in-flight LND payments, may remain. v13.2.4-rc2 followed with dependency updates only.

Two newer fixes have since been merged to source and are not confirmed in either release candidate. The default-expiry correction makes the local BOLT11 decoder apply the specification’s default expiry of 3600 seconds when an invoice has no expiry field. Such invoices had been treated as never expiring, so the check that blocks paying expired invoices did not apply, and the NWC invoice validation in NostrConnectUtils had the same gap. The wallet-scoped backup correction resets the Nostr mint-backup timestamp for each ecash wallet. Before this fix, a wallet recovered from seed in the same session as another ecash wallet could inherit that wallet’s timestamp. It could then drop its own older relay backups as stale and save an empty mint list, which turned off automatic restore. A backup that finishes after a wallet switch can still write its timestamp under the wrong wallet. Wallets already affected keep their saved empty list and need the manual restore in Mint sync, or their mint URLs added again. Their ecash stays at the mint. Both pull requests report that no device testing was done.

npub.cash

npub.cash receives Lightning payments for Nostr identities and converts them to Cashu ecash. It merged a server change that publishes zap receipts to the relays the payer requested. The server already parsed the relays named in a zap request but ignored them when publishing paid receipts. Now receipts go to those relays when the request names at least one, while requests with a missing or empty relay list still use the configured default relays.

eHagaki

eHagaki, a Nostr web client that also ships as an embeddable Web Component, released 1.31.0 and 1.31.1. Version 1.31.0 adds reposts (NIP-18), reactions (NIP-25) and uploaded media management, settles outbox routing (NIP-65) before an event goes to an external signer, and can keep post history and a cache in a local Citrine relay. Its IndexedDB migration resets locally displayed post history but keeps drafts and saved deletion requests; relay-held history can be refetched, while local-only posts need a backup or export before upgrading. Version 1.31.1 syncs NIP-96 upload servers through kind 10096 alongside Blossom’s kind 10063, keeps usable partial relay settings and carries the upload server list and media server sync fixes. Upload server list fetching through declared read relays keeps the newest validly signed list despite other relay timeouts and leaves settings unchanged when none arrives. Media server sync handles Blossom and NIP-96 preferences separately and never publishes a shortened list after a failed lookup.

Other merged reliability fixes are not yet confirmed in a release. After a 401 or 403, users can register with the yabu.me or nostrcheck.me NIP-96 servers from the media screen; the NIP-98 signature covers the actual POST URL and body hash, account or destination changes cancel the request, a guard blocks double sends and unknown-outcome requests are not resent. eHagaki never supplies a password, and invite code or payment steps go to the provider’s official site. Large Blossom file lists page 24 items at a time from a bounded local snapshot, rejecting responses over 8 MiB or 10,000 entries and discarding the snapshot on account, session or server change; reaching the end means the snapshot is used up, not that the server has no more files. NIP-46 remote signer recovery rebuilds the connection and explicitly rejects old pending requests after 30 seconds without resending. Uploads to Primal’s Blossom server encode the existing signed authorization as padded standard Base64, while other servers keep Base64URL.

Two newer merges are also unconfirmed in a release. Publishing now shares bounded, verified relay request waits and keeps delivery and progress tied to the session, replacing several separate timers. The first valid relay acknowledgement counts as success while delivery to the remaining relays continues. Progress never claims delivery to every relay, and switching accounts or logging out stops background delivery. Post history can refresh related replies, reactions and deletions on request within a three-second limit. Results already received are kept after a partial timeout, and a deletion that does not arrive is not treated as proof none exists.

Formstr Drive

Formstr Drive, an encrypted file-sharing app built on Nostr and Blossom, merged its DriveKey recovery work, which we previously reported as an open proposal. The app reads every reachable relay before writing a combined keyring, so old keys converge as they become visible. It creates a new key only when two of four app relays return nothing and there is no history or version. A write relay that does not answer can still hide an old key for a while, and older builds cannot read the new JSON format.

The project also kept each account’s decrypted files, shares, folders and outbox separate. Switching accounts blocks the previous account’s pending signatures and imports, though a staged blob can be left unreferenced. New accounts must now pick an upload server explicitly with no silent failover, while earlier automatic defaults are kept. The server still sees the pubkey, upload timing and encrypted bytes. Duplicate warnings now require identical live bytes on the same server and folder. Android paths for account separation and duplicate acknowledgement are untested, and we have not confirmed that any of this is in a release.

diVine

diVine, a short-video client for Nostr, merged messaging, account and challenge changes. Its early beta releases have only generic notes, so none of this is established in shipped builds. Encrypted per-field account snapshots sync preferences, badge decisions and dismissals, retry pending changes locally and block unsafe publishing on incomplete reads. DM read markers keep the existing protocol, notification reads use the server API and mark-all-read needs a connection; OS permissions, credentials and age consent stay on device.

In DMs, the composer and share sheet close once a message is safely queued; background delivery does not run while the app is terminated, and delivery counts only after relay acknowledgement. Failed retries count consistently against the attempt limit. Invalid-shape legacy NIP-04 messages are dropped and recorded in a ledger, though stored empty bubbles remain and compatibility with external signers and other devices is not established. Optional blurred previews for video DMs from trusted senders are off by default and always blurred with a content warning; the video still downloads, so blur gives no network privacy. In groups, blocking a member hides only their messages; a warning says they still receive yours. Leaving a room sticks. New group creation stays behind a default-off flag. These changes apply to existing groups; trust-and-safety review is pending.

Two previously open features merged. Received DM video caching keeps decrypted files per account for up to 30 days or 300 MB; autoloading in trusted chats and from followed users reveals viewing time to the media host, strangers’ videos need a tap. A server takedown does not immediately revoke cached bytes, which may be evicted earlier. Username ownership lookup checks the name server’s NIP-05 directory for first-page Divine-handle searches and pins only an active owner; query names appear in server logs, and this is not general NIP-05 validation.

People lists move to general availability, building on combined discovery and management work. Profile support links are on by default, and the editor waits for a strict raw kind 0 read from every relay, preserving hidden providers and unsaved edits; store promotion and backend rollout have not happened. Client attribution tags follow the current NIP-89 preference on retries and metadata edits, removing a foreign client tag before signing, while signed scheduled posts never change. Authenticated external short links, off by default, sign the exact NIP-98 POST and body within two seconds and fall back to canonical URLs, which DMs and Nostr events always keep; gateway creation is deployed switched off with rollout gates ahead.

Creators can allow reuse of a public video with an explicit tag, off by default and locked off at publish time by no-derivatives licensed audio; this is a client convention, not DRM. Test-only challenge work covers a signed protocol foundation, entry signing with rule and consent checks, durable per-account storage and native review and withdrawal flows in special test builds. Relay acknowledgement does not mean organizer approval. Production discovery is disabled. Backend delivery, real-account acceptance testing and a cross-client release sequence are outstanding.

Newer merges are also unconfirmed in a release. When a recipient’s kind 10050 DM inbox cannot be read, the NIP-17 held-send queue now reuses the ID of the recipient gift wrap a relay already accepted, preserving that wrap identity across retries. If a retry finds the inbox, the client can republish to the advertised relays. If no inbox turns up, it settles on the accepted copy and relies on relays to keep it. Messages can still show as Failed. Recipient delivery or reading remains unproven; reaction and deletion retries remain outside this change. Public notification preloading and timezone refresh use a bounded thumbnail cache and a shared SQLite index, excluding DMs and campaigns. They need a normal native release plus a coordinated service change, and background execution is not guaranteed. The video editor gains five transitions, for 20 in total, rendered natively in preview and export. Reduced motion deliberately limits preview tiles. Flash spacing can fall back to a dissolve. We did not field-test the native implementation.

Four open pull requests were unmerged at our source cutoff. Social video stickers, stacked on earlier info-sticker work, would write small flat sticker tags with mention (p), hashtag (t) and link (r) metadata. The player would overlay tappable regions and warn before opening external links. Other clients see only the stickers burned into the video unless they implement the tags, which are not an accepted NIP. Mentions in flag-gated Concord chats would keep identities inside authenticated encrypted messages. In-app alerts would come only from followed, unblocked senders in rooms the user has opened, capped at 50 rows with saved read state. They would not trigger OS push notifications or a public chat rollout, and identity-collision, replay and block checks are covered only by scoped tests. NIP-17 rumor tags would name the reaction author once with the actual kind, and wrapped deletions would drop misleading p tags. Gift wraps already went to the correct recipients, so this does not fix a recipient leak. Already-queued rumors stay unchanged, behavior in other clients is untested and a room-filing tradeoff remains. The next native build would turn on the existing short-link sharing by default, while the web version stays off. Disabled, signed-out and error paths would keep full canonical URLs. Store distribution, service readiness and device checks are not proven.

rust-nostr

rust-nostr, a set of Nostr protocol libraries in Rust, merged a breaking change to how subscriptions are re-issued. SubscriptionData now shows each relay’s current EOSE state. Re-issuing queues the CLOSE and the stored-filter REQ in one atomic step, even while disconnected, which guarantees how they are queued but not that both frames reach the relay. Recovering from a notification gap no longer silently drops a subscription or sends a duplicate request. Late EOSE messages or events from the previous REQ can still overlap the new one, because nothing on the wire tells them apart. This is merged source, and we have not confirmed that it is in a release.

nostr-sdk-ffi

nostr-sdk-ffi, the bindings that let other languages use rust-nostr’s SDK, merged raw access to NIP-44 v2 conversation keys, so Concord hosts no longer need to bundle their own ECDH and HKDF code. It thinly wraps the existing derivation and adds no new cryptography. The author reported a Python build and a round trip yielding the same key from both sides, but added no dedicated unit tests. This is merged source only.

NDK

NDK, a Nostr development kit for Dart, published 0.11.0-dev.2, a breaking prerelease. It is not a stable 0.11.0 and is unrelated to the JavaScript NDK. The release adds NIP-49 password-encrypted ncryptsec keys with a sample UI. Its notes say decryption bounds logN, rejects unknown security bytes and zeroes derived buffers; these claims rest on the notes and merged source, and we have not seen an independent audit or test-vector run. Requests now report a notSent outcome carrying the connection or send failure, and requests to unreachable relays finish once no remaining relay or filter can answer, without waiting out a timeout. Broadcasts check for a signer before marking an event in flight, zap request IDs use the stored created_at, and NIP-11 relay metadata is fetched on demand through a shared cache so it no longer blocks every sync.

The prerelease also includes previously source-only changes. NIP-65 lists that repeat a relay URL are now merged correctly, combining read and write markers and preserving the outbox write-relay set; the author saw 5 misread lists among 932 profiles in a single observation. An optional BUD-06 upload preflight check asks the server, using the upload’s own authorization, whether it would accept a blob and reports the status and reason, as real upload refusals now do too. A 404 means support is unknown, and passing does not guarantee the upload will succeed. A breaking change to NIP-77 reconciliation timeouts splits the single timeout into open and idle timeouts with a typed error, excluding time spent waiting for authentication. There is no overall deadline, so a sync that keeps progressing can run indefinitely, and we have not seen the change verified against a live relay.

Open pull requests propose identifier-keyed NIP-05 caching with negative caching, a cache API returning IDs and timestamps for NIP-77, WebSocket readiness handling, full NIP-11 fields and completion when a connection is refused. A further proposal, still open in a fresh status check, would create and recover accounts with browser and Flutter platform passkeys, following a draft passkey identity design with derived and stored key modes plus explicit legacy metadata. Unknown handles are refused and never treated as a new account, and recovery must be verified independently before a stored registration is kept. The author notes that interoperability has not been validated across all passkey providers.

Applesauce

Applesauce, a set of TypeScript libraries for Nostr, has new source changes with changesets, and we do not claim a matching release. Standalone messaging clients and explicit relay authentication add NIP-04 and NIP-17 clients for a fixed account that make explicit NIP-42 auth requests and retry prepared signed sends. Scoped wrapped conversations and rumor stores expose kind 14 rumors and thread models without starting signer or network work. Decryption is off by default, wrapped sends need kind 10050 relays for every participant including the sender, and relay acceptance is not peer receipt. Bounded decrypted-content cache restoration defaults to concurrency 8, which can reorder events unless set to 1. Apps must scope and encrypt those plaintext caches themselves. The NDR transport and a separate Cordn coordinator client follow. NDR must persist its own separate ratchet state, and Submitted means local handoff, not peer receipt. Cordn handles transport only, is shelved in the example and does not implement MLS. Per-window Kehto ContextVM integration gives each napplet window an ephemeral ContextVM identity, without account auth or payments. With durable app-owned deposits and nutzap recovery, new wallet deposits and redemptions require a consumer recovery store and mint NUT-09 restoration. The journal persists spendable proofs, secrets and blinding factors, so it should be encrypted and scoped per account. Resume runs only when explicitly called, reuses signed IDs and keeps the journal until positive relay acceptance, and cancelling does not invalidate the invoice. Batched timeline snapshots with synchronous wallet state group timeline updates in 16 ms windows while wallet-token state stays synchronous. The COUNT request scheduler, proposed last week, has now merged. It starts at 8 under a concurrency cap and doubles until the first rate-limit or transport error, and each error halves the cap and adds a cooldown. Timeouts surface as CountFailure without lowering the cap. Latency only guides relay choice; the three-relay benchmark remains insufficient for general performance claims.

eventstore

eventstore, fiatjaf’s library of storage backends for Nostr events, merged two query fixes. No tagged release containing them has been verified. All backends now follow the NIP-01 rule for empty filter lists: an empty ids, authors, kinds or tag list matches nothing, while a missing (nil) tag list still places no restriction. A fix to LMDB event counting moves the HyperLogLog cursor forward after a match, so counts no longer hang forever. Counting also no longer applies author, kind or tag checks when the filter has none, which had made it return zero.

zsp

zsp, Zapstore’s command-line tool for publishing Android apps to Nostr, released version 2.0.0. The README at that tag offers a wizard where a person proves ownership of the C1 signing certificate and a zsp skill command giving agents publishing instructions. It forbids giving agents the keystore, its password or any private keys, so the proof stays human. The release also detects JKS and PKCS12 keystores by content, so PKCS12 stores named .jks or .keystore load in both the wizard and publishing path. We did not test publishing with it.

nsite-gateway

nsite-gateway, which serves static websites published on Nostr, released version 3.6.6. The source change upgrades to Applesauce 7 and restores event expiration. Earlier versions deliberately swapped in a disabled expiration manager to avoid an upstream timer-clamping bug, so expired site events could stay live in the gateway’s store indefinitely. With the upstream fix in place, the gateway uses the normal event store again. Expiry here governs what the gateway keeps and serves, and it does not delete events from relays or third-party caches. We did not test a deployed gateway.

44billion

44billion, a Nostr app launcher, changed how it remembers permissions. Saved grants are now tied to app, permission name, event kind and scope, and a wildcard kind -1 grant no longer authorizes specific kinds. Scopes are granular only for registered kind and scope pairs with translated labels; unknown scopes fall back to an empty whole-kind scope, and the registry starts empty. IndexedDB schema version 5 intentionally resets version 4 grants and removes unsupported scoped grants at startup, keeping other app data. The custom personal-encryption API includes NIP-44 v3 style helpers that are not an accepted standard. This is a source change with no identified release or deployment.

Newer source adds App Data Access settings that group remembered grants by app and let users revoke one grant or a whole app without reloading. Revocation affects only future protected requests. Data already stored or copied is not deleted, and work already in progress may not be stopped. A Blossom asset-cache change treats a cached asset as complete only after the whole body’s SHA-256 checks out and a matching validated marker is stored. Provisional chunks from older caches are revalidated, and streaming no longer reports a false final chunk. This does not mean no bytes are exposed before validation, and there is no new binary release.

Blossom Servers

The Blossom Servers directory added community capability reports for each server URL, each attributed to its contributor. Manual claims and browser observations are kept separate and drop out of filters after 90 days and 24 hours respectively. Checks look at HTTP responses and advertised methods along with auth and payment challenges. Anonymous browser checks send a HEAD request proposing metadata for a 68-byte PNG without uploading anything, so a 200 answer does not prove that a real upload works. Discussion loading is now scoped, and contributor attribution replaces the earlier implied operator authority. A report is not proof of who runs a server and says nothing about global uptime or full BUD compliance, and contributors can disagree or be wrong. We did not verify a deployment or release.

Newer source adds configurable app and lookup relays and reads accounts and outboxes through NIP-65. An existing public kind 10086 lookup list takes precedence. Saving updates the public list only if one already exists and otherwise stays local. The local publication record updates only after at least one relay acknowledges the event, which does not mean every relay received it. No release or deployment is confirmed.

Ditto

Ditto, the Nostr client from Soapbox, fixed H.264 metadata produced by malformed WebCodecs encoders so transcoded videos can play on iOS. It detects doubled SPS and PPS NAL header bytes and bad reserved bits in the avcC record and repairs them before the Mediabunny muxer writes MP4 metadata, leaving well-formed or unrecognized records unchanged. Version 2.45.1 is out, but we did not confirm it contains the fix or test playback on a physical iOS device. The change targets this H.264 fault, not every codec or video.

Amber desktop signer and Android NIP-46 fix

Amber, the Android Nostr signer, merged source on 27 October for a Compose desktop NIP-46 signer (Windows/macOS/Linux) that mirrors the Android per-app and per-kind permission model (commit). NIP-55 stays Android-only. The desktop code supports multiple accounts and nostrconnect/bunker connections with per-app relays and history, plus Tor and tray notifications. Keys sit in encrypted PKCS12 storage behind a mandatory Argon2id passphrase, with encrypted per-account databases. We have not verified desktop packaging or runtime behavior.

A separate merged change to the Android app, not the desktop signer, refreshes NIP-46 relay subscriptions and connection filters after an account logs out. As a result, Amber stops listening for a deleted account’s keys. The redacted lock-screen notification now also shows the request description. That makes the notification more useful, but it does not add privacy. No new stable release with either Android change is confirmed.

noStrudel napplet intents and synced app data

The noStrudel web client merged several source changes, with no confirmed tag or deployment. Cross-napplet intents resolve through the catalog and z/i manifest declarations, delivering accepted payloads after the target frame loads with a runtime-attested sender ID; unsupported intents are rejected and explicit-target handlers need user confirmation (commit). Installed napplets and default handlers sync per account in NIP-44-encrypted kind 30078 app data with a three-way merge (commit), and selected NIP-66 relay monitors sync through encrypted NIP-78 app data (commit). NIP-17 messages hydrate cached gift wraps and reconcile thirty days from DM relays once per session, using NIP-77 where supported, with older history on demand (commit).

Nostr Feedz archived

Nostr Feedz, which combined RSS with Nostr long-form and video, now states in its README that it is archived and no longer maintained (commit). The notice points to Readstr by PrivKey as a fork continuing development. This is a maintenance-status change, and we have not checked whether GitHub marks the repository archived or whether accounts and data carry over.

Zap Cooking guarded lists, signer fixes and passkey signup

Zap Cooking, a Nostr recipe-sharing client, merged a large batch of web source changes; deployment or release is unconfirmed. Saved kind 30001 list writes now read first and serialize per account, preserving foreign tags and encrypted content from the newest complete base, and refuse when the relay list is unknown or quorum is short (#869). Quorum needs at least two list-capable EOSE answers plus half the user’s capable write relays, and an empty nostr.wine answer cannot prove absence (#878). Custom collections share the guarded writer, older queued operations replay under fresh guards (#885), and an empty aggregate EOSE alone no longer renders a list empty (#872).

An explicit auth method fixes a production minification bug that confused signer classes, so NIP-46 and NIP-07 encryption use the active signer, not a stale local key; relay wallet backup stays blocked for NIP-46 (#896). Login started from a save or reaction resumes it. A pending zap keeps amount and target but still needs Send. Signer refusals show an error without silent re-signing under a stranger key (#867).

Signup creates the identity locally with passkey-encrypted vault sync on by default; a backup key is required if sync is off or upload fails, and Google Drive is restore-only (#893). One-prompt WebAuthn PRF setup leaves the vault unconfirmed and the plaintext nsec in the browser until a later successful vault decryption confirms the vault and removes the plaintext key (#907). Extending that prompt to signup relies on an unsigned registration that is not authentication: anyone with a fresh server challenge can forge a passing registration, and an attacker knowing the credential ID can replace an unconfirmed entry (30-day TTL) and deny the real user sync (#911). These are documented tradeoffs, not security guarantees.

Note links encode as NIP-19 nevent with up to three observed relay hints, helping clients find thinly replicated events without guaranteeing availability (#873). Profile Replies include NIP-22 kind 1111 comments rooted on events (#877), and a coordinate parser fix keeps recipes with URL d-tags in packs and plans (#888). The premium recipe paywall experiment is retired after an author audit found a query-pubkey bypass, with legacy kind 35000 posts readable as stored content (#862).

An open proposal, not yet merged, targets mute lists (#921). An unavailable mute-list fetch would remain distinct from a successful fetch that returns a list or no list. The change would stop caching an unavailable fetch as an empty list for five minutes. Parse failures would be retried, with a warning when private mutes fail to decrypt. Opening the notification bell would reload the list. The aim is to stop a silently stale empty mute list from letting muted authors into notifications. It does not make all failures block content, and it is not deployed.

Lumilumi NWC zap payments

Lumilumi, a Nostr web client, has a draft pull request that would pay zap invoices through Nostr Wallet Connect (NIP-47) with one tap (#1120). The spending connection URI is stored only locally and excluded from the plaintext kind 30078 settings backup. Requests use NIP-44 when the wallet advertises nip44_v2 and fall back to NIP-04 otherwise. The author checked it against a mock wallet with no real payment, and the draft was unmerged at our source cutoff.

An open pull request for the Wisp Nostr client, unmerged at our source cutoff, would have search recognize pasted NIP-19 and NIP-05 identifiers, hex keys and web entity links before falling back to a NIP-50 text query (#681). Lookups use relay hints and the local cache. Search would stream results while waiting for EOSE from queried relays up to a 15-second cap, so slow relays are no longer dropped. The author reports emulator testing only, not a physical device.

Zapstore Android TV support

Zapstore, the Nostr-based app store, has an open v2 pull request for Android TV, unmerged at our source cutoff (#407). It would match 32-bit ABIs and support remote-only Leanback focus, with a fallback when the install permission screen is unavailable. 32-bit builds lacking Arti explicitly show a Direct-only connection, while 64-bit builds missing Arti fail closed. The TV build uses a local debug signer for testing and not distribution, and the author’s single TV test used a locally built relay because the public bundle was unavailable.

strfry hardening and NIP-11 proposals

strfry, the C++ Nostr relay, has two proposals unmerged at our source cutoff. #281 answers relay audit findings SF-01 to SF-13 by bounding JSON depth, decompressed payloads, queues and metric labels, fixing an empty negentropy filter crash and hashing indexes for long tags. It moves to DB format 4, so adopters would export and reimport. Its passing tests are the author’s own. Draft #278 would advertise only enforced NIP-11 limitations plus optional fees and payments_url, with payment_required defaulting to false and configured prices that do not implement payments.

nostrcheck-server Bark payments

nostrcheck-server, a Nostr media hosting server, has a draft pull request adding a barkd (Bark) payment provider (#62). It would create Lightning invoices through barkd’s REST API and optionally attach a per-file X-Ark BIP-321 URI to 402 responses, with the same Lightning invoice as fallback. A wallet on the same Ark server pays over Ark and others use Lightning, and a settled payment unlocks the file once. Tests use a mocked barkd, and it depends on the open BUD-07 pull request #61. It was unmerged at our source cutoff and is not a feature on share.yabu.me.

mattn nostr-relay paid writes

A draft pull request for mattn’s nostr-relay, unmerged at our source cutoff, would add optional paid writes through a Bark wallet, off by default (#37). Pubkeys would prepay write fees through barkd with an optional kind filter, and writers without credit get a restricted: response with a payments URL. Top-ups would use Ark or Lightning via BIP-321 URIs or NWC, with fees listed in NIP-11. Tests use a mock daemon, and whether this belongs in-tree or behind a hook is undecided.

ContextVM reconnect replay guard

ContextVM, which carries MCP over Nostr, has an open pull request for its TypeScript SDK that would prevent duplicate execution after relay reconnects (#113). The server transport would retain verified event IDs until it closes, and a separate bounded envelope cache blocks rewrapped duplicates. Memory grows with unique verified events over the transport’s lifetime. The fix was unmerged at our source cutoff and is not in a released package.

Kehto shell media playback and approvals

Kehto, a web shell for Nostr napplets, merged NAP-MEDIA playback on 28 October. The Paja and playground hosts now share a policy-mediated audio and video player. It uses browser codecs for finite URL and Blossom sources, and it plays live HTTPS MP3 or ADTS AAC streams where MediaSource supports the codec, starting before the response ends. Session authority stays bound to the endpoint, source window and ACL. Revocation or teardown retires Blob URLs, stops playback and cancels streams. The host-only ResourceService.openStream method uses the existing endpoint-origin grants and policy, and it adds no resource wire message. Terminal delivery remains. The legacy sendCommand alias still works. Separately, detectable two-argument callbacks keep working with a warning. Unary legacy callbacks move to command objects. The browser resolver rejects non-HTTPS URLs, credentials and private IP literals. It also disables redirects and referrers. It cannot inspect DNS, so it does not guarantee private-address protection at lookup time: production resolvers need DNS-time checks, and the browser default relies on CORS and private-network protection. HLS, DASH, live Ogg, Nostr sources, queues, persistence and automatic resume on focus remain unsupported. The author reports 155 Chromium tests and 112 seconds of radio playback from an unmodified Funclet artifact, which we did not rerun. This is source-only work. The published Napplet 0.32 package lacks some draft types. NAP-MEDIA remains a draft; released conformance remains unclaimed.

A second merged change makes signing and publication approvals version-specific. Each approval is bound to the verified publisher, the artifact hash and the active signer. Approvals can be revoked, and signing-only and publication-only approvals are separate. A legacy permission is never silently upgraded. Consent for a mutable development URL lasts only for that load, and a change of endpoint or account rejects pending requests. NAP-LINK opens a link only after an explicit click in a host modal, using noopener. The change does not claim universal testing against external CVM radio sources, and a source merge does not show an npm release.

Pact

Pact, a Nostr protocol for agent relationships and operator consent, now authenticates Nostr Wallet Connect replies. Each result must carry the wallet’s signature and reference its request, and Pact checks the result type and payment hash along with any returned preimage. Redemption gains atomic ledger writes plus guards on consuming and retrying requests, and more consent forgery paths are closed. A follow-up capping MCP payments keeps them off unless PACT_MCP_ALLOW_PAYMENTS=1 is set and checks a default 1,000-sat cap against both the stated and BOLT11 amounts. The private inbox window now stops at 200 wraps and flags truncation. The author’s tests rely on mocks.

nostr.watch

nostr.watch, a Nostr relay monitor, adds explicit FIPS discovery and transport support, and overlay lookups no longer fall through to public DNS-over-HTTPS. Hosts still supply DNS and IPv6 routing, since the monitor ships no FIPS daemon or proxy and offers no anonymity. A stricter npub check accepts npubs only inside parsed .fips hostnames. Automatic NIP-11 and NIP-05 probes move into an app-owned ServiceWorker, removing the owning-tab context from the observed extension-driven navigation path; this was checked in stock Firefox 155 with a controlled extension fixture. The conformance suite holds fifteen bounded NIP-01 checks with a conversation layer supporting independent connections. The author reports passing tests and isolated mesh runs, not a public-relay or browser-security audit.

Bitcredit Core

Bitcredit Core, a peer-to-peer credit and bill protocol that uses Nostr, now checks that at least one write relay is connected before a block operation persists anything locally or triggers its effects. Recovery also reinitializes cleanly. The candidate-chain validation reported as open last week has since merged, so chains are validated and prepared before they are persisted. These steps reduce the chance of inconsistent local state. A connected relay cannot guarantee that relays accept the event or that settlement completes, and that check alone does not make local persistence durable.

A newer merge, not confirmed in a release, adds a transaction manager to the identity service. Identity blocks, state and email confirmation now commit atomically before anything propagates over Nostr, and new tests check that nothing is sent when the commit fails. This covers only the identity service. Bill and company persistence lack this atomic commit, and relay acceptance and settlement are still not guaranteed.

MLS-KMP and Marmot compatibility

MLS-KMP, the Kotlin MLS library under marmot-kmp, earlier fixed several wire behaviors to match other MLS implementations, so members on 1.2.0 and on that newer code disagree in the listed cases and groups must upgrade together. Saved state moved to version 10, which older releases cannot restore. The downstream Marmot compatibility job is non-blocking. Its tests did not run in that change’s authoring environment; Marmot must still adapt to authorizeProposal and GREASE. An earlier app-components change enforces the components Marmot needs to follow MDK v0.14. We have not verified adoption in Amethyst.

Newer merged source, not claimed for the released 1.3.0, repairs compilation of the nightly interop runner and reports pass, fail or skip per script. Our earlier note that the live runner never ran is therefore outdated: the authors report working runs, though the final run was still in progress when the change was opened and we have not read back a final CI result. The OpenMLS job stays non-blocking, skips 22 unsupported or panicking scenarios and covers only ciphersuite 0x0001, so it does not certify interoperability. That change also fixes ReInit PSK lookup by retained group ID, the epoch-zero interim transcript, the first-epoch random secret and external-commit resumption PSK handling. For the epoch-zero transcript, the code now follows RFC 9420 section 11 to match OpenMLS, so external joins into epoch 0 differ from 1.3.0 and older releases, and saved older groups keep the old hash until their first commit. The original engine derived its first epoch secret from zero; the authors found no exploit because later commits carry a fresh UpdatePath, and the fix does not show that every security issue is resolved.

Obelisk Relay

Obelisk Relay merged a fix to its default branch for private NIP-29 groups. Global relay admins could already send REQs for private groups, but the event visibility filter still rejected the matching events. Relay admins can now read those events, and member access checks stay in place. Relay-private groups are not end-to-end encrypted, and the change makes the server admin’s visibility explicit. The fix is merged source work for developers and operators.

Plume

Plume, the Rust and Tauri desktop client, merged a change that keeps one persistent, reconnecting WebSocket per relay. Feed, profile, publishing and direct-message operations all share that connection. Subscriptions and event IDs are multiplexed over it. Reconnect attempts back off; the connections close when the app exits. Before the change, each operation opened a fresh socket that was then leaked. The reviewed change is merged source work; no performance measurements are established here. It does not promise lossless recovery or guaranteed delivery.

Hashtree

Hashtree’s TypeScript runtime 0.5.22 lets browser providers keep up to 256 current signed public peer announcements in IndexedDB, scoped by identity and app. Providers can reload them before network discovery. Ordinary peer REQs can replay that cache where existing admission rules allow, and private discovery stays in a separate owner scope. Separately, a merged Rust adapter change cancels abandoned index reads, so commands no longer wait out the full transport timeout. The pull request reports hashtree-nostr-pubsub 0.2.87 as published, and that package is versioned separately from the TypeScript runtime. Source-only Rust client commits add combined legacy, read and write Blossom origins for reads and one retry for typed request-stage connection resets per source, without caching partial responses. One cold install on a Mac does not prove that intermittent transfer timeouts are fixed.

nostr-pubsub

nostr-pubsub TS 0.5.20 keeps a bounded store of signed events and adds IndexedDB persistence, atomic cross-tab transactions, expiry and local replay for ordinary Nostr REQs. The same source separately describes an optional native Rust file store API with atomic snapshots and an exclusive writer lease, which is distinct from the TypeScript package. In the durable event-store implementation, reloads re-check signatures and NIP-01 replaceable-event winners and reject ephemeral events and timestamps more than five minutes ahead of the current time. Stores are never opened implicitly, and callers choose the public announcement scope. FIPS restores signed kind 37195 announcements before network discovery and still checks freshness, schema and namespace. Anonymous or private discovery caches have to stay separate from public replay, and a network-fetching router should not be used as a replay source. Because retention is bounded, this does not provide indefinite offline bootstrap.

FIPS-TS

FIPS-TS runtime 0.0.57 accepts a durable discovery provider owned by the application, which publishes and subscribes to signed kind 37195 announcements through the existing interface. With a provider injected, the transport opens no Nostr relay clients and accepts an empty relay list, and shutdown drains pending subscriptions. The caller owns the provider’s lifetime and restored storage. Namespace, signature and expiry checks still apply. Peer authorization remains required. Cached announcements do not guarantee offline bootstrap, because new authenticated routing and WebRTC signaling still need a reachable FIPS carrier.

Flotilla

Flotilla merged three source changes. Share to Chat lets users share standalone notes and NIP-22 comments into any room or conversation. Quoting in a conversation no longer adds the quoted author to p-tags or forks the membership. Resuming interrupted uploads restores attachment uploads from drafts and lets users recover from failed uploads by showing an error. If compression fails it falls back to the original file, which may keep its metadata. Waiting for stored read markers holds page read-marker writes until stored read state loads, so early read updates are not lost at startup.

following.space

An open pull request for following.space, unmerged at our source cutoff, would restore follow-pack creation, editing and deletion, along with following a pack’s members. It would use Applesauce for account and outbox relay discovery and share packs as naddr addresses. It supports browser-extension signers, a secret kept only in memory and bunker signers. The code and the author’s described tests do not show a deployed service or compatibility with every signer.

Routstr

Three Routstr pull requests were open and unmerged at our source cutoff. In the core service, provider health discovery would reject announced URLs and redirects that resolve to non-global addresses while keeping onion proxy handling. The authors describe a server-side request forgery (SSRF) exposure and tests, but this is not a deployed fix or a confirmed exploit. In the SDK, provider credit for a URL would follow the key that signed the kind 38421 event. A pubkey written in its content remains unverified. Among the 81 events the author checked on the default relay, none had content-based provider lists, so there is no claim that known URLs were exploited or that every provider is now secure. Model-path auto-pinning would move from built-in constants to signed snapshots in trusted addressable kind 38427 events. The SDK would keep the last good snapshot and rollback watermarks, and an empty snapshot would act as a kill switch. The change breaks the custom adapter API. No policy events have been published, and rollout is still an operator step.

SatSigner

An open pull request for SatSigner, unmerged at our source cutoff, reworks its Nostr relay, cache and sync layer. Not finding an event (a relay’s end-of-stored-events reply) would be kept separate from timeouts and from having no relay at all. Stale cached content would be flagged. Events would be stored before processing advances cursors; gift-wrap rumor IDs would be verified. Removing an identity would wipe its Nostr tables, but a kind 0 sync can overwrite a local profile edit. A follow-up stacked on it would add redacted diagnostics, tap-to-load video posters in the Nostr feed with at most three players, and catch-up on app resume without tearing down the relay pool. It also adds relay tests that inject faults. The new native video module requires an app rebuild, and device validation is pending. Neither change has shipped or passed a runtime check.

Bray

Bray 3.5.4 adds NIP-42 relay authentication to its NIP-46 bunker client and daemon. Private relays that require AUTH can now be used to read messages addressed to the bunker. Later source changes are not established in this tag.

In later merged source, Bray’s MCP server starts read-only when no signer is configured or BRAY_READ_ONLY is forced, and it makes that decision before opening any secrets. In this mode no wallet is loaded, signing, encryption and decryption are refused, and only 111 of its 261 tools, the lookup tools, are available. The CLI and SDK still require a signer, and a configured but empty secret file is still an error. New attestations now use a NIP-32 attestation label namespace, replacing nip-va. The existing #l type query finds both old and new labels, while signet-protocol keeps its own 2.5.5 copy. This is not official NIP acceptance, and it does not mean every nested library has migrated. Neither change is shown to be in 3.5.4.

Alby browser extension

An open pull request for the Alby Lightning browser extension, unmerged at our source cutoff, would make its permission helper reject remembered blocked entries in a single read. This closes a race where removing a deny entry could let a Nostr handler act without prompting. The equivalent blocked-entry path for BTC and Liquid is not currently reachable. This is not a deployed fix, and no exploit has been confirmed.

MintRadar relay write policy

MintRadar source adds an operator write policy for the project’s Nostr relay. It limits public kind 38172 announcements and kind 38000 reviews to 16,384 serialized-JSON characters per event and 120 per hour per IPv6 /64, with compressed IPv6 prefixes put into canonical form. A soft ceiling of 3,000 per hour applies to heavy sources, and an absolute cap of 6,000 per hour counts only accepted events across all sources. Privileged keys are unlimited. New connections are limited to 120 per minute with a burst of 60. This is code and operator configuration, not proof of a production rollout or full denial-of-service protection.

New Projects

bosstro

Bosstro is a new Android client for Mostro dispute solvers. Its MVP source is published, with a Flutter front end on Mostro’s Rust core. Solvers sign with a dedicated solver key, never the node key, and the node grants each one read or read-write authority. Authorized solvers can take disputes, join encrypted buyer–seller chats that include images and PDFs, and pay the buyer or refund the seller. Keys sit in Android Keystore-backed storage, but Linux and web development builds lack those protections. Published checksums do not prove who the publisher is.

cordn-kmp

cordn-kmp is a new Kotlin Multiplatform Cordn implementation built on Quartz and mls-kmp for JVM, Android, iOS, macOS and Linux. Its headless CordnGroupManager creates groups, invites, joins, sends and catches up through an MCP coordinator over Nostr, a different model from Marmot’s relay delivery. Frontends supply their own persistence, and the README’s ts-mls interop claim comes from the author.

The project has since published 1.1.0, which builds against released Quartz 2.4.0, so the earlier requirement for a local checkout of unreleased Quartz behind a build flag no longer applies to tagged releases. 1.2.0 removes the public CordnExposure.differsFromMarmot() method and leaves comparison with a different binding to frontends. Despite the minor version number, this is a breaking API change. A proposal had called this version 2.0.0, and the actual release uses 1.2.0.

emosphere

EmoSphere is a Nostr mood map whose source is now public, and its README describes version 0.5.1. Each device generates its own key and publishes signed kind 1074 events carrying an emotion and intensity, an optional short note and a coarse location that users can switch off. Posts appear on a world map with time replay and a follow feed. These signals are public and pseudonymous, so relays can read mood and location and link them to a key over time. Android keeps keys in secure storage, while the web version uses localStorage.

matrix-appservice-nostr

matrix-appservice-nostr is prototype source for a Matrix application service paired with a Nostr relay. Matrix users can create or import Nostr identities and post, follow, reply, react and DM from Matrix rooms, with NIP-05 handles on the bridge domain. Content and media stay on the Matrix backend, and the relay rebuilds events from saved originals. Keys are AES-GCM-encrypted under a configured secret or kept remote through NIP-46. Users must trust the operator, and a Matrix redaction removes only the bridge’s copy.

Seven newer commits add shadow Nostr identities. The bridge creates them automatically for permitted Matrix users who interact outward, with profiles that mirror Matrix. Creating a full profile upgrades the existing account in place and retains the same key. Bridge admins can grant outside users or homeservers full or shadow access, or room-scoped passive reply, reaction and vote access. A grant or ban for a specific user overrides homeserver rules, which override room rules. Full permission allows a profile to be created but does not publish one automatically. Revoking access keeps keys, history and rooms but stops outward posting where it is no longer allowed. Imported identities are never overwritten with a mirrored profile. The checks have code and tests but no runtime interoperability or security verification, and trust in the operator’s key handling remains. Stickers now go out as images.

nostr-scrutiny

Nostr Scrutiny publishes source and fact sheets dated October 24 comparing five Nostr clients: Amethyst, Damus, Nostrich, Primal and Quill. Each sheet covers the client’s app-store privacy claims and published code, along with the network requests seen on a first browser visit. Built as static plain HTML, the site says it has no first-party tracking. The sheets are a dated inventory of facts, not a security certification or cryptographic audit. In a disclosed conflict of interest, the author also develops Quill.

v2

Solid Chat v2 is newly published client source using one did:nostr key to write to Solid pod rooms with NIP-98 HTTP auth and to send NIP-17 gift-wrapped DMs. Signing works through NIP-07, NIP-46 or a local nsec, with NIP-44 encryption and kind 1059 wraps. Rooms are plaintext, protected only by each pod’s ACL. Encrypted DM media uploads to Blossom, and profile lookups go to a nostr.social directory. A local nsec sits in localStorage, so an external signer is safer.

witchat

Witchat is source for an unofficial bitchat client on Windows and Linux. It chats over a nearby Bluetooth mesh and falls back to Nostr gift wraps between mutual favorites. It also joins public geohash channels on Nostr, using kind 20000 events for messages and kind 20001 for presence. Interop with bitchat’s transports is the author’s claim, and the Windows binaries are unsigned. Nostr relays can see IP addresses and channel metadata, and nearby broadcasts currently travel only over Bluetooth.

wn-notify

wn-notify is an unofficial standard-library Python CLI that sends messages and files to White Noise groups through a local wn-agent over the marmot.agent-control.v2 Unix socket; the connector holds keys, MLS state and relays. The CLI checks for final_sent and message IDs. On an unknown outcome it exits nonzero as unknown and keeps the idempotency key for a manual retry, since it never retries itself. An acknowledgment confirms relay publication, not that anyone read the message. Only wn-agent 0.13.0 has been tested.

xmradar

XMRadar is a browser extension that copies web posts and X articles to Nostr. Every publish is approved through an external NIP-07 signer. Release 0.2.0 adds Monero tips on X for authors who have a Nostr identity.

The implementation publishes a kind 9042 receipt only after the user says they sent a tip and confirms. The receipt makes public both participants’ npubs, the amount and the address. It includes no transaction ID, transaction key or payment proof. A small random piconero amount lets the recipient’s wallet match the payment and publish a kind 9044 confirmation. That confirmation is signed by the recipient and is not independent onchain proof. The interface separates recipient-confirmed tips from unconfirmed claims. A user’s own tips stay pending for 30 minutes. Unconfirmed claims count once per payer, at the smallest receipt to the current address; those claims can be forged. Totals are kept per author, not per post. Address discovery through NIP-A3 and NIP-39 X proofs is off by default. When it is on, relays and X can see which identities the user views.

agent-inbox

agent-inbox is a new tool letting AI agents reach each other by short handles over Nostr. A single Python file sends standard NIP-17 gift wraps with NIP-44 v2 encryption, can post to a public board and includes fixtures from the official test vectors. Handles are truncated public-key suffixes, not certified identities. The README warns its pure-Python crypto is not constant-time, and we did not audit it. Any NIP-17 client can still message an agent’s npub.

CarryChat

CarryChat is a new store-and-forward messenger that moves bounded message bundles over whatever path is available. Nostr is its internet transport, and local links such as Bluetooth LE and plain file exchange cover the offline cases. The source includes the Nostr transport along with tests for it. The README calls this an early 0.2 release and says LoRa field testing on physical hardware is unfinished. We did not test it on devices.

Thirteen newer commits, up to 311f176, replace roadmap placeholders with working source. They cover Wi-Fi Direct, a MeshCore radio adapter, Reticulum links, NFC contact cards and an audio transport, with Kotlin, Rust and UI code. Over audio, the listener verifies contact-card signatures and accepts normal message frames but refuses file chunks. NFC swaps contact cards only, not messages. This is source development after the earlier 0.2.0 release, not a new verified binary. The README says MeshCore and LoRa, Reticulum, Wi-Fi Direct and NFC still await field or two-phone tests. The changes make no claim of hardware compatibility, anonymity or security. High-frequency audio depends on the hardware and is not inaudible everywhere. Nostr remains one internet relay transport alongside the local links.

Cosign and Marble

Cosign is a new beta protocol and library that splits a Nostr signing key into FROST threshold shares. A user’s device can sign together with a server, but servers cannot sign alone. A paper backup share supports the recovery and share-refresh flows in the README, which have not been security verified. Marble, an Android and browser client, uses Cosign for feeds and signing. The underlying FROST library has been audited, but Cosign’s own protocol has had no independent review.

In newer source, the Marble browser client ties unsent notes to the signed-in account. Before publishing, it notices when another tab or a remote session has ended the sign-in, and a request from a signed-out client shows Signed out. Instant search queries Ditto and relays, not the general web. Searching one author’s posts checks posts already loaded before asking relays. Likely spam collapses behind an expandable notice. A Not Spam override applies only in that browser and only to that author. These search helpers are not evidence of a security review.

Cosign 0.12.7 lets member-list merges come only from servers, which stops a paper backup share from being promoted to another role. After an epoch sync, stale servers are marked as behind. Invalid partial results are refused; automatic repair stays disabled. Decryption partials now carry Chaum-Pedersen proofs, which are checked before the partials are combined. Older clients ignore the proofs, and Marble’s Android part arrives with its next build. These security descriptions come from the release author, and we have not audited the cryptography.

Android NIP-55 source committed after the 0.12.7 tag fixes a race on first connection, when the server’s grant is still arriving over relays. Public-key lookups now answer immediately. Signing and decryption wait off the UI thread and retry once, and only when a freshly granted connection gets a revoked response. The code also tells an unreachable server apart from one that responds with a refusal. This later source fix is not established in the 0.12.7 tag or a current Marble binary.

Dream Nests

Dream Nests is a new read-only directory of live Nostr audio rooms that pulls Nests rooms and live activity events together with their chat. For screen readers, the web app uses headings and polite live-region announcements, and short earcons serve as audio cues. It plays public HLS streams listen-only. Nests rooms open in Nests, while Corny Chat and HiveTalk rooms open on their own sites, so speaking stays in those apps. Mic indicators come from presence metadata, not voice detection. We did not test accessibility on devices. The repo documents a public live URL.

fips-pub-pki

fips-pub-pki is new source for signed Nostr certificates letting a domain delegate to sub-issuers, with offline path validation. Trust anchors come from the companion fips-pub-domains project, which combines DNSSEC claims with pins and witnesses. The verifier never queries DNS. Revocation relies on expiry and explicit markers, not deleting events from relays. The README says live mesh tests with a public domain and phone are unfinished. With no NIP submitted or kind registered, this is an experiment, not a TLS replacement.

Magnetar

Magnetar is a new search stack for NIP-35 torrent events. It pairs a crawler and search backend with an Android app that keeps a local SQLite cache, and it builds publisher trust from follows and checks swarm liveness. The first 0.1 prerelease includes crawler code and tests for both Android and the server. The author has validated it only with automated tests and an emulator, not on real phones. Follow-based trust cannot make a torrent legal or safe, and the backend is not an authoritative index.

Magnitude Relay

Magnitude Relay is a new Rust Nostr relay from VectorPrivacy, tuned for Vector’s gift-wrapped DMs and Concord traffic, with NIP-77 sync and typing indicators. Operators say it replaced strfry at two existing Vector endpoints. Its repository includes adversarial testing and benchmarking harnesses, but published speed figures come from the author’s own runs and are not independently reproduced.

It has since merged Docker and Compose packaging for operators. It runs as an unprivileged user with a data volume, a local-only bind and a healthcheck. The pull request’s production and import observations come from the author, and arm64 is untested. Packaging alone does not show protocol conformance.

Newer source limits new connections per IP by default to a burst of 300, then 60 per minute. Setting the limit to 0 disables it, and loopback is exempt. A proxy’s real-IP header is trusted only from localhost, and rejected connections get HTTP 429 before the WebSocket opens. Public relay refusals are reported only in aggregate, and per-IP detail is available only on the admin socket. Bulk NIP-77 sync leaves out ephemeral events and events that expire within 600 seconds, while live delivery still carries short-lived events. When trusted links change, the relay skips redundant gift-wrap visibility probes, but gift wraps are still synced. These are source changes with no measured production benchmark.

nostr_doctor

nostr_doctor is a new Dart library, with a CLI and a Flutter front end, that checks whether clients can discover an account’s data. It starts with profile metadata and NIP-65 relay lists, then covers private DM relays and drafts as well as Blossom servers and nutzap settings. To check relay-list discovery, it probes the replaceable list. We reviewed the diagnostic tool as source and did not verify an app release. Its results only reflect the relays it queries and do not show global availability.

nostr-indexer-relay

nostr-indexer-relay is a new Go relay that stores only NIP-65 relay lists. Its crawler finds relays named in those lists, probes them for NIP-77 support and syncs with other live indexers through negentropy. It includes a public lookup page and admin interface and describes itself as early. It is a focused relay-list index, not a Nostr archive or general content relay.

nostr2gh

nostr2gh is a new bridge that carries NIP-34 patch and pull request events, plus their updates, from Nostr to GitHub through a whitelisted relayer. A contributor pushes a branch to a fetchable location and signs a Nostr event, and a friend with a working GitHub account then opens the PR for them. The tool helps contributors who lack GitHub access, but it does not get around a ban automatically and does not give permission to run untrusted patches automatically.

Relay Radio

Relay Radio is a new read-only web app that turns a live Nostr feed into sound with earcons and browser text-to-speech, plus an optional polite live region for screen reader users. Listeners choose a curated global station or one built from people they follow, covering notes, replies, reposts, reactions and zaps. It never posts or pays for the listener. Content filtering is best effort, so it cannot guarantee everything read aloud is safe.

Hibiki

Hibiki is a standalone feed napplet for Torii, and its source calls version 0.2.1 its first working feed. A node fetches public posts and media, and ranking based on the user’s taste runs in the browser. The feed runs in a sandboxed iframe with no direct network access and treats signed spam reputation only as advice. We did not independently verify the privacy boundary.

Merged source through version 0.2.6 adds inline replies and extractive news summaries, and likes no longer rerank posts. A tagged release remains unconfirmed. Preview support in the Watch player adds preview frames. Zaps arrive with profile pages. The node checks each invoice’s amount and description hash. Every payment requires owner confirmation; the payer uses WebLN or a QR code. The node holds neither funds nor keys. Primal address invoices lack the description hash, so a follow-up accepts them when the amount matches exactly. These are flagged bound:false, and the owner is warned that the wallet may not confirm. This weakens the link between invoice and zap request and does not make them valid NIP-57 confirmations. Wallet 5xx errors and timeouts are retried once and show the LNURL reason. The author has not reported a successful end-to-end zap with a real wallet.

wax

wax is a new Common Lisp signer that derives role keys from a BIP-39 seed and runs every request through a policy guard, denying by default unless an approval callback or allowlist permits it. Per-caller envelope sequences guard against replay. Its method names resemble NIP-46, but the core supplies no network transport. We did not security-audit the signer.

WhatZaps

WhatZaps is a new browser extension that pays WhatsApp contacts over Lightning through WebLN support in the Nostr WoT extension. It maps a contact to a Nostr profile, checks their payment address and always asks for explicit confirmation before paying. The /zap command is not sent as a chat message, and the reaction or button path pays without posting anything. These are Lightning payments that use Nostr to look up identities, not signed NIP-57 zap receipts. We did not test its browser message matching.

Agora encrypted polls

Agora is a browser prototype for encrypted group polls. It combines member vouching with blind voting tickets and carries traffic over Nostr relays and WebRTC. The README frames the design as one real person, one vote, but that depends on trusting the ticket issuer, which can fabricate tickets, and on vouching as a form of social trust. The design provides no coercion resistance. Relays can see timing and IP addresses; results depend on which events a client receives. The project is unrelated to the older ghobs91/Agora chat project.

Cinderous SDK

Cinderous SDK v0.83.0 is a new source prototype that assigns each device its own key and synchronizes documents with Git-like history over Nostr and WebRTC, falling back to relays when needed. The caller chooses and deploys the relays, and the SDK ships no default public relay. Its encryption uses an experimental CinderEK scheme with a Double Ratchet, which has not had an external audit. The hybrid key exchange does not make the secp256k1 signatures quantum safe, and the README describes the SDK as not production-ready.

evil-napplets

evil-napplets added attack ladder levels 02 through 08 for testing hosts that run napplets under the draft NIP-5D opaque-origin model. The malicious napplets probe capability and bridge boundaries and report what the host allowed. Demonstration mode is the default, and active modes must be enabled explicitly. Active tests should only be run against hosts the tester is authorized to probe. The suite is a red-team fixture, so a host that passes it has not been shown to be secure. It is a separate project from evil-napps, which targets a different app architecture.

evil-napps

evil-napps is a new source suite that probes authority boundaries in NAPP launchers. It covers the launcher bridge and the NIP-07 signer exposed to apps. SharedDB storage is also in scope. NAPP bundles pair metadata with an index file, a different format from the single HTML artifact used by NIP-5D napplets. According to the README, the suite runs in demonstration mode by default and runs active probes only when explicitly requested. Its tests and harness do not certify a launcher.

Feedstr

Feedstr is a new Rust RSS reader that syncs feeds, read state and favorites over Nostr in encrypted form. Sync can be turned off for individual feeds. It supports OPML import and export and handles NIP-23 long-form articles. The repository has core, Android, web and Flatpak source trees. The README says the software is barely tested and not recommended for use, and that installation and usage instructions are coming soon.

NKIP deposit receipt toolkit

KYC-rip/nkip-0001 is a new TypeScript toolkit, maintained by XBToshi, for NKIP-0001 deposit receipts. NKIP-0001 is an application receipt format and not an accepted Nostr NIP. The toolkit handles Ed25519-signed deposit receipts, salted commitments, Nostr witness events, and salt recovery through NIP-44 encryption. Its protection depends on the application withholding the deposit address until the witness has been observed. The SDK does not gate orders and does not guarantee payouts. Details are in the README.

nostr-parse

nostr-parse is a new Rust parser from VectorPrivacy for signed Nostr events. It enforces the strict seven-field event shape, requires nonnegative integers, limits kinds to the u16 range, checks hex fields and validates escaped strings. Errors are reported with offsets. Callers can produce compact owned allocations or borrowed spans into the input, and parse_unsigned accepts unsigned NIP-59 rumors. Parsing does not recompute the event ID or verify the Schnorr signature, so callers still need to run those checks themselves.

cl-deposits

cl-deposits is a new Common Lisp implementation of Bitcoin Deposits. In this design an operator runs signed, quorum-cosigned hash-chain ledgers over Nostr, backed by Taproot reserves. The repository includes the source and a devnet with inspection tests. According to the README and ROADMAP, the author has replayed the reference fixtures, run a signet devnet, and tested interoperability with deposits-rust in both directions. The author also reports that the Lightning receive path works, and lists payment InvoiceLock and Fulfill as next. Users depend on the operator, the cosigning quorum and the reserve assumptions.

Streets

Streets, a column-based Nostr web client that shows timelines, notifications and search side by side, merged a change that saves the default reaction emoji in the account’s NIP-78 deck document (kind 30078). Users no longer have to pick it again after logging in again or on another device. Previously the choice was stored only in the device’s localStorage. The deck document is encrypted with NIP-44, so cross-device sync requires logging in with an extension or signer that supports encryption. Other login modes keep the setting on the device. If an account has no saved reaction, the existing device value is used, so the setting does not reset to the heart. An invalid saved value is dropped without discarding the rest of the deck. The change is in source, and the 1.22.0 release notes are still a draft.

Labradorite

Labradorite is an Android app for controlling coding-agent sessions on a paired Linux computer, and it published 0.1.0 and 0.2.0. The phone is only the control interface. A daemon on the computer runs the agent and exchanges Marmot MLS messages over ordinary Nostr relays, with one group per session. It accepts only npubs on an allowlist that is empty by default (source). Version 0.1.0 starts or resumes approved sessions, streams text, tool calls and diffs, and handles approvals and questions. It also offers Git controls and read-only file browsing. Version 0.2.0 queues follow-ups as separate turns, lets users cancel them from the phone, keeps queued work across daemon restarts and replays missed history after reconnecting. These are publisher claims, and we have not independently audited its security.

Nomisma

Nomisma is an Android shared-expense ledger in prototype beta that pairs two participants over private Nostr messages. It tracks balances only and does not move or settle money. Version 0.1.3 reconnects paired devices automatically, retries persisted changes with growing delays and adds NIP-42 relay authentication. It also resends missing operations. The two devices compare a SHA-256 fingerprint of entries, payers and splits only once their per-author vector clocks agree. Both devices need 0.1.3 and matching relay settings, because the default relay changed. Checkpoints are gift-wrapped with a 15-minute NIP-40 expiry, which asks relays to drop them but does not guarantee erasure. The notes report fixes to native library loading, Schnorr argument order and NIP-44 key derivation, and we have not independently audited its security. User signing runs through Amber, but ephemeral keys also exist on the device. Distribution notes conflict about the APK signing certificate, so we have not qualified upgrade compatibility here.

Onyx

Onyx is a private diary prototype available as source, not a qualified release. It keeps dated Markdown files on the device as the source of truth and backs them up to relays as encrypted kind 30078 events. Salted d-tags avoid exposing entry dates directly. Restoring requires the separate local encryption key, so users must back it up, because the npub alone cannot restore the diary. An October 27 patch adds a guard that checks request-field integrity before publishing: the signer’s returned event kind, content, pubkey, tags and timestamp must match the request. The patch also rejects downloads from the wrong author, keeps newer local edits and replaces data atomically during restore. Event authors and timestamps stay public. Plaintext passed to the encryption command can briefly show up to local process inspection, and deleting an entry does not erase relay copies.

Zzub

Zzub 0.0.41 is a community client forked from Buzz. According to the publisher’s short notes, this version adds calendar RSVPs with time zone support, profile zaps, display of NIP-58 badges and a huddle button that joins a live meeting. Agent controls gain a restart option, editing of a budget-exempt list and new task card types. Startup now uses cached channels.

Protocol and Spec Work

NIP-CD defines commands invoked as plain text

The NIP-CD specification, first titled Commands and now titled Slash Commands, was merged into the NIPs repository on 21 October (proposal review). An executor advertises a command in a kind 31992 event listing its trigger, title, description, typed positional arguments and scopes. Users invoke it as plain text at the start of event content, optionally qualified by the executor’s npub, so no command-specific tags or client support are required. A bare trigger can match several executors. Clients may offer autocomplete but cannot require it.

Marmot adopts multiple devices per account

Marmot, an MLS-based encrypted group messaging protocol for Nostr, merged its multi-device account rules (proposal review) on 26 October in a form revised from the earlier draft. An inviter may add at most 20 KeyPackages for one account in a Commit. Each device holds exactly one lifelong random publication slot and never copies MLS state or private KeyPackages. Packages should last 30 days with a 7-day refresh. Inviters send each eligible device its own Welcome, and removing an account removes all of its leaves.

Marmot lets members manage their own account’s leaves

Marmot adopted a same-account membership component, marmot.group.account-devices.v1 (ID 0x800d), which carries no data. When group negotiation requires the component, a member can commit Adds and Removes for their own account without admin authority. Under this component the member cannot remove the committer’s own leaf or remove other accounts, and the account’s admin standing does not change. Existing groups must activate the component and meet its support invariants.

Marmot push triggers gain fresh padding

Marmot now requires fresh padding in every push trigger, merged 26 October. Each kind 446 trigger carries at least one fresh 1,084-byte CSPRNG padding chunk, which leaves at most 31 real encrypted tokens within the 32-chunk budget. Without fresh padding, identical token bytes would let content-hash deduplication suppress legitimate later notifications. Servers hash all chunks and must not reject a structurally valid trigger because they cannot detect the padding. Padding hides the token count from relays and observers, but the decrypting notification server can still see it.

Marmot adds push-token repair for new members

Marmot merged push-token repair for new members on 26 October, and a follow-up clarified its final wording. The owner of the Commit that adds a joiner should send active kind 448 token snapshots and kind 449 removal tombstones. An optional fingerprint set in a kind 447 announce lets peers send only the missing records. The top three ranked leaves respond on staggered timers under a 24-hour rate guard per announcing leaf. Relayed signed records and retained removal tombstones repair missing token state even while the owners are offline.

Proposal for passkey-held Nostr keys

A proposal for passkey-held Nostr keys builds on Nosskey, an existing scheme for using passkeys with Nostr keys. Tagged handles separate a PRF/HKDF-derived identity from a stored key, and encrypted kind 31778 relay records bind the relying party, author and credential. Missing or unknown metadata must not silently create a new identity. Relying-party origin authorization still applies, and legacy Nosskey data needs an explicit migration reader. A derived identity is lost with its passkey unless it is backed up separately.

Proposal for DNS delegation of NIP-05 identifiers

An unmerged DNS delegation proposal for NIP-05 DNS-based identifiers adds a fallback that applies only when the original HTTPS lookup returns 404 or 410. Clients then read a _nip05 TXT record that points to an HTTPS provider. Timeouts, TLS or CORS failures, redirects and key mismatches never trigger the fallback, and DNS stores no keys. DNSSEC is recommended but optional, so with unsigned DNS the provider’s TLS cannot independently authenticate the original domain’s authorization. Older clients cannot resolve delegation-only identifiers.

Software application catalog proposed as NIP-82

A software application catalog proposal uses NIP-82 as a proposed number in that open, unmerged pull request; the number has not been assigned or adopted. It brings together kinds for apps (32267), releases (30063), assets (3063), curation (30267), certificate ownership proofs (30509) and a catalog relay list (10067). Assets identify their platform and runtime along with a file hash. Android assets add a signing-certificate hash. A proof signature shows that the publisher controls the certificate, and readers must still check its expiry and revocation.

BIP 321 URIs proposed as NIP-A3 payment targets

An unmerged proposal adding a bip321 payment type to NIP-A3 payment targets lets a kind 10133 event carry a complete bitcoin: URI as static, reusable payment instructions. Because the target is reused, the proposal disallows an amount and a one-shot BOLT11 lightning invoice parameter. The payer chooses the amount and the wallet picks a payment method it supports, with Lightning-address fallback retained.

Proposal for zaps paid through BIP 321 targets

A proposal for zaps paid through BIP 321 targets has the sender pay a recipient’s reusable NIP-A3 bip321 target over Ark (an offchain Bitcoin protocol), Lightning or onchain, then publish a kind 9740 zap. The receipt-key holder confirms settlement with kind 9741. Both kind numbers remain placeholders. The payment reference is encrypted with NIP-44 versioned encryption to a receipt key the recipient opts into, and only that key can confirm the payment. Third parties cannot verify payment details, so confirmation depends on trusting the recipient’s signature. The proposal does not replace NIP-57 Lightning zaps.

Ark payments proposed for Nostr Wallet Connect

An unmerged Ark extension proposal for Nostr Wallet Connect, the NIP-47 protocol that lets apps control a remote wallet, adds an Ark instruction to existing BIP 321 pay and receive support and an Ark payment record for lookup_payment, with no new methods. A wallet uses the instruction only when it supports the address version and network and shares the same Ark server. Otherwise it tries another URI instruction. Amounts must be whole satoshis with no millisatoshi rounding, and records separate a server-cosigned payment from funds the recipient has collected and can spend.

Ark payment header proposed for Blossom servers

A proposal for an Ark payment header in Blossom, the protocol for storing media blobs on HTTP servers, adds X-Ark to BUD-07 HTTP 402 payment-required responses. The header carries a BIP 321 URI holding a fresh per-request Ark address and the amount. Optionally, the URI also carries the same payment as a Lightning invoice. As proof, clients retry with the paid Ark address after settlement. Clients that used the fallback retry with the Lightning preimage. A HEAD request is not retried with proof, and clients proceed to the GET or PUT.

Cashtag proposal for asset mentions in notes

A cashtag proposal defines optional tokenization of $ followed by two to six ASCII letters, excluding code, URLs and Nostr references. A single cashtag tag sets the display mode and can attach an asset ID chosen by the author, since a ticker alone cannot uniquely identify an asset. Readers check that the symbol matches the chain and address and flag mismatches without relabeling them. Optional t tags in the form $ticker allow standard relay search.

Napplet gamepad specification withdrawn

The NAPs repository, where Napplet specifications are published, merged a removal of the gamepad specification on 27 October. The change deletes NAP-GAMEPAD.md and undoes the earlier adoption. No gamepad NAP is currently adopted.

Cyberspace height tags avoid group-tag collisions

Cyberspace, a spatial protocol built on Nostr, merged several of its own specifications, called DECKs. These are project specs, not official NIPs. The spec now renames the height tag on bags and chat from h to H. The lowercase tag clashed with NIP-29 group tags and caused events to be rejected or misfiled. Readers fall back to a legacy h only when H is missing. This changes only the project spec. It does not amend NIP-29 or prove that deployed clients interoperate.

Cyberspace hidden audio

DECK-0007 defines hidden audio as an encrypted Blossom file, referenced by an unsigned rumor inside a signed bag or chest. This means the person who hid it is not attributed through a separately signed public post that can be played. Each placement uses a fresh key and ciphertext, but anyone can still share the key. The spec does not claim that encryption guarantees the finder’s privacy or that its URL rules block all SSRF, and reader support is still in progress.

Cyberspace public models and animation

Items can now reference public SNO models with bob and spin animations, and fall back to the old rendering when a model is invalid or unavailable. Live models can change or disappear, and wide adoption is not claimed.

Cyberspace item, chat and comment specifications

Optional DECKs 0004 through 0006 document existing code for items, chests, listings, encrypted local chat and sealed comments, with synthetic test vectors. Several issues are still open. Bag and chest signatures differ, and sealed comments expose the parent ID and kind through public tags. Holders can override listings. Chat has replay and context-binding gaps, and chest references are not implemented. The documentation fixes no security issue and is not a deployment.

Multi-author events proposal

A signed long-form article, Multi-Author Nostr Events as a Soft Fork, proposes events whose ID hash covers several author pubkeys, with each author signing the same ID. Older clients would see a secp256k1-compatible wrapper carrying the new-form data and Q tags as lookup hints. Peers would negotiate the new form per connection. The article generalizes the author’s earlier post-quantum proposal, which would add a future key as one more co-author. This is an unnumbered proposal, not an accepted NIP. Coauthored naddr replacement and binary transport remain open questions.

Buzz NIP-AR sync subscriptions send a complete snapshot before live heads

An open Buzz pull request proposes NIP-AR WebSocket sync subscriptions (#8522). The relay would send a consistent artifact set read under REPEATABLE READ and emit EOSE only once that set is complete, then stream live current heads; live Redis registration happens before the initial read. Redis disconnect or lag ends the subscription with CLOSED and requires a resync, and so do access changes, redactions or a full queue. Subscriptions cap at 4,096 artifacts, and the change was unmerged at our source cutoff with no production availability.

Buzz NIP-AR incremental artifact reads over HTTP

A separate open Buzz pull request adds incremental HTTP reads for NIP-AR artifacts (#8523). Clients page by database modified timestamps and stable IDs with a 120-second overlap, and receive either the current revision or a removal. They can recover known IDs. Results use an eventual-consistency model. The proposal does not promise a complete snapshot, and an artifact’s absence does not mean deletion or lost access. Its latest revision requires membership or an explicit #h scope for unlisted open channels, and a listing change resets incremental progress. The feature gate, BUZZ_ARTIFACT_INCREMENTAL_ENABLED, is off and requires every writer and migration (now 0074 through 0076) in place. This 120-second delay is an operating assumption. At our source cutoff the change remained open.

Draft NIP-AM text for delegated metric readers

A draft Buzz documentation pull request specifies delegated readers for NIP-AM metrics without changing runtime authorization (#8582). The owner-encrypted kind 44200 event stays unchanged, and the agent emits a separate NIP-44 copy for each active grant, bound to the exact owner-authored grant event ID. The proposed grant kind 30180 and reader caps remain open questions, as do history, revocation and public linkage. A signed revocation cannot erase copies a recipient already holds, and the draft was unmerged at our source cutoff.

DECK-0003 lets a parent carry the objects it places

An open Cyberspace pull request proposes DECK-0003 §1.10, a root table of inline SNO object payloads (#81). A present entry in the parent’s copy wins without a network fetch, even when invalid. Each entry is scoped to the author pubkey with bounded size and depth plus cycle limits. Older readers fetch missing objects and show a placeholder. The proposal describes implementations held pending this change, which was unmerged at our source cutoff.

DECK-0004 defines height-bound doors with derived room keys

An open Cyberspace pull request adds DECK-0004 §3.6 and §3.7 on looks and doors (#82). Doors are height-bound, and the room key is SHA-256(domain separator ‖ location key ‖ door secret), with the room’s bag encrypted under it. Rooms can have multiple or nested doors, and setting a new lock rotates the key. The text has no test vectors until a first implementation exists, and it was unmerged at our source cutoff.

nostream NIP-11 peering advertisement extension

An open nostream pull request would extend the relay’s NIP-11 document with a peering section (#999). It advertises feed kinds with time bounds and settlement terms, along with a contact endpoint and peering proof-of-work. Only enabled: false disables the section, and empty terms mean settlement-free peering. An advertised offer is not an accepted peer. The change implements no peer agreement or paid federation. It was unmerged at our source cutoff.

NIP-CD adds optional installed command lists

A follow-up to NIP-CD was merged into the NIPs default branch on 27 October (merge), and the specification is now titled Slash Commands. It defines an optional kind 10992 list, following NIP-51, in which a user keeps address tags pointing to kind 31992 command definitions, each identified by executor pubkey and d value with an optional relay hint. Users may maintain the list, and clients should use it for autocomplete and rendered chips. The list is a display and discovery preference. It does not authorize executors, and plain-text invocation still works without it, with no command-specific tags and no required client support. NIP-CD remains an optional draft, and the merge does not show which clients have adopted the list.

Marmot narrows its fair preparation rule for account devices

Marmot merged a correction on 28 October to its scheduling rule for groups that require account devices. After a bounded convergence pass reaches Stable, one queued intent authorized by an admin, or a permitted intent from the same account, gets a preparation attempt before queued inbound work alone can force another pass. SelfUpdate and Leave fall outside this extra fairness guarantee, although any member may still commit them. The change corrects earlier wording that covered every authorized intent, and groups that do not require account devices keep their previous scheduling. There is no wire change, and a preparation attempt does not guarantee a valid, accepted or canonical Commit.

Marmot proposes a hidden device roster for account groups

An open Marmot proposal, not merged, would add a device-roster-v1 component with ID 0x800e for a hidden group whose leaves all belong to one account. A group carries the roster from creation or never does. The roster records devices, rejected slots, rejected KeyPackages and leaf maps, and it is the first component to use explicit, order-independent diff updates applied to the candidate parent. Removed slots can keep leaf maps for groups their siblings cannot remove them from. A device trusts a device group only if it created that group or joined through a Welcome authenticated by a confirmed link, so the 0x800e marker alone grants no trust. The founding Add names the exact KeyPackage from the confirmed link. A stolen linked device can edit the roster until it is removed. The device cap applies to devices. Leaf-map and rejected records have per-entry size limits but no record-count cap. Roster data is never copied to other accounts, and the group stays hidden from chats, counts, notifications and destinations. The body says MDK keeps roster bytes behind a test switch with no new ordinary UI.

Marmot proposes clearer feedback when account-device activation fails

Another open Marmot proposal, not merged, would let clients explain activation failures for account devices. A client may report that a group cannot activate account devices. That group-level feedback cannot name the members or devices that block it. A member who is not an active admin learns only that it lacks admin status. If a branch selection is lost or a regenerated activation check fails, the user must make a fresh request. The client never retries activation automatically. The existing rule that activation requires a fresh user request from an authorized client is unchanged. This is draft normative text and does not show implemented or deployed behavior.

Marmot proposes emoji verification for pairing new devices

An open Marmot proposal, not merged, describes pairing a new device through an exchange modeled on Matrix m.sas.v1, using X25519, HKDF and HMAC. The user compares seven labelled emoji on both screens and does not read or type a code. Possessing the account key never authenticates a device. Five unsigned rumors (Request, Answer, Reveal, Confirm and Cancel) are wrapped to the account pubkey and bind the account, session, new KeyPackageRef, existing device slot and fresh keys. The existing device confirms first and adds exactly the confirmed KeyPackageRef. The new device confirms only after verifying, and it accepts a Welcome only for the group ID authenticated by the confirmed exchange. Kinds 452 to 456 are proposed, with 457 to 489 reserved. An account keyholder can still forge Cancel to deny service, even after confirmation. The hourly Answer limit does not persist across restarts. Relays can see the wrap burst and account address; some merge and Welcome cases remain deferred. Implementations keep these formats off by default, and two author-supplied known-answer vectors are not an independent security or interoperability audit.

NIP-5D napplet proposal tightens media and source fields

The open NIP-5D napplet proposal was described previously. Its 28 October changes have now merged into the proposal branch, not into the NIPs default branch, revising optional media and source fields introduced on 17 October. Screenshot and preview tags now reuse NIP-92 key-value fields, with one required lowercase SHA-256 x value and optional m, dim, size, alt and duration. Readers must verify the hash and decode the actual format before rendering. If a valid m field is present, the decoded format must also agree with that MIME type. Entries with a missing, repeated or bad x are ignored, bad optional fields are dropped without discarding other usable media, and multiple previews are ignored. A source-commit must resolve to an exact full Git ID, and HTTPS source archives need an exact byte-level SHA-256 match. Duplicate or malformed source fields are ignored, and unusable source data must not block HTML playback. A matching commit or archive does not prove a reproducible build, and no client conformance is claimed.

Six Years of Nostr Octobers

Across six Octobers, Nostr’s dated changes moved outward from message framing to the applications built on it. In 2021 the basic specification settled that client messages are framed as top-level JSON arrays. The following Octobers brought client search and Lightning invoices, timestamp evidence and job requests, media variants and ecash wallets, then code collaboration and private-message metadata. Other changes in the same months made identities and connections easier to carry between programs, from visible relay status to separate signer keys and wallet pairing. This October the same document defined what an empty filter list matches, so relays that read identical JSON now have a shared rule for which events it selects.

October 2021: Making the Transport Unambiguous

On October 4, NIP-01, the basic protocol specification, was revised so client messages are top-level JSON arrays. The informal EVENT, REQ and CLOSE prefixes became the first element of each array, and the fixed /ws path requirement was dropped, so any WebSocket endpoint would do. This clarified a specification that already had code behind it. Independently written clients need exact framing before anything more sophisticated can interoperate.

On October 23, the relay-to-client direction gained explicit EVENT and NOTICE messages. A relay EVENT carries the identifier of an existing REQ subscription, so a client running several subscriptions over one connection can match results to requests, and NOTICE carries human-readable text. A vocabulary this small is practical to implement more than once, which suits separately operated relays.

The October 23 text of NIP-01 also shows what a signature covers. An event’s ID is a digest of a compact UTF-8 JSON array holding a leading zero, the author’s public key, the timestamp, the kind, the tags and the content, and the author signs that digest with a Schnorr signature on the secp256k1 curve. The WebSocket envelope and the subscription identifier sit outside that signed data. It follows from that text that the same signed event can arrive on different subscriptions, or over different connections, without being signed again. A REQ first returns matching stored events and then stays live until the client sends CLOSE, closes the socket or reuses the subscription ID for a new REQ. Every condition within one filter must hold, while several filters in one REQ match events that satisfy any of them. Filter names in that version differ from today’s. NOTICE behavior was left unspecified, and nothing promised how long relays keep events or that a query returns all of them. Five years later, the same specification would return to what filters inside REQ mean.

October 2022: A Feed Becomes Usable on a Phone

On October 8, Damus, an iOS Nostr client, added search for hashtags, profiles and events. The change touched its search results view and thread model, letting a reader jump to a signed identity or a specific event in addition to scrolling incoming text. This search worked inside the client’s own navigation and was not relay-side full-text search.

Eight days later, Damus replaced the plain rows in its relay configuration with a view showing each connection’s state. A colored dot reads the client’s relay pool. Green means connected and yellow means connecting or reconnecting, with red for anything else and gray before the first reading. The view refreshes when it appears and every two seconds after that. Swipe-to-delete, which already existed, moved into the new view. With the dots visible, a stalled feed no longer had to be read as an author’s silence, because a reader could see which of several independent connections was up and which was retrying. A green dot shows an open socket. It does not show that a relay accepted or kept an event. It also does not show that a query returned everything the relay holds. The commit records the implementation in merged source. This source change establishes no App Store release date.

On October 19, Damus added a parser for BOLT11 Lightning invoices and invoice widgets in posts, chats and direct messages. The widget shows the invoice description and amount in satoshis, and its Pay button passes the lightning: URI through iOS to an installed handler. The social client presents the signed post, and a separate wallet pays. These widgets predate the later zap receipt convention, so they are invoice displays, not standardized zaps.

October 2023: Events Carry Evidence and Requests for Work

On October 11, NIP-03 OpenTimestamps attestations, which anchor evidence about events in Bitcoin, moved from an ots field on the event to a separate kind 1040 event. That event names the original with an e tag and carries the full base64 OpenTimestamps file, with at least one Bitcoin attestation, in its content. The referenced event id is itself the digest the proof attests, so a verifier learns that the event existed by the attested time. That time comes from Bitcoin, not from the author’s created_at. The proof dates the event and makes no claim about its content.

On October 12, independent of the timestamp change, NIP-06 key derivation gained two test vectors. A mnemonic is a sequence of words that encodes a recovery seed, and the vectors cover one 12-word and one 24-word mnemonic, each with its expected private and public keys in hexadecimal and in nsec and npub encodings. NIP-06 already used BIP-39 to turn the mnemonic into a binary seed and the BIP-32 path m/44'/1237'/<account>'/0/0 to derive a key, with account zero as the basic single-key choice. The October addition supplied known answers, not mnemonic recovery or a new derivation algorithm. A client can now check that its derivation and encodings reproduce the documented identity. Matching the vectors makes implementations comparable. It does not certify any particular implementation or prove that every wallet and client import agrees. Protecting a seed from theft is a separate matter that the vectors do not address.

On October 29, NIP-90, the data vending machine standard, was merged into the NIPs repository with fixed job kinds. It reserved kinds 5000 to 5999 for job requests and set each result kind at the request kind plus 1000. Feedback used kind 7000. A request can point to text, URLs or earlier jobs. It can also name the expected output and offer an optional bid. The task therefore lives in signed events that any provider can answer, outside any single vendor’s API. An earlier draft had used kinds 68001 and 68002.

October 2024: Media Alternatives and Portable Ecash

On October 15, NIP-71 video events adopted imeta tags for video variants. In the then-current addressable kinds 34235 and 34236, each variant’s URL, dimensions, MIME type, preview image and fallbacks sat together in one tag. A client picking a resolution needs to know which thumbnail and fallback belong to it, and flattened metadata could not say. Those kind numbers are historical: current NIP-71 uses kinds 21 and 22.

Ten days later, NIP-60 Cashu wallets and NIP-61 nutzaps, both introduced in earlier drafts, were merged together as specifications. They build on Cashu, an ecash protocol whose tokens are issued by mints. NIP-60 keeps encrypted wallet proofs on relays, so compatible applications can reach the same wallet state. Under NIP-61, a recipient’s kind 10019 event lists trusted mints, relays and a locking key, and a sender’s kind 9321 event carries proofs locked to that key for the recipient to redeem. Users still depend on the mints that issue the tokens, and applications must guard against the same proofs being redeemed twice.

On October 29, NIP-46 remote signing, in which a separate service holds the key that signs on a user’s behalf, was revised so a bunker:// connection string carries the remote signer’s public key. The user’s identity is obtained separately: the revised text requires clients to tell the two keys apart and to call get_public_key after connecting. The client generates its own keypair for the conversation and addresses its encrypted requests to the signer’s key, while sign_event returns an event signed with the user’s key. Those two keys may coincide, but they need not. The key in the connection string identifies only the signer service. The user’s account is the public key that get_public_key returns. NIP-60 had addressed shared wallet state four days earlier; this revision addresses a separate concern, signer identity. The examples at that commit still use the encrypted transport NIP-46 specified at the time, and the change neither makes a remote signer trustless nor proves who holds the user’s key.

October 2025: Collaboration Updates and Private-Message Metadata

On October 8, NIP-47 Nostr Wallet Connect gained deep links for pairing an app with a wallet. A wallet can register nostrnwc://connect or an app-specific nostrnwc+{app_name}://connect, and a requesting app opens that link with its URI-encoded icon, its name and a callback scheme. Once the wallet has created the connection, it opens the callback with a value parameter holding the pairing code, a nostr+walletconnect:// URI. Three years after Damus handed invoices to a wallet through iOS, pairing on one phone no longer had to mean scanning a QR code shown on the same screen or copying a long string between apps. The addition covers only this handoff. It changes no payment methods and pays nothing by itself. Both apps must implement the handlers, and the specification text is no evidence that every wallet does. Nor does it settle spending budgets, consent screens or which app may safely own a callback scheme.

On October 16, NIP-34 git collaboration gained kind 1618 pull request and kind 1619 update events beside its existing patch events. A pull request names a commit tip and clone locations, and an update moves that tip. Patches are recommended below 60 kB, with pull requests for larger submissions. This shifted the recommended route for larger submissions from patch bodies carried inside events to signed references to commits, while smaller changes can still travel as patches. Nostr carries the coordination and signed references, and Git servers still supply the commit objects those references point to.

On October 27, NIP-59 gift wrap gained guidance to randomize seal and gift-wrap timestamps independently when expiration tags are added. Gift wrap encloses a message in those two layers, and giving each layer its own random timestamp reduces how closely the layers’ timing can be correlated. Here the attention turned from encrypting content to limiting what metadata correlation can reveal. Encryption hides the message itself, but timing and other metadata around the envelope remain observable, and implementation choices decide how easily they can be linked. The guidance adds no new encryption and does not make participants anonymous.

October 2026: Shared Query Meanings and Text-Triggered Services

On October 5, NIP-92 media attachments extended imeta tags to kind 0 profiles, letting a profile describe its picture and banner with fallback URLs, a blurhash (a compact encoding of a blurred preview), dimensions, alt text and other attachment metadata. NIP-92 existed before this change; what is new is that the grouped metadata NIP-71 applied to video variants in 2024 now reaches profile images. Association is exact. A tag applies only when its URL equals the picture or banner URL, clients SHOULD ignore tags that match neither, and they SHOULD try fallbacks when the primary URL fails. Because a new kind 0 event replaces the earlier profile, a publisher SHOULD carry over metadata for an unchanged image and drop tags for images no longer used, so stale alt text or dimensions do not quietly describe a different picture. That update rule matters as much as the new fields. An imeta tag does not guarantee that an image stays available or loads faster. It also provides no privacy protection, and clients need not render every field.

On October 17, NIP-01 was clarified so an empty list in a filter matches no events, which differs from leaving the attribute out. A follow-up removed inconsistent “one or more” wording and recommended that clients avoid sending lists that cannot match. In October 2021 this document agreed on REQ’s JSON message framing: the REQ message is an array, and each filter is a JSON object inside it. This October it settled filter semantics, fixing what an empty list inside such a filter means, since relays that parse the same frame identically could still return different results.

On October 21, NIP-CD, then titled Commands, moved from proposal to merged draft specification; it describes slash commands. Kind 31992 events define commands, and an invocation is plain text starting at the first character of an event’s content, so clients need no special support to send it. A follow-up proposal, with an earlier commit on a separate branch, was merged on October 27. It retitled the specification Slash Commands and added optional kind 10992 installed-command lists that clients should use for autocomplete and rendering. The lists record a user preference and do not authorize executors or gate plain-text invocation. NIP-90 jobs use structured request and result events, while a command stays readable as ordinary text.