Commit Graph

61 Commits

Author SHA1 Message Date
Jure
708c54b2a3 Merge pull request #1 from hoornet/hoornet-patch-1
Update Liberapay username in FUNDING.yml
2026-03-10 22:05:35 +01:00
Jure
2fe95473a3 Add Support section to README so #support anchor works
Fixes broken "Zap the developer" link in GitHub release notes.
Includes Lightning, Bitcoin, Ko-fi, and in-app zap instructions.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 22:04:01 +01:00
Jure
3e3532d47d Update Liberapay username in FUNDING.yml 2026-03-10 21:57:28 +01:00
Jure
98f5d70024 Bump version to 0.1.5 + update release notes (Phase 1 complete)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v0.1.5
2026-03-10 21:05:42 +01:00
Jure
5659f18099 Add auto-updater (Phase 1 #4)
- tauri-plugin-updater + tauri-plugin-process registered (Rust + npm)
- Updater endpoint: github.com/hoornet/wrystr/releases/latest/download/latest.json
- Ed25519 signing keypair generated; public key in tauri.conf.json;
  private key added to TAURI_SIGNING_PRIVATE_KEY GitHub secret
- Release workflow passes TAURI_SIGNING_PRIVATE_KEY env var so
  tauri-action signs artifacts and generates latest.json manifest
- useUpdater hook: checks for updates 5 s after startup (silent on
  error); exposes available, version, install(), dismiss()
- UpdateBanner: dismissible top-of-app bar shown when an update is
  available — "Update & restart" downloads, installs, and relaunches

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 21:00:14 +01:00
Jure
4cde2fe4c7 Add quoted note inline preview (Phase 1 #3)
- fetchNoteById(eventId): fetches a single event by ID
- NoteContent: note1 and nevent1 (kind 1) references now parsed as
  "quote" segment type instead of plain mention text
- QuotePreview component: lazily fetches the referenced note, renders
  a bordered card with author avatar + name + truncated content;
  click navigates to the thread view
- Quote cards rendered as a block below the note text, consistent with
  how images/videos are handled
- naddr1 (kind 30023) and other nevent kinds still open via the
  existing article/njump.me handler

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 20:46:08 +01:00
Jure
af5e04f963 Add zap counts on notes (Phase 1 #2)
- fetchZapCount(eventId): fetches kind 9735 receipts for an event,
  parses millisat amounts from embedded zap request description tags,
  returns { count, totalSats }
- useZapCount hook: session-cached, same pattern as useReactionCount
- NoteCard: zap button shows " N sats" when total > 0, falls back
  to " zap" when no zaps yet; stats row shown for logged-out users
  displaying ♥ and  counts when non-zero

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 20:43:54 +01:00
Jure
ab7af96c45 Add long-form article reader (Phase 1 #1, NIP-23)
- fetchArticle(naddr): fetches kind 30023 by d-tag + author pubkey
- fetchAuthorArticles(pubkey): for future profile articles tab
- ArticleView: cover image, title, italic summary, author row (avatar +
  name + date), tag pills, full markdown body (DOMPurify sanitized),
  zap author button in header and footer, copy nostr: link, njump.me
  fallback on fetch error
- prose-article CSS: reader-optimised typography (15px base, 1.8 line
  height, h2 border, styled blockquote/code/pre/links/images)
- NoteContent: naddr1 clicks for kind 30023 now open ArticleView
  instead of falling through to njump.me
- openArticle(naddr) added to UI store with previousView tracking

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 20:42:13 +01:00
Jure
f0cb9a97bb Restructure roadmap into Phase 1/2/3 with release gates between phases
Phase 1 (OpenSats priority): article reader, zap counts, quoted note
preview, auto-updater.

Phase 2 (engagement): notifications, NIP-65 outbox, reply context,
keyboard shortcuts.

Phase 3 (polish): NIP-17 DMs, image lightbox, bookmarks, follow
suggestions, UI polish.

Also documents all shipped features through v0.1.x and captures the
brainstorm backlog (WOT, NIP-23 depth, NIP-46).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 20:38:17 +01:00
Jure
6464ba2a79 Add Direct Messages — NIP-04 encrypted DMs (roadmap #13)
Nostr layer:
- fetchDMConversations: fetches all kind-4 events to/from the user
  (both directions in parallel), deduplicates, newest-first
- fetchDMThread: fetches both directions for a specific conversation,
  sorted oldest-first for display
- sendDM: NIP-04 encrypts content via NDK signer, publishes kind 4
- decryptDM: decrypts regardless of direction (ECDH shared secret is
  symmetric — always pass the other party to signer.decrypt)

UI (DMView):
- Two-panel layout: conversation list (w-56) + active thread
- ConvRow: avatar, name, time; shows "🔒 encrypted" preview to avoid
  decrypting the whole inbox on load
- MessageBubble: decrypts lazily on mount; mine right-aligned,
  theirs left-aligned; shows "Could not decrypt" on failure
- ThreadPanel: loads full thread, auto-scrolls to bottom, re-fetches
  after send; Ctrl+Enter to send
- NewConvInput: start a new conversation by pasting an npub1 or hex
  pubkey; validates and resolves before opening thread
- Read-only (npub) accounts see a clear "nsec required" message

Navigation:
- ✉ messages added to sidebar nav
- openDM(pubkey) in UI store → navigates to dm view with pending pubkey
- ProfileView: "✉ message" button in action row opens DM thread

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 20:29:05 +01:00
Jure
65d103f252 Bump version to 0.1.4 + update release notes
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v0.1.4
2026-03-10 20:22:48 +01:00
Jure
d72dfe56d8 Search improvements — NIP-50 relay detection + smarter zero-results (roadmap #12)
- relayInfo.ts: checkNip50Support fetches NIP-11 relay info (Accept:
  application/nostr+json) and checks supported_nips for 50; results
  cached per session with 4s timeout; getNip50Relays checks all relays
  in parallel

- SearchView: relay NIP-50 support checked on mount in the background
  and shown as context in the idle state ("N of M relays support
  full-text search") and in zero-results states

- Zero results for full-text search now shows:
  - relay NIP-50 count (or "none of your relays support full-text")
  - prominent "Search #<query>" one-click button to retry as hashtag

- Tabs (notes / people) now always rendered after any search, not only
  when both result types are non-empty — makes the UI consistent

- Per-tab zero-results explanations: people tab explains NIP-50
  requirement when no relay supports it

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 20:21:22 +01:00
Jure
abd38a4edd Add profile helpers for newcomers (roadmap #11)
Image upload (ImageField):
- "upload" button next to profile picture and banner URL fields
- Opens native file picker (accept="image/*"), uploads to nostr.build
  free hosting via their v2 API, auto-fills the URL on success
- Shows inline error if upload fails; URL field still editable manually

NIP-05 verification (Nip05Field):
- Replaces the plain nip05 text field
- Debounced live check (900ms): fetches /.well-known/nostr.json?name=...
  and compares the returned pubkey against the logged-in user's pubkey
- Status badges: checking… / ✓ verified / ✗ pubkey mismatch / ✗ not found
- "How to get verified ↗" link to nostr.how guide

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 20:18:18 +01:00
Jure
288abdc180 Sidebar improvements (roadmap #10)
- sidebarCollapsed now persisted to localStorage — remembered across sessions
- Explicit ‹/› toggle button always visible in the header; no longer
  requires knowing to click the WRYSTR wordmark
  - Expanded: WRYSTR on left, ‹ collapse button on right
  - Collapsed: centered › expand button fills the header
- Write article (✦) now visible in collapsed mode as icon-only with
  tooltip, consistent with the rest of the nav
- Nav items have title tooltip in collapsed mode for discoverability
- Status footer: collapsed shows just the connection dot with tooltip;
  expanded shows dot + online/offline text + note count as before

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 19:41:16 +01:00
Jure
faaf8ac4a4 Bump version to 0.1.3 + update README and release notes
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v0.1.3
2026-03-10 19:37:57 +01:00
Jure
16446573c4 Add zap history view (roadmap #9)
- fetchZapsReceived: kind 9735 filtered by #p tag (receipts)
- fetchZapsSent: kind 9734 filtered by authors (zap requests)
- ZapHistoryView: Received / Sent tabs with row count; header shows
  total sats in/out; each row: avatar, amount, counterpart name
  (clickable → profile), comment, time ago
- Receipt parsing: amount from embedded zap request in "description"
  tag (millisats → sats); sender from uppercase "P" tag with fallback
  to zap request pubkey
- Request parsing: amount from "amount" tag, recipient from "p" tag
-  zaps nav item added to sidebar between search and relays
- Logged-out fallback state with prompt to log in

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 19:32:44 +01:00
Jure
cccae35169 Add system tray / minimize to tray (roadmap #8)
- tauri "tray-icon" feature enabled
- Tray icon created on startup using the app's default window icon
- Tray menu: "Open Wrystr" (show + focus) and "Quit" (app.exit)
- Left-click on tray icon: show + focus the main window
- Right-click: context menu (platform default)
- Window close button (X) now hides to tray instead of exiting —
  "Quit" in the tray menu is the exit point
- Works on Windows (system tray), Linux (status bar tray), macOS
  (menu bar); DE-specific tray support varies on Linux

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 19:29:00 +01:00
Jure
da9297c1cc Add NWC setup UX guided wizard (roadmap #7)
Replaces the raw nostr+walletconnect:// textarea with a two-step wizard:

Step 1 — wallet chooser: grid of 4 cards (Alby Hub, Alby Extension,
Mutiny, Phoenix) each with an "open ↗" link to the wallet's NWC setup
page and a "connect →" button to advance; "I already have a connection
string" skip link for power users.

Step 2 — paste URI: per-wallet numbered instructions, textarea with
real-time format validation (detects missing params, wrong prefix),
green "✓ Valid — relay: hostname" on success, specific error messages
on failure; ← back link to wallet chooser.

Connected state: shows detected wallet name + relay hostname, disconnect
button. Raw URI textarea kept as the fallback path via "generic" wallet.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 18:33:47 +01:00
Jure
0f998eac92 Add Quote / Repost (NIP-18, roadmap #6)
- publishRepost: kind 6 event with stringified original event as content
  and ["e", id, "", "mention"] + ["p", pubkey] tags
- publishQuote: kind 1 note with user's text + appended nostr:nevent1...
  reference and ["q", id] + ["p", pubkey] tags
- QuoteModal: compose modal with live quoted-note preview (avatar, name,
  truncated content); Ctrl+Enter to post, Escape to close
- NoteCard: "repost" (one-click, shows "reposted ✓") and "quote" (opens
  QuoteModal) added to the actions row alongside reply/like/zap

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 18:28:59 +01:00
Jure
acf171bb74 Bump version to 0.1.2
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 18:26:01 +01:00
Jure
42fe32f584 Add mute/ignore user + anti-spam (roadmap #5, NIP-51)
- fetchMuteList / publishMuteList in nostr client (kind 10000)
- mute store: mutedPubkeys persisted to localStorage + synced to relay;
  mute/unmute publish kind 10000 best-effort; fetchMuteList merges relay
  list with local mutes on login
- fetchMuteList called after every login (nsec + pubkey)
- Feed: muted pubkeys filtered from both Global and Following tabs
- NoteCard: ⋯ context menu (appears on hover, hidden for own notes)
  with mute / unmute action; backdrop click closes menu
- ProfileView: mute / unmute button in the action row (next to follow)
- SettingsView: MuteSection lists muted accounts with name + avatar;
  hover to reveal unmute button; hidden when mute list is empty

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 18:23:30 +01:00
Jure
926a7cbdae Add About / Support page (roadmap #4)
- New 'about' view wired into sidebar nav (♥ support) and App.tsx
- Sections: in-app zap button (reuses ZapModal + NWC infra), Lightning
  address QR + copy, Bitcoin address QR + copy, Ko-fi link, GitHub link,
  version/tech credits footer
- QR codes rendered as SVG via react-qr-code (no canvas dependency)
- lightning: URI and bitcoin: URI formats for wallet-scannable QR codes
- Tasteful and non-nagging — lives in the nav, never pops up unprompted

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 18:16:54 +01:00
Jure
e3ba3dbcee Add SQLite note and profile cache (roadmap #3)
- Rust: rusqlite (bundled) with WAL mode; wrystr.db in app data dir
  - db_save_notes: upsert batch of raw event JSON, prune to 500 kind-1 notes
  - db_load_feed: return N most-recent kind-1 raws for instant startup display
  - db_save_profile / db_load_profile: cache NDKUserProfile JSON by pubkey
  - Falls back to in-memory SQLite if the on-disk open fails
- src/lib/db.ts: typed invoke wrappers; all errors silenced (cache is best-effort)
- feed store: loadCachedFeed() populates notes before relay connects;
  loadFeed() merges fresh+cached (so relay returning fewer notes doesn't
  erase cached ones), then saves fresh notes to SQLite
- useProfile: reads SQLite cache to show avatar/name instantly while
  relay request is in-flight; saves result to SQLite after relay responds
- Feed: calls loadCachedFeed() first → notes visible before relay connects

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 17:53:00 +01:00
Jure
a8627b7305 Add multi-account / profile switcher (roadmap #2)
- SavedAccount list persisted in localStorage (wrystr_accounts)
- loginWithNsec / loginWithPubkey now upsert into the accounts list
- fetchOwnProfile caches name + picture into the account entry
- switchAccount: loads nsec from OS keychain, falls back to read-only
- removeAccount: deletes keychain entry + removes from list; logs out
  if it was the active account
- logout: clears active session only — keychain entries kept for instant
  switch-back
- AccountSwitcher component in sidebar footer: shows current account,
  expand (▼/▲) to list all saved accounts, click to switch instantly,
  × to remove, "+ add account" opens LoginModal, sign-out / remove
  account actions inline

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 17:28:39 +01:00
Jure
4ef824a26a Add OS keychain for persistent nsec sessions (roadmap #1)
- Rust: store_nsec / load_nsec / delete_nsec Tauri commands via keyring crate
  (macOS Keychain, Windows Credential Manager, Linux Secret Service)
- On nsec login: key is stored in OS keychain keyed by hex pubkey
- On startup: restoreSession() auto-loads nsec from keychain and re-establishes
  the NDK signer — no manual re-login required after restart
- On logout: keychain entry is deleted
- Graceful degradation: if keychain is unavailable (e.g. Linux without a Secret
  Service daemon), the app starts logged-out — same UX as before, no crash

Also updates ROADMAP.md with 4 new items from the Windows playtest (multi-account
switcher, NWC wizard, system tray, zap history view) and reorders the list.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 17:21:44 +01:00
Jure
ee26edfe65 Bump version to 0.1.1 v0.1.1 2026-03-10 08:14:15 +01:00
Jure
909f8f4731 Ignore OpenSats application draft (private) 2026-03-09 21:17:30 +01:00
Jure
b7853a14e2 Wire up NIP-19 / NIP-21 navigation + hashtag search from notes
- Mention clicks (nostr:npub1, nostr:nprofile) open internal ProfileView
- njump.me links intercepted: npub/nprofile decoded and opened internally,
  note/nevent/naddr fall through to browser (no reader yet)
- Hashtag clicks navigate to SearchView and auto-run the search
- openSearch(query) action added to UIStore; pendingSearch consumed on mount

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 20:47:57 +01:00
Jure
2cdf99b725 Fix own profile not updating after save + expand roadmap
- ProfileView: own profile now reads from user store directly instead of
  useProfile() hook, which only re-fetches on pubkey change — so the bio/
  name/avatar updates immediately after saving without needing to navigate away

- ROADMAP: added items from playtest feedback:
  - About/funding page (Bitcoin QR, Lightning, zap dev npub, Ko-fi/GitHub)
  - Mute/ignore user + anti-spam settings + WOT brainstorm note
  - Quote/repost (NIP-18)
  - Sidebar auto-hide + clearer collapse affordance
  - Profile helpers for newcomers (NIP-05, image upload)
  - Search improvements (NIP-50 relay detection, people search fallback)
  - UI/look & feel deferred until after Windows playtest
  - Long-form reading experience as a brainstorm session

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 20:41:19 +01:00
Jure
515eb2c81c Fix blank window on Wayland (Hyprland) — disable WebKit DMA-BUF renderer
Sets WEBKIT_DISABLE_DMABUF_RENDERER=1 on Linux before Tauri initialises.
Prevents EGL_BAD_PARAMETER crash in WebKit's GPU process on compositors
like Hyprland that don't expose the required EGL display extensions.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 20:01:16 +01:00
Jure
1b32072c37 Fix macOS Intel runner: macos-13 deprecated, use macos-12 2026-03-09 19:43:57 +01:00
Jure
90290e511b Add macOS (Apple Silicon + Intel) to release matrix
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v0.1.0
2026-03-09 19:38:10 +01:00
Jure
f04cce744e Fix TypeScript errors blocking production build
- ArticleEditor: annotate map callback parameter as string
- ui.ts: prefix unused get parameter with _ to silence noUnusedLocals

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 19:37:43 +01:00
Jure
848b72630f Add GitHub Actions release workflow
Builds Linux (AppImage + .deb) and Windows (.exe + .msi) on tag push.
Triggered by v* tags. Uses tauri-apps/tauri-action@v0.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 19:36:25 +01:00
Jure
c4b14f1dd4 Fix read-only mode: hide write actions when no signer
- ComposeBox, action row (reply/like/zap), and write article button
  all gated on getNDK().signer in addition to loggedIn
- Prevents read-only (npub-only) users from seeing actions they can't use
- Found during browser testing of the login path

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 19:32:06 +01:00
Jure
f3d0929253 Update documentation to reflect current feature set
- CLAUDE.md: updated architecture map, current state (implemented/not yet), conventions
- README.md: full feature list updated, roadmap trimmed to what's actually next
- ROADMAP.md: mark completed items done, collapse into 'Up next' section

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 17:58:54 +01:00
Jure
c84e5d3a3b Add onboarding flow for new users
- OnboardingFlow replaces app layout on first visit (no wrystr_pubkey in localStorage)
- Welcome screen: plain-language explanation of Nostr/keys, two paths
- Create path: NDKPrivateKeySigner.generate(), show npub with copy button
- Backup step: show nsec with danger styling, copy button, checkbox confirmation
  required before proceeding — login happens only after user confirms backup
- Login path: existing nsec or read-only npub, back button to welcome
- On complete: normal app layout shown; pubkey in localStorage acts as the flag

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 17:55:27 +01:00
Jure
8fcabac450 Add zaps: NWC wallet connect + NIP-57 zap flow
- NWC client (nwc.ts): parse URI, encrypt/send kind 23194, await kind 23195 response
- Lightning store: persist NWC URI to localStorage, zap() via NDKZapper + lnPay callback
- ZapModal: amount presets (21/100/500/1000/5000 sats), custom amount, optional comment,
  paying/success/error states, prompts to Settings if no wallet connected
-  zap button on NoteCard (action row) and ProfileView (header, next to follow)
- Settings > Lightning Wallet section: paste NWC URI, connect/disconnect

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 17:45:39 +01:00
Jure
b324db6bac Update roadmap: funding UI TODO, sync done list
- Add item #10: project funding/support UI brainstorm (Bitcoin, Lightning, zaps)
- Update 'already done' to reflect recent work (reactions, follow, search, settings)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 17:39:34 +01:00
Jure
2370fc21f9 Add search view (NIP-50 + hashtag + people)
- searchNotes: NIP-50 full-text for text queries, #t tag filter for #hashtags
- searchUsers: NIP-50 kind 0 search for people
- SearchView with tabbed notes/people results, follow/unfollow inline
- Hashtag queries skip people search and use universal #t filter
- Graceful empty state explains NIP-50 relay support caveat
- Search added to sidebar nav (⌕)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 17:38:54 +01:00
Jure
0a0a00a1b3 Build out Settings view: relay management + identity
- addRelay / removeRelay in nostr lib; relay list persisted to localStorage
- getNDK() seeds from localStorage instead of hardcoded list
- Settings > Relays: list with status dots, remove on hover, add with validation
- Settings > Identity: npub display with one-click copy
- Removed local umbrel relay from defaults (was a dev artifact)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 17:33:27 +01:00
Jure
d52cfa5f75 Add network reaction counts to note cards
- fetchReactionCount (kind 7 #e filter) in nostr lib
- useReactionCount hook with module-level cache to avoid refetching
- NoteCard shows count next to like button; increments optimistically on like
- Falls back to "like"/"liked" text when count is zero or still loading

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 17:31:42 +01:00
Jure
2960e7b279 Add follow/unfollow (NIP-02) from profile view
- publishContactList (kind 3) in nostr lib — replaces full follow list on each change
- follow() and unfollow() actions in user store with optimistic UI update
- Follow/Unfollow button in ProfileView header (visible when logged in, not own profile)
- Button shows "unfollow" in muted style with danger hover when already following

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 17:25:34 +01:00
Jure
b0a477177d Expand roadmap: onboarding, long-form vision, editorial TODO
- Add onboarding as a named roadmap item (first-class, not afterthought)
- Add vision note positioning long-form content as Wrystr's distinguishing feature
- Plant a brainstorm TODO for the long-form reading/writing/discovery design session
- Renumber items accordingly

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 16:42:24 +01:00
Claude
469c0ded23 Add ROADMAP.md with prioritized next steps from codebase analysis 2026-03-09 15:33:01 +00:00
Jure
f434ef3d90 Add auto-updater to roadmap
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 19:46:24 +01:00
Jure
cf3f8d4761 Replace scaffold README with actual project description
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 19:25:04 +01:00
Jure
a8a3581f9a Fix profile cache invalidation after editing
Invalidate the in-memory profile cache for the user's pubkey after
publishing a new kind 0 event, so the updated profile reflects immediately.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 19:23:51 +01:00
Jure
b465ad03a3 Add editable own profile + navigation fixes
- ProfileView shows edit form when viewing own profile
- publishProfile (kind 0) added to nostr lib
- Sidebar name/avatar opens own profile
- Back button in edit mode cancels form; outside edit mode navigates back
- goBack safeguard: falls back to feed if previousView === currentView
- Fix ThreadView crash when selectedNote is null
- Tighten feed filter for base64 blobs and protocol messages

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 19:19:24 +01:00
Jure
bf1d68bb93 Add long-form article editor (NIP-23)
- ArticleEditor with title, markdown body, summary, cover image, tags
- write/preview toggle with markdown rendering via marked
- Auto-save draft to localStorage
- Publish as kind 30023 with NIP-23 tags (d, title, published_at, etc.)
- 'write article' button in sidebar when logged in
- Article preview prose styles in CSS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 19:04:43 +01:00