nostter: Namecoin .bit NIP-05 resolution (PR #2128)

A PR against SnowCait/nostter — the calm reader-oriented Nostr web client — adds Namecoin .bit NIP-05 resolution to the existing verify path. One module, one hook, two call-site swaps, zero new top-level UI: the existing checkmark either lights up or it doesn’t. Seventh N1 reference implementation across five runtimes.

nostter: Namecoin .bit NIP-05 resolution

Opened a tightly-scoped PR against SnowCait/nostter — the calm reader-oriented Nostr web client — adding optional Namecoin .bit verification to the existing NIP-05 path.

PR: https://github.com/SnowCait/nostter/pull/2128

Scope

  • One module: src/lib/namecoin/ (cache + browser-WSS ElectrumX client + ifa-0001 value parser + 21 vitest tests).
  • One hook: src/lib/Nip05.ts wraps nostr-tools queryProfile. Identifiers ending in .bit (and the d/<name> / id/<name> shorthands) route to the Namecoin resolver; everything else falls through unchanged.
  • Two existing call sites updated to use the wrapper (NostrAddress.svelte profile row + the [slug=npub] slug-overwrite path).
  • No new top-level UI elements. The existing verified checkmark either lights up for a .bit address or it doesn’t — same calm UX as for any other NIP-05 address.

Wire format

Same wire format used in Amethyst (Kotlin), Nostur (Swift), the merged dart-nostr work, and the in-review PRs against nostrudel, jumble, and nostr-tools:

  • d/<domain> records: nostr.names[<local>] with _ as the root entry, optional nostr.relays map keyed by pubkey.
  • id/<name> records: nostr.pubkey + optional flat nostr.relays array.
  • Shorthand "nostr": "<hex>" accepted as the root entry of a d/ record.

Server pool

Ships the 4-of-6 browser-WSS subset of Amethyst’s DEFAULT_ELECTRUMX_SERVERS. Amethyst additionally carries two bare-IP entries over its JVM TLS path, but browsers refuse WSS to bare IPs without an IP-SAN certificate so they’re deliberately omitted. Documented inline in the source.

Try it

  • _@mstrofnone.bit resolves to the npub posting this note.
  • mstrofnone.bit (the bare shorthand) does the same.

Footprint

+1012 / -8 across 10 files. Full vitest suite stays at 103/103. Prettier + ESLint clean for the new files. svelte-check regressions: zero (11 pre-existing errors, same count before and after).

Reference implementations

This is the seventh N1 client port across five runtimes:

  • Kotlin/Android — Amethyst (several merged PRs)
  • Swift/iOS — Nostur PR #60
  • Dart/Flutter — dart-nostr PR #44 (merged) + nostrmo PR #33 (open)
  • JS/TS — nostrudel PR #352, jumble PR #774, nostr-tools PR #533, ants PR #281, nosotros (shipped), and now nostter PR #2128

.bit is a censorship-resistant naming layer (Namecoin, since 2011). For nostter’s calm reader-oriented audience this lands as a one-line suffix check in the existing NIP-05 path — no new badges, no new toggles, no new top-level UI. If the chain says yes, the checkmark lights up. If the chain says no, the checkmark stays dark. That’s the whole UX surface.



Looking for comments…

Searching Nostr relays. This may take a moment the first time this article is opened.