publish_with_keys and publish_metadata_async carried ~55 identical
lines (JoinSet per-relay sends, 6s timeout, outcome collection,
disconnect, result split) that had to be hand-synced once already.
Extracted into publish::send_to_all_relays; callers keep their own
relay-add policy (note path hard-fails on add errors, metadata path
ignores them), so behavior and user-facing strings are unchanged.
METADATA_SEND_TIMEOUT and profiles::failure_for folded away.
The NIP-46 task created its notification receiver only after
publishing the connect announcement. An automated client answers
within milliseconds, so its ack and first request landed in the
relay pool broadcast channel before a receiver existed and were
dropped silently — the client then waited forever for a reply and
never left its connect/QR screen (seen with Yakihonne).
Open the notification stream right after adding relays, before
connect/subscribe/announce, closing the drop window.
Verified end-to-end with a reference NIP-46 client over live relays:
before the fix get_public_key was never answered; after it the full
round-trip (announce, ack, get_public_key) completes.
The theme dropdown popup inherited the near-transparent select
background and rendered white-on-white under the glass theme.
Options now get an explicit dark surface, plus color-scheme: dark
so native controls render correctly. User-facing name is Aurora;
the internal 'glass' id is unchanged so saved settings keep working.
Commit a01f258 removed Theme::System but missed Settings::default(),
so the crate failed to compile and every desktop launch kept spawning
a stale backend binary that rejected 'glass'. Also untangles the
glass palette CSS that was duplicated as nested blocks inside the
neon rule, and re-applies the theme reactively when settings change.
- Store an optional nip05 on each profile; publish it in kind 0 metadata
- set-nip05 CLI (+ validation, lower-casing, clear) and nip05-file helper
that prints the .well-known/nostr.json document for a domain
- Profiles screen: NIP-05 button, handle shown on cards, Nip05Modal with
client-side validation and Remove action
- Fix Modal stealing focus from autoFocus inputs one frame after open
- Crate/binary: nostr-manager-backend -> keynectr
- Data directory: nost-feed-manager -> keynectr, migrated automatically
on first data_dir() call (existing vaults, settings and backups move)
- Electron extraResources/spawn path, executableName, productName,
window title and CLI usage strings updated to match
- Deliberately unchanged: crypto.rs KDF verifier string, so previously
encrypted vault backups remain decryptable
Verified live: existing vault with two profiles migrated to
~/.local/share/keynectr and loads correctly.