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
2026-03-08 14:05:56 +01:00

Wrystr

A cross-platform desktop Nostr client built with Tauri 2.0 + React + TypeScript. Polished UI, deep Lightning integration, and first-class support for long-form writing.

Named as a nod to Nostr with a wry twist.

Download

Grab the latest release from the Releases page.

Platform File
Linux .AppImage (make executable, then run)
Windows .exe installer
macOS (Apple Silicon) aarch64.dmg
macOS (Intel) x86_64.dmg

No dependencies required — everything is bundled.

Features

Identity & accounts

  • In-app key generation with plain-language nsec backup — no browser extension required
  • Login with nsec (full access) or npub (read-only)
  • Multi-account switcher — save multiple identities, switch instantly from the sidebar
  • OS keychain integration — nsec stored in macOS Keychain / Windows Credential Manager / Linux Secret Service; sessions survive restarts

Feed & content

  • Global and following feeds with live relay connection
  • Compose notes, inline replies, full thread view
  • Reactions (NIP-25) with live network counts
  • Follow / unfollow (NIP-02) with contact list publishing
  • Quote & Repost (NIP-18) — one-click repost or quote with compose modal
  • Mute users (NIP-51) — muted list synced to relays, filtered from feed
  • Long-form article editor (NIP-23) with title, tags, cover image, live preview, auto-save drafts
  • Note rendering: images, video, mentions, hashtags, njump.me link interception

Lightning & zaps

  • NWC guided wizard — wallet picker (Alby Hub, Alby Extension, Mutiny, Phoenix) with per-wallet setup steps and inline URI validation
  • Send zaps via NWC (NIP-47 + NIP-57) with amount presets, custom amounts, comment
  • Zap history — Received and Sent tabs with amounts, counterparts, comments
  • Support / About page — zap the developer, Lightning + Bitcoin QR codes, Ko-fi and GitHub links

Performance & UX

  • SQLite note cache — feed loads instantly from local cache on startup; profiles cached for immediate avatar display
  • System tray — close button hides to tray; "Quit" in tray menu to fully exit
  • Collapsible sidebar (icon-only mode)
  • Search: NIP-50 full-text, #hashtag, people search with inline follow
  • Relay management: add/remove relays with live connection status

Stack

Layer Technology
Desktop shell Tauri 2.0 (Rust)
Frontend React 19 + TypeScript + Vite
Nostr protocol NDK 3.x (Nostr Dev Kit)
Styling Tailwind CSS 4
State Zustand
Local storage SQLite (rusqlite, bundled)
Keychain keyring crate (OS-native)

Development

# Prerequisites: Node.js 20+, Rust stable, @tauri-apps/cli
npm install
npm run tauri dev       # full app with hot reload
npm run dev             # browser only (no Tauri window)
npm run tauri build     # production binary

Roadmap

See ROADMAP.md for the full prioritised next steps.

Up next:

  • Sidebar improvements (auto-hide, clearer collapse affordance)
  • Profile helpers (NIP-05 guide, image upload via NIP-96/Blossom)
  • Search improvements (NIP-50 relay detection)
  • Direct messages (NIP-44/17)
  • Long-form article reader view

License

MIT — hoornet

Languages
TypeScript 91.1%
Rust 6.4%
Shell 1.3%
CSS 0.8%
JavaScript 0.3%