Commit Graph

311 Commits

Author SHA1 Message Date
Jure f9fda75cac flatpak: add Flathub packaging (manifest, metainfo, desktop, README)
From-source Flatpak build for com.veganostr.Vega on GNOME 50 runtime.
Screenshots and the manifest git-pin are finalized before the Flathub PR.
Vendored cargo/node sources are generated (gitignored; live in the flathub repo).
2026-07-15 13:57:12 +02:00
Jure 662155224c docs: record react-qr-code CJS-import crash and release.yml startup-failure lessons in CLAUDE.md 2026-07-15 11:37:02 +02:00
Jure e0a7c2e1a4 ci: restore release notes body to known-good form (isolate v0.14.1 startup failure) v0.14.1 2026-07-15 11:23:39 +02:00
Jure 7b7116fd58 Release v0.14.1 — fix Support view crash, add proxy/Tor support
Fixes a crash that blanked the Support (About/donate) view with React
error #130 on every release build since v0.13.2. react-qr-code ships
CommonJS, and since the Vite 8 / Rolldown migration its default import
resolved to the module namespace object ({ QRCode, default }) instead of
the component, making <QRCode/> an invalid element. AboutView now unwraps
the import to the real component. Reproduced against the production bundle
and verified fixed the same way.

Also ships the configurable HTTP/SOCKS5 network proxy (incl. Tor) from
PR #10 by Anderseta, merged earlier: routes relay WebSockets, Rust-side
fetches and update checks through the proxy. The proxy settings and the
README/CHANGELOG note that DNS is not yet guaranteed private (issue #11).

Adds a Contributors section to the README (Anderseta, SondreB).
2026-07-15 11:16:07 +02:00
Anderson Henrique Orso 7f4eab58c2 Add configurable HTTP/SOCKS5 network proxy (#10)
Adds a Settings UI to route Vega through an HTTP or SOCKS5 proxy (e.g. Tor).

Covers both network stacks: the webview (proxy_url applied at build time, so
relay WebSocket traffic is proxied) and all five Rust-side plugin-http call
sites (converted to fetchWithProxy). The auto-updater's check and download are
also routed via check({ proxy }), so update traffic no longer bypasses the
proxy and leaks the user's IP.

socks5h:// is intentionally rejected for now: Tauri's webview proxy API only
documents http and socks5, so accepting socks5h globally would imply a DNS-leak
guarantee the webview can't yet make. Tracking a cross-platform DNS-leak test
as follow-up.

By Anderseta.
2026-07-15 10:34:49 +02:00
Jure ca60b4554c docs: record the v0.14.0 identifier change and the Tauri setup() migration trap in CLAUDE.md 2026-07-14 19:28:32 +02:00
Jure 957557708e Bump to v0.14.0 — app identifier moves to com.veganostr.Vega
The app identifier changes from `com.hoornet.vega` to `com.veganostr.Vega`.
A reverse-DNS app ID must sit on a domain the project controls; the old one
did not, which blocks publishing on Flathub and leaves Vega's identity
inconsistent across Flathub, winget and the native installers.

The identifier keys every per-app directory, so this migrates existing
installs on first launch: the SQLite cache (vega.db), the embedded relay's
database (relay.db), and webview localStorage (themes, drafts, podcast
subscriptions, article read-state).

Migration runs at the top of run(), before tauri::Builder — not inside
.setup(). Tauri builds the config-defined windows before invoking the setup
hook, and building a webview create_dir_all's <LocalData>/<identifier>, which
on Linux is the same directory that holds vega.db. Migrating from setup()
would therefore always find a non-empty destination, skip, and silently
strand every Linux user's data with no way for a later fix to recover it.

Entries are moved individually rather than renaming the whole tree, so a
destination the webview already created does not block the migration, and a
failed attempt retries on the next launch. An entry that already exists at
the destination is never overwritten — the live copy always wins.

All three per-platform roots are covered: WebView2 keeps localStorage under
%LOCALAPPDATA% on Windows (not %APPDATA%), and WKWebView keeps it under
~/Library/WebKit on macOS, neither of which is the app data dir.

Keys are unaffected — the keychain service name is independent of the
identifier, so users stay logged in.

Windows installs v0.14.0 alongside v0.13.2 rather than replacing it, since
the changed identifier reads as a new application. Documented in the README,
CHANGELOG and release notes.
v0.14.0
2026-07-14 12:20:32 +02:00
Jure d37a414b82 docs: remove stale Wrystr references from README, fix shipped V4V in ROADMAP Up next 2026-06-20 18:05:03 +02:00
Jure fdc0c3c588 Bump dompurify 3.4.9 → 3.4.11 (GHSA-cmwh-pvxp-8882 ALLOWED_ATTR pollution) 2026-06-20 14:58:37 +02:00
dependabot[bot] d3a52e2d98 Bump undici from 7.24.4 to 7.28.0 (#9)
Bumps [undici](https://github.com/nodejs/undici) from 7.24.4 to 7.28.0.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v7.24.4...v7.28.0)

---
updated-dependencies:
- dependency-name: undici
  dependency-version: 7.28.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-20 14:46:05 +02:00
dependabot[bot] fe044b0327 Bump dompurify from 3.4.2 to 3.4.9 (#8)
Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.4.2 to 3.4.9.
- [Release notes](https://github.com/cure53/DOMPurify/releases)
- [Commits](https://github.com/cure53/DOMPurify/compare/3.4.2...3.4.9)

---
updated-dependencies:
- dependency-name: dompurify
  dependency-version: 3.4.9
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-18 14:31:02 +02:00
Jure b58e218de1 docs: update README, CHANGELOG, and CLAUDE.md for v0.13.2
- CHANGELOG: add v0.13.2 entry (note re: v0.12.10–v0.13.1 in GitHub Releases)
- README: mute-aware search, resizable sidebar, collapsing compose box, update-banner changelog; bump verify example to 0.13.2
- CLAUDE.md: add the four v0.13.2 features to the Implemented list
2026-06-15 21:55:57 +02:00
Jure e2f98e0d7e Bump to v0.13.2 — mute-aware search, collapsing compose box, resizable sidebar, update-banner changelog
- Search respects the mute list (#7)
- Compose box collapses to a single line when idle (#6)
- Resizable left sidebar (#6)
- Update banner shows the new version's changelog
- Build: Vite 8 migration, dropped vulnerable esbuild dev dependency
v0.13.2
2026-06-15 21:45:18 +02:00
Jure 08f231fb7e feat: show new-version changelog in the update banner
The updater already fetched the release notes (update.body) but never
displayed them. The banner now has a 'What's new' toggle that expands a
panel showing only the newest version's section (sliced out of the
cumulative release body), rendered as markdown, with a 'Full changelog
on GitHub' link to the releases page.
2026-06-15 21:43:54 +02:00
Jure 2e0af4e6bf feat: make the left sidebar width resizable (#6)
Adds a drag handle on the right edge of the expanded sidebar; width is
clamped to 160-360px, double-click resets to the default, and the chosen
width persists to localStorage. Collapsed state is unchanged.

Closes #6
2026-06-15 21:30:13 +02:00
Jure 7d15ae3070 feat: collapse compose box to a single line when idle (#6)
The posting area was always full-height, which felt oversized (reported
on macOS). It now shows a single line when empty and unfocused, and
expands to full height + toolbar on focus or when it has content. Uses
focus-within blur semantics so clicking the emoji/attach/poll/post
controls doesn't collapse it mid-interaction, and resets the auto-resize
inline height on collapse. A saved draft starts expanded.

Part of #6
2026-06-15 21:30:13 +02:00
Jure 5db0a14a38 fix: respect mute-list in search results (#7)
Search only filtered the people *suggestions* list — actual note,
article, and people results ignored the mute-list entirely, so muted
spam accounts still showed up. Now notes/articles are filtered by muted
pubkey and muted keyword, and people by muted pubkey, reusing the same
logic the feed uses. Tab counts, zero-result states, and all result
lists use the filtered sets and react to mute changes.

Closes #7
2026-06-15 21:30:05 +02:00
Jure c9d8dc8713 Merge pull request #5 from hoornet/dependabot/npm_and_yarn/multi-9e9c9dbf03
Bump esbuild, @tailwindcss/vite, @vitejs/plugin-react and vite
2026-06-15 21:15:30 +02:00
Jure 23ef37da11 build: migrate manualChunks to function form for Vite 8 / Rolldown
Vite 8 switches the bundler to Rolldown, which no longer accepts the
object form of rollupOptions.output.manualChunks — it must be a function.
Convert it (same ndk/vendor split intent) and give tsconfig.node.json a
modern target/lib so vite.config.ts type-checks against String.includes.
2026-06-15 21:15:11 +02:00
dependabot[bot] 4a4843d3fc Bump esbuild, @tailwindcss/vite, @vitejs/plugin-react and vite
Removes [esbuild](https://github.com/evanw/esbuild). It's no longer used after updating ancestor dependencies [esbuild](https://github.com/evanw/esbuild), [@tailwindcss/vite](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite), [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) and [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite). These dependencies need to be updated together.


Removes `esbuild`

Updates `@tailwindcss/vite` from 4.2.1 to 4.3.1
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.1/packages/@tailwindcss-vite)

Updates `@vitejs/plugin-react` from 4.7.0 to 6.0.2
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.0.2/packages/plugin-react)

Updates `vite` from 7.3.2 to 8.0.16
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.16/packages/vite)

---
updated-dependencies:
- dependency-name: esbuild
  dependency-version:
  dependency-type: indirect
- dependency-name: "@tailwindcss/vite"
  dependency-version: 4.3.1
  dependency-type: direct:production
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 6.0.2
  dependency-type: direct:development
- dependency-name: vite
  dependency-version: 8.0.16
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-12 21:22:13 +00:00
dependabot[bot] 137fcf176b Bump tar from 0.4.45 to 0.4.46 in /src-tauri (#4)
Bumps [tar](https://github.com/composefs/tar-rs) from 0.4.45 to 0.4.46.
- [Release notes](https://github.com/composefs/tar-rs/releases)
- [Commits](https://github.com/composefs/tar-rs/compare/0.4.45...0.4.46)

---
updated-dependencies:
- dependency-name: tar
  dependency-version: 0.4.46
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-31 12:26:10 +02:00
Jure d80233e4d9 Bump to v0.13.1 — article reader scroll lock fix + click-to-zoom v0.13.1 2026-05-24 20:15:10 +02:00
Jure 94f610c2d3 fix: article reader scroll lock + click-to-zoom for body images
WebKitGTK collapses body <img> elements to 0 height during re-decode,
shrinking scrollHeight and clamping scrollTop — articles with body images
locked partway down. Give every .prose-article img a fixed 16:9
aspect-ratio + object-fit: contain so the layout box survives the collapse
and scrollHeight stays constant. Body images now click-to-open the existing
ImageLightbox (with cursor: zoom-in affordance), and the lightbox image
itself now closes on click instead of swallowing it.
2026-05-24 20:07:06 +02:00
Jure d3d855e7f3 docs: update README for v0.13.0; drop stale live-feed claim
- Themes: 7 -> 8, add the new Reader theme.
- Add Easy-Read Font (Atkinson Hyperlegible) to Personalization.
- Add 'view your secret key in Settings' to Identity.
- Drop the false 'Live streaming feed — no manual refresh needed' claim:
  the live subscription has been disabled since v0.12.8. Replaced with an
  accurate virtualized-feed / infinite-scroll description. (Auto-refresh
  returns in v0.13.1 — README feed line to be revisited then.)
- Bump the minisign verify example to 0.13.0.
v0.13.0
2026-05-22 15:21:39 +02:00
Jure 1c73f1e320 fix: harden updater null-handling, dev-mock install_info, honest interests copy
- useUpdater: guard the install_info response — a null/garbage value no
  longer overwrites the optimistic default and crash the whole app on
  installInfo.can_self_update. (Real app never returns null here; this is
  defensive — a failed updater check must not take down Vega.)
- tauri-dev-mock: add an install_info case so browser dev mode
  (localhost:1420) doesn't crash on the post-onboarding render.
- onboarding: the interests step claimed "you can always change this
  later" — there is no interests editor anywhere. Copy is now honest
  about what interests do (surface as hashtag pills on an empty
  Following feed).
2026-05-22 14:59:57 +02:00
Jure 2dfe0e86c1 Bump to v0.13.0 — visual overhaul: themes, readability, accessibility 2026-05-21 21:26:43 +02:00
Jure 349e9d12f8 polish: onboarding step indicator + safe backup escape hatch
- Onboarding Shell: larger accent VEGA wordmark + step-progress dots
  across the create -> backup -> interests path.
- Backup step gains an "I'll back up my key later" escape hatch. It runs
  the SAME keychain-saving login as confirming (skips only the checkbox)
  — wiring it to onComplete alone would have lost the generated key.
- Settings -> Identity now reveals the secret key (nsec): reveal/hide/
  copy via the existing load_nsec keychain command, hidden for read-only
  and remote-signer accounts. This makes the escape hatch honest — its
  note truthfully points users to where they can retrieve the key, and
  fills a real gap (the nsec was previously unreachable after onboarding).
2026-05-21 21:19:55 +02:00
Jure da8aab7de5 polish: replace sidebar Unicode glyphs with Lucide icons
The Unicode/symbol icons (◈ ☰ ▶ ⌕ ⟐ ✦ …) rendered inconsistently across
platforms and sizes. Lucide is crisp and pixel-perfect at any zoom.

- Add lucide-react (pinned exact); tree-shakes to the 15 icons used.
- NAV_ITEMS is now NavItem[] with ReactNode icons (the as-const array
  couldn't carry JSX). View type exported from the ui store for it.
- Icon spans switched from text-centred glyphs to flex-centred SVGs.
- Write-article ✦ -> PenLine.
2026-05-21 21:19:55 +02:00
Jure 5c490dbb56 feat: easy-read font option (Atkinson Hyperlegible)
New Settings → Appearance toggle, "Easy-Read Font". When on, swaps the
UI sans-serif to Atkinson Hyperlegible — a typeface designed by the
Braille Institute for legibility (distinct b/d/p/q, clear 1/I/l). Helps
dyslexic readers and anyone in a long reading session.

- Bundled via @fontsource/atkinson-hyperlegible (400 + 700), pinned exact
  — no runtime font fetch, works offline.
- Toggle adds an html.font-readable class; CSS overrides --font-ui and
  nudges letter-spacing (+0.012em) and line-height (1.6 -> 1.65) per
  evidence-based dyslexia guidance.
- Persisted to localStorage (wrystr_easy_read_font), applied on <html>
  at startup. Independent of theme — pairs with any, Reader included.
- Code blocks keep font-mono; articles keep their reading serif.

Follow-up to the Reader theme: colour was ~60-70% of the dyslexia-
friendly benefit, the font is most of the rest.
2026-05-21 17:30:59 +02:00
Jure 5cd11667ae polish: Sepia + Hackerman redesigned, new Reader theme
- Sepia: refined warm-dark elevation ladder (was muddy), proper text
  hierarchy (text-muted/text-dim were near-identical), considered amber
  accent. The reading-by-candlelight feel kept and sharpened.
- Hackerman: deeper phosphor base. Fixed a real bug — accent was the
  same hex as primary text (#00ff41), so the accent disappeared into
  the text. Accent is now a lighter phosphor green, distinguishable.
  Acid #ffff00 zap softened to a less-painful warm yellow.
- Reader (new, 8th theme): cream + dark-warm-grey + saddle-brown accent.
  Bookish, low-glare, moderate contrast. Helps dyslexic readers (per
  evidence-based guidance: off-white base, no pure-black text, calmer
  contrast) and anyone reading long-form articles. Borrows from print
  book design rather than screen design. A dyslexia-friendly font is
  a worthwhile follow-up but lives outside the colour-only theme system.
2026-05-20 22:53:48 +02:00
Jure 87c9a49e6c polish: Light theme redesign — soft off-white base, real text hierarchy
- Base shifts from #f5f5f5 to #fbfbfc (softer off-white, faint cool tint)
  — pure-white-card-on-soft-base elevation reads instead of being flat.
- bg-hover #f0f1f4 (darker on hover, the light-theme inverse).
- text-muted vs text-dim were near-identical (#697180 vs #6c717a) — no
  real hierarchy. Now #5b5f6e (WCAG AA on bg) and #888c98 for hints.
- Deeper violet accent #6d28d9 — carries more weight on white than the
  previous shade did.
- Semantic colours retuned for light backgrounds (zap, danger, warning,
  success all use the deeper Tailwind-700 family for proper presence).
2026-05-20 22:42:12 +02:00
Jure a4a4648aa6 polish: Midnight theme redesign — proper elevation + refined palette
- Base shifts from pure #0a0a0a to a barely-cool #0d0e12 ("midnight sky"
  reads as deep blue-black, not generic OLED black).
- Even elevation ladder: bg -> bg-raised -> bg-hover now reads as clear,
  perceptible steps instead of muddy near-duplicates.
- Three-tier text hierarchy with verified contrast: primary near-white,
  muted (WCAG AA on bg), dim for timestamps/hints.
- More luminous violet accent (#a78bfa) with proper pressed variant.
- Semantic colours retuned to harmonise (zap warm gold, success fresh
  green, danger softer red).

Mirrored into index.css @theme so pre-applyTheme initial paint matches.
2026-05-20 22:33:20 +02:00
Jure 7b6f67f42e fix: feed flicker — fixed-height quote box + content-aware row estimate
Two remaining causes of upward-scroll flicker in the virtualized feed:

- QuotePreview rendered nothing until fetchNoteById resolved, then popped
  in a box — a 70-200px late growth that desynced the virtualizer every
  time a quote note mounted. It now renders a fixed 80px (h-20) box,
  reserved whether or not the quoted note has loaded; a 2-line clamp keeps
  resolved content inside it.

- estimateSize was a flat 140px, so every row snapped from 140 to its real
  height (96-1660px) on first measurement. New estimateNoteHeight predicts
  height from note content (text, media boxes, quote box) so the
  first-measure correction is small enough to be imperceptible.

Remaining: a <=25px transient on some notes' first few views (a flex-wrap
row reflowing as async content lands); self-heals as caches warm.
2026-05-19 17:50:37 +02:00
Jure 30f050119b fix: feed virtualization — overlapping cards and phantom gaps
Three compounding causes in the v0.12.17 virtualized feed:

- Measurement cache was keyed by list index; the feed reorders (refresh
  merge, WoT filter, tab switch, cached->fresh swap) so cached heights
  reattached to the wrong note. Fixed with getItemKey by note id.
- <video> and single <img> had no reserved height and resized after
  metadata/image load — after the virtualizer measured the row. They
  now sit in fixed aspect-ratio boxes.
- The custom measureElement returned the 140px estimate for not-yet-
  measured rows on backward scroll (e.g. notes revealed by toggling
  WoT), so tall cards rendered far bigger than their recorded size.
  Removed — stable box heights make the flicker workaround obsolete.

Media boxes always render (stable height); the <img>/<video> inside
mounts only when the card is on screen, keeping scroll light.
2026-05-18 20:12:28 +02:00
Jure 9051c14205 polish: capitalise sidebar labels, rounded avatars, stronger article titles
- sidebar nav labels Title Case; follows -> People, dm -> Messages
- NoteCard + ArticleCard avatars rounded-sm -> rounded-md
- ArticleCard title 14px/medium -> 15px/semibold; larger tag pills
2026-05-18 18:17:13 +02:00
Jure 2250e2daf6 polish: sans-serif body font + midnight theme contrast refresh
- body font-family mono -> system sans-serif; 13px/1.5 -> 14px/1.6
- add --font-ui theme token
- midnight theme: readable muted text (#7c7c7c -> #a0a0a0, WCAG AA),
  restored muted/dim hierarchy, visible card borders, friendlier accent
- index.css @theme vars mirror themes.ts midnight (no first-paint flash)
2026-05-18 18:17:13 +02:00
Jure 62667bc8ef Bump to v0.12.17 — infinite scroll & virtualized feed v0.12.17 2026-05-17 21:10:29 +02:00
Jure 7678ad2f1f Feed virtualization Stage 2: infinite scroll
Adds older-notes pagination to the Global feed. fetchGlobalFeed gains an
optional until param (fetch events before a timestamp, no since bound).
The feed store's new loadOlderNotes action fetches 50 older notes when
triggered, dedups, merges, re-sorts. MAX_FEED_SIZE raised 200 to 1000 —
virtualization bounds the DOM-node/bitmap count, so this just caps the JS
notes array as hygiene.

Feed.tsx auto-triggers loadOlderNotes when the user scrolls within ~8 rows
of the bottom; a 'Loading older notes' row shows during the fetch. Global
tab only (Following uses a separate path, Trending is a ranked snapshot).

Pending: sandboxed memory verification.
2026-05-17 20:26:15 +02:00
Jure 73c1bd1ac9 Virtualize feed list with @tanstack/react-virtual
Stage 1 of the feed virtualization work. The feed now renders only the
visible window of note cards (~25-35 in the DOM) instead of all up to 200,
via @tanstack/react-virtual (pinned 3.13.24). This structurally caps the
WebKit decoded-bitmap accumulation that caused the v0.12.6-era OOM.

Error and 'new notes' banners moved above the scroll container so the
virtualizer's coordinate space always starts at scrollTop 0. Upward-scroll
flicker fixed with a scroll-direction-aware measureElement that reuses the
cached row height on backward scroll (TanStack/virtual#659).

Feed still capped at MAX_FEED_SIZE; infinite scroll is Stage 2.
2026-05-16 19:02:18 +02:00
Jure db81de9007 Bump to v0.12.16 — security hardening: http(s) scheme guard on link sinks, loop-stable HTML tag strip v0.12.16 2026-05-16 13:59:10 +02:00
Jure 61c6703513 Bump to v0.12.15 — install-aware update banner (Arch/deb/rpm get manual update guidance) v0.12.15 2026-05-16 13:43:38 +02:00
Jure 3757368990 Bump to v0.12.14 — fix macOS auto-updater (add app bundle target) v0.12.14 2026-05-16 13:26:57 +02:00
Jure 0d4153e6de Bump to v0.12.13 — union legacy + cloud on first podcast hydrate v0.12.13 2026-05-15 20:50:47 +02:00
Jure 1cbd13031d Bump to v0.12.12 — podcast subscriptions sync via Nostr (kind 30003) v0.12.12 2026-05-15 20:35:36 +02:00
Jure 7e998be45b Bump to v0.12.11 — read-only mode write-action guards
The app now behaves coherently for users without a signer (fully logged
out, or signed in with an npub). No broken Publish buttons, no dead-end
"Not logged in" toasts.

- Add useCanSign() hook in src/stores/user.ts as the single source of
  truth for write-capability. Captures both "no pubkey" and
  "npub-only login" states.
- ReadOnlyBanner now fires for both states (was only "no pubkey" before).
- Hide account-bound sidebar entries (Bookmarks, Messages, Notifications,
  Zaps, V4V) in read-only mode. Read-only-OK views (Feed, Articles, Media,
  Podcasts, Search, Follows, Relays, Settings, Support) stay visible.
- Guard every write surface, two patterns:
  - Hide inline UI: ComposeBox, InlineReplyBox, NoteActions row, NoteCard
    context menu, ArticleFeed "Write article", FollowsView per-row
    follow/unfollow, ThreadView root reply, PollWidget vote controls,
    RelaysView "Publish list", PodcastPlayerBar ShareButton.
  - "Sign in to X" CTA: ArticleEditor publish, QuoteModal post, ZapModal,
    EditProfileForm save. CTAs open LoginModal.
- ProfileView edit/follow/mute/zap/DM buttons each gated by canSign.
- ArticleView like/repost/comment/bookmark/zap each gated by canSign.
- Belt-and-suspenders runtime guards in user store follow/unfollow.

Bookmark / mute stores already swallow publish errors via .catch(() => {}),
so they don't need explicit runtime guards.
v0.12.11
2026-05-11 22:08:06 +02:00
Jure 88c42fcb57 Bump @tauri-apps/api to ^2.11.0 to match Rust tauri 2.11.1
CI tauri-action enforces matching major/minor between the @tauri-apps/api
JS package and the Rust tauri crate. v0.12.10's first build failed because
the JS side was still at 2.10.1 after only the Rust crate was bumped.
v0.12.10
2026-05-11 16:30:45 +02:00
Jure 9fc585a395 Bump to v0.12.10 — security: Tauri, rustls-webpki, rand, dompurify, postcss
Clears all Dependabot alerts except glib (pinned upstream by Tauri's gtk-rs
stack via wry — waits for upstream).

- Tauri 2.10.3 → 2.11.1 (Origin Confusion IPC fix, + wry/tao/tray-icon bumps)
- rustls-webpki 0.103.10 → 0.103.13 (high-severity DoS panic on malformed CRL)
- rand 0.8.5 → 0.8.6, rand 0.9.2 → 0.9.4 (soundness with custom loggers)
- dompurify 3.3.2 → 3.4.2 (four sanitization bypasses)
- postcss 8.5.8 → 8.5.14 (XSS via unescaped </style>)

No functional changes. Smoke tested on Linux: build clean, app starts, feed
renders, podcast playback works, login flow works.
2026-05-11 15:20:01 +02:00
Jure 7f3dafa97a README: link to veganostr.com, refresh signature notes
- Website was never linked from the README. Add a header link line
  (Website / Download / AUR) directly under the tagline and a second
  pointer in the Download section.
- Verify example used vega_0.12.1_amd64.AppImage.tar.gz — AppImage was
  dropped in v0.1.6. Swap in a current .deb example.
- Sig note was stale: .deb and .rpm actually ship with minisign
  signatures now (tauri-action unified installer and updater artifacts).
  Only .dmg is unsigned.
2026-04-23 19:51:11 +02:00
Jure 992b7f97b1 README: add Web of Trust feature, refresh Up Next, add NIP-32 row
- Web of Trust wasn't mentioned in the features list despite shipping
  in v0.11.0 and being extended to reactions/zaps/all tabs in v0.12.9.
  Added under Feed & content next to keyword muting.
- Drop "custom Go relay" from Up Next — Vega Relay is live and is
  Vega's default relay. Swap in real remaining work (NIP-96, WoT-
  powered feed ranking).
- Add NIP-32 row — partial support via the language filter's script
  tags.
2026-04-23 19:48:38 +02:00
Jure 58f3b4d7cb Bump to v0.12.9 — Web of Trust everywhere
Extends the WoT filter beyond the global feed: reaction pills, zap
totals, and all feed tabs (global, following, trending) now respect
the trust graph. Also drops the "new account" badge, since the
kind-0 created_at proxy was unreliable.

Softens the v0.12.8 forward-reference to Blossom — it will reappear
in a future release, not specifically this one, since it still needs
a safe-probe or allowlist (see WEBKIT_OOM_INVESTIGATION).
v0.12.9
2026-04-23 19:34:16 +02:00