NIP-47 Simplifies Its Core Spec and Adds an Extensions Repository
A merged pull request narrows NIP-47 down to three event kinds and five core methods, moving notifications, keysend payments, hold invoices, transaction listing and metadata handling out to a separate extensions repository.
Nostr WoT Newsroom
Assembled by the Nostr WoT Newsroom from the cited primary sources, and published automatically without individual human review.
NIP-47 defines Nostr Wallet Connect (NWC): a way for a Nostr client to reach a remote lightning wallet over relays, so it can request payments, check a balance or create invoices without holding the funds itself. On 2026-08-01, PR #2419, authored by frnandu, merged into the spec and rewrote 47.md down to a much smaller core, moving most of what it used to describe into a new, dedicated NWC extensions repository. The change touched a single file, with 19 lines added and 332 removed, by far the largest single-file rewrite in this NIP's history covered here.
What stays in the core
Three event kinds remain: the info event (kind 13194), the request event (kind 23194), and the response event (kind 23195). Five methods keep their full request and response definitions in 47.md: pay_invoice, make_invoice, lookup_invoice, get_balance, and get_info. The encryption negotiation between client and wallet service (NIP-44 with NIP-04 fallback, advertised via the info event's encryption tag), the error code list, the example pay-invoice flow, and the note about using a dedicated relay all stay as they were.
What moved out
Everything else lost its spec text in 47.md. The notification event kind, 23197 (with 23196 kept for NIP-04 backward compatibility in the old spec), is gone from the list of core event kinds, and the entire "Notification Events" description along with the "Notifications" section, which spelled out the JSON shape of payment_received, payment_sent and hold_invoice_accepted events, has been deleted outright.
The pay_keysend method, with its full request and response format, is gone. So is list_transactions, including its pagination and filtering parameters. The three hold-invoice methods, make_hold_invoice, cancel_hold_invoice and settle_hold_invoice, are deleted along with the appendix's step-by-step "Example Hold Invoice Support Flow". The Metadata section, which defined the 4096-character metadata limit and documented conventions some clients use for LUD-12 comments, LUD-18 payer and recipient data, embedded NIP-57 zap requests and keysend TLV records, is gone too. The deep-link section describing the nostrnwc://connect URI scheme and its appicon, appname and callback parameters for wallet pairing has also been removed.
The capability tag itself changed shape
This isn't only a matter of deleted prose: one part of the wire-facing spec changed. The old 47.md had the info event advertise notification support through a notifications tag (for example payment_received payment_sent), and its capability list in the event's content field could include the word notifications alongside method names. The new version drops that tag entirely. In its place, the info event now carries an extensions tag listing which optional extension identifiers a wallet service supports (the spec's example uses 02 03 04), and says any methods that come from those extensions should still be reflected in the content field's capability list. The worked example in the appendix shows this concretely: the old example info event advertised eleven capabilities including notifications; the new one advertises five, pay_invoice get_balance get_info make_invoice lookup_invoice, with an extensions tag separately listing 02 03 04 06 07 08. Neither the diff nor the PR description says which extension identifier corresponds to which removed feature.
Where the removed text is supposed to go
A new "Extensions" section replaces most of what was cut. It states that NIP-47 now defines only the core protocol and a small common command set, and that additional methods, metadata conventions, pairing flows and finer-grained authorization behavior may be defined by optional NWC extension specifications, maintained at https://github.com/nostr-wallet-connect/nwc. That repository, per the new section, reserves 01.md for the core spec corresponding to this simplified NIP-47, with optional features starting at 02.md.
Does this break existing wallets
Nothing in the diff touches the wire format of the five methods that remain in core, or the kind numbers of the three core event kinds. A wallet or client built against the previous 47.md that implements pay_invoice, get_balance, make_invoice, lookup_invoice and get_info keeps working exactly as before. The PR also doesn't rewrite the request/response bodies of the features it removes, such as pay_keysend or the hold-invoice methods, so their previously documented wire shape isn't retroactively changed by this diff either; it's simply no longer specified inside 47.md itself.
The one concrete compatibility point is the info event's capability tag. Any implementation that inspected the notifications tag to detect whether a wallet service would emit kind 23197 events will no longer find that tag described in the spec, because it has been replaced by the extensions tag and identifier scheme. New implementations written strictly from the current 47.md will only cover the five core methods unless they also consult the extensions repository for the rest.
Why the split
According to the PR description, the goal is to keep 47.md small, stable and easy to implement, while giving optional NWC features a dedicated place to evolve independently. The author describes the work as related to ideas explored in the matbalez/universal-lightning-wallet project, and aligned with a direction agreed in an earlier discussion on the NIPs repository, which pointed toward keeping room for a future, simpler wallet spec while recognizing that NIP-47 could already be reduced by moving less common functionality out of its core.
Sources
Every claim in this piece links to a primary source.
- NIP-47: simplify core spec and introduce extensions — nostr-protocol/nips (August 1, 2026)