Checkpoint: card-click profile selection

This commit is contained in:
Avi 2026-08-23 15:35:00 -05:00
commit 355e07f40f

View file

@ -1,54 +1,34 @@
# Checkpoint — Profile metadata publishing + profile pictures (2026-08-22) # Checkpoint — Card-click profile selection + rename to Nostr_Keynctr (2026-08-23)
**App renamed to Keynectr (2026-08-23).** A stopping point you can return to if this session is closed. Everything below was **App renamed to Keynectr (2026-08-23).** A stopping point you can return to if this session is closed. Everything below was
verified green at the moment this file was written. verified green at the moment this file was written.
## Where things are ## Where things are
- Project: `/home/avi/Projects/Nostr_Keynctr` (renamed from `0_Nostr` after commit `1116dfd`) - Project: `/home/avi/Projects/Nostr_Keynctr` (renamed from `0_Nostr` after commit `1116dfd`;
- Git repo: `master` @ `a6329d5` ("Publish profile metadata (name + picture) so external folder itself renamed from `Nostr-Keynectr` — see `2e4005d`)
clients show it"). Before it: `db81f8d` (profile deletion with undo), `9a8f334` - Git repo: `master` @ `653945a` ("Select a profile by clicking anywhere on its card").
(audit checkpoint refresh), and the 2026-08-21 audit-fix commits (`f7db29e`, `d90b6e5`, Before it: `2e4005d` (folder-rename checkpoint), `24b34b6`, `6ead6f4`, `31ef305`
`130d7e2`). (Keynectr rebrand), `a6329d5` (metadata publishing), `db81f8d` (delete + undo).
- Working tree is **clean** apart from this checkpoint update, which is committed right after. - Working tree is **clean** apart from this checkpoint update, which is committed right after.
## What was completed ## What was completed
**Problem:** profiles created in the app never published a Nostr kind 0 metadata event, 1. **Click anywhere on a profile card to select it (2026-08-23)** — on the Profiles
so other clients showed generated petnames ("evil iguana", "homeless leech") or a screen, clicking an inactive profile's card now does the same as pressing its
truncated npub instead of the user's chosen name. "Select" button (`653945a`). Clicks on buttons inside the card (Copy / Publish name /
Picture / Delete / Secret key / Select) do not trigger selection. The active card is
not clickable and shows a hover highlight on inactive cards.
2. **Project folder renamed** to `Nostr_Keynctr` (`2e4005d`) — old path
`Nostr-Keynectr` no longer exists; same project, new name.
3. Earlier in the session: Keynectr rebrand across UI/package/binary (`31ef305`,
`6ead6f4`, `24b34b6`), metadata/picture publishing (`a6329d5`) — see previous
checkpoint notes below for details.
1. **Automatic metadata on creation** — `create_profile` now publishes a kind 0 event ## Commits added most recently
with the label as `name`/`display_name` to all enabled relays (best-effort; relay
failures never block creation).
2. **"Publish name" action for existing profiles** — new button on every Profiles-screen
card plus CLI `publish-name <npub>`. Returns a per-relay report shown in the UI.
3. **Profile pictures end-to-end** —
- Vault: optional `picture: Option<String>` per profile (serde default → old vaults
load unchanged).
- Backend: `set_profile_picture` validates http(s) URLs only, stores the URL, and
publishes kind 0 including `picture`; clearing supported (`None`).
- GUI: "Picture" button opens a modal — paste a URL, upload a file via the existing
nostr.build pipeline, or remove; avatar shows the picture everywhere in-app.
- CLI: `set-picture <npub> <url>`.
4. **Nested-runtime safety** — metadata publishing runs on a dedicated OS thread with its
own tokio runtime, so both sync (CLI) and async (IPC server) callers are safe.
5. **Finished prior session's delete/undo work** — exposed `undo_history` in
`AppStateView`, fixed invalid Button variants / missing icon / null-safety errors so
the frontend typechecks again.
6. **Test hygiene fix** — `Settings::default()` points at real relays and tests were
silently publishing events to them (one got rate-limited by damus.io). All test suites
now use offline settings; test time dropped from ~126 s to ~3 s.
## Commits added in this session - `653945a` Select a profile by clicking anywhere on its card
- `2e4005d` Checkpoint: project folder renamed to Nostr_Keynctr
- `7c6a085` Rename the app to Keynectr
- `ae5ddda` Allow new profile methods through the Electron IPC allowlist
- `a6329d5` Publish profile metadata (name + picture) so external clients show it
**Gotcha for future work:** any new backend request type must also be added to
`RENDERER_METHODS` in `frontend/electron/main.ts`, or the main process rejects it with
"rejected renderer method" before it reaches the Rust backend.
## Verification commands run (all green) ## Verification commands run (all green)
@ -56,7 +36,8 @@ Rust (repo root):
``` ```
cargo test # 96 passed; 0 failed cargo test # 96 passed; 0 failed
cargo clippy --all-targets # 0 errors/warnings from session code cargo clippy --all-targets # finishes; 2 pre-existing warnings in src/profiles.rs
# (drop of reference at :170, unused delete_profile at :761)
cargo fmt --check # clean cargo fmt --check # clean
cargo build --release # success cargo build --release # success
``` ```
@ -64,7 +45,7 @@ cargo build --release # success
Frontend (`frontend/`): Frontend (`frontend/`):
``` ```
npm test # 14 files, 78 tests passed npm test # 14 files, 80 tests passed (incl. 2 new card-click tests)
npm run typecheck # clean npm run typecheck # clean
npm run lint # 0 errors npm run lint # 0 errors
npm run format:check # clean npm run format:check # clean
@ -80,6 +61,8 @@ GUI:
cd ~/Projects/Nostr_Keynctr/frontend && npm start cd ~/Projects/Nostr_Keynctr/frontend && npm start
``` ```
- Profiles screen: click an inactive profile's card (anywhere except its buttons) to
make it active; the Select button still works as before.
- New profiles publish their name automatically on creation. - New profiles publish their name automatically on creation.
- Existing profiles: **Profiles → Publish name** button, or **Picture** button to set a - Existing profiles: **Profiles → Publish name** button, or **Picture** button to set a
photo (URL paste or file upload) which publishes immediately. photo (URL paste or file upload) which publishes immediately.
@ -94,12 +77,10 @@ $B publish-name <npub> # republish stored name
$B set-picture <npub> https://…/img.png # set + publish picture $B set-picture <npub> https://…/img.png # set + publish picture
``` ```
Verified live during the session: kind 0 events confirmed present on nos.lol,
relay.primal.net, relay.damus.io and the user's own wss://nostr.l484.com via direct
websocket queries; Iris shows the stored names after publish.
## Notes & next steps ## Notes & next steps
- Pre-existing clippy warnings in `src/profiles.rs` (drop of a reference, unused
`delete_profile`) are untouched — worth cleaning up in a future pass.
- Nostr has no relay-to-relay sync: names/pictures are only visible on relays they were - Nostr has no relay-to-relay sync: names/pictures are only visible on relays they were
published to. Keep major relays enabled so clients that don't read your own relay can published to. Keep major relays enabled so clients that don't read your own relay can
see the profile. see the profile.
@ -116,7 +97,7 @@ websocket queries; Iris shows the stored names after publish.
- **Rename details:** binary is now `keynectr`; data lives in `~/.local/share/keynectr` - **Rename details:** binary is now `keynectr`; data lives in `~/.local/share/keynectr`
(auto-migrated from `nost-feed-manager` on first run — verified live). The KDF verifier (auto-migrated from `nost-feed-manager` on first run — verified live). The KDF verifier
string in crypto.rs was deliberately NOT renamed so old encrypted backups stay readable. string in crypto.rs was deliberately NOT renamed so old encrypted backups stay readable.
If a GitHub remote is ever added, rename the repo to `Nostr_Keynctr` there too. The git remote is `https://git.atitlan.io/avi/Nostr_Keynctr`.
- Relay config at time of writing (all enabled): nos.lol, relay.primal.net, l484.com - Relay config at time of writing (all enabled): nos.lol, relay.primal.net, l484.com
(user's own), damus.io, snort.social, soloco.nl; relay.nostr.band added but was (user's own), damus.io, snort.social, soloco.nl; relay.nostr.band added but was
unreachable (handshake timeout) — retry enabling later. unreachable (handshake timeout) — retry enabling later.