#Amethyst v1.09.0: We are going crazy

Amethyst

npub142gywvjkq0dv6nupggyn2euhx4nduwc7yz5f24ah9rpmunr2s39se3xrj0

hex

b1b91d7ee0c5da9d081d1a53470248ee4585b058b11aa34fe28c0e3e07ac1e0a

nevent

nevent1qqstrwga0msvtk5apqw35568qfywu3v9kpvtzx4rfl3gcr37q7kpuzsprpmhxue69uhhyetvv9ujuem4d36kwatvw5hx6mm9qgs24yz8xftq8kkdf7q5yzf4v7tn2ek78v0zp2y427mj3sa7f34ggjccv7uvz

Kind-1 (TextNote)

2026-05-15T19:42:16Z

#Amethyst v1.09.0: We are going crazy

  • Go live on audio spaces (Nests)
  • Marmot Group chats (WhiteNoise)
  • Voice and Video calls (Noscall)
  • PDF reader
  • Favorite algo feeds
  • HLS Video Uploads
  • Schedule posts for later
  • Cast videos to your TV (Chromecast)
  • Mute a whole conversation thread
  • Pull Notification (internal Pokey)
  • Local LLMs (Pixel 9+, Samsung 25+, Xiaomi 15+)
  • amy, a command-line Nostr client

Features

  • Voice and Video Calls (NIP-AC) — one-on-one and group WebRTC calls.
    • Full-screen incoming-call UI over the lock screen.
    • PiP, ringtone and vibration.
    • Proximity sensor support.
    • Bluetooth headset routing.
    • Camera switch.
    • Network resilience and default TURN servers.
    • Mid-call peer invites with a 30s timeout and per-peer status.
    • Settings toggle to disable calls.
  • Audio Rooms / Nests (NIP-53) — a full revamp.
    • Live chat panel.
    • Reactions overlay and picker.
    • Listener counter.
    • Presence with publishing/onstage tags.
    • Hand-raise queue.
    • Host actions: kick, promote, demote, edit, close room.
    • Per-participant context sheet.
    • Scheduled rooms with a TimePicker and SCHEDULED badge.
    • "Listen to recording" CTA for closed rooms.
    • Share a room as naddr1.
    • Custom room themes and fonts (kind 30312).
    • Home live-bubble row showing follows broadcasting.
    • Host-leave confirmation and default-server prompt.
    • In-app lobby with a chat composer, gating room re-entry.
    • PiP that focuses active speakers.
    • Feed bucketed into Live / Scheduled / Recently ended, with live status verified by current presence.
    • Live audio-level speaker ring.
    • Keeps the screen on while connected.
    • Audio plays through the media volume stream.
  • Marmot Encrypted Group Chats (MLS over Nostr / NIP-EE)
    • Create, join and leave groups.
    • Inline group rendering in Messages.
    • Member management with user search.
    • Admin grant/revoke.
    • Group info screen with picture, member list and per-relay freshness.
    • Auto-publish KeyPackage.
    • Reset Marmot State safety valve in Settings.
    • Full RFC 9420 compliance pass (P0/P1/P2).
    • External Commit flow.
    • Retained-epoch decryption for offline catch-up.
    • Required-capabilities advertised on groups; interop fixes for other Marmot clients.
    • Popup notifications for group messages (kind:445).
  • Multi-account on Desktop
    • Account switcher dropdown in the sidebar and single-pane layout.
    • Add Account dialog and per-account logout.
    • View-only (npub-only) accounts.
    • Account removal switches to another account or logs out cleanly.
    • Encrypted local account storage (AES-256-GCM).
    • Display names and middle-truncated npubs.
  • Schedule posts for later
    • Date/time picker and toolbar toggle in the post composer.
    • Dedicated screen and drawer entry to view, push or delete scheduled posts.
    • Background worker that publishes at the scheduled time.
    • Warning when scheduling without always-on notifications.
  • Cast videos to your TV
    • Chromecast casting (Google Play build only).
    • Stop-from-phone button; the local player pauses while casting.
    • Cast button backfilled for accounts that already had video settings.
  • Mute a whole thread
    • Mute thread entry in the long-press dropdown and quick-action sheet.
    • Muted threads listed in Security Filters with an unmute action.
    • Muted threads dropped from feeds, notifications and push delivery.
  • Configurable home tabs
    • Choose between New Threads, Conversations and Everything.
    • Visibility toggles persist across restarts.
  • Configurable bottom navigation bar
    • Pick which screens appear in the bottom bar.
    • Restore-default button in settings.
  • Reply and Mention notifications (NIP-10 / NIP-22)
    • Dedicated Mentions channel.
    • Per-thread grouping.
    • Inline reply.
    • All content-event citations routed to Mentions.
    • Opt-in Following / Everyone tab split.
  • Filter the home feed in place by hashtag, community, geohash and relay (no navigation away)
  • Hashtag and geohash top-nav filters on Pictures, Shorts, Articles, Polls and Products
  • NIP-22 comments on external content (hashtags, geohashes, URLs) render a typed reply-context chip and land in the conversations feed
  • Interest Sets (NIP-51, kind 30015)
    • List, create, rename, delete and clone interest sets.
    • Public/private hashtag toggle.
    • TopNav filter chips.
  • NIP-9A Community Rules
    • Structured rules editor in the new-community flow.
    • Post validation against community rules in the composer.
    • Opt-in moderation feed filter.
  • PDF reader
    • Inline PDF previews in feeds.
    • Double-tap to toggle zoom.
    • Zoom-aware hi-res re-render for crisp pinch-zoom.
    • Download and save PDFs to Downloads/Amethyst.
  • Multi-wallet NWC
    • Multiple wallets with a balance view.
    • Default picker, rename and reorder.
    • Dedicated Add Wallet screen with Connect Wallet / paste / QR scan.
  • Favorite Algo Feeds filter in the Top Nav Bar
  • Custom Post creation on Polls / Pictures / Shorts / Longs
  • Custom Emoji Packs (NIP-30)
    • Browse Emoji Sets screen for discovering kind 30030 packs.
    • My Emoji List screen for managing your kind 10030 selection.
    • Modernized pack metadata screen with hero image and inline emoji/cover upload.
    • Public/private toggle when adding emoji.
    • Decrypted private emojis surfaced end-to-end.
  • Dedicated drawer screens for more content types.
    • Standalone Articles, Products, Public Chats, Communities (NIP-72), Live Streams and Follow Packs screens.
    • Products screen defaults to "Around Me".
  • Richer live stream chat.
    • Inline clips (kind 1313) and raids (kind 1312).
    • Inline zap receipts.
    • NIP-75 zap goal pinned at the top.
    • Top zappers leaderboard.
    • Stream clips surfaced in the profile gallery tab.
  • Content warnings on media.
    • Grid-level content warnings with distinct reasons.
    • Warning overlaid on the blurhash at media size.
  • YouTube-style video quality picker.
    • Feed and PiP default to the lowest HLS resolution.
    • Fullscreen defaults to auto.
  • HLS Video uploads (NIP-71)
    • Pick which renditions to upload.
    • See which file is currently uploading.
    • Optional cross-post as a kind-1 note.
    • Generated poster JPEG.
    • Blurhash and thumbhash on every video imeta.
  • ThumbHash support alongside BlurHash
    • Used across events, uploads and the UI.
    • Forwarded when adding media to the gallery.
    • Upload failures to generate a blurhash/thumbhash are now surfaced.
  • NIP-A3 Payment Targets (kind 10133)
    • Pay action on the note reactions row.
    • Payment-targets button on the profile.
    • Lightning address moved to the wallet setup screen.
    • Alt-text on payment-target events.
  • Search power tools
    • Scope, source, follows and sort toggles.
    • Paste an npub1…, nprofile1…, nevent1…, naddr1… or note1… to jump straight to it.
  • Markdown renderer — improved typography, blockquote gutter, table styling
  • Polls
    • Single-screen creation with a poll-type selector.
    • Open/Closed tabs.
    • "View results" option (prevents voting after viewing).
    • Dismiss button on active-poll cards.
  • Badge support Redesigned — You can now create, grant, manage and add/remove badges from your profile.
  • Settings revamp
    • Modernized Settings screen.
    • Dedicated Profile UI settings page.
    • Compose Settings screen (auto-draft toggle).
    • Security Filters split into a hub with per-category screens.
  • Tap a timestamp to toggle between relative ("2h ago") and absolute date/time, driven by a single shared ticker
  • Copy raw JSON of a note from the dropdown menu
  • Stale-relay hint on replaceable events, using the NIP-66 relay cache
  • Two-stage zap progress on the zap action
  • Bulk-remove for blocked users and hidden words
  • Jump-to-parent icon on replies in Full UI mode
  • Configurable report-warning threshold
  • .f4a audio playback

In AI-Ready phones (Pixel 9+, Samsung 25+, Xiaomi 15+):

  • AI Writing Help — assistant in the new-post screen.
    • Tone suggestions, precomputed in parallel.
    • Auto language detection.
    • On-device option in Application Preferences.
  • AI Alt-Text for images — on-device image description / labeling.
    • Suggestions appear in the upload sheet (Google Play build).

Desktop

  • Tor Support — full Tor support on the desktop app.
    • kmp-tor daemon and settings UI.
    • Per-relay routing.
    • .onion badge.
    • Restart-on-toggle.
    • Image loading via Tor.
  • Multi-account
    • Sidebar account switcher.
    • Add Account dialog and per-account logout.
    • Encrypted account storage.
  • Embedded local relay — an in-process relay with SQLite event persistence
  • Custom feeds system
    • Create, pin and inline-switch between custom feeds.
    • Author search in the feed builder (relay NIP-50 + avatars).
  • App Drawer with a categorized screen launcher
  • Workspace management
    • Save, switch and restore workspaces.
    • Tabs, an editor and unified search.
    • Pin/unpin syncs to the active workspace.
  • Namecoin name resolution
    • Namecoin lookups now resolve and surface in search.
    • Follows the import field of name objects (ifa-0001).
    • Added relay.testls.bit ElectrumX endpoints (clearnet TLS, Tor, bare IP).
  • Native theming for macOS, GNOME, KDE and Windows (matches platform look and accent colors)
  • Relay power tools
    • Dashboard and config editors.
    • Per-screen relay picker.
    • Persistent configuration.
    • Correct counts.
  • Messages
    • Draggable divider.
    • Alignment polish and centered empty states.
    • Typography hierarchy and refined dividers.
  • macOS polish
    • Dock / Cmd+Tab icon via the Taskbar API.
    • Apple-HIG squircle margins.
    • Transparent window icon.
    • Light-mode primary contrast.
    • Content extends correctly under the title bar.
  • Reading layout — width-capped reading column with comfortable side margins for wide windows
  • Compact UI
    • Search/Chat/Profile inputs.
    • Settings hierarchy normalized.
    • Tabs-first headers across Home / Reads / Notifications.
    • Whole-card hover on notes.
  • Per-OS theming preview flag for testing macOS/GNOME/KDE/Windows looks locally
  • Selectable error messages.
  • Scrollable single-pane navigation rail.
  • Fixes feed loading, repost rendering and Profile back-navigation visibility.

Amy (CLI)

  • New amy, a non-interactive CLI Nostr client.
    • Drives the same Quartz + Commons engine as the apps.
    • Available on macOS and Linux from the GitHub Release.
  • Subcommands:
    • account / use, profile, post, feed, notes.
    • dm send | list | await | send-file (NIP-17, kind:14 + kind:15).
    • marmot ….
    • store stat | sweep-expired | scrub | compact.
  • Cache-first reads from a local file-backed event store.
    • relays.json is gone — kind:10002 / 10050 / 10051 events in the store are the config.
  • Secure key storage.
    • Private keys move out of identity.json into the OS keychain or a NIP-49 encrypted file.
    • On-disk data restricted to owner-only.
  • Color, human-readable output by default; --json opts in.

Quartz

  • Adds NIP-AC — WebRTC call signaling events (offer / answer / ICE / hangup / reject / renegotiate) over EphemeralGiftWrap, multi-device, group calls
  • Adds EphemeralGiftWrapEvent (kind 21059) — replaces 20s expiration GiftWraps for call signaling
  • Adds NIP-A3 Payment Targets (kind 10133)
  • Adds NIP-82 Software Applications (experimental)
  • Adds the AdminCommandEvent for audio-room kick (kind 4312)
  • Adds the NIP-9A community rules parser + validator (kind:34551)
  • Expands NIP-34 git collaboration coverage.
    • Repository State (kind 30618).
    • Pull Requests and PR updates (kinds 1618 / 1619).
    • Git Status events (open / closed / draft / applied).
  • Adds the rest of NIP-51 list event kinds and full NIP-53 live-activity rendering
  • Adds MLS / Marmot event types and a pure-Kotlin MLS engine with IETF RFC 9420 interop test vectors (no native deps)
  • Adds an async SQLite event persistence layer.
    • NIP-09 / NIP-50 / NIP-62 compliance.
    • Room-style connection pool.
  • Adds a file-backed event store.
    • flock + transactions.
    • scrub/compact.
    • NIP-50 full-text search.
    • NIP-62 Right-to-Vanish.
    • NIP-01 tiebreaker.
    • NIP-09 created_at window.
    • Deletion-author check.
  • Adds a reactive ObservableEventStore layer.
    • A façade that wraps any event store — SQLite-backed, file-backed, or in-memory.
    • Publishes a StoreChange on every accepted insert, delete and expiration sweep.
    • Projections stay in sync without re-querying the store.
    • Ephemeral events (kinds 20000-29999) emit without being persisted.
    • EventStoreProjection turns the change stream into a cold Flow of sealed ProjectionState.
    • Per-filter limits and per-projection NIP-62 vanish scoping.
  • Promotes the relay toolkit into the new geode module — a real Nostr relay.
    • Implements NIP-01 and NIP-45.
    • NIP-77 negentropy reconciliation (strfry parity).
    • NIP-86 management API.
    • TOML config and graceful drain.
    • Adaptive connection pooling for 10k+ connections.
  • Adds an EventInterner so deserialized events share canonical instances, with an interning event store that interns on insert
  • Adds Ktor KMP HTTP implementations alongside OkHttp
  • Adds macOS (Apple Silicon), iOS and Linux native targets.
    • Pure-Kotlin Ed25519 and X25519 for the MLS crypto on those platforms.
    • commonMain now compiles for Kotlin/Native.

Crypto and Performance

  • Custom secp256k1 implementation, starting to replace fr.acinq.secp256k1
    • Pure-Kotlin core for KMP native targets (macOS / iOS / Linux).
    • C + inline-ASM accelerated path on Android via a JNI bridge.
    • Hardware SHA-256 (SHA-NI on x86_64, ARMv8 CE on ARM64).
    • Comb method for G multiplication → 3× faster sign/keygen.
    • Same-pubkey batch Schnorr verify (5–6× throughput).
    • verifySchnorrFast for Nostr (skips y-parity inversion).
    • 4×64-bit limb representation with lazy field ops and ARM64 assembly.
    • Standalone libsecp256k1-nostr / libschnorr256k1 C project, with Android benchmarks.
  • Concurrent caching DNS resolver (SurgeDns)
    • Lock-free DNS cache.
    • 24h positive TTL.
    • Stale-while-revalidate.
    • Persisted across process restarts.
  • Smoother video playback
    • Warm ExoPlayer pool and retained warm players.
    • Tuned LoadControl.
    • VideoCache warmup 10s → 1.5s.
    • Stable controller-overlay tree.
  • Faster icons — shared FontFamily and TextMeasurer across all Material Symbols
  • Faster chat lists — stable list keys and reduced recomposition
  • Faster note rendering — cached event-derived values, fewer per-item allocations during feed scroll
  • Faster Quartz queries
    • Direct-slot driver for replaceable + addressable lookups.
    • Streaming k-way merge.
    • Smallest-first FTS intersect.
    • Parallel Schnorr verify in the ingest queue.
    • Index-driven fan-out for cache observers.
  • Faster rich-text translation
  • Thumbnail disk cache for profile pictures; Coil disk-cache eviction moved off the write path to prevent scroll stalls
  • Paginated GiftWrap loading for the DM chat list
  • Bookmark events preloaded for faster access
  • Lifecycle-aware screen subscriptions
    • Feed/screen relay subscriptions pause on background and resume on foreground.
    • 30s grace delay so brief app switches don't churn subscriptions.
  • Adaptive video disk cache — sized to 20% of free disk (256 MB–4 GB) instead of a fixed 1 GB, with on-demand HLS videos cached in SimpleCache
  • Tuned image/video OkHttp dispatcher and connection pool (16 in-flight per host) to de-serialize feed loading
  • Streaming image hashing — computes image hashes without loading the whole file into memory; SHA-256 hasher moved off the thread pool
  • GeoHash library rewritten from scratch for performance, dropping an external dependency

QUIC + nestsClient (foundation)

  • New pure-Kotlin QUIC v1 + HTTP/3 + WebTransport client (no JNI, no native deps).
    • Powers the NIP-53 audio-rooms over MoQ-transport path.
  • Full RFC coverage and stabilization:
    • RFC 9002 loss recovery and retransmission.
    • 0-RTT early data.
    • 1-RTT key update.
    • TLS 1.3 session resumption (PSK).
    • ECN.
    • Connection migration with path validation.
    • Retry and Version Negotiation packet handling.
    • Stateless-reset detection.
    • Broad DoS-hardening / RFC-compliance stabilization sweep.
  • Passes the quic-interop-runner test matrix against picoquic and quic-go.
    • Covers handshake, transfer, multiplexing, retry, 0-RTT, key-update, ECN, http3.
    • Includes qlog diagnostics.
  • Multiple security and correctness audits.
    • RFC 9001 test vectors.
    • Live interop against aioquic and picoquic.
  • nestsClient module
    • MoQ-transport (IETF) reference implementation.
    • Production moq-lite Lite-03/04 codec with version-aware ALPN negotiation.
    • catalog.json publishing aligned with kixelated/hang.
    • Opus + AudioRecord/AudioTrack.
    • Reconnection policy with proactive JWT refresh.
    • Cross-stack (Amethyst ↔ Rust ↔ browser) interop harness in CI.

Improvements and Fixes

  • WakeUp Push Notification events — Starting to migrate to a better Push/Loading system
  • Pinned notes moved to their own screen
  • Left drawer reorganized into collapsible You / Feeds / Create / System sections, with clearer names
  • Article writing redesign — banner, tags, slug
  • Redesigned long-form article cards
  • GIF support
    • Playback controls and autoplay.
    • GIF→MP4 upload conversion option in the upload screen.
    • GIF / image keyboard support in the short post screen and in Marmot, DM and public-channel chat fields.
  • Configurable video player buttons in Account Settings
  • Autoplay Videos setting (Always / Never), separate from the video-loading toggle
  • Drag-and-drop reordering for some relay list settings
  • 3-dot options menu on video / picture / file feed cards
  • Zoomable media grows from its source bounds, and loads the full-resolution source in the image dialog
  • Favorite relays can now be added to the Global Feed
  • Configurable max-hashtag spam filter
  • Account setting to forward kind 0 events to a local relay
  • Relay Sync UI replaced with visual indicators
  • Account Settings
    • Split broadcast tracker visibility from Complete UI mode.
    • Hide payment-targets icon by default and place it after Zap.
    • Float the broadcast banner as a rounded card.
  • Danger Zone section in settings
  • NIP-89 client tag
    • Per-account toggle to disable it, synced via NIP-78 security settings.
    • On by default and moved into Compose settings.
  • Local Blossom cache — image and profile-picture fetches route through a local Blossom cache
  • Mention preservation in compose:
    • Survives keyboard auto-correction.
    • Partial-overlap edits delete the whole mention.
    • Cursor snaps to mention boundaries.
  • Chat cursor jumping fixed
  • Avatar zoom-in keeps aspect ratio during the animation
  • Profile pictures center-cropped to prevent squashing
  • HLS video fixes:
    • Playback routed to the right MediaSource.
    • Multi-rendition videos collapse to a single gallery tile.
    • Render with artwork and a graceful fallback.
  • Broken "Pause" action removed from the always-on background notification
  • Hand-raise button in audio rooms now has a visible toggled state
  • GiftWrap unwrapping for all writable accounts when always-on is enabled
  • Search bar bech32 paste navigates instead of running a search
  • Top and bottom bars stay visible on non-scrollable lists
  • Rich-text translation:
    • Bug, performance and jitter overhaul.
    • {N} placeholders so URLs survive CJK translation.
  • Swipe-to-dismiss containers fixed on newer Compose
  • Right-to-Vanish settings observe toggles reactively, preserve prior behavior on upgrade
  • Relay reconnection:
    • Auto-reconnect after a server-initiated disconnect.
    • Periodic keep-alive to revive relays stuck in long backoff.
  • Account settings (profile, follow list, mutes, relay lists, KeyPackages) are republished to newly-selected relays so accounts aren't lost on fresh relays
  • Broadcasting relays:
    • Kept out of personal & channel sends.
    • Always included in non-private sends.
    • Fixed an infinite loop in the broadcast-relay computation.
  • Tor now falls back to clearnet when bootstrap is stuck
  • Android Arti reliability: stale Arti cache cleared on init with retry, SOCKS proxy default port moved with busy-port retry, relay-over-Tor connectivity fixes
  • Chess game challenges filtered out of the home feed (ended games only); chess cards show user picture and name instead of hex pubkeys
  • Expired polls re-evaluated and removed from notification cards
  • NIP-39 external identity claims without a platform separator are rejected
  • Dismissible cleanup banner across Pinned Notes, Bookmarks and Bookmark Sets, flagging author-deleted items with a "Remove from list" action
  • Bogus Content-Type rejected when saving downloaded media, with URL-extension fallback validation
  • NIP-46 bunker decrypt/encrypt response parsing fixed, with a longer timeout
  • Hidden DMs no longer counted toward the unread message badge
  • Profile header hides the _@ prefix on NIP-05 names
  • Foreground-service-not-allowed exception from the background handled gracefully
  • Fixes Samsung crash on outgoing call
  • Foreground service starts earlier to prevent call death on Android 14+
  • Stop ringtone and call notification when rejecting consecutive calls

UI Refresh

  • Migrates the icon set from Material Icons to Material Symbols (thin weight) for a more consistent, modern look across the app
  • Drops unused legacy drawables
  • Bottom-bar icon size bumped to compensate for Material Symbols padding

Build & Documentation

  • CI restructure:
    • Splits Android into its own CI job.
    • Adds Android Lint as the first step.
    • Merges test+build to eliminate duplicate compilation.
    • Drops assembleDebug APK uploads.
  • Adds a :nestsClient:test step to the desktop CI leg
  • Adds a quic-interop-runner CI workflow and a browser-side cross-stack interop workflow
  • Broadens libicu Depends so the .deb installs across Debian and Ubuntu
  • Adds SECURITY.md with private vulnerability reporting policy
  • Moves desktop packaging / AppImage tooling into the desktopApp module
  • AGP and dependencies bumped

Contributors

  • nostr:nprofile1qqsyvrp9u6p0mfur9dfdru3d853tx9mdjuhkphxuxgfwmryja7zsvhqpzamhxue69uhhv6t5daezumn0wd68yvfwvdhk6tcpzpmhxue69uhkummnw3ezumt0d5hszythwden5te0dehhxarj9emkjmn99uwfvhl6
  • nostr:nprofile1qqsv4zwtz8cuwh2mvc3zdrl5853g365t9j6mn25edlul7uz0eyzt0zcpzpmhxue69uhkummnw3ezumt0d5hszxnhwden5te0wf5kymewv46jumn0wd68y6tp9eshqup0qyd8wumn8ghj7um9dejxjapwdehhxenvv9ex2tnrdakj7nrm3sx
  • nostr:nprofile1qqs9vyevafl4f7rqluqykt500e9nj5ase8eh5k423rgwtfw6qdjhd4spz4mhxue69uhhyetvv9ujuerpd46hxtnfduhsz9mhwden5te0wfjkccte9ehx7um5wghxyctwvshszrnhwden5te0dehhxtnvdakz7axwpzp
  • nostr:nprofile1qqs827g8dkd07zjvlhh60csytujgd3l9mz7x807xk3fewge7rwlukxgppemhxue69uhkummn9ekx7mp0qydhwumn8ghj7argv4nx7un9wd6zumn0wd68yvfwvdhk6tcpz9mhxue69uhkummnw3ezumrpdejz7d9xcpk
  • nostr:nprofile1qqswc4nrhvp4lrjct0ayy0ps8f2hvj8e2guucp63dwcx6m6e8pka9fqpr4mhxue69uhkummnw3ezucnfw33k76twv4ezuum0vd5kzmp0qy08wumn8ghj7un9d3shjtnwdaehgu3wwa5hyetydejhgtn2wqhsz9nhwden5te0v4jx2m3wdehhxarj9ekxzmny9ue5n65v
  • nostr:nprofile1qqsxeh4ue276rhaqtz4c2df209gfkkft9006qdcryh3gaswtfuvxvlgpzamhxue69uhhyetvv9ujuurjd9kkzmpwdejhgtcpz4mhxue69uhhyetvv9ujuerpd46hxtnfduhsz9mhwden5te0wfjkccte9en82mnywd68ytndv5hsc2mjk6

Translations

  • Czech, German, Swedish, and Portuguese by nostr:nprofile1qqsv4zwtz8cuwh2mvc3zdrl5853g365t9j6mn25edlul7uz0eyzt0zcpzpmhxue69uhkummnw3ezumt0d5hszxnhwden5te0wf5kymewv46jumn0wd68y6tp9eshqup0qyd8wumn8ghj7um9dejxjapwdehhxenvv9ex2tnrdakj7nrm3sx
  • Hungarian by nostr:nprofile1qqsxekg0s8kxpcrka8ccwztv2m73kz6jy0ur8f7jc04rwr5p44w5acspzamhxue69uhhyetvv9ujumn0wd68ytnzv9hxgtcppemhxue69uhkummn9ekx7mp0qyg8wumn8ghj7mn0wd68ytnddakj7c0ns2l
  • French by nostr:nprofile1qqs8av5uzf4nv2q80chrmp3mj9a9dd6zjw4fmz56hsn2gzar72rxhtcppemhxue69uhkummn9ekx7mp0qyg8wumn8ghj7mn0wd68ytnddakj7qgawaehxw309ahx7um5wghxy6t5vdhkjmn9wgh8xmmrd9skctcuvd26f
  • Polish by nostr:nprofile1qqsdyfz0ewdhmgp3a4r3pxvezx5r8yalrgvjn38v2ml5qrusnv7yywgpzemhxue69uhkummnw3ezucm6v9ejuurvw4ej7qg0waehxw309a3h5ctn9e6x7up0kvajyt
  • Hindi by nostr:nprofile1qqs88dt78wgnzvaph6fcstfvsd98xc2qs8eg8tllwv2zlutu8ehec2cpz4mhxue69uhhyetvv9ujuerpd46hxtnfduhszrnhwden5te0dehhxtnvdakz7qghwaehxw309aex2mrp0yh8qunfd4skctnwv46z7x03hlx
  • Slovenian by nostr:nprofile1qqsqqqqqqp0fmkspg7w8d305ln96a0jw0ptwqtuwskkm5pddv2kkjfcppemhxue69uhkummn9ekx7mp0qy2hwumn8ghj7un9d3shjtnyv9kh2uewd9hj7qgkwaehxw309aex2mrp0yhxg6t5w3hjuur4vghsdu406e
  • Bengali by nostr:nprofile1qqsgs9hgjw87vz36jf2r83m5zree2q87zvs8s7kty9jljdz7wprytyspremhxue69uhkummnw3ezu6m0de5kueedv3jkwunpv9nzumnv9uq3kamnwvaz7tm5d4cz6un9d3shjtnrv4ekxtn5wfskgef0qy28wumn8ghj7mn0wd68yt3k8quzummjvuhsg63aw2
  • Spanish by nostr:nprofile1qqs07tjpyvvlq9ugdpax8h3jfrpwn7kr72k3tc7ky83tggn4et9eangpg3mhxw309ajxyartwdukjery09cxwctsd3ek6cnjdfnxs6t00pnhq7ttdvmkw7nsd3shxdrr0gery6nyva3h2ct0096kyerjw9jzummwd9hkutcprpmhxue69uhkv6tvw3jhytnwdaehgu3wwa5kuef0qyghwumn8ghj7mn0wd68ytnhd9hx2tcxdyhdq
  • Chinese by hypnotichemionus4 and nostr:nprofile1qqsyxnuhnymz0u0xru2watmqe25vlh8vzzje9jhlsfgvsff9942gc9gprfmhxue69uhhq7tjv9kkjepwve5kzar2v9nzucm0d5hsz9mhwden5te0wfjkccte9e3hsurvv9ujummjvuhsz9nhwden5te0wfjkccte9ehx7um5wghx6mm99urkr68m
  • Russian by Anton Zhao

原始 JSON

{
  "kind": 1,
  "id": "b1b91d7ee0c5da9d081d1a53470248ee4585b058b11aa34fe28c0e3e07ac1e0a",
  "pubkey": "aa9047325603dacd4f8142093567973566de3b1e20a89557b728c3be4c6a844b",
  "created_at": 1778874136,
  "tags": [
    [
      "alt",
      "A short note: #Amethyst v1.09.0: We are going crazy\n\n- Go live o..."
    ],
    [
      "p",
      "460c25e682fda7832b52d1f22d3d22b3176d972f60dcdc3212ed8c92ef85065c",
      "wss://vitor.nostr1.com/"
    ],
    [
      "p",
      "ca89cb11f1c75d5b6622268ff43d2288ea8b2cb5b9aa996ff9ff704fc904b78b",
      "wss://nostr.mom/"
    ],
    [
      "p",
      "56132cea7f54f860ff004b2e8f7e4b3953b0c9f37a5aaa88d0e5a5da036576d6",
      "wss://relay.damus.io/"
    ],
    [
      "p",
      "7579076d9aff0a4cfdefa7e2045f2486c7e5d8bc63bfc6b45397233e1bbfcb19",
      "wss://nos.lol/"
    ],
    [
      "p",
      "ec5663bb035f8e585bfa423c303a557648f95239cc07516bb06d6f59386dd2a4",
      "wss://nostr.bitcoiner.social/"
    ],
    [
      "p",
      "6cdebccabda1dfa058ab85352a79509b592b2bdfa0370325e28ec1cb4f18667d",
      "wss://relay.primal.net/"
    ],
    [
      "p",
      "6cd90f81ec60e076e9f187096c56fd1b0b5223f833a7d2c3ea370e81ad5d4ee2",
      "wss://relay.nostr.band/"
    ],
    [
      "p",
      "7eb29c126b3628077e2e3d863b917a56b74293aa9d8a9abc26a40ba3f2866baf",
      "wss://nos.lol/"
    ],
    [
      "p",
      "d2244fcb9b7da031ed4710999911a83393bf1a1929c4ec56ff400f909b3c4239",
      "wss://nostr.czas.plus/"
    ],
    [
      "p",
      "73b57e3b913133a1be93882d2c834a73614081f283afff73142ff17c3e6f9c2b",
      "wss://relay.damus.io/"
    ],
    [
      "p",
      "000000005e9dda01479c76c5f4fccbaebe4e7856e02f8e85adba05ad62ad6927",
      "wss://nos.lol/"
    ],
    [
      "p",
      "8816e8938fe60a3a925433c77410f39500fe1320787acb2165f9345e70464592",
      "wss://nostr.koning-degraaf.nl/"
    ],
    [
      "p",
      "ff2e412319f01788687a63de3248c2e9fac3f2ad15e3d621e2b42275cacb9ecd",
      "ws://dbtksyiddypgaplsmbrjfhioxgpykk7gzplas4cz22jdgcuaoyubdrqd.onion/"
    ],
    [
      "p",
      "434f97993627f1e61f14eeaf60caa8cfdcec10a592caff8250c825252d548c15",
      "wss://pyramid.fiatjaf.com/"
    ],
    [
      "t",
      "Amethyst"
    ],
    [
      "t",
      "amethyst"
    ],
    [
      "r",
      "https://`catalog.json/"
    ],
    [
      "r",
      "https://`.deb/"
    ],
    [
      "r",
      "https://`security.md/"
    ],
    [
      "r",
      "https://`kind:10002/"
    ],
    [
      "r",
      "https://kind:445/"
    ],
    [
      "r",
      "https://kind:34551/"
    ],
    [
      "r",
      "https://`fr.acinq.secp256k1/"
    ],
    [
      "r",
      "http://`.onion/"
    ],
    [
      "r",
      "https://`relays.json/"
    ],
    [
      "r",
      "https://`.f4a/"
    ],
    [
      "r",
      "https://kind:14/"
    ],
    [
      "r",
      "https://kind:15/"
    ],
    [
      "r",
      "https://`relay.testls.bit/"
    ],
    [
      "r",
      "https://`identity.json/"
    ],
    [
      "r",
      "https://1.5s/"
    ],
    [
      "zapraiser",
      "1000000"
    ],
    [
      "zap",
      "460c25e682fda7832b52d1f22d3d22b3176d972f60dcdc3212ed8c92ef85065c",
      "wss://vitor.nostr1.com/",
      "0.33"
    ],
    [
      "zap",
      "ca89cb11f1c75d5b6622268ff43d2288ea8b2cb5b9aa996ff9ff704fc904b78b",
      "wss://nostr.mom/",
      "0.2"
    ],
    [
      "zap",
      "56132cea7f54f860ff004b2e8f7e4b3953b0c9f37a5aaa88d0e5a5da036576d6",
      "wss://relay.damus.io/",
      "0.1"
    ],
    [
      "zap",
      "7579076d9aff0a4cfdefa7e2045f2486c7e5d8bc63bfc6b45397233e1bbfcb19",
      "wss://nos.lol/",
      "0.05"
    ],
    [
      "zap",
      "ec5663bb035f8e585bfa423c303a557648f95239cc07516bb06d6f59386dd2a4",
      "wss://nostr.bitcoiner.social/",
      "0.05"
    ],
    [
      "zap",
      "6cdebccabda1dfa058ab85352a79509b592b2bdfa0370325e28ec1cb4f18667d",
      "wss://relay.primal.net/",
      "0.05"
    ],
    [
      "zap",
      "6cd90f81ec60e076e9f187096c56fd1b0b5223f833a7d2c3ea370e81ad5d4ee2",
      "wss://relay.nostr.band/",
      "0.03"
    ],
    [
      "zap",
      "7eb29c126b3628077e2e3d863b917a56b74293aa9d8a9abc26a40ba3f2866baf",
      "wss://nos.lol/",
      "0.03"
    ],
    [
      "zap",
      "d2244fcb9b7da031ed4710999911a83393bf1a1929c4ec56ff400f909b3c4239",
      "wss://nostr.czas.plus/",
      "0.03"
    ],
    [
      "zap",
      "000000005e9dda01479c76c5f4fccbaebe4e7856e02f8e85adba05ad62ad6927",
      "wss://nos.lol/",
      "0.03"
    ],
    [
      "zap",
      "8816e8938fe60a3a925433c77410f39500fe1320787acb2165f9345e70464592",
      "wss://nostr.koning-degraaf.nl/",
      "0.03"
    ],
    [
      "zap",
      "ff2e412319f01788687a63de3248c2e9fac3f2ad15e3d621e2b42275cacb9ecd",
      "ws://dbtksyiddypgaplsmbrjfhioxgpykk7gzplas4cz22jdgcuaoyubdrqd.onion/",
      "0.03"
    ],
    [
      "zap",
      "434f97993627f1e61f14eeaf60caa8cfdcec10a592caff8250c825252d548c15",
      "wss://pyramid.fiatjaf.com/",
      "0.03"
    ],
    [
      "client",
      "Amethyst"
    ]
  ],
  "content": "#Amethyst v1.09.0: We are going crazy\n\n- Go live on audio spaces (Nests)\n- Marmot Group chats (WhiteNoise)\n- Voice and Video calls (Noscall)\n- PDF reader\n- Favorite algo feeds\n- HLS Video Uploads\n- Schedule posts for later\n- Cast videos to your TV (Chromecast)\n- Mute a whole conversation thread\n- Pull Notification (internal Pokey)\n- Local LLMs (Pixel 9+, Samsung 25+, Xiaomi 15+)\n- `amy`, a command-line Nostr client\n\n## Features\n\n- Voice and Video Calls (NIP-AC) — one-on-one and group WebRTC calls.\n  - Full-screen incoming-call UI over the lock screen.\n  - PiP, ringtone and vibration.\n  - Proximity sensor support.\n  - Bluetooth headset routing.\n  - Camera switch.\n  - Network resilience and default TURN servers.\n  - Mid-call peer invites with a 30s timeout and per-peer status.\n  - Settings toggle to disable calls.\n- Audio Rooms / Nests (NIP-53) — a full revamp.\n  - Live chat panel.\n  - Reactions overlay and picker.\n  - Listener counter.\n  - Presence with publishing/onstage tags.\n  - Hand-raise queue.\n  - Host actions: kick, promote, demote, edit, close room.\n  - Per-participant context sheet.\n  - Scheduled rooms with a TimePicker and SCHEDULED badge.\n  - \"Listen to recording\" CTA for closed rooms.\n  - Share a room as `naddr1`.\n  - Custom room themes and fonts (kind 30312).\n  - Home live-bubble row showing follows broadcasting.\n  - Host-leave confirmation and default-server prompt.\n  - In-app lobby with a chat composer, gating room re-entry.\n  - PiP that focuses active speakers.\n  - Feed bucketed into Live / Scheduled / Recently ended, with live status verified by current presence.\n  - Live audio-level speaker ring.\n  - Keeps the screen on while connected.\n  - Audio plays through the media volume stream.\n- Marmot Encrypted Group Chats (MLS over Nostr / NIP-EE)\n  - Create, join and leave groups.\n  - Inline group rendering in Messages.\n  - Member management with user search.\n  - Admin grant/revoke.\n  - Group info screen with picture, member list and per-relay freshness.\n  - Auto-publish KeyPackage.\n  - Reset Marmot State safety valve in Settings.\n  - Full RFC 9420 compliance pass (P0/P1/P2).\n  - External Commit flow.\n  - Retained-epoch decryption for offline catch-up.\n  - Required-capabilities advertised on groups; interop fixes for other Marmot clients.\n  - Popup notifications for group messages (kind:445).\n- Multi-account on Desktop\n  - Account switcher dropdown in the sidebar and single-pane layout.\n  - Add Account dialog and per-account logout.\n  - View-only (npub-only) accounts.\n  - Account removal switches to another account or logs out cleanly.\n  - Encrypted local account storage (AES-256-GCM).\n  - Display names and middle-truncated npubs.\n- Schedule posts for later\n  - Date/time picker and toolbar toggle in the post composer.\n  - Dedicated screen and drawer entry to view, push or delete scheduled posts.\n  - Background worker that publishes at the scheduled time.\n  - Warning when scheduling without always-on notifications.\n- Cast videos to your TV\n  - Chromecast casting (Google Play build only).\n  - Stop-from-phone button; the local player pauses while casting.\n  - Cast button backfilled for accounts that already had video settings.\n- Mute a whole thread\n  - Mute thread entry in the long-press dropdown and quick-action sheet.\n  - Muted threads listed in Security Filters with an unmute action.\n  - Muted threads dropped from feeds, notifications and push delivery.\n- Configurable home tabs\n  - Choose between New Threads, Conversations and Everything.\n  - Visibility toggles persist across restarts.\n- Configurable bottom navigation bar\n  - Pick which screens appear in the bottom bar.\n  - Restore-default button in settings.\n- Reply and Mention notifications (NIP-10 / NIP-22)\n  - Dedicated Mentions channel.\n  - Per-thread grouping.\n  - Inline reply.\n  - All content-event citations routed to Mentions.\n  - Opt-in Following / Everyone tab split.\n- Filter the home feed in place by hashtag, community, geohash and relay (no navigation away)\n- Hashtag and geohash top-nav filters on Pictures, Shorts, Articles, Polls and Products\n- NIP-22 comments on external content (hashtags, geohashes, URLs) render a typed reply-context chip and land in the conversations feed\n- Interest Sets (NIP-51, kind 30015)\n  - List, create, rename, delete and clone interest sets.\n  - Public/private hashtag toggle.\n  - TopNav filter chips.\n- NIP-9A Community Rules\n  - Structured rules editor in the new-community flow.\n  - Post validation against community rules in the composer.\n  - Opt-in moderation feed filter.\n- PDF reader\n  - Inline PDF previews in feeds.\n  - Double-tap to toggle zoom.\n  - Zoom-aware hi-res re-render for crisp pinch-zoom.\n  - Download and save PDFs to Downloads/Amethyst.\n- Multi-wallet NWC\n  - Multiple wallets with a balance view.\n  - Default picker, rename and reorder.\n  - Dedicated Add Wallet screen with Connect Wallet / paste / QR scan.\n- Favorite Algo Feeds filter in the Top Nav Bar\n- Custom Post creation on Polls / Pictures / Shorts / Longs\n- Custom Emoji Packs (NIP-30)\n  - Browse Emoji Sets screen for discovering kind 30030 packs.\n  - My Emoji List screen for managing your kind 10030 selection.\n  - Modernized pack metadata screen with hero image and inline emoji/cover upload.\n  - Public/private toggle when adding emoji.\n  - Decrypted private emojis surfaced end-to-end.\n- Dedicated drawer screens for more content types.\n  - Standalone Articles, Products, Public Chats, Communities (NIP-72), Live Streams and Follow Packs screens.\n  - Products screen defaults to \"Around Me\".\n- Richer live stream chat.\n  - Inline clips (kind 1313) and raids (kind 1312).\n  - Inline zap receipts.\n  - NIP-75 zap goal pinned at the top.\n  - Top zappers leaderboard.\n  - Stream clips surfaced in the profile gallery tab.\n- Content warnings on media.\n  - Grid-level content warnings with distinct reasons.\n  - Warning overlaid on the blurhash at media size.\n- YouTube-style video quality picker.\n  - Feed and PiP default to the lowest HLS resolution.\n  - Fullscreen defaults to auto.\n- HLS Video uploads (NIP-71)\n  - Pick which renditions to upload.\n  - See which file is currently uploading.\n  - Optional cross-post as a kind-1 note.\n  - Generated poster JPEG.\n  - Blurhash and thumbhash on every video imeta.\n- ThumbHash support alongside BlurHash\n  - Used across events, uploads and the UI.\n  - Forwarded when adding media to the gallery.\n  - Upload failures to generate a blurhash/thumbhash are now surfaced.\n- NIP-A3 Payment Targets (kind 10133)\n  - Pay action on the note reactions row.\n  - Payment-targets button on the profile.\n  - Lightning address moved to the wallet setup screen.\n  - Alt-text on payment-target events.\n- Search power tools\n  - Scope, source, follows and sort toggles.\n  - Paste an `npub1…`, `nprofile1…`, `nevent1…`, `naddr1…` or `note1…` to jump straight to it.\n- Markdown renderer — improved typography, blockquote gutter, table styling\n- Polls\n  - Single-screen creation with a poll-type selector.\n  - Open/Closed tabs.\n  - \"View results\" option (prevents voting after viewing).\n  - Dismiss button on active-poll cards.\n- Badge support Redesigned — You can now create, grant, manage and add/remove badges from your profile.\n- Settings revamp\n  - Modernized Settings screen.\n  - Dedicated Profile UI settings page.\n  - Compose Settings screen (auto-draft toggle).\n  - Security Filters split into a hub with per-category screens.\n- Tap a timestamp to toggle between relative (\"2h ago\") and absolute date/time, driven by a single shared ticker\n- Copy raw JSON of a note from the dropdown menu\n- Stale-relay hint on replaceable events, using the NIP-66 relay cache\n- Two-stage zap progress on the zap action\n- Bulk-remove for blocked users and hidden words\n- Jump-to-parent icon on replies in Full UI mode\n- Configurable report-warning threshold\n- `.f4a` audio playback\n\n## In AI-Ready phones (Pixel 9+, Samsung 25+, Xiaomi 15+):\n- AI Writing Help — assistant in the new-post screen.\n  - Tone suggestions, precomputed in parallel.\n  - Auto language detection.\n  - On-device option in Application Preferences.\n- AI Alt-Text for images — on-device image description / labeling.\n  - Suggestions appear in the upload sheet (Google Play build).\n\n## Desktop\n\n- Tor Support — full Tor support on the desktop app.\n  - kmp-tor daemon and settings UI.\n  - Per-relay routing.\n  - `.onion` badge.\n  - Restart-on-toggle.\n  - Image loading via Tor.\n- Multi-account\n  - Sidebar account switcher.\n  - Add Account dialog and per-account logout.\n  - Encrypted account storage.\n- Embedded local relay — an in-process relay with SQLite event persistence\n- Custom feeds system\n  - Create, pin and inline-switch between custom feeds.\n  - Author search in the feed builder (relay NIP-50 + avatars).\n- App Drawer with a categorized screen launcher\n- Workspace management\n  - Save, switch and restore workspaces.\n  - Tabs, an editor and unified search.\n  - Pin/unpin syncs to the active workspace.\n- Namecoin name resolution\n  - Namecoin lookups now resolve and surface in search.\n  - Follows the `import` field of name objects (ifa-0001).\n  - Added `relay.testls.bit` ElectrumX endpoints (clearnet TLS, Tor, bare IP).\n- Native theming for macOS, GNOME, KDE and Windows (matches platform look and accent colors)\n- Relay power tools\n  - Dashboard and config editors.\n  - Per-screen relay picker.\n  - Persistent configuration.\n  - Correct counts.\n- Messages\n  - Draggable divider.\n  - Alignment polish and centered empty states.\n  - Typography hierarchy and refined dividers.\n- macOS polish\n  - Dock / Cmd+Tab icon via the Taskbar API.\n  - Apple-HIG squircle margins.\n  - Transparent window icon.\n  - Light-mode primary contrast.\n  - Content extends correctly under the title bar.\n- Reading layout — width-capped reading column with comfortable side margins for wide windows\n- Compact UI\n  - Search/Chat/Profile inputs.\n  - Settings hierarchy normalized.\n  - Tabs-first headers across Home / Reads / Notifications.\n  - Whole-card hover on notes.\n- Per-OS theming preview flag for testing macOS/GNOME/KDE/Windows looks locally\n- Selectable error messages.\n- Scrollable single-pane navigation rail.\n- Fixes feed loading, repost rendering and Profile back-navigation visibility.\n\n## Amy (CLI)\n\n- New `amy`, a non-interactive CLI Nostr client.\n  - Drives the same Quartz + Commons engine as the apps.\n  - Available on macOS and Linux from the GitHub Release.\n- Subcommands:\n  - `account` / `use`, `profile`, `post`, `feed`, `notes`.\n  - `dm send | list | await | send-file` (NIP-17, kind:14 + kind:15).\n  - `marmot …`.\n  - `store stat | sweep-expired | scrub | compact`.\n- Cache-first reads from a local file-backed event store.\n  - `relays.json` is gone — `kind:10002 / 10050 / 10051` events in the store *are* the config.\n- Secure key storage.\n  - Private keys move out of `identity.json` into the OS keychain or a NIP-49 encrypted file.\n  - On-disk data restricted to owner-only.\n- Color, human-readable output by default; `--json` opts in.\n\n## Quartz\n\n- Adds NIP-AC — WebRTC call signaling events (offer / answer / ICE / hangup / reject / renegotiate) over EphemeralGiftWrap, multi-device, group calls\n- Adds EphemeralGiftWrapEvent (kind 21059) — replaces 20s expiration GiftWraps for call signaling\n- Adds NIP-A3 Payment Targets (kind 10133)\n- Adds NIP-82 Software Applications (experimental)\n- Adds the AdminCommandEvent for audio-room kick (kind 4312)\n- Adds the NIP-9A community rules parser + validator (kind:34551)\n- Expands NIP-34 git collaboration coverage.\n  - Repository State (kind 30618).\n  - Pull Requests and PR updates (kinds 1618 / 1619).\n  - Git Status events (open / closed / draft / applied).\n- Adds the rest of NIP-51 list event kinds and full NIP-53 live-activity rendering\n- Adds MLS / Marmot event types and a pure-Kotlin MLS engine with IETF RFC 9420 interop test vectors (no native deps)\n- Adds an async SQLite event persistence layer.\n  - NIP-09 / NIP-50 / NIP-62 compliance.\n  - Room-style connection pool.\n- Adds a file-backed event store.\n  - flock + transactions.\n  - scrub/compact.\n  - NIP-50 full-text search.\n  - NIP-62 Right-to-Vanish.\n  - NIP-01 tiebreaker.\n  - NIP-09 created_at window.\n  - Deletion-author check.\n- Adds a reactive `ObservableEventStore` layer.\n  - A façade that wraps any event store — SQLite-backed, file-backed, or in-memory.\n  - Publishes a `StoreChange` on every accepted insert, delete and expiration sweep.\n  - Projections stay in sync without re-querying the store.\n  - Ephemeral events (kinds 20000-29999) emit without being persisted.\n  - `EventStoreProjection` turns the change stream into a cold `Flow` of sealed `ProjectionState`.\n  - Per-filter limits and per-projection NIP-62 vanish scoping.\n- Promotes the relay toolkit into the new `geode` module — a real Nostr relay.\n  - Implements NIP-01 and NIP-45.\n  - NIP-77 negentropy reconciliation (strfry parity).\n  - NIP-86 management API.\n  - TOML config and graceful drain.\n  - Adaptive connection pooling for 10k+ connections.\n- Adds an EventInterner so deserialized events share canonical instances, with an interning event store that interns on insert\n- Adds Ktor KMP HTTP implementations alongside OkHttp\n- Adds macOS (Apple Silicon), iOS and Linux native targets.\n  - Pure-Kotlin Ed25519 and X25519 for the MLS crypto on those platforms.\n  - `commonMain` now compiles for Kotlin/Native.\n\n## Crypto and Performance\n\n- Custom secp256k1 implementation, starting to replace `fr.acinq.secp256k1`\n  - Pure-Kotlin core for KMP native targets (macOS / iOS / Linux).\n  - C + inline-ASM accelerated path on Android via a JNI bridge.\n  - Hardware SHA-256 (SHA-NI on x86_64, ARMv8 CE on ARM64).\n  - Comb method for G multiplication → 3× faster sign/keygen.\n  - Same-pubkey batch Schnorr verify (5–6× throughput).\n  - `verifySchnorrFast` for Nostr (skips y-parity inversion).\n  - 4×64-bit limb representation with lazy field ops and ARM64 assembly.\n  - Standalone `libsecp256k1-nostr` / `libschnorr256k1` C project, with Android benchmarks.\n- Concurrent caching DNS resolver (SurgeDns)\n  - Lock-free DNS cache.\n  - 24h positive TTL.\n  - Stale-while-revalidate.\n  - Persisted across process restarts.\n- Smoother video playback\n  - Warm ExoPlayer pool and retained warm players.\n  - Tuned LoadControl.\n  - VideoCache warmup 10s → 1.5s.\n  - Stable controller-overlay tree.\n- Faster icons — shared FontFamily and TextMeasurer across all Material Symbols\n- Faster chat lists — stable list keys and reduced recomposition\n- Faster note rendering — cached event-derived values, fewer per-item allocations during feed scroll\n- Faster Quartz queries\n  - Direct-slot driver for replaceable + addressable lookups.\n  - Streaming k-way merge.\n  - Smallest-first FTS intersect.\n  - Parallel Schnorr verify in the ingest queue.\n  - Index-driven fan-out for cache observers.\n- Faster rich-text translation\n- Thumbnail disk cache for profile pictures; Coil disk-cache eviction moved off the write path to prevent scroll stalls\n- Paginated GiftWrap loading for the DM chat list\n- Bookmark events preloaded for faster access\n- Lifecycle-aware screen subscriptions\n  - Feed/screen relay subscriptions pause on background and resume on foreground.\n  - 30s grace delay so brief app switches don't churn subscriptions.\n- Adaptive video disk cache — sized to 20% of free disk (256 MB–4 GB) instead of a fixed 1 GB, with on-demand HLS videos cached in SimpleCache\n- Tuned image/video OkHttp dispatcher and connection pool (16 in-flight per host) to de-serialize feed loading\n- Streaming image hashing — computes image hashes without loading the whole file into memory; SHA-256 hasher moved off the thread pool\n- GeoHash library rewritten from scratch for performance, dropping an external dependency\n\n## QUIC + nestsClient (foundation)\n\n- New pure-Kotlin QUIC v1 + HTTP/3 + WebTransport client (no JNI, no native deps).\n  - Powers the NIP-53 audio-rooms over MoQ-transport path.\n- Full RFC coverage and stabilization:\n  - RFC 9002 loss recovery and retransmission.\n  - 0-RTT early data.\n  - 1-RTT key update.\n  - TLS 1.3 session resumption (PSK).\n  - ECN.\n  - Connection migration with path validation.\n  - Retry and Version Negotiation packet handling.\n  - Stateless-reset detection.\n  - Broad DoS-hardening / RFC-compliance stabilization sweep.\n- Passes the quic-interop-runner test matrix against picoquic and quic-go.\n  - Covers handshake, transfer, multiplexing, retry, 0-RTT, key-update, ECN, http3.\n  - Includes qlog diagnostics.\n- Multiple security and correctness audits.\n  - RFC 9001 test vectors.\n  - Live interop against aioquic and picoquic.\n- `nestsClient` module\n  - MoQ-transport (IETF) reference implementation.\n  - Production moq-lite Lite-03/04 codec with version-aware ALPN negotiation.\n  - `catalog.json` publishing aligned with kixelated/hang.\n  - Opus + AudioRecord/AudioTrack.\n  - Reconnection policy with proactive JWT refresh.\n  - Cross-stack (Amethyst ↔ Rust ↔ browser) interop harness in CI.\n\n## Improvements and Fixes\n- WakeUp Push Notification events — Starting to migrate to a better Push/Loading system\n- Pinned notes moved to their own screen\n- Left drawer reorganized into collapsible You / Feeds / Create / System sections, with clearer names\n- Article writing redesign — banner, tags, slug\n- Redesigned long-form article cards\n- GIF support\n  - Playback controls and autoplay.\n  - GIF→MP4 upload conversion option in the upload screen.\n  - GIF / image keyboard support in the short post screen and in Marmot, DM and public-channel chat fields.\n- Configurable video player buttons in Account Settings\n- Autoplay Videos setting (Always / Never), separate from the video-loading toggle\n- Drag-and-drop reordering for some relay list settings\n- 3-dot options menu on video / picture / file feed cards\n- Zoomable media grows from its source bounds, and loads the full-resolution source in the image dialog\n- Favorite relays can now be added to the Global Feed\n- Configurable max-hashtag spam filter\n- Account setting to forward kind 0 events to a local relay\n- Relay Sync UI replaced with visual indicators\n- Account Settings\n  - Split broadcast tracker visibility from Complete UI mode.\n  - Hide payment-targets icon by default and place it after Zap.\n  - Float the broadcast banner as a rounded card.\n- Danger Zone section in settings\n- NIP-89 client tag\n  - Per-account toggle to disable it, synced via NIP-78 security settings.\n  - On by default and moved into Compose settings.\n- Local Blossom cache — image and profile-picture fetches route through a local Blossom cache\n- Mention preservation in compose:\n  - Survives keyboard auto-correction.\n  - Partial-overlap edits delete the whole mention.\n  - Cursor snaps to mention boundaries.\n- Chat cursor jumping fixed\n- Avatar zoom-in keeps aspect ratio during the animation\n- Profile pictures center-cropped to prevent squashing\n- HLS video fixes:\n  - Playback routed to the right MediaSource.\n  - Multi-rendition videos collapse to a single gallery tile.\n  - Render with artwork and a graceful fallback.\n- Broken \"Pause\" action removed from the always-on background notification\n- Hand-raise button in audio rooms now has a visible toggled state\n- GiftWrap unwrapping for all writable accounts when always-on is enabled\n- Search bar bech32 paste navigates instead of running a search\n- Top and bottom bars stay visible on non-scrollable lists\n- Rich-text translation:\n  - Bug, performance and jitter overhaul.\n  - `{N}` placeholders so URLs survive CJK translation.\n- Swipe-to-dismiss containers fixed on newer Compose\n- Right-to-Vanish settings observe toggles reactively, preserve prior behavior on upgrade\n- Relay reconnection:\n  - Auto-reconnect after a server-initiated disconnect.\n  - Periodic keep-alive to revive relays stuck in long backoff.\n- Account settings (profile, follow list, mutes, relay lists, KeyPackages) are republished to newly-selected relays so accounts aren't lost on fresh relays\n- Broadcasting relays:\n  - Kept out of personal \u0026 channel sends.\n  - Always included in non-private sends.\n  - Fixed an infinite loop in the broadcast-relay computation.\n- Tor now falls back to clearnet when bootstrap is stuck\n- Android Arti reliability: stale Arti cache cleared on init with retry, SOCKS proxy default port moved with busy-port retry, relay-over-Tor connectivity fixes\n- Chess game challenges filtered out of the home feed (ended games only); chess cards show user picture and name instead of hex pubkeys\n- Expired polls re-evaluated and removed from notification cards\n- NIP-39 external identity claims without a platform separator are rejected\n- Dismissible cleanup banner across Pinned Notes, Bookmarks and Bookmark Sets, flagging author-deleted items with a \"Remove from list\" action\n- Bogus Content-Type rejected when saving downloaded media, with URL-extension fallback validation\n- NIP-46 bunker decrypt/encrypt response parsing fixed, with a longer timeout\n- Hidden DMs no longer counted toward the unread message badge\n- Profile header hides the `_@` prefix on NIP-05 names\n- Foreground-service-not-allowed exception from the background handled gracefully\n- Fixes Samsung crash on outgoing call\n- Foreground service starts earlier to prevent call death on Android 14+\n- Stop ringtone and call notification when rejecting consecutive calls\n\n## UI Refresh\n\n- Migrates the icon set from Material Icons to Material Symbols (thin weight) for a more consistent, modern look across the app\n- Drops unused legacy drawables\n- Bottom-bar icon size bumped to compensate for Material Symbols padding\n\n## Build \u0026 Documentation\n\n- CI restructure:\n  - Splits Android into its own CI job.\n  - Adds Android Lint as the first step.\n  - Merges test+build to eliminate duplicate compilation.\n  - Drops `assembleDebug` APK uploads.\n- Adds a `:nestsClient:test` step to the desktop CI leg\n- Adds a quic-interop-runner CI workflow and a browser-side cross-stack interop workflow\n- Broadens `libicu` Depends so the `.deb` installs across Debian and Ubuntu\n- Adds `SECURITY.md` with private vulnerability reporting policy\n- Moves desktop packaging / AppImage tooling into the `desktopApp` module\n- AGP and dependencies bumped\n\n## Contributors\n\n- nostr:nprofile1qqsyvrp9u6p0mfur9dfdru3d853tx9mdjuhkphxuxgfwmryja7zsvhqpzamhxue69uhhv6t5daezumn0wd68yvfwvdhk6tcpzpmhxue69uhkummnw3ezumt0d5hszythwden5te0dehhxarj9emkjmn99uwfvhl6\n- nostr:nprofile1qqsv4zwtz8cuwh2mvc3zdrl5853g365t9j6mn25edlul7uz0eyzt0zcpzpmhxue69uhkummnw3ezumt0d5hszxnhwden5te0wf5kymewv46jumn0wd68y6tp9eshqup0qyd8wumn8ghj7um9dejxjapwdehhxenvv9ex2tnrdakj7nrm3sx\n- nostr:nprofile1qqs9vyevafl4f7rqluqykt500e9nj5ase8eh5k423rgwtfw6qdjhd4spz4mhxue69uhhyetvv9ujuerpd46hxtnfduhsz9mhwden5te0wfjkccte9ehx7um5wghxyctwvshszrnhwden5te0dehhxtnvdakz7axwpzp\n- nostr:nprofile1qqs827g8dkd07zjvlhh60csytujgd3l9mz7x807xk3fewge7rwlukxgppemhxue69uhkummn9ekx7mp0qydhwumn8ghj7argv4nx7un9wd6zumn0wd68yvfwvdhk6tcpz9mhxue69uhkummnw3ezumrpdejz7d9xcpk\n- nostr:nprofile1qqswc4nrhvp4lrjct0ayy0ps8f2hvj8e2guucp63dwcx6m6e8pka9fqpr4mhxue69uhkummnw3ezucnfw33k76twv4ezuum0vd5kzmp0qy08wumn8ghj7un9d3shjtnwdaehgu3wwa5hyetydejhgtn2wqhsz9nhwden5te0v4jx2m3wdehhxarj9ekxzmny9ue5n65v\n- nostr:nprofile1qqsxeh4ue276rhaqtz4c2df209gfkkft9006qdcryh3gaswtfuvxvlgpzamhxue69uhhyetvv9ujuurjd9kkzmpwdejhgtcpz4mhxue69uhhyetvv9ujuerpd46hxtnfduhsz9mhwden5te0wfjkccte9en82mnywd68ytndv5hsc2mjk6\n\n## Translations\n\n- Czech, German, Swedish, and Portuguese by nostr:nprofile1qqsv4zwtz8cuwh2mvc3zdrl5853g365t9j6mn25edlul7uz0eyzt0zcpzpmhxue69uhkummnw3ezumt0d5hszxnhwden5te0wf5kymewv46jumn0wd68y6tp9eshqup0qyd8wumn8ghj7um9dejxjapwdehhxenvv9ex2tnrdakj7nrm3sx\n- Hungarian by nostr:nprofile1qqsxekg0s8kxpcrka8ccwztv2m73kz6jy0ur8f7jc04rwr5p44w5acspzamhxue69uhhyetvv9ujumn0wd68ytnzv9hxgtcppemhxue69uhkummn9ekx7mp0qyg8wumn8ghj7mn0wd68ytnddakj7c0ns2l\n- French by nostr:nprofile1qqs8av5uzf4nv2q80chrmp3mj9a9dd6zjw4fmz56hsn2gzar72rxhtcppemhxue69uhkummn9ekx7mp0qyg8wumn8ghj7mn0wd68ytnddakj7qgawaehxw309ahx7um5wghxy6t5vdhkjmn9wgh8xmmrd9skctcuvd26f\n- Polish by nostr:nprofile1qqsdyfz0ewdhmgp3a4r3pxvezx5r8yalrgvjn38v2ml5qrusnv7yywgpzemhxue69uhkummnw3ezucm6v9ejuurvw4ej7qg0waehxw309a3h5ctn9e6x7up0kvajyt\n- Hindi by nostr:nprofile1qqs88dt78wgnzvaph6fcstfvsd98xc2qs8eg8tllwv2zlutu8ehec2cpz4mhxue69uhhyetvv9ujuerpd46hxtnfduhszrnhwden5te0dehhxtnvdakz7qghwaehxw309aex2mrp0yh8qunfd4skctnwv46z7x03hlx\n- Slovenian by nostr:nprofile1qqsqqqqqqp0fmkspg7w8d305ln96a0jw0ptwqtuwskkm5pddv2kkjfcppemhxue69uhkummn9ekx7mp0qy2hwumn8ghj7un9d3shjtnyv9kh2uewd9hj7qgkwaehxw309aex2mrp0yhxg6t5w3hjuur4vghsdu406e\n- Bengali by nostr:nprofile1qqsgs9hgjw87vz36jf2r83m5zree2q87zvs8s7kty9jljdz7wprytyspremhxue69uhkummnw3ezu6m0de5kueedv3jkwunpv9nzumnv9uq3kamnwvaz7tm5d4cz6un9d3shjtnrv4ekxtn5wfskgef0qy28wumn8ghj7mn0wd68yt3k8quzummjvuhsg63aw2\n- Spanish by nostr:nprofile1qqs07tjpyvvlq9ugdpax8h3jfrpwn7kr72k3tc7ky83tggn4et9eangpg3mhxw309ajxyartwdukjery09cxwctsd3ek6cnjdfnxs6t00pnhq7ttdvmkw7nsd3shxdrr0gery6nyva3h2ct0096kyerjw9jzummwd9hkutcprpmhxue69uhkv6tvw3jhytnwdaehgu3wwa5kuef0qyghwumn8ghj7mn0wd68ytnhd9hx2tcxdyhdq\n- Chinese by hypnotichemionus4 and nostr:nprofile1qqsyxnuhnymz0u0xru2watmqe25vlh8vzzje9jhlsfgvsff9942gc9gprfmhxue69uhhq7tjv9kkjepwve5kzar2v9nzucm0d5hsz9mhwden5te0wfjkccte9e3hsurvv9ujummjvuhsz9nhwden5te0wfjkccte9ehx7um5wghx6mm99urkr68m\n- Russian by Anton Zhao",
  "sig": "83d63cf7973d0a321cda80461621c274ef4c372a675904da9215d15c6dc8b82eecf84866483d67f9b4eedeb383d1f7eebdbf868b499eb1cac41fdee4c268fc2c"
}