Compound searches, encrypted app permissions, messaging recovery, web highlights, wallet safeguards, and public profile verification lead this week's Nostr development updates.
Ants keeps compound search constraints aligned. Myco (maintainer:
Top Stories#
Ants#
Ants, a Nostr search client, now supports nested AND/OR searches across its native Android release and released web query compiler, keeping author, event-type and date constraints tied to each branch. Android also filters result language locally. Results remain limited by selected relays, event caps and deadlines; text matching depends on relay support for NIP-50, relay-side search.
The web app's v0.6.0 adds zap, nutzap and public mute-list cards; displayed amounts come from published invoices or proofs and do not establish settlement. Later follow, pin and bookmark cards read public entries while leaving encrypted private contents undisplayed.
Later Android 0.35.0 loads zap and nutzap targets inline, including addressable notes, and adds profile-scoped media filters. 0.36.0 shares submitted searches as ants.sh links. These links expose query text and omit local language-filter settings; results still depend on the receiving client and its relays.
Myco#
Myco, a host for small Nostr apps, ships permission-gated uploads in v0.10.0. The shell selects Blossom file servers and signs upload authorization without exposing the user's key to apps, returning confirmed file URLs and hashes. Uploads are capped at 16 MiB; consent comes from installation approval, with no per-upload preview or EXIF stripping.
Marmot MDK#
Marmot MDK, an encrypted messaging toolkit, releases v0.12.0 with broader account-import discovery, separate inbox defaults and source-epoch attachment keys with bounded recovery, supported by its implementation changes and companion release work. Later merged queued-send preservation keeps sibling failures from stopping eligible sends, but is outside that release. History beyond five epochs can remain undecryptable.
Later master work adds beta per-account C sessions using NIP-46 remote signing for remote-signer login and restore, and backports the KEM dependency fix to 0.0.10 while retaining HPKE 0.7 compatibility. Hosts must encrypt exported signer credentials. These changes are outside v0.12.0.
Agent integrations add a Goose terminal harness and admin-gated group-profile tools; opaque draft-revision markers help hosts distinguish newer edits during send handoff. Goose attachments and autonomous mode remain unsupported, and real-binary interoperability is unverified. Draft markers require host adoption and matching bindings; they do not authorize deletion.
Iris Chat#
Iris Chat, an encrypted messaging app, adds message edits, edit history and deletion controls. Its author-authenticated mutation handling preserves deletion tombstones through replay and applies edits only after encrypted enqueue succeeds. Editing is limited to delivered, unexpired outgoing text without attachments; delete-for-everyone requests removal by compatible clients and cannot prove recipients erased their copies.
Later device-link updates start chosen history transfer after verified local approval and preserve routed transfers when a direct link disappears. Sign-in codes remain usable until cancellation; completion waits for observed authorization. Older-account recovery repairs equivalent signed device lists while stripping retired encrypted labels; conflicting authorization still fails.
Tagged Releases#
Nostr WoT#
Signing policies now apply global rules, site/account overrides and exact-origin defaults for NIP-98 HTTP authentication, with denials taking precedence and money requests reviewed individually in the extension release. Nostr WoT (maintainer Leon:
Account Archive in v0.8.11 synchronizes original signed events across relays with checkpoints and encrypted local storage. Version 0.8.12 makes exported archive files passwordless while checking signatures and account ownership on import; older encrypted exports remain supported. Exported files and encrypted local storage have different privacy boundaries.
Scramble#
Still-sealed messages arriving ahead of the current group epoch now survive restarts and replay when the epoch advances in Scramble v0.7.9. The group messenger also binds KeyPackage identifiers before relay exposure. Recovery is bounded by a 256-envelope cap per group and a retention window.
Sonar#
Active conversations gain [chat catchup](https://github.com/hedwig-corp/bitchat-to-sonar
Chama#
Creator checks now compare the full creator identity when known, discard provisional link claims after failed loads and refuse ambiguous fresh legacy links in Chama v6.4.20
Mostro#
Funded hold invoices are protected from cancellation, failed lookups are deferred and bonds are paid exactly in Mostro v0.19.1
Main-branch Mostro core user-info messages add a restore-only request and reply for a user's own reputation, including rating, review count, operating days and first-trade date. Daemon identity-proof and lookup integration remain separate.
Earthly#
Map, Story and Atlas authoring now share [native Chrome WebMCP browser-agent operations](https://github.com/zeSchlausKwab/earthly
nostream#
Multiple tag constraints and per-filter limits now produce correct query results through the [filter-query repair](https://github.com/cameri/nostream (maintainer:
Grain#
Event serialization and replacement preflight checks improve in Grain v0.8.0 (maintainer:
Ditto#
Ditto
Nostr Double Ratchet journals received controls#
Private control messages now share a durable journal row with advanced receiver state in the TypeScript v0.0.176 release. The encrypted messaging library retains them until the application's durable acknowledgement, enabling replay after failure or restart. Callbacks must be idempotent and validate authorized siblings; newly ratcheted AppKeys labels do not retroactively protect older records.
nostr-social-graph#
Private-contact edits now persist before notification, with owner-bound controls, fieldwise clocks and exact pending acknowledgements in nostr-social-graph v2.0.3 (maintainer:
nostr-pubsub#
Ordinary subscriptions start immediately, followed by optional bounded NIP-77 inventory reconciliation in nostr-pubsub TypeScript v0.5.14. The subscription library fetches missing event IDs over the existing relay socket and verifies events through the normal admission path. Reconciliation does not upload local-only events or change history-completion semantics.
The separate Rust FIPS package v0.5.20 (maintainer:
FIPS#
Missing routed sessions can recover through authenticated discovery after a browser restart that retains identity in FIPS runtime v0.0.53. The Nostr-keyed transport bounds recovery attempts and checks for a usable route before signaling. Recovery completion can clear pending state only in its original node generation, preventing stale work from clearing a replacement node's state.
Later TypeScript runtime v0.0.56 restricts nonforwarding browser nodes to advertising their own identity and refreshes cached routing announcements after a fresh authenticated responder carrier. Wire formats, identity checks and session authentication remain unchanged.
Separate Rust source changes adopt pending key sessions only after authentication, even when key-epoch bits match. Failed decryptions no longer evict live peers using public receiver indices; authenticated liveness still determines expiry. Session backoff temporarily refuses repeated silent sessions, while BLE connection arbitration addresses shared-connection races. Rekey guards reject copied setup messages and off-link attempts, age and drain floors protect session transitions, and bounded child-filter checks reject apparent echoes with threshold exemptions. These are development changes, with no new Rust release or device validation established.
Elisym#
Elisym, a merchant payment tool, adds webhook signature and freshness verification in commerce 0.9.0, merchant-node 0.9.1 and MCP 0.32.1, an AI-tool interface using the Model Context Protocol. Checkout changes reset closed or reloaded modals while existing payments continue, checking unresolved payments before another wallet request. Those pages lose the order’s onPaid callback; signed backend webhooks remain authoritative. A durable paid-order webhook outbox queues signed retries alongside ledger changes. Receipts travel over Nostr, but fulfilment and event-ID deduplication remain merchant-owned; payment completion does not confirm delivery.
Hashtree#
Remote blocks can retain peer-readable provenance after restart through durable verified-block sharing, included in Hashtree runtime v0.5.19 (organization Sirius Business Ltd:
Later Rust source adds automatic, bounded peer archive intake alongside relay catchup, using an ephemeral identity and verified events. Peer observations cannot satisfy missing required relay coverage. Interrupted appends resume only from matching durable input; author coverage advances after the whole author is durable.
A standalone Git reader combines bounded relay observations with public signed index roots while preserving original signatures. Unreachable sources remain distinct from absent repositories. An explicit expected release root preserves existing history or stops on conflict; it does not guarantee concurrent publication safety.
Amethyst#
Amethyst v1.17.0
Later development limits browser signing prompts to 120 seconds and always asks before signing reports. Encrypted-message history now pages only the visible account, prioritizes its DM relay list and offers bounded searches with retry controls. Relay-hint and search repairs reject malformed relay URLs, stop indexing encrypted emoji-pack contents and stop linking anonymous or private zap sender keys; expanded public-text search requires existing stores to be reindexed. The amy command-line client adds posting, threads and deletion while restricting group content to its host relay and refusing group reposts or quotes. The Android app’s own group-repost path remains unchanged. Paired clients using NIP-46, Nostr's remote-signing protocol bypass the unpaired-client rate limiter; unpaired traffic remains limited to 10 requests per author and 100 combined per minute. Queue and concurrency bounds and per-request authorization remain.
My Signet#
Per-app phone approval is available, default off, in My Signet v0.18.2, a hardware-signer companion. It requires an imported Heartwood hardware-signer operator key, compatible firmware and a connected, unlocked inbox. Possession of that phone key authorizes enabled requests without touching hardware; "Approve once" can permit the same event kind for ten minutes, while wallet pairing and login codes still require the hardware button.
Nsync#
Signed Nostr address announcements now help paired devices find each other in Nsync v0.3.0, a Syncthing-based file synchronizer. Pairing binds each Nostr identity to a Syncthing device ID, and receivers require newer announcements. Files still transfer through Syncthing; relay announcements expose address and online-timing metadata, even with public-IP announcement disabled.
PsstPsst#
PsstPsst v26.10.1 adds small private groups for text, reactions and files through PsstPsst's group-send implementation. The messenger extends NIP-17 private messaging and NIP-59 gift wrapping with encrypted group identifiers and membership actions, using per-recipient NIP-44 encryption. These extensions remain draft and optional: other clients may split rooms, and any current member can publish membership changes.
Write Nostr#
Encrypted draft and account-settings sync arrives in Write Nostr's v0.4.11 changes. The writing client commits a draft revision only after every chunk and its head record reach at least one common accepting relay, preserving local content on incomplete or invalid recovery. Signers without NIP-44 support retain local drafts but cannot use encrypted sync.
Flotilla#
Screen sharing joins existing calls through Flotilla's cross-platform sharing implementation (maintainer:
Blitz Wallet#
Native Android background handling for NIP-47 wallet requests arrives in the Blitz Wallet Android prerelease. The Lightning wallet shares SQL-backed budget reservations, payment-hash claims and uncertain-payment markers with JavaScript handling, alongside startup fallback and background crash containment. Firebase Cloud Messaging is required, and Android may still need JavaScript execution or an open app.
Sidecar#
Selected web text can be published as NIP-84 highlights in Sidecar v1.15.6. The browser extension's v1.15.8 composer changes align mention and quote tags, convert pasted identifiers and skip unanswered relays after 12 seconds, so delivery can remain partial. The server-discovery repair in v1.15.9 finds Blossom servers through account-declared relays, including write-only relays, and retries failed discovery on the next upload. The same fix covers profile images; nostr.build remains the fallback.
BuhoGO#
BuhoGO, a Bitcoin wallet, releases 1.10.0. Purchased NIP-05 identity names now survive restarts and delayed relay replies through durable profile synchronization. Activation continues after checkout closes, and verified recovery requires no second payment; newer username choices remain authoritative. Android installations older than 1.9.1 use another signing key: back up recovery phrases before uninstalling and reinstalling.
Staircase#
Staircase, an MLS group-chat client over Nostr, releases 0.1.20. Its forwarding and synchronization changes re-encrypt forwarded attachments; captions default off, with no original author, chat or reply metadata. Folders stay local unless multi-device sync encrypts them under derived keys. Search excludes deleted messages and covers device-held history. New accounts use cordn.feeds.relay.tools; existing coordinators remain. Startup key-package reconciliation survives leaving onboarding.
KithMoot#
KithMoot, an encrypted room messenger over Nostr, releases 0.6.62. Queued messages retry oldest first using their original signed events. Never-sent messages remain editable or deletable; possibly delivered messages can only leave the local pending list. Saved-room synchronization republishes missing relay records using their original signed events, preserving deletion records.
Later merged 0.6.63 preparation adds VMLS rooms on user-operated Bothy servers, with Nostr invitations and signer-authorized access grants. This preview has no persistent VMLS message history. Compromised-device removal holds new sends and joins until witnessed, revokes keeper-owned grants without grace, and retries unconfirmed revocations; existing traffic may arrive first. Tor-only rooms pause server traffic. Signing, publication and handset acceptance remain pending; downgrades discard removal journals and compromise marks.
Rooms have no end by default; when one is chosen, self-destruct defaults on, with a read-only alternative. Cleanup runs with background ringing or delivery enabled, otherwise at next start. It requests deletion of this device's signed events and attempts local cleanup; failed stores, relays or recipients may retain copies. Without a reachable relay, cleanup retries while retaining its signing key.
Nostr Vault#
Nostr Vault, an Android client with an on-device relay, releases 2.7.2 with marketplace listings, polls, article highlights and nostrconnect signer pairing. Release notes also report cross-device DM catchup and signature checks; NIP-29 relay groups are removed. These are publisher-reported release behaviors, without independent security or background-delivery validation.
Private Provider#
Private Provider is an Android AI coding workspace that builds APKs on the phone and publishes Nostr repositories through ngit. Version 0.7.2 lets the in-app agent, Pi, request issues, comments and pull requests with explicit command approval and signatures from the Amber Android signer. 0.7.5 pins Blossom and Zapstore publication targets in a committed manifest and rejects tag/commit mismatches. Wallet recovery remains unavailable; the documentation cautions users to keep only small balances.
Haps v0.1.11: social-graph package discovery#
Haps v0.1.11, a Nostr-key package publisher and installer, adds signed immutable bootstrap discovery and publisher-maintained catalogs, preserving custom sources and publisher pins. Search and bare-name installs require a publisher or release voucher from the user's social graph, excluding muted or overmuted people. Explicit npub/package installs warn outside that graph; trusted warnings block installation. The installer retains its verified selection. Signatures establish authorship, not safety: native programs and build recipes remain unsandboxed; package formats remain unstable.
soyLI#
soyLI v0.25.0, a toolkit for publishing sandboxed Nostr apps, uses creators' own NIP-34 Git repositories, checking signed refs and clone reachability again on resume. It avoids duplicate repositories and retains linked source on deletion. Remote dynamic backends still require soyLI-managed source. Earlier changes accept NIP-22 replies with extra mentions and prevent a relay-handshake timeout race from terminating the web process.
fips2go#
fips2go
In Development#
Dart NDK#
Dart NDK (maintainer:
MintRadar#
MintRadar (maintainer:
LNbits#
LNbits, a Lightning service with Nostr notifications, lets WASM extensions request user notifications under an explicit permission. The host selects the current user or invocation wallet owner and their saved Nostr, email or Telegram settings; extensions cannot supply an arbitrary recipient. This is merged development work, and a queued response does not guarantee delivery.
Zeus#
Zeus
Pollerama#
Pollerama (maintainer:
Nostur#
Nostur
Gittr#
Gittr, a Nostr-based Git platform, repairs Settings deletion requests that could fail to reach Amber. Subscriptions measure their wait from the current signer-connection pause, and a saved signer identity can proceed to signing when the initial connection warmup finds no open socket. This repairs signer contact; it does not establish that deletion has completed across relays.
NosTube#
NosTube, a Nostr video client, adds a separate instance build that loads server configuration before starting the app and limits its video catalog to configured creators and sources. Signer and wallet connections retain their own relay access. Admin routes are served by nostube-server. Search remains disabled in this initial instance variant.
eHagaki#
eHagaki, a Nostr client, stores content-warning bodies separately in verified kind 36 payloads before publishing the original event structure. Only compatible clients retrieve and display those bodies; the warning does not encrypt them. Local history search now streams its first 50 matches while scanning continues, then reports the exact total.
Nostr Components#
Nostr Components (maintainer saiy2k:
Holoboard#
Holoboard, a paid Nostr note-promotion board, preserves unfinished promotion payments when users return to editing or switch notes. Earlier invoices remain available for explicit resume, and late wallet replies update their own payment record. Unconfirmed payments retain a warning that they may already have succeeded. Issued invoices remain payable; returning to the editor neither cancels them nor refunds a payment. Failed browser storage leaves a visible notice.
Milk Market#
Milk Market
NYM#
NYM (lead developer Luxas:
Client AI consent and account-deletion changes add prompts before bot processing and translation; bot consent can also enable translation. Requests may share conversation or channel context, including other people’s recent messages and approximate location, with the service and selected model providers. Deletion attempts cover usable saved identities and local wiping, but public relay copies, inaccessible identities and external backups can remain, and some server-cleanup errors are not surfaced. Closed-app ringing is opt-in for one identity per phone.
Nostr Inspect#
Nostr Inspect, an event-inspection tool formerly called Nostr Events Monitor, adds browser-side signature and content-ID checks, address lookup and relay-copy status, plus exact-event or latest-address sharing. Latest means the newest valid copy observed from queried relays, which may withhold other copies. Shared search filters run ordinary searches on opening; streaming needs a user start. The rename resets existing browser settings and repeats the walkthrough once. These changes are merged source work.
Bark#
Bark
NoorNote#
NoorNote (maintainer:
Wisp#
Wisp (maintainer:
Meiso#
Meiso (maintainer:
ZapTracker#
ZapTracker (maintainer Pratik (pratik227):
Formstr Drive#
Formstr Drive
Safebox Acorn#
Safebox Acorn (maintainer Tim Bouma:
Minibits#
Minibits, an ecash wallet, adds persistent NIP-17 conversations for text, ecash and payment requests, with unread indicators and unknown-contact requests. Separate sender copies and message deduplication prevent outgoing funds from being counted as incoming. Conversations display at most 500 messages without paging; relay acceptance leaves delivery and reading unconfirmed.
LaWallet#
LaWallet, a wallet service, merges an OAuth 2.1 MCP interface for balance, invoice and payment tools, with explicit permissions and daily connection budgets. A companion listener-secret safeguard restricts stored-secret fallback to the configured origin. Pending and unknown payments remain accounted for, but concurrent grants lack a global exactly-once guarantee, and fee reserves do not enforce a total fee cap.
Zap Cooking#
Zap Cooking
Later main changes route reactions, comments and zap-receipt requests, plus reposts and lists, through authors' write relays, recipient read relays and the app list. Lists omit recipient fan-out; group events stay on Pantry. Routing failure can still fall back to the pool. Extension and remote-signer relay login gets one attempt per account, relay and page load; reconnects may remain logged out until reload. Pantry and local keys are exempt. Members also gain topic-labeled day and month archives, subject to relay access and paging limits.
Kehto / Paja#
Kehto's Paja transport, for ContextVM remote tool calls over Nostr, adds bounded oversized transfers and streaming progress. Server identity and typed request tokens prevent chunks or progress from attaching to the wrong concurrent request; completed transfers require matching byte length and hash. Idle probes monitor streams, while the final response or deadline determines completion.
Notedeck#
Notedeck
diVine#
diVine (maintainer:
Conduit#
Conduit
Buzz#
Buzz
Merged work keeps agent-to-agent replies inside threads and retries uncertain sibling-agent authorization lookups while denying the current event. An optional read-state/sidebar API remains disabled by default: database operators can read its plaintext state, and it does not synchronize with legacy read-state events. Deletion cleanup purges retention-free read-state and heartbeat rows with their mentions; ordinary deleted history remains soft-deleted.
New Projects#
cvm-registry#
cvm-registry caches ContextVM service discovery, using a curator allowlist and explicit fresh or expired catalog states to help users assess service listings. This static discovery dashboard makes catalog age visible, but its restaurant demonstration does not invoke services, make payments or settle transactions.
Nostr Workshop#
Nostr Workshop's phone milestone provides phone-oriented learning tasks, a signer bridge and encrypted key backups, with published results updating task progress. The browser signer holds the unlocked private key in plaintext per-tab sessionStorage until Lock; lasting use calls for transferring the encrypted backup to a dedicated signer. The newer source milestone is not attested to the listed APK.
Nostella#
Nostella's experimental relay mesh authenticates forwarded requests and gives them stable identities to stop recursive amplification. Bounded forwarding to ordinary relays preserves filters and limits. Remote results arrive after the local end-of-stored-events signal, so clients that close their subscription at that signal miss those results.
nope-mcp#
nope-mcp adds connector metadata and default open-license filtering to educational-resource search across Nostr relays, exposing it through a public MCP interface without signing or mutation tools. Resources missing license tags are excluded by default.
Vitals#
Vitals implements owner-authorized monitoring sessions, with a Linux daemon sending ephemeral machine reports encrypted using NIP-44, Nostr's encrypted-message format. Five-minute keepalives extend a seven-minute session timeout. Closing the browser sends no signed stop, leaving monitoring to expire by timeout; the daemon is a prototype.
grasp-go-proxy#
grasp-go-proxy exposes Nostr repository discovery to Go tooling, resolving npub, naddr and NIP-05 human-readable identifiers for NIP-34 Git repository announcements into go-import metadata pointing at existing Git hosts.
Keythra#
Keythra adds a Mac-mediated remote signer using NIP-46, Nostr's remote-signing protocol, forwarding authorized applications' requests to an iPhone or local authenticator. Each signing, encryption or decryption operation requests user verification, with event IDs derived from approved fields. This remains a prototype source milestone: the Mac bridge must stay running, Nostr keys remain in software storage.
Protocol and Spec Work#
Profile image metadata matched by exact URL#
The merged NIP-92 profile metadata change lets clients associate profile pictures and banners with NIP-92, the media metadata format, only when URLs match exactly. Clients ignore unmatched tags and may use fallback URLs if the primary fails. Updates preserve metadata for unchanged fields and drop obsolete tags; the merge establishes specification behavior, not shipped client support.
Signed descriptors for napplets#
The open napplet proposal, for self-contained HTML applications, now uses a signed descriptor tied to one HTML hash. It declares required and optional capabilities, intents, icons and a plaintext description, replacing the aggregate/path model. HTML publishing metadata cannot override the signed descriptor's authority; this remains proposed protocol text.
The napplet CLI v0.7.0 implements the descriptor format and offline migration. Unattended publishing defaults to the current format; a temporary explicit legacy option supports older shells. Migration verifies the original signed event and emits an unsigned template for review, without fetching, executing, signing or publishing its HTML. Ambiguous multi-file manifests must be rebundled, and permission and storage identities change to the artifact hash. Explicit unknown capability declarations are retained with warnings; shells still decide whether they can load the app.
Financial cashtags with separate binding and indexing#
The financial cashtag proposal separates a cashtag's location in text from its indexed financial identity. Non-indexed cashtag tags bind text using UTF-8 byte offsets, while NIP-73, the external-identifier tagging convention, supplies i tags for symbol and instrument indexing. The proposal covers ISIN, FIGI, CAIP-19 and ISO-4217 identities, not prices or payments; implemented adoption is not established.
Marmot membership requests and receipts#
A proposed Marmot membership workflow, for encrypted group messaging, adds optional inner kind-458 requests, rejections, withdrawals and Applied receipts. Administrators independently validate KeyPackages, and an Applied receipt requires a matching accepted Commit. These checks tie receipts to accepted membership changes; the fixtures assume Messaging Layer Security group-key authorization facts and do not prove convergence.
Marmot multi-device pairing security#
Merged Marmot multi-device design notes introduce private, single-use KeyPackages, a device-group roster, commitment-based pairing and ordered settings. The design addresses substitution, KeyPackage reuse and offline-searchable pairing. Normative wire definitions and interoperable device support remain unfinished.
Wallet Connect commission invoices#
The unimplemented Nostr Wallet Connect commission proposal, for wallet-to-app communication, adds an optional make_commission_invoice permission governed by user-confirmed rate, payee, fee and budget limits. Shared-hash hold invoices coordinate payments, with idempotent retries to prevent duplicate requests. A preimage does not prove payment, and client delays and colluding routing remain risks.
Cyberspace virtual brackets#
The Cyberspace spatial protocol specifies virtual brackets for games identified by their public keys. An enter-virtual action names the game in a p tag and records base and game positions; an exit returns to the entry’s base position. Verifiers follow links through unrecognized actions and compare recognized positions with the preceding recognized action, so a skipped action that moved the identity invalidates the chain. Existing client verifiers still need implementation changes.
NIP Deep Dive: NIP-05 and NIP-24#
NIP-05, human-readable account identifiers, connects local@domain to a public key; NIP-24, additional profile metadata, makes public presentation portable across clients. The NIP-05 specification is merged, final and optional. The NIP-24 specification is merged, draft and optional: draft describes its maturity, not a newly opened proposal.
Checking an account name#
After validating the signed profile, read nip05 from its JSON-string content. Split the identifier and request https://<domain>/.well-known/nostr.json?name=<local> over HTTPS, ignoring redirects. The local part permits a-z0-9-_.; the response's names[local] must equal the author's hexadecimal public key. Optional relays supplies discovery hints, not authenticated relay endorsements. _@domain is a root identifier that may display as the domain, according to the lookup specification.
Identifier-first discovery fetches the mapping, then the key's profile and matching claim. Follows retain the public key: domain reassignment invalidates the old name association without transferring the follow. This proves an association, not legal identity or biography; the email-like string implies no mailbox. Missing names, mismatched keys, invalid JSON, redirects and unreachable endpoints cannot establish it. Browser CORS failures are indistinguishable from other fetch failures under the NIP-05 rules.
The identifier server receives the requested name and may observe the client's network origin. External profile images can also reveal browsing activity to their hosts. Neither specification supplies a universal privacy proxy or cache policy; changing mappings require revalidation. NIP-05 began with June 18, 2021's DNS-name introduction, followed by December's well-known JSON revision.
Portable metadata and its limits#
NIP-24 adds optional display_name, website, banner, Boolean bot and object birthday, whose year, month and day may each be omitted. Authors should still supply name; deprecated displayName and username should be ignored or removed. Partial birthdays reduce disclosure, but supplied details remain public. The metadata specification defines fields, not universal recovery from wrong types, invalid dates or duplicate keys.
Generic r, i, title and lowercase t tags mean web URL, external identifier, named item and hashtag unless a more specific specification overrides them. Historical kind-3 relay-map content is deprecated in favor of NIP-65, relay-list metadata. NIP-24's introduction was authored September 24 and committed September 26, 2023. NIP-92, media attachment metadata, now permits profile-image descriptions through URL-matched imeta tags.
One signed profile, both specifications#
This kind-0 profile was recovered from relay.damus.io on October 6. Under NIP-01, basic event structure, id is the canonical event hash, pubkey the signing identity, created_at the author-provided Unix timestamp, kind:0 the replaceable profile type, tags the event tags, content the exact profile JSON string, and sig the signature. The event specification authenticates payload integrity, not its truth.
{
"kind": 0,
"id": "700f005cff9fcd93268053f9fda0d4f3cccb0847fc6aa4547ba80c622b98aa3a",
"pubkey": "208ad03138eb32da4b3fb2edb79d13a8e3532842db627d76aff8168db564a0e9",
"created_at": 1791295764,
"tags": [
[
"client",
"Nostrich"
]
],
"content": "{\"name\":\"calavera\",\"nip05\":\"calavera@primal.net\",\"about\":\"Audentes Fortuna Iuvat\\nLe mie gesta sul video ludo 👇\",\"lud16\":\"solartern74@nostrich.org\",\"display_name\":\"Manny Calavera\",\"picture\":\"https://m.primal.net/OHcz.jpg\",\"banner\":\"https://m.primal.net/OHdW.gif\",\"website\":\"https://rumble.com/user/HomoLudensArchive\"}",
"sig": "9bc7be81b87a7db10f812e23181fda38d5e369c49d9a52757b16fb4ff0ad544abb24486b346382d5f43fc127794ac0562d80e6e4a7df8489512f40ffbedcf670"
}
Here name is the short label, display_name the richer label, and nip05 the separately checked association. picture and banner are image URLs, website an author-supplied link, and about self-description. lud16 is a payment-address extension, not identity verification. The client tag self-asserts application context. No imeta, bot or birthday appears; NIP-24's optional fields need not all be present.
Implementation boundaries#
Amethyst's lookup client compares the mapped key, while its birthday decoder ignores undecodable birthday fields and retains the profile. The Damus client's lookup models names without explicit redirect rejection in that file, and its profile bindings expose display name, website and banner. The rust-nostr library's identifier types support root lookup and relay hints, while its metadata decoder preserves custom JSON but can reject wrong types in known fields.
Nostr Compass
Nostr Compass is a technical resource for the Nostr protocol, helping developers, relay operators, and builders stay current on protocol evolution. We publish weekly newsletters covering NIP proposals, client updates, relay developments, and notable code changes. Our podcast features conversations with the developers building Nostr. The topic index documents key concepts with links to primary sources. Podcast: https://podcast.nostrcompass.org
_@nostrcompass.org
Nostr Compass is a technical resource for the Nostr protocol, helping developers, relay operators, and builders stay current on protocol evolution. We publish weekly newsletters covering NIP proposals, client updates, relay developments, and notable code changes. Our podcast features conversations with the developers building Nostr. The topic index documents key concepts with links to primary sources. Podcast: https://podcast.nostrcompass.org