mirror of
https://github.com/hoornet/vega.git
synced 2026-05-14 09:18:35 -07:00
Bump to v0.10.0 — paste nevent/naddr in search, copy npub from profiles
This commit is contained in:
68
.github/workflows/release.yml
vendored
68
.github/workflows/release.yml
vendored
@@ -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.
|
> **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
|
### New in v0.10.0 — Renamed to Vega + UX Improvements
|
||||||
- **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
|
- **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.
|
||||||
- **Follower OS notification dedup** — fixed repeated notifications for the same person (kind 3 replaceable event IDs change on every contact list update)
|
- **Paste nevent/note1/naddr in search** — pasting a Nostr event link navigates directly to the note or article (GitHub #2)
|
||||||
- **Article bookmarks fixed** — articles now correctly appear under the Articles tab in Bookmarks, not Notes
|
- **Copy npub from profiles** — click the pubkey on any profile to copy the full npub to clipboard (GitHub #2)
|
||||||
- **Notification dedup** — kind 3 follower events deduplicated by pubkey in the notification store
|
- **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
|
### 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
|
### Previous: v0.9.8–v0.9.9 — Web of Trust, Speed & Linux Fix
|
||||||
- Instant thread loading, Linux/Wayland image upload fix, trending feed reliability, notification retry, upload service scope 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
|
### Previous: v0.9.0–v0.9.7 — Reactions, Search, Threads & Themes
|
||||||
- Web of Trust on profiles (Vertex DVM), SQLite-backed notification cache, profile notes retry, reaction queue fix
|
- 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: 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 highlights
|
### Previous highlights
|
||||||
- v0.7.1: Relay health checker, advanced search with modifiers
|
- 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.0: NIP-98 uploads, markdown toolbar, multi-draft management
|
- v0.7.x: NIP-98 uploads, markdown toolbar, multi-draft management, advanced search with modifiers
|
||||||
- v0.6.0: Article discovery feed, article cards, article search, profile Articles tab
|
- v0.6.x: Article discovery feed, article cards, article search
|
||||||
- v0.5.0: Note sharing, reply counts
|
- v0.5.x and earlier: Note sharing, reply counts, image lightbox, bookmarks, DMs, multi-account, system tray, auto-updater
|
||||||
- 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
|
### Install
|
||||||
|
|
||||||
|
|||||||
2
PKGBUILD
2
PKGBUILD
@@ -1,6 +1,6 @@
|
|||||||
# Maintainer: hoornet <hoornet@users.noreply.github.com>
|
# Maintainer: hoornet <hoornet@users.noreply.github.com>
|
||||||
pkgname=vega-nostr
|
pkgname=vega-nostr
|
||||||
pkgver=0.9.11
|
pkgver=0.10.0
|
||||||
pkgrel=1
|
pkgrel=1
|
||||||
pkgdesc="Cross-platform Nostr desktop client with Lightning integration"
|
pkgdesc="Cross-platform Nostr desktop client with Lightning integration"
|
||||||
arch=('x86_64')
|
arch=('x86_64')
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "vega",
|
"name": "vega",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.9.11",
|
"version": "0.10.0",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "vega"
|
name = "vega"
|
||||||
version = "0.9.11"
|
version = "0.10.0"
|
||||||
description = "Cross-platform Nostr desktop client with Lightning integration"
|
description = "Cross-platform Nostr desktop client with Lightning integration"
|
||||||
authors = ["hoornet"]
|
authors = ["hoornet"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://schema.tauri.app/config/2",
|
"$schema": "https://schema.tauri.app/config/2",
|
||||||
"productName": "Vega",
|
"productName": "Vega",
|
||||||
"version": "0.9.11",
|
"version": "0.10.0",
|
||||||
"identifier": "com.hoornet.vega",
|
"identifier": "com.hoornet.vega",
|
||||||
"build": {
|
"build": {
|
||||||
"beforeDevCommand": "npm run dev",
|
"beforeDevCommand": "npm run dev",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useEffect, useState } from "react";
|
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 { useUIStore } from "../../stores/ui";
|
||||||
import { useUserStore } from "../../stores/user";
|
import { useUserStore } from "../../stores/user";
|
||||||
import { useMuteStore } from "../../stores/mute";
|
import { useMuteStore } from "../../stores/mute";
|
||||||
@@ -65,6 +65,7 @@ export function ProfileView() {
|
|||||||
const [bannerLoaded, setBannerLoaded] = useState(false);
|
const [bannerLoaded, setBannerLoaded] = useState(false);
|
||||||
const [bannerError, setBannerError] = useState(false);
|
const [bannerError, setBannerError] = useState(false);
|
||||||
const [wotExpanded, setWotExpanded] = useState(false);
|
const [wotExpanded, setWotExpanded] = useState(false);
|
||||||
|
const [npubCopied, setNpubCopied] = useState(false);
|
||||||
|
|
||||||
const isFollowing = follows.includes(pubkey);
|
const isFollowing = follows.includes(pubkey);
|
||||||
const { mutedPubkeys, mute, unmute } = useMuteStore();
|
const { mutedPubkeys, mute, unmute } = useMuteStore();
|
||||||
@@ -260,7 +261,18 @@ export function ProfileView() {
|
|||||||
{isOwn && !about && (
|
{isOwn && !about && (
|
||||||
<p className="text-text-dim text-[12px] mt-2 italic">No bio yet — click "edit profile" to add one.</p>
|
<p className="text-text-dim text-[12px] mt-2 italic">No bio yet — click "edit profile" to add one.</p>
|
||||||
)}
|
)}
|
||||||
<div className="text-text-dim text-[10px] font-mono mt-2">{shortenPubkey(pubkey)}</div>
|
<button
|
||||||
|
onClick={() => {
|
||||||
|
const npub = nip19.npubEncode(pubkey);
|
||||||
|
navigator.clipboard.writeText(npub);
|
||||||
|
setNpubCopied(true);
|
||||||
|
setTimeout(() => setNpubCopied(false), 2000);
|
||||||
|
}}
|
||||||
|
className="text-text-dim text-[10px] font-mono mt-2 hover:text-accent transition-colors cursor-pointer"
|
||||||
|
title="Copy npub to clipboard"
|
||||||
|
>
|
||||||
|
{npubCopied ? "copied!" : shortenPubkey(pubkey)}
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { useState, useRef, useEffect } from "react";
|
import { useState, useRef, useEffect } from "react";
|
||||||
import { NDKEvent, nip19 } from "@nostr-dev-kit/ndk";
|
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 { parseSearchQuery, describeSearch } from "../../lib/search";
|
||||||
import { useUserStore } from "../../stores/user";
|
import { useUserStore } from "../../stores/user";
|
||||||
import { useMuteStore } from "../../stores/mute";
|
import { useMuteStore } from "../../stores/mute";
|
||||||
@@ -215,6 +215,23 @@ export function SearchView() {
|
|||||||
}
|
}
|
||||||
} catch { /* not valid, fall through to normal search */ }
|
} 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);
|
setLoading(true);
|
||||||
setSearched(false);
|
setSearched(false);
|
||||||
setSearchHint(null);
|
setSearchHint(null);
|
||||||
|
|||||||
Reference in New Issue
Block a user