From 6a7a0bccf3c163212e3d743120fe4f49e79ca3cf Mon Sep 17 00:00:00 2001 From: Jure <44338+hoornet@users.noreply.github.com> Date: Mon, 30 Mar 2026 21:48:30 +0200 Subject: [PATCH] =?UTF-8?q?Bump=20to=20v0.10.0=20=E2=80=94=20paste=20neven?= =?UTF-8?q?t/naddr=20in=20search,=20copy=20npub=20from=20profiles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/release.yml | 68 ++++++++------------------ PKGBUILD | 2 +- package.json | 2 +- src-tauri/Cargo.toml | 2 +- src-tauri/tauri.conf.json | 2 +- src/components/profile/ProfileView.tsx | 16 +++++- src/components/search/SearchView.tsx | 19 ++++++- 7 files changed, 56 insertions(+), 55 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4d411c4..be51073 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -69,60 +69,32 @@ 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.11 — Notifications & Bookmarks Polish - - **Follower notifications cleaned up** — followers no longer appear in the Notifications list (they only show in the Follows badge + OS notification); no more confusing "click a contact list" experience - - **Follower OS notification dedup** — fixed repeated notifications for the same person (kind 3 replaceable event IDs change on every contact list update) - - **Article bookmarks fixed** — articles now correctly appear under the Articles tab in Bookmarks, not Notes - - **Notification dedup** — kind 3 follower events deduplicated by pubkey in the notification store + ### New in v0.10.0 — Renamed to Vega + UX Improvements + - **Renamed from Wrystr to Vega** — named after Jurij Vega (1754–1802), Slovenian mathematician and artillery officer. Fresh identity, same mission: a desktop Nostr client built for writers. + - **Paste nevent/note1/naddr in search** — pasting a Nostr event link navigates directly to the note or article (GitHub #2) + - **Copy npub from profiles** — click the pubkey on any profile to copy the full npub to clipboard (GitHub #2) + - **Zap reliability fix** — custom outbox relays replace broken default (purplepag.es DNS failure), 45s timeout prevents indefinite hang + - **Zap history note preview** — zap entries now show a preview of the zapped note with click-to-navigate + - **Follower notification dedup** — fixed repeated OS notifications for the same follower (in-memory store now updated alongside DB) + - **Data migration** — existing Wrystr users automatically migrate settings, database, and keychain on first launch + + ### Previous: v0.9.11 — Notifications & Bookmarks Polish + - Follower notifications cleaned up, follower OS notification dedup, article bookmarks fixed ### Previous: v0.9.10 — Instant Everything - - SQLite-backed followers, bookmarks, and articles cache; instant own-profile load; retry-on-empty for followers, articles, hashtags + - SQLite-backed followers, bookmarks, and articles cache; instant own-profile load - ### Previous: v0.9.9 — Speed, Stability & Linux Fix - - Instant thread loading, Linux/Wayland image upload fix, trending feed reliability, notification retry, upload service scope fix + ### Previous: v0.9.8–v0.9.9 — Web of Trust, Speed & Linux Fix + - Web of Trust (Vertex DVM), SQLite-backed notifications, instant threads, Linux upload fix, trending reliability - ### Previous: v0.9.8 — Web of Trust & Instant Notifications - - Web of Trust on profiles (Vertex DVM), SQLite-backed notification cache, profile notes retry, reaction queue fix - - ### Previous: v0.9.7 — Emoji Reactions & Search - - Grouped emoji reactions (❤️5 🤙3 🔥2), multi-reaction per note, npub search, notification reliability, dev-only debug logger - - ### Previous: v0.9.6 — Font Size Fix - - Content-only zoom, flex-wrap everywhere, themes grid fix - - ### Previous: v0.9.4 — Search, Follows, Editor & Polish - - Search overhaul (dedicated NIP-50 relays, hybrid results), follows view, article editor improvements (image previews, toolbar labels, drag-drop), auto-expanding textareas, profile layout fix, thread stability fix - - ### Previous: v0.9.3 — Themes, Font Size & Settings Polish - - 7 color themes, font size presets, collapsible muted accounts, removed old connection indicator - - ### Previous: v0.9.2 — Relay Status, Toasts & Debug Tools - - Relay status badge, toast notifications, per-tab timestamps, debug panel (Ctrl+Shift+D), consolidated relay management - - ### Previous: v0.9.1 — Live Feed & Relay Reliability - - Live streaming feed, timeouts on all relay fetches, fixed relay death spiral, NDK subscription hygiene, feed diagnostics, background relay recovery - - ### 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 - - ### Previous: v0.8.3 — Trending, Remote Signer, Media - - Trending feed (24h engagement decay), NIP-46 remote signer (bunker://), media feed, profile media gallery, OS push notifications, NIP-05 badges, hashtag pages, keyword muting, emoji picker - - ### Previous: v0.8.0 — Polish, Portability & Discovery - - Profile banner polish, data export, relay recommendations, reading list tracking, trending hashtags + ### Previous: v0.9.0–v0.9.7 — Reactions, Search, Threads & Themes + - Grouped emoji reactions, advanced search (NIP-50), follows view, nested thread trees, 7 color themes, font size presets, relay management, live feed, NIP-46 remote signer ### 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 + - v0.8.x: Trending feed, media feed, profile gallery, OS notifications, NIP-05 badges, hashtag pages, keyword muting, emoji picker, data export, relay health checker + - v0.7.x: NIP-98 uploads, markdown toolbar, multi-draft management, advanced search with modifiers + - v0.6.x: Article discovery feed, article cards, article search + - v0.5.x and earlier: Note sharing, reply counts, image lightbox, bookmarks, DMs, multi-account, system tray, auto-updater ### Install diff --git a/PKGBUILD b/PKGBUILD index 0f81ebe..e5b0d13 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -1,6 +1,6 @@ # Maintainer: hoornet pkgname=vega-nostr -pkgver=0.9.11 +pkgver=0.10.0 pkgrel=1 pkgdesc="Cross-platform Nostr desktop client with Lightning integration" arch=('x86_64') diff --git a/package.json b/package.json index e75acb4..bdee774 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vega", "private": true, - "version": "0.9.11", + "version": "0.10.0", "type": "module", "scripts": { "dev": "vite", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index eaddd57..eae96fa 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "vega" -version = "0.9.11" +version = "0.10.0" 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 51a992a..6235151 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": "Vega", - "version": "0.9.11", + "version": "0.10.0", "identifier": "com.hoornet.vega", "build": { "beforeDevCommand": "npm run dev", diff --git a/src/components/profile/ProfileView.tsx b/src/components/profile/ProfileView.tsx index e0c6548..603829c 100644 --- a/src/components/profile/ProfileView.tsx +++ b/src/components/profile/ProfileView.tsx @@ -1,5 +1,5 @@ import { useEffect, useState } from "react"; -import { NDKEvent } from "@nostr-dev-kit/ndk"; +import { NDKEvent, nip19 } from "@nostr-dev-kit/ndk"; import { useUIStore } from "../../stores/ui"; import { useUserStore } from "../../stores/user"; import { useMuteStore } from "../../stores/mute"; @@ -65,6 +65,7 @@ export function ProfileView() { const [bannerLoaded, setBannerLoaded] = useState(false); const [bannerError, setBannerError] = useState(false); const [wotExpanded, setWotExpanded] = useState(false); + const [npubCopied, setNpubCopied] = useState(false); const isFollowing = follows.includes(pubkey); const { mutedPubkeys, mute, unmute } = useMuteStore(); @@ -260,7 +261,18 @@ export function ProfileView() { {isOwn && !about && (

No bio yet — click "edit profile" to add one.

)} -
{shortenPubkey(pubkey)}
+ diff --git a/src/components/search/SearchView.tsx b/src/components/search/SearchView.tsx index 2459cb5..acf392f 100644 --- a/src/components/search/SearchView.tsx +++ b/src/components/search/SearchView.tsx @@ -1,6 +1,6 @@ import { useState, useRef, useEffect } from "react"; import { NDKEvent, nip19 } from "@nostr-dev-kit/ndk"; -import { fetchFollowSuggestions, fetchProfile, advancedSearch, fetchTrendingHashtags } from "../../lib/nostr"; +import { fetchFollowSuggestions, fetchProfile, advancedSearch, fetchTrendingHashtags, fetchNoteById } from "../../lib/nostr"; import { parseSearchQuery, describeSearch } from "../../lib/search"; import { useUserStore } from "../../stores/user"; import { useMuteStore } from "../../stores/mute"; @@ -215,6 +215,23 @@ export function SearchView() { } } catch { /* not valid, fall through to normal search */ } } + + // Bare note1/nevent1/naddr1 → navigate directly to thread/article + if (/^(note1|nevent1|naddr1)[a-z0-9]+$/i.test(q)) { + try { + const decoded = nip19.decode(q); + if (decoded.type === "note") { + const event = await fetchNoteById(decoded.data); + if (event) { useUIStore.getState().openThread(event); return; } + } else if (decoded.type === "nevent") { + const event = await fetchNoteById(decoded.data.id); + if (event) { useUIStore.getState().openThread(event); return; } + } else if (decoded.type === "naddr") { + useUIStore.getState().openArticle(q); + return; + } + } catch { /* not valid, fall through to normal search */ } + } setLoading(true); setSearched(false); setSearchHint(null);