diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bbf1a2d..7d94aac 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -69,18 +69,19 @@ jobs: > **Windows note:** The installer is not yet code-signed. Windows SmartScreen will show an "Unknown publisher" warning — click "More info → Run anyway" to install. - ### New in v0.9.0 — Thread Conversation Overhaul - Major upgrade to how conversations work in Wrystr. - - **Nested thread trees** — replies displayed as visual trees with indentation and connecting lines, not a flat list - - **Reply to any note in thread** — click reply on any note and the reply box opens right below it with proper NIP-10 root + reply marker tagging - - **Recursive reply fetching** — deep replies discovered with a 2-round-trip fetch strategy; previously invisible conversations now surfaced - - **Ancestor chain** — opening a deep reply from the feed shows compact parent notes above the root for full context - - **Multi-level back navigation** — navigation stack (up to 20 levels) retraces your exact path through threads - - **Smart "replying to" links** — scrolls to the parent note if already visible instead of re-opening the same view - - **Thread collapse** — threads with many replies collapse after 3 with "show N more" button - - **Mute filtering in trees** — muted subtrees pruned with "N replies hidden" indicator - - **Loading shimmer** — animated skeleton while thread data loads - - **Podcast subscriptions** — My Podcasts tab, episode playback with V4V streaming sats + ### New in v0.9.1 — Live Feed & Relay Reliability + Fundamental upgrade to how Wrystr connects to relays and delivers content. + - **Live streaming feed** — persistent relay subscriptions deliver new notes in real-time; no manual refresh needed + - **Timeouts on all relay fetches** — every relay query across the entire codebase now has a timeout (5–12s). No view can hang indefinitely — Articles, DMs, Notifications, Zaps, Trending all fixed + - **Fixed relay death spiral** — removed aggressive liveness probe that was disconnecting working relays; relay connections now stay stable + - **NDK subscription hygiene** — prevents stale subscription reuse; `since` filters ensure feed freshness + - **Feed diagnostics** — developer console helpers for tracking fetch timing, event freshness, and relay states + - **Background relay recovery** — automatic NDK instance reset after 30s of continuous failure; preserves login state + - **Fixed Articles Latest** — no longer wipes results on follow list changes + - **Fixed Zap History** — proper loading state; increased timeout for zap queries + + ### Previous: v0.9.0 — Thread Conversation Overhaul + - Nested thread trees, reply-to-any-note, recursive reply fetching, ancestor chain, multi-level back navigation, thread collapse, mute filtering in trees, podcast subscriptions ### Previous: v0.8.4 — Codebase Refactor & Bug Fixes - Codebase refactor (split 5 files into focused modules), Supported NIPs table in README, bug fixes @@ -91,106 +92,15 @@ jobs: ### Previous: v0.8.0 — Polish, Portability & Discovery - Profile banner polish, data export, relay recommendations, reading list tracking, trending hashtags - ### Previous: v0.7.1 — Relay Health Checker & Advanced Search - - **Relay health checker** — NIP-11 info fetch + WebSocket latency probing; relays classified as online/slow/offline; expandable cards show software, description, supported NIPs; "Remove dead" strips offline relays; "Republish list" publishes cleaned NIP-65 relay list - - **Advanced search** — ants-inspired query parser with modifiers: `by:author`, `mentions:npub`, `kind:N`, `is:article`, `has:image`, `since:2026-01-01`, `until:2026-12-31`, `#hashtag`, `"exact phrase"`, boolean `OR`; NIP-05 resolution for author lookups; search help panel - - ### Previous: v0.7.0 — Writer Tools & Upload Fix - - NIP-98 HTTP Auth uploads with fallback services - - Markdown toolbar with keyboard shortcuts (Ctrl+B/I/K) - - Multi-draft management with draft list - - Cover image file picker, article bookmarks (NIP-51 `a` tags) - - Upload moved to TypeScript, draft count badge - - ### Previous: v0.6.1 — Media Upload & Feed Polish - - Native file picker, file path paste upload, mention name resolution, connection stability - - ### Previous: v0.6.0 — Long-form Article Experience - - **Article discovery feed** — dedicated "Articles" view in sidebar with Latest and Following tabs; browse kind 30023 articles from all relays or just followed authors - - **Article cards** — title, summary snippet, author avatar+name, cover image thumbnail, reading time, tag chips - - **Article search** — search notes, articles, and people in parallel; articles tab in search results; supports full-text (NIP-50) and hashtag search for articles - - **Profile Articles tab** — Notes/Articles tab toggle on every profile; browse any author's long-form posts - - **Article reader polish** — estimated reading time, bookmark/save, like (reaction), zap — all in header and footer - - ### Previous: v0.5.0 — Sharing & Thread Indicators - - **Note sharing** — share button on every note copies a `nostr:nevent1…` URI to clipboard; works when logged out too - - **Reply count** — notes now show reply count next to the reply button; updates optimistically when you reply - - ### Previous: v0.4.1 — Media & Feed Fixes - - **Video player** — direct video URLs (.mp4, .webm, .mov, etc.) now render as inline players with native controls - - **Audio player** — direct audio URLs (.mp3, .wav, .flac, etc.) render as inline audio players with filename display - - **YouTube/Vimeo rich cards** — YouTube links show thumbnail previews, Vimeo/Spotify/Tidal show branded cards; all open in external browser - - **Media detection** — parser now recognizes YouTube, Vimeo, Spotify, and Tidal URLs as distinct media types - - **Fix: video clicks opening thread** — media elements rendered outside the clickable area so interactions don't navigate away - - **Fix: post not visible on Following tab** — publishing a note while on Following now correctly shows it in the feed - - ### New in v0.4.0 — Phase 3: Discovery & Polish - - **Image lightbox** — click any image to view full-screen; Escape to close, arrow keys to navigate multi-image posts - - **Bookmarks (NIP-51)** — save/unsave notes with one click; dedicated Bookmarks view in sidebar; synced to relays (kind 10003) - - **Discover people** — "follows of follows" suggestions on the Search page with mutual follow counts and one-click follow - - **Language/script feed filter** — dropdown in feed header filters by writing system (Latin, CJK, Cyrillic, Arabic, Korean, etc.); uses Unicode detection + NIP-32 language tags - - **UI polish** — skeleton loading placeholders, improved empty states with helpful prompts, subtle view fade transitions - - ### New in v0.3.1 - - **Feed tab persists across navigation** — back button now returns to the correct tab (Global/Following) instead of always resetting to Global - - **Available on AUR** — Arch/Manjaro users can install with `yay -S wrystr-git` - - ### New in v0.3.0 - - **Instant feedback** — posted notes appear in feed immediately; thread replies show up without waiting for relay - - **Image paste fix** — uploads now use Tauri HTTP plugin, fixing "Failed to fetch" on Windows - - **Sent zaps visible** — zap history now correctly shows sent zaps (queries kind 9735 receipts instead of ephemeral kind 9734) - - **Reply-to @name clickable** — clicking the @name in "↩ replying to @name" now opens that person's profile - - **Feed refresh on login** — switching or adding an account immediately loads the new account's feed - - ### New in v0.2.8 - - **Fix: OS keychain was a no-op** — `keyring` crate had no platform backends enabled; nsec keys now actually persist to Windows Credential Manager, macOS Keychain, and Linux keyutils - - **Fix: multi-account persistence** — all nsec accounts restored from keychain on startup; account switching no longer gets stuck after restart - - **Fix: account switcher** — shows re-login prompt when keychain entry is missing - - ### New in v0.2.6 - - **Fix: auto-updater** — added `createUpdaterArtifacts: true` + regenerated signing key; `.sig` files and `latest.json` are now correctly produced by CI - - ### New in v0.2.3 - - **Fix: auto-updater** — `latest.json` now correctly generated via `includeUpdaterJson: true`; users on older versions will receive the update banner - - ### New in v0.2.0 — Phase 2: Engagement & Reach - - **Feed reply context** — replies show "↩ replying to @name" above the note; click to open the parent thread - - **NIP-65 outbox model** — reads kind 10002 relay lists so you see notes from people who publish to their own relays; "Publish relay list to Nostr" button in Settings - - **Notifications view** — 🔔 sidebar nav item; lists recent mentions with unread badge; badge clears on open - - **DM unread badge** — messages nav item shows count of conversations with new messages; clears when conversation is opened - - **Keyboard shortcuts** — `n` focus compose, `/` focus search, `j`/`k` navigate feed with highlight, `Esc` go back, `?` help overlay - - ### New in 0.1.7 - - **Per-account Lightning wallet** — NWC connection is now stored per account; switching accounts loads the correct wallet automatically - - **New account creation in-app** — "Add account" now has a "New account" tab that generates a fresh keypair (no need to go through onboarding again) - - **Zap button on thread root note** — like and zap the main note in a thread view - - **Conditional zap button** — zap only shown for profiles that have a Lightning address (lud16/lud06) - - **Image paste in compose** — paste an image from clipboard → auto-uploads to nostr.build and inserts the URL - - **Account switcher redesign** — cleaner dropdown, sign-out/remove moved into menu - - **GitHub Sponsors link** in Support page - - Fix: posts no longer sign under the wrong account during rapid account switches - - ### New in 0.1.6 - - **Linux packaging** — ships `.deb` (Ubuntu/Debian/Mint) and `.rpm` (Fedora/openSUSE) instead of AppImage; Arch users see PKGBUILD in the repo - - ### New in 0.1.5 - - **Article reader** — click any `nostr:naddr1…` link to open it in a clean reader with cover image, author, tags, and full markdown; zap the author inline - - **Zap counts on notes** — ⚡ N sats shown on each note - - **Quoted note preview** — `nostr:note1…` / `nostr:nevent1…` references render as inline bordered cards; click to open thread - - **Auto-updater** — "Update & restart" banner appears when a new version is available - - ### New in 0.1.4 - - **Sidebar** — explicit ‹/› collapse toggle, state persisted across restarts - - **Profile image upload** — uploads to nostr.build, auto-fills URL field - - **NIP-05 live verification** — real-time domain check with ✓/✗ status - - **Search improvements** — NIP-50 relay detection, hashtag fallback suggestion - - ### New in 0.1.3 - - **OS keychain** — sessions survive restarts (macOS Keychain, Windows Credential Manager, Linux Secret Service) - - **Multi-account switcher** — instant switch from sidebar footer - - **SQLite note + profile cache** — feed loads instantly on startup - - **Quote & Repost** (NIP-18), **Mute users** (NIP-51), **NWC setup wizard** - - **System tray**, **Zap history**, **About / Support page** + ### Previous highlights + - v0.7.1: Relay health checker, advanced search with modifiers + - v0.7.0: NIP-98 uploads, markdown toolbar, multi-draft management + - v0.6.0: Article discovery feed, article cards, article search, profile Articles tab + - v0.5.0: Note sharing, reply counts + - v0.4.0: Image lightbox, bookmarks (NIP-51), discover people, language filter + - v0.3.0: Instant feedback, image paste, feed refresh on login + - v0.2.0: Feed reply context, NIP-65 outbox, notifications, DM badges, keyboard shortcuts + - v0.1.3–v0.1.7: OS keychain, multi-account, SQLite cache, zap history, DMs, system tray ### Install diff --git a/PKGBUILD b/PKGBUILD index 2818883..ac66359 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -1,6 +1,6 @@ # Maintainer: hoornet pkgname=wrystr -pkgver=0.9.0 +pkgver=0.9.1 pkgrel=1 pkgdesc="Cross-platform Nostr desktop client with Lightning integration" arch=('x86_64') diff --git a/README.md b/README.md index 61e31f0..4514335 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,7 @@ sudo dnf install gstreamer1-plugins-base gstreamer1-plugins-good gstreamer1-liba - **OS keychain integration** — nsec stored in macOS Keychain / Windows Credential Manager / Linux Secret Service; sessions survive restarts **Feed & content** +- **Live streaming feed** — persistent relay subscriptions deliver new notes in real-time; no manual refresh needed - Global and following feeds with live relay connection - **Language/script feed filter** — filter by writing system (Latin, CJK, Cyrillic, Arabic, Korean, etc.) via dropdown in feed header; uses Unicode detection + NIP-32 language tags - Compose notes, inline replies, **nested thread trees** with reply-to-any-note and multi-level back navigation @@ -88,6 +89,7 @@ sudo dnf install gstreamer1-plugins-base gstreamer1-plugins-good gstreamer1-liba - **NIP-05 verification badges** — cached verification with green checkmark on note cards **Performance & UX** +- **Resilient relay connectivity** — all relay queries have timeouts (no more infinite loading); automatic reconnection with NDK instance reset as last resort; feed diagnostics for debugging - **Auto-updater** — "Update & restart" banner when a new version is available - **SQLite note cache** — feed loads instantly from local cache on startup; profiles cached for immediate avatar display - **Data export** — export bookmarks, follows, and relay list as JSON via native save dialog diff --git a/ROADMAP.md b/ROADMAP.md index fe1d1fc..7f276eb 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -126,6 +126,16 @@ Bugs found during testing are fixed before Phase N+1 starts. A release is cut be ## What's already shipped +### v0.9.1 — Live Feed & Relay Reliability +- **Live streaming feed** — persistent relay subscriptions (`closeOnEose: false`) deliver new notes in real-time; no manual refresh needed. Inspired by Wisp's streaming architecture. +- **Timeouts on all relay fetches** — every `fetchEvents` call across the entire codebase now has a timeout (5–12s depending on query type). No view can hang indefinitely. +- **Fixed relay death spiral** — removed aggressive liveness probe that was force-disconnecting working relays; `ensureConnected` now trusts `relay.connected` and only reconnects when zero relays are connected +- **NDK subscription hygiene** — `groupable: false` prevents NDK from batching/reusing stale subscriptions; `since` filters on global (2h) and follow (24h) feeds ensure freshness +- **Feed diagnostics** — `feedDiagnostics.ts` tracks every feed fetch with timing, event freshness, relay states; console helpers `__feedDiag()`, `__feedDiagRelays()`; periodic relay snapshots +- **NDK reset as last resort** — `resetNDK()` destroys and recreates the NDK instance (preserving signer) when relay connections are unrecoverable; triggered automatically after 30s of continuous failure +- **Fixed Articles Latest** — article feed no longer wipes results when follows array changes +- **Fixed Zap History** — loading state initialised correctly; increased timeout for zap queries (12s) + ### v0.9.0 — Thread Conversation Overhaul - **Nested thread trees** — replies displayed as visual trees with indentation and connecting border lines; see who replied to whom at a glance - **Reply to any note** — inline reply boxes open directly below the note you're replying to; proper NIP-10 root + reply marker tagging diff --git a/package.json b/package.json index 5ae7e9c..7487cbe 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "wrystr", "private": true, - "version": "0.9.0", + "version": "0.9.1", "type": "module", "scripts": { "dev": "vite", diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index d1694d2..68167bc 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -2177,9 +2177,9 @@ dependencies = [ [[package]] name = "linux-keyutils" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "761e49ec5fd8a5a463f9b84e877c373d888935b71c6be78f3767fe2ae6bed18e" +checksum = "83270a18e9f90d0707c41e9f35efada77b64c0e6f3f1810e71c8368a864d5590" dependencies = [ "bitflags 2.11.0", "libc", @@ -4232,9 +4232,9 @@ dependencies = [ [[package]] name = "tao" -version = "0.34.6" +version = "0.34.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d52c379e63da659a483a958110bbde891695a0ecb53e48cc7786d5eda7bb" +checksum = "89ad37db4a177d0a6f02c6895c9dc412b1eaaa2a7b8702fa04aa3f78544691a1" dependencies = [ "bitflags 2.11.0", "block2", @@ -6157,7 +6157,7 @@ dependencies = [ [[package]] name = "wrystr" -version = "0.9.0" +version = "0.9.1" dependencies = [ "keyring", "rusqlite", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index cb0c8cd..25c22e2 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wrystr" -version = "0.9.0" +version = "0.9.1" description = "Cross-platform Nostr desktop client with Lightning integration" authors = ["hoornet"] edition = "2021" diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 839eea7..235bd5c 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "Wrystr", - "version": "0.9.0", + "version": "0.9.1", "identifier": "com.hoornet.wrystr", "build": { "beforeDevCommand": "npm run dev",