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.


Write a comment
No comments yet.