#Amethyst v1.12.0: Cashu, CLINK, Private Posts, Music, Podca...

Amethyst

npub142gywvjkq0dv6nupggyn2euhx4nduwc7yz5f24ah9rpmunr2s39se3xrj0

hex

40e817712e397c07ba31784a92fa474aa095896a828c0e2dea0d09c60d49ee1e

nevent

nevent1qqsyp6qhwyhrjlq8hgchsj5jlfr54gy4394g9rqw9h4q6zwxp4y7u8sprpmhxue69uhhyetvv9ujuem4d36kwatvw5hx6mm9qgs24yz8xftq8kkdf7q5yzf4v7tn2ek78v0zp2y427mj3sa7f34ggjc5qtfpx

Kind-1 (TextNote)

2026-06-16T18:35:49Z

#Amethyst v1.12.0: Cashu, CLINK, Private Posts, Music, Podcasts, Apps & Workouts

Highlights:

  • Adds Cashu wallet: in-app NIP-60 wallet.
  • Adds CLINK payments: a new Lightning rail
  • Adds App Store Feed form ZapStore
  • Adds Private posts: post, reply, react, and zap privately via NIP-59.
  • Adds Workout Feed: record and browse NIP-101e workouts in a dedicated feed.
  • Adds Reaction cards: likes, zaps, and nutzaps render as rich gradient cards.
  • Adds Music Feed: publish and browse music tracks and playlists.
  • Adds Podcasts Feed: a new NIP-F4 podcast feed with favorites and an inline player.
  • Adds support for hashtag labels to posts after they're published.
  • Adds AppFunctions to allow Gemini to call Amethyst locally.

New Features

Payments

  • Adds unified zap popup for lightning, CLINK, on-chain, and Cashu in one place
    • Quick 3-state toggle to quickly pick the source of your zap
    • Defaults to options that both receiver and sender can use
    • The payment rails now appear live as they resolve.
  • Adds full Cashu support (NIP-60/61)
    • A full in-app ecash wallet, beyond the previous redeem-only support.
    • Create and add a Cashu wallet, with its own screen and settings.
    • Browse and pick mints from a mint directory.
    • Mint ecash from Lightning and melt it back to Lightning.
    • Send and receive ecash tokens.
    • Top up a mint from a standalone screen.
    • See per-mint balances on the wallet.
    • Send NIP-61 nutzaps from the wallet, with a Lightning-style send progress bar.
    • Cashu top-up is crash-safe on retry.
    • Funds are checkpointed the instant they leave the wallet.
  • Adds full CLINK support
    • Pay and get paid through CLINK Offers and Debits.
    • Render all schemas inside of Notes
    • Profiles can show a tappable CLINK Offer chip.
    • Set one-time or recurring limits.
    • Resolve a person's payment offer by NIP-05.
    • A debit connection pulls funds only up to the cap you set.
  • Adds Unified Send Payment screen.
    • Long-press any chip in the Profile or this screen to copy that destination.
    • Use Lightning, CLINK, on-chain Bitcoin, and Cashu/nutzaps from one place.
    • A "Pay from" selector chooses which wallet the money leaves.
    • Pay Bitcoin payment targets from the in-app on-chain wallet.

Posting & Privacy

  • Adds private posts and private replies
    • Create and view private posts, replies, and reactions.
    • Customize who the receivers are for posts and replies.
  • Adds support for Private reactions to all feeds
    • React and un-react privately automatically.
    • Safeguards prevent private content from leaking publicly.
  • Enhances support for Private zaps
    • Zaps on private notes are forced private.
    • Replies to a private zap route into the sender's DM room.
  • Adds support for NIP-32 hashtag labels.
    • Add first-class hashtag labels to posts.
    • Follow-hashtag labels publish through your outbox relays.
    • They surface in the hashtag feed.
  • Enhances post's compose screen
    • Richer notify chips in the new-post screen.
    • Modernized inline payment cards that show their descriptions.
  • Enhances hidden words screen
    • A per-row unblock button on the Hidden Words screen.
    • Remove a single muted word without clearing the whole list.

Chat & DMs

  • Re-engineers DM bootstrapping with dynamic loading
    • Only loads the last 7 days worth of DMs.
    • Per-relay download windows realign when DMs are pruned.
    • A slow Tor connect is no longer mislabeled as "stalled".
    • The paused-history card shows parked relays.
    • The sync marker is now tappable.
  • Adds support for pinning DM conversations
    • Pins sync across devices via a NIP-78 app-data event.
  • Adds support for @-mention search in Marmot (MLS) group chats
    • Search and tag users in the group composer.
    • Conversation participants rank first.
    • They are marked with an "In this chat" chip.
  • Fixes quoted chat messages being rendered as posts
    • Quotes render inside chat bubbles with the proper chat-reply design.
    • The redundant reply row is skipped when the quote is already inline.
  • Fixes MLS reliability
    • Unread state now persists across app restarts.
    • The kind:445 backlog is no longer refetched on every launch.
  • Adds Share to DM ("Send as DM") flow
    • A new Android share-sheet target, alongside "New Post".
    • Share text, an image, or a video from another app into a DM.
    • Pick a recent conversation; the chat composer opens pre-filled and editable.

Reading & Feeds

  • Enhances Tor reliability and connection speed
    • Connects faster by reusing the network directory between launches (about 3× quicker on warm starts).
    • Watchtower rebuilds Tor automatically when it looks connected but no relay traffic is flowing.
    • Recovers from stuck entry guards that could leave Tor unable to connect across app restarts.
    • No longer hangs on a hostile network — bootstrap gives up after 60s and retries instead of wedging.
    • Holds Tor-routed relays until the proxy is ready, cutting wasted battery and network on launch and Wi-Fi/cellular switches.
    • Stays stable through self-heal resets and network changes.
  • Adds new Notifications top nav filter
    • The old "Global" tab is split into "Curated" and a raw "Global".
    • Curated is the current system that requires your involvement on a thread to notify you.
    • Global shows everything, including all hell threads.
    • Replies to likes/zaps now reach the notifications feed.
  • Adds Reply to zaps and reactions from the notification screen
  • Pre-loads reply threads from the feed so opening a thread is faster.
  • Adds support for LaTeX math in notes.
    • Use $...$ for inline equations.
    • Use $$...$$ for block equations.
  • Adds support for first-class reaction rendering
    • Reactions and zaps anchor their own thread view.
    • Reactions, zaps, likes, and nutzaps render as gradient cards.
    • Each card embeds the post it's about.
    • A single tap on a like/zap chip opens that event's thread.
  • Adds support for Workouts (new, NIP-101e)
    • Create and publish workout records (kind 1301), interoperable with the RUNSTR dialect.
    • Browse a dedicated Workouts feed.
    • Filter by exercise type, author, community, or hashtag.
    • Richer workout cards: a hero metric, a fixed stats grid, splits-style breakdowns, and the source app.
  • Adds support for Music (new)
    • First-class support for tracks (kind 36787) and playlists.
    • Browse Music Tracks and Music Playlists feeds.
    • Publish a new track and create playlists.
    • Add a track to a playlist from a bottom sheet.
  • Adds support for Software Apps directory (new, NIP-82).
    • Browse software applications (kind 32267).
    • Filter by follows, author, hashtag, or global.
    • An app detail screen shows screenshots and the author.
    • Tap a screenshot to open it fullscreen.
  • Enhances support for App recommendations (NIP-89).
    • Editable recommendations on your profile.
    • Tiered ordering in the recommendations editor.
    • Richer app cards with author attribution.
  • Adds support for Birdex species collections (kind 12473).
  • Adds support for Agora fundraiser campaigns (kind 33863).
  • Adds Audio visualizer picker
    • A live visualizer for audio-only notes.
    • Real-time FFT spectrum from the track's decoded audio (no mic, no new permission).
    • Styles: Classic (default), Spectrum Bars, Color Waves, Radial Ring, Aurora Glow, Static, and Off.
    • Each style has a live preview in the settings picker.
    • Your choice syncs across devices via NIP-78.
    • Fills the art area in fullscreen and shows a fixed strip in the feed.
  • Adds support for Podcasts (new, NIP-F4)
    • Dedicated podcast and episode feeds, filterable by follows, authors, communities, or hashtags.
    • Mark podcasts as favorites.
    • Tap a podcast to open a show screen with all its episodes and an inline player.
    • Translatable show and episode descriptions on the feed cards.
    • The episode audio player is squared so the controls get room.

Improvements and Bug fixes

  • Adds Searchable settings.
    • A search box filters rows by title and curated keywords.
    • Supports prefix matching and an empty-state.
  • Adds Swipe for brightness and volume in fullscreen video.
  • Fixes Quote-reposts (NIP-18) not counting in the repost counter.
  • Hides reposts of unsupported kinds instead of showing blank cards.
  • Fixes URLs glued to other words: the "fix missing spaces" pass now indexes URLs by their first character.
  • Search no longer matches text in p, e, a, alt, or client tags.
  • Media uploads in anonymous posts use the ephemeral signer.
  • Fixes anonymous profile zaps being encrypted as private zaps.
  • The Cashu wallet row shows the Cashu logo instead of a generic icon.
  • On-chain zaps highlight the bolt and show as pending in the counter.
  • Removed the wallet options reordering drag-and-drop UI.
  • De-duplicates preset amounts in Zap Settings
  • Fixes the chip-drag interaction in Zap Settings.
  • Fixes the live-stream chat relay fallback
  • Zap and non-zap polls now share the same option text when composing a post
  • Fixes Legacy NIP-71 videos to resolve their address from the real d tag.
  • Fixes the default media server resetting on every launch.
  • Fixes account cache: Deleting an account now clears its cached entry.
  • Adds support for birthdays on profile
  • Fixes cache child back-references when deleting notes
  • Detaches on-chain-zap, nutzap, and channel sources on cache deletion
  • Honors relay connection backoff during Tor bootstrap.
  • Heals sockets opened on the wrong transport by rebuilding them.
  • Recovers relay connections after the device wakes from sleep.
  • Keeps a relay's reconnect backoff from resetting on a momentary connection.
  • Honors the "Money operations via Tor" setting for payments and wallet relay connections
  • Reduces runtime log noise.
  • Fixes several edge-case crashes.
  • Fixes IPv6-literal URLs in posts
  • Reorganizes changelog into versioned files
  • Audit fixes across the private-posts, CLINK, and MLS paths.
  • Adds off-main-thread crypto and leak prevention.
  • Hides share/bookmark on private notes.

Desktop

  • Adds image compression on upload:
    • An Image Compression settings panel.
    • Per-post quality presets.
    • Batch progress in the composer.
    • A preview-then-publish gate.
    • A fail-loud dialog if compression fails.
  • Adds new media player.
    • Replaced vlcj with kdroidFilter's ComposeMediaPlayer.
    • Uses a JCodec/FFmpeg backend.
  • Adds Group DM parity with Android.
    • Set and update a group name (subject) on encrypted group chats.
    • Create a group by selecting multiple recipients in the New DM dialog.
    • Rooms are marked read when opened.
    • Messages from muted authors no longer mark a room unread.
    • Desktop now handles group direct messages the same way.
  • Adds Replies tab on the user profile.
    • Feeds also show reply context (parent embed plus label) inline.
  • Adds Feed refresh.
    • Inline card expansion.
    • A "New posts" chip that slides in from the top.
    • Stick-to-top on prepend.
    • Wired-up like/zap/comment actions.
  • Smaller fixes.
    • Copy a Blossom image URL on click, with a hover tooltip and snackbar.
    • Collapsed-sidebar polish: tighter ripple and hover tooltips.
    • Amethyst logo on the Tor and account-loading splashes.
    • Restored inter-word spacing in rich text with mentions/hashtags.
    • Fixed parent-author metadata loading.
  • Adds Unhealthy-relay review.
    • A banner and popup that flag relays behaving poorly.
  • Adds Namecoin diagnostics.
    • The diagnostics card was ported from the Android settings.

Cli

  • Adds amy offer — CLINK offer info and request, including --payer-data.
  • Adds amy debit — CLINK debit info, pay, and budget.
  • Adds amy zap --with <ndebit> — settle a zap invoice via a CLINK debit.
  • Adds amy offer discover <nip05> — resolve a profile's offer through NIP-05.
  • Closed CLINK parity gaps (profile offer, follow, offer pay, GFY detail).
  • Adds a clink-headless interop harness.

Quartz

  • Adds Relay-server toolkit.
    • Added a Flow<Event> REQ-responder SPI with a storage-free dispatch engine.
    • Added NIP-50 search parsing.
    • Added suspendable auth hooks.
    • Split engine/backend/policy packages.
  • Adds NIP-45 approximate COUNT
    • Added HyperLogLog with wire support.
  • Enhances NIP-11 documents.
    • Added the missing banner field.
    • Relay limits are now a single source of truth served over NIP-11.
  • Adds Relay Connection observability.
    • Stable per-connection ids.
    • A per-connection RequestContext threaded into the event source.
    • Auth identity moved from policy into connection scope.
  • Fixes NIP-46 double-resume and retry id-reuse race
  • Fixes NIP-46 error serialization issues
  • Fixes q (quote) tags being dropped by an inverted guard.
  • Fixes CommunityRulesEvent and CLINK DTO serializers
  • Improves Relay failure logs
  • Fixes disk cache to recreate cache dir if cleared at runtime

Build & Documentation

  • Dependency updates.
    • Bumped Kotlin, Compose Multiplatform 1.11.1, Coil 5, OkHttp 5, Jackson, AndroidX, Firebase, and more.
    • Adapted the Blossom interceptor test to OkHttp 5's Interceptor.Chain.
  • iOS CI.
    • commons commonTest now compiles and runs on iOS targets.
    • CI runs the shared commonTest on iOS for :commons.
  • Amethyst → commons migration (KMP/iOS).
    • Moves shared, CLI-safe code out of the Android app into commons.
    • Decryption caches (Mute/People/Community, Hashtag, Favorite-algo, Trust-provider).
    • Models: InterestSet, LabeledBookmarkList, NwcWalletEntry, CashuToken, OwnedEmojiPack.
    • The link-preview fetcher, relay broadcast tracker, and CLI-safe util extensions.
    • HtmlParser made KMP (dropped its Java Charset dependency).
    • A consolidated package taxonomy with a new architecture doc.
  • Licensing.
    • Replaced the GPLv3 TarsosDSP dependency with an in-house pitch shifter for the voice anonymizer.
    • Keeps the project MIT-clean.
  • Misc.
    • Added a monochrome outline Cashu icon to the Material Symbols set.
    • Renamed ReplaceableVideoEvent to AddressableVideoEvent for spec accuracy.
    • Split the monolithic CHANGELOG into per-version files under docs/changelog/.
    • versionName branch detection sets the git cwd, so it works inside git worktrees.
  • SonarQube cleanup (S1871).
    • Merged duplicate when/if arms across the codebase.
    • Migrated Log calls to the lambda overload.
  • Documentation.
    • Updated Privacy Policy to the new requirements from the PlayStore
    • Documented an Amethyst→commons migration plan and target package hierarchy.
    • Refreshed several Claude skills, documentation and the Namecoin design doc.
    • Added a rule requiring a license check when adding any new dependency.

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
  • Dutch by nostr:nprofile1qqs82l74z7g3x8j3avpn2wrjrwn855nyvmpxa4v5pftfvtv5lrvrc5cppemhxue69uhkummn9ekx7mp074ge6h
  • Polish by nostr:nprofile1qqsdyfz0ewdhmgp3a4r3pxvezx5r8yalrgvjn38v2ml5qrusnv7yywgpzemhxue69uhkummnw3ezucm6v9ejuurvw4ej7qg0waehxw309a3h5ctn9e6x7up0kvajyt
  • Hindi by nostr:nprofile1qqs88dt78wgnzvaph6fcstfvsd98xc2qs8eg8tllwv2zlutu8ehec2cpz4mhxue69uhhyetvv9ujuerpd46hxtnfduhszrnhwden5te0dehhxtnvdakz7qghwaehxw309aex2mrp0yh8qunfd4skctnwv46z7x03hlx
  • Slovenian by nostr:nprofile1qqsqqqqqqp0fmkspg7w8d305ln96a0jw0ptwqtuwskkm5pddv2kkjfcppemhxue69uhkummn9ekx7mp0qy2hwumn8ghj7un9d3shjtnyv9kh2uewd9hj7qgkwaehxw309aex2mrp0yhxg6t5w3hjuur4vghsdu406e
  • Spanish by nostr:nprofile1qqs07tjpyvvlq9ugdpax8h3jfrpwn7kr72k3tc7ky83tggn4et9eangpg3mhxw309ajxyartwdukjery09cxwctsd3ek6cnjdfnxs6t00pnhq7ttdvmkw7nsd3shxdrr0gery6nyva3h2ct0096kyerjw9jzummwd9hkutcprpmhxue69uhkv6tvw3jhytnwdaehgu3wwa5kuef0qyghwumn8ghj7mn0wd68ytnhd9hx2tcxdyhdq
  • Chinese by hypnotichemionus4 and nostr:nprofile1qqsyxnuhnymz0u0xru2watmqe25vlh8vzzje9jhlsfgvsff9942gc9gprfmhxue69uhhq7tjv9kkjepwve5kzar2v9nzucm0d5hsz9mhwden5te0wfjkccte9e3hsurvv9ujummjvuhsz9nhwden5te0wfjkccte9ehx7um5wghx6mm99urkr68m

Raw JSON

{
  "kind": 1,
  "id": "40e817712e397c07ba31784a92fa474aa095896a828c0e2dea0d09c60d49ee1e",
  "pubkey": "aa9047325603dacd4f8142093567973566de3b1e20a89557b728c3be4c6a844b",
  "created_at": 1781634949,
  "tags": [
    [
      "alt",
      "A short note: #Amethyst v1.12.0: Cashu, CLINK, Private Posts, Mu..."
    ],
    [
      "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",
      "757fd51791131e51eb033538721ba67a526466c26ed5940a56962d94f8d83c53",
      "wss://nos.lol/"
    ],
    [
      "p",
      "d2244fcb9b7da031ed4710999911a83393bf1a1929c4ec56ff400f909b3c4239",
      "wss://nostr.czas.plus/"
    ],
    [
      "p",
      "73b57e3b913133a1be93882d2c834a73614081f283afff73142ff17c3e6f9c2b",
      "wss://relay.damus.io/"
    ],
    [
      "p",
      "000000005e9dda01479c76c5f4fccbaebe4e7856e02f8e85adba05ad62ad6927",
      "wss://nos.lol/"
    ],
    [
      "p",
      "ff2e412319f01788687a63de3248c2e9fac3f2ad15e3d621e2b42275cacb9ecd",
      "ws://dbtksyiddypgaplsmbrjfhioxgpykk7gzplas4cz22jdgcuaoyubdrqd.onion/"
    ],
    [
      "p",
      "434f97993627f1e61f14eeaf60caa8cfdcec10a592caff8250c825252d548c15",
      "wss://pyramid.fiatjaf.com/"
    ],
    [
      "t",
      "Amethyst"
    ],
    [
      "t",
      "amethyst"
    ],
    [
      "r",
      "https://kind:445/"
    ],
    [
      "r",
      "https://`interceptor.chain/"
    ],
    [
      "zapraiser",
      "1000000"
    ],
    [
      "zap",
      "460c25e682fda7832b52d1f22d3d22b3176d972f60dcdc3212ed8c92ef85065c",
      "wss://vitor.nostr1.com/",
      "0.38"
    ],
    [
      "zap",
      "ca89cb11f1c75d5b6622268ff43d2288ea8b2cb5b9aa996ff9ff704fc904b78b",
      "wss://nostr.mom/",
      "0.2"
    ],
    [
      "zap",
      "56132cea7f54f860ff004b2e8f7e4b3953b0c9f37a5aaa88d0e5a5da036576d6",
      "wss://relay.damus.io/",
      "0.15"
    ],
    [
      "zap",
      "7579076d9aff0a4cfdefa7e2045f2486c7e5d8bc63bfc6b45397233e1bbfcb19",
      "wss://nos.lol/",
      "0.03"
    ],
    [
      "zap",
      "ec5663bb035f8e585bfa423c303a557648f95239cc07516bb06d6f59386dd2a4",
      "wss://nostr.bitcoiner.social/",
      "0.03"
    ],
    [
      "zap",
      "6cdebccabda1dfa058ab85352a79509b592b2bdfa0370325e28ec1cb4f18667d",
      "wss://relay.primal.net/",
      "0.03"
    ],
    [
      "zap",
      "6cd90f81ec60e076e9f187096c56fd1b0b5223f833a7d2c3ea370e81ad5d4ee2",
      "wss://relay.nostr.band/",
      "0.03"
    ],
    [
      "zap",
      "757fd51791131e51eb033538721ba67a526466c26ed5940a56962d94f8d83c53",
      "wss://nos.lol/",
      "0.03"
    ],
    [
      "zap",
      "d2244fcb9b7da031ed4710999911a83393bf1a1929c4ec56ff400f909b3c4239",
      "wss://nostr.czas.plus/",
      "0.03"
    ],
    [
      "zap",
      "000000005e9dda01479c76c5f4fccbaebe4e7856e02f8e85adba05ad62ad6927",
      "wss://nos.lol/",
      "0.03"
    ],
    [
      "zap",
      "ff2e412319f01788687a63de3248c2e9fac3f2ad15e3d621e2b42275cacb9ecd",
      "ws://dbtksyiddypgaplsmbrjfhioxgpykk7gzplas4cz22jdgcuaoyubdrqd.onion/",
      "0.03"
    ],
    [
      "zap",
      "434f97993627f1e61f14eeaf60caa8cfdcec10a592caff8250c825252d548c15",
      "wss://pyramid.fiatjaf.com/",
      "0.04"
    ],
    [
      "client",
      "Amethyst"
    ]
  ],
  "content": "#Amethyst v1.12.0: Cashu, CLINK, Private Posts, Music, Podcasts, Apps \u0026 Workouts\n\nHighlights:\n\n- Adds Cashu wallet: in-app NIP-60 wallet.\n- Adds CLINK payments: a new Lightning rail \n- Adds App Store Feed form ZapStore\n- Adds Private posts: post, reply, react, and zap privately via NIP-59.\n- Adds Workout Feed: record and browse NIP-101e workouts in a dedicated feed.\n- Adds Reaction cards: likes, zaps, and nutzaps render as rich gradient cards.\n- Adds Music Feed: publish and browse music tracks and playlists.\n- Adds Podcasts Feed: a new NIP-F4 podcast feed with favorites and an inline player.\n- Adds support for hashtag labels to posts after they're published.\n- Adds AppFunctions to allow Gemini to call Amethyst locally.\n\n## New Features\n\n### Payments\n\n- Adds unified zap popup for lightning, CLINK, on-chain, and Cashu in one place\n  - Quick 3-state toggle to quickly pick the source of your zap\n  - Defaults to options that both receiver and sender can use\n  - The payment rails now appear live as they resolve.\n- Adds full Cashu support (NIP-60/61)\n  - A full in-app ecash wallet, beyond the previous redeem-only support.\n  - Create and add a Cashu wallet, with its own screen and settings.\n  - Browse and pick mints from a mint directory.\n  - Mint ecash from Lightning and melt it back to Lightning.\n  - Send and receive ecash tokens.\n  - Top up a mint from a standalone screen.\n  - See per-mint balances on the wallet.\n  - Send NIP-61 nutzaps from the wallet, with a Lightning-style send progress bar.\n  - Cashu top-up is crash-safe on retry.\n  - Funds are checkpointed the instant they leave the wallet.\n- Adds full CLINK support\n  - Pay and get paid through CLINK Offers and Debits.\n  - Render all schemas inside of Notes\n  - Profiles can show a tappable CLINK Offer chip.\n  - Set one-time or recurring limits.\n  - Resolve a person's payment offer by NIP-05.\n  - A debit connection pulls funds only up to the cap you set.\n- Adds Unified Send Payment screen.\n  - Long-press any chip in the Profile or this screen to copy that destination.\n  - Use Lightning, CLINK, on-chain Bitcoin, and Cashu/nutzaps from one place.\n  - A \"Pay from\" selector chooses which wallet the money leaves.\n  - Pay Bitcoin payment targets from the in-app on-chain wallet.\n\n### Posting \u0026 Privacy\n\n- Adds private posts and private replies\n  - Create and view private posts, replies, and reactions.\n  - Customize who the receivers are for posts and replies.\n- Adds support for Private reactions to all feeds\n  - React and un-react privately automatically.\n  - Safeguards prevent private content from leaking publicly.\n- Enhances support for Private zaps\n  - Zaps on private notes are forced private.\n  - Replies to a private zap route into the sender's DM room.\n- Adds support for NIP-32 hashtag labels.\n  - Add first-class hashtag labels to posts.\n  - Follow-hashtag labels publish through your outbox relays.\n  - They surface in the hashtag feed.\n- Enhances post's compose screen\n  - Richer notify chips in the new-post screen.\n  - Modernized inline payment cards that show their descriptions.\n- Enhances hidden words screen\n  - A per-row unblock button on the Hidden Words screen.\n  - Remove a single muted word without clearing the whole list.\n\n### Chat \u0026 DMs\n\n- Re-engineers DM bootstrapping with dynamic loading\n  - Only loads the last 7 days worth of DMs.\n  - Per-relay download windows realign when DMs are pruned.\n  - A slow Tor connect is no longer mislabeled as \"stalled\".\n  - The paused-history card shows parked relays.\n  - The sync marker is now tappable.\n- Adds support for pinning DM conversations\n  - Pins sync across devices via a NIP-78 app-data event.\n- Adds support for @-mention search in Marmot (MLS) group chats\n  - Search and tag users in the group composer.\n  - Conversation participants rank first.\n  - They are marked with an \"In this chat\" chip.\n- Fixes quoted chat messages being rendered as posts\n  - Quotes render inside chat bubbles with the proper chat-reply design.\n  - The redundant reply row is skipped when the quote is already inline.\n- Fixes MLS reliability\n  - Unread state now persists across app restarts.\n  - The kind:445 backlog is no longer refetched on every launch.\n- Adds Share to DM (\"Send as DM\") flow\n  - A new Android share-sheet target, alongside \"New Post\".\n  - Share text, an image, or a video from another app into a DM.\n  - Pick a recent conversation; the chat composer opens pre-filled and editable.\n\n### Reading \u0026 Feeds\n\n- Enhances Tor reliability and connection speed\n  - Connects faster by reusing the network directory between launches (about 3× quicker on warm starts).\n  - Watchtower rebuilds Tor automatically when it looks connected but no relay traffic is flowing.\n  - Recovers from stuck entry guards that could leave Tor unable to connect across app restarts.\n  - No longer hangs on a hostile network — bootstrap gives up after 60s and retries instead of wedging.\n  - Holds Tor-routed relays until the proxy is ready, cutting wasted battery and network on launch and Wi-Fi/cellular switches.\n  - Stays stable through self-heal resets and network changes.\n- Adds new Notifications top nav filter\n  - The old \"Global\" tab is split into \"Curated\" and a raw \"Global\".\n  - Curated is the current system that requires your involvement on a thread to notify you.\n  - Global shows everything, including all hell threads.\n  - Replies to likes/zaps now reach the notifications feed.\n- Adds Reply to zaps and reactions from the notification screen\n- Pre-loads reply threads from the feed so opening a thread is faster.\n- Adds support for LaTeX math in notes.\n  - Use `$...$` for inline equations.\n  - Use `$$...$$` for block equations.\n- Adds support for first-class reaction rendering\n  - Reactions and zaps anchor their own thread view.\n  - Reactions, zaps, likes, and nutzaps render as gradient cards.\n  - Each card embeds the post it's about.\n  - A single tap on a like/zap chip opens that event's thread.\n- Adds support for Workouts (new, NIP-101e)\n  - Create and publish workout records (kind 1301), interoperable with the RUNSTR dialect.\n  - Browse a dedicated Workouts feed.\n  - Filter by exercise type, author, community, or hashtag.\n  - Richer workout cards: a hero metric, a fixed stats grid, splits-style breakdowns, and the source app.\n- Adds support for Music (new)\n  - First-class support for tracks (kind 36787) and playlists.\n  - Browse Music Tracks and Music Playlists feeds.\n  - Publish a new track and create playlists.\n  - Add a track to a playlist from a bottom sheet.\n- Adds support for Software Apps directory (new, NIP-82).\n  - Browse software applications (kind 32267).\n  - Filter by follows, author, hashtag, or global.\n  - An app detail screen shows screenshots and the author.\n  - Tap a screenshot to open it fullscreen.\n- Enhances support for App recommendations (NIP-89).\n  - Editable recommendations on your profile.\n  - Tiered ordering in the recommendations editor.\n  - Richer app cards with author attribution.\n- Adds support for Birdex species collections (kind 12473).\n- Adds support for Agora fundraiser campaigns (kind 33863).\n- Adds Audio visualizer picker\n  - A live visualizer for audio-only notes.\n  - Real-time FFT spectrum from the track's decoded audio (no mic, no new permission).\n  - Styles: Classic (default), Spectrum Bars, Color Waves, Radial Ring, Aurora Glow, Static, and Off.\n  - Each style has a live preview in the settings picker.\n  - Your choice syncs across devices via NIP-78.\n  - Fills the art area in fullscreen and shows a fixed strip in the feed.\n- Adds support for Podcasts (new, NIP-F4)\n  - Dedicated podcast and episode feeds, filterable by follows, authors, communities, or hashtags.\n  - Mark podcasts as favorites.\n  - Tap a podcast to open a show screen with all its episodes and an inline player.\n  - Translatable show and episode descriptions on the feed cards.\n  - The episode audio player is squared so the controls get room.\n\n## Improvements and Bug fixes\n\n- Adds Searchable settings.\n  - A search box filters rows by title and curated keywords.\n  - Supports prefix matching and an empty-state.\n- Adds Swipe for brightness and volume in fullscreen video.\n- Fixes Quote-reposts (NIP-18) not counting in the repost counter.\n- Hides reposts of unsupported kinds instead of showing blank cards.\n- Fixes URLs glued to other words: the \"fix missing spaces\" pass now indexes URLs by their first character.\n- Search no longer matches text in `p`, `e`, `a`, `alt`, or `client` tags.\n- Media uploads in anonymous posts use the ephemeral signer.\n- Fixes anonymous profile zaps being encrypted as private zaps.\n- The Cashu wallet row shows the Cashu logo instead of a generic icon.\n- On-chain zaps highlight the bolt and show as pending in the counter.\n- Removed the wallet options reordering drag-and-drop UI.\n- De-duplicates preset amounts in Zap Settings\n- Fixes the chip-drag interaction in Zap Settings.\n- Fixes the live-stream chat relay fallback\n- Zap and non-zap polls now share the same option text when composing a post\n- Fixes Legacy NIP-71 videos to resolve their address from the real `d` tag.\n- Fixes the default media server resetting on every launch.\n- Fixes account cache: Deleting an account now clears its cached entry.\n- Adds support for birthdays on profile\n- Fixes cache child back-references when deleting notes\n- Detaches on-chain-zap, nutzap, and channel sources on cache deletion\n- Honors relay connection backoff during Tor bootstrap.\n- Heals sockets opened on the wrong transport by rebuilding them.\n- Recovers relay connections after the device wakes from sleep.\n- Keeps a relay's reconnect backoff from resetting on a momentary connection.\n- Honors the \"Money operations via Tor\" setting for payments and wallet relay connections\n- Reduces runtime log noise.\n- Fixes several edge-case crashes.\n- Fixes IPv6-literal URLs in posts\n- Reorganizes changelog into versioned files\n- Audit fixes across the private-posts, CLINK, and MLS paths.\n- Adds off-main-thread crypto and leak prevention.\n- Hides share/bookmark on private notes.\n\n## Desktop\n\n- Adds image compression on upload:\n  - An Image Compression settings panel.\n  - Per-post quality presets.\n  - Batch progress in the composer.\n  - A preview-then-publish gate.\n  - A fail-loud dialog if compression fails.\n- Adds new media player.\n  - Replaced vlcj with kdroidFilter's ComposeMediaPlayer.\n  - Uses a JCodec/FFmpeg backend.\n- Adds Group DM parity with Android.\n  - Set and update a group name (subject) on encrypted group chats.\n  - Create a group by selecting multiple recipients in the New DM dialog.\n  - Rooms are marked read when opened.\n  - Messages from muted authors no longer mark a room unread.\n  - Desktop now handles group direct messages the same way.\n- Adds Replies tab on the user profile.\n  - Feeds also show reply context (parent embed plus label) inline.\n- Adds Feed refresh.\n  - Inline card expansion.\n  - A \"New posts\" chip that slides in from the top.\n  - Stick-to-top on prepend.\n  - Wired-up like/zap/comment actions.\n- Smaller fixes.\n  - Copy a Blossom image URL on click, with a hover tooltip and snackbar.\n  - Collapsed-sidebar polish: tighter ripple and hover tooltips.\n  - Amethyst logo on the Tor and account-loading splashes.\n  - Restored inter-word spacing in rich text with mentions/hashtags.\n  - Fixed parent-author metadata loading.\n- Adds Unhealthy-relay review.\n  - A banner and popup that flag relays behaving poorly.\n- Adds Namecoin diagnostics.\n  - The diagnostics card was ported from the Android settings.\n\n## Cli\n\n- Adds `amy offer` — CLINK offer info and request, including `--payer-data`.\n- Adds `amy debit` — CLINK debit info, pay, and budget.\n- Adds `amy zap --with \u003cndebit\u003e` — settle a zap invoice via a CLINK debit.\n- Adds `amy offer discover \u003cnip05\u003e` — resolve a profile's offer through NIP-05.\n- Closed CLINK parity gaps (profile offer, follow, offer pay, GFY detail).\n- Adds a clink-headless interop harness.\n\n## Quartz\n\n- Adds Relay-server toolkit.\n  - Added a `Flow\u003cEvent\u003e` REQ-responder SPI with a storage-free dispatch engine.\n  - Added NIP-50 search parsing.\n  - Added suspendable auth hooks.\n  - Split engine/backend/policy packages.\n- Adds NIP-45 approximate COUNT\n  - Added HyperLogLog with wire support.\n- Enhances NIP-11 documents.\n  - Added the missing `banner` field.\n  - Relay limits are now a single source of truth served over NIP-11.\n- Adds Relay Connection observability.\n  - Stable per-connection ids.\n  - A per-connection `RequestContext` threaded into the event source.\n  - Auth identity moved from policy into connection scope.\n- Fixes NIP-46 double-resume and retry id-reuse race\n- Fixes NIP-46 error serialization issues\n- Fixes `q` (quote) tags being dropped by an inverted guard.\n- Fixes `CommunityRulesEvent` and CLINK DTO serializers\n- Improves Relay failure logs\n- Fixes disk cache to recreate cache dir if cleared at runtime\n\n## Build \u0026 Documentation\n\n- **Dependency updates.**\n  - Bumped Kotlin, Compose Multiplatform 1.11.1, Coil 5, OkHttp 5, Jackson, AndroidX, Firebase, and more.\n  - Adapted the Blossom interceptor test to OkHttp 5's `Interceptor.Chain`.\n- **iOS CI.**\n  - `commons` `commonTest` now compiles and runs on iOS targets.\n  - CI runs the shared `commonTest` on iOS for `:commons`.\n- **Amethyst → commons migration (KMP/iOS).**\n  - Moves shared, CLI-safe code out of the Android app into `commons`.\n  - Decryption caches (Mute/People/Community, Hashtag, Favorite-algo, Trust-provider).\n  - Models: InterestSet, LabeledBookmarkList, NwcWalletEntry, CashuToken, OwnedEmojiPack.\n  - The link-preview fetcher, relay broadcast tracker, and CLI-safe util extensions.\n  - `HtmlParser` made KMP (dropped its Java `Charset` dependency).\n  - A consolidated package taxonomy with a new architecture doc.\n- **Licensing.**\n  - Replaced the GPLv3 `TarsosDSP` dependency with an in-house pitch shifter for the voice anonymizer.\n  - Keeps the project MIT-clean.\n- **Misc.**\n  - Added a monochrome outline Cashu icon to the Material Symbols set.\n  - Renamed `ReplaceableVideoEvent` to `AddressableVideoEvent` for spec accuracy.\n  - Split the monolithic CHANGELOG into per-version files under `docs/changelog/`.\n  - `versionName` branch detection sets the git cwd, so it works inside git worktrees.\n- **SonarQube cleanup (S1871).**\n  - Merged duplicate `when`/`if` arms across the codebase.\n  - Migrated `Log` calls to the lambda overload.\n- **Documentation.**\n  - Updated Privacy Policy to the new requirements from the PlayStore\n  - Documented an Amethyst→commons migration plan and target package hierarchy.\n  - Refreshed several Claude skills, documentation and the Namecoin design doc.\n  - Added a rule requiring a license check when adding any new dependency.\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- Dutch by nostr:nprofile1qqs82l74z7g3x8j3avpn2wrjrwn855nyvmpxa4v5pftfvtv5lrvrc5cppemhxue69uhkummn9ekx7mp074ge6h\n- Polish by nostr:nprofile1qqsdyfz0ewdhmgp3a4r3pxvezx5r8yalrgvjn38v2ml5qrusnv7yywgpzemhxue69uhkummnw3ezucm6v9ejuurvw4ej7qg0waehxw309a3h5ctn9e6x7up0kvajyt\n- Hindi by nostr:nprofile1qqs88dt78wgnzvaph6fcstfvsd98xc2qs8eg8tllwv2zlutu8ehec2cpz4mhxue69uhhyetvv9ujuerpd46hxtnfduhszrnhwden5te0dehhxtnvdakz7qghwaehxw309aex2mrp0yh8qunfd4skctnwv46z7x03hlx\n- Slovenian by nostr:nprofile1qqsqqqqqqp0fmkspg7w8d305ln96a0jw0ptwqtuwskkm5pddv2kkjfcppemhxue69uhkummn9ekx7mp0qy2hwumn8ghj7un9d3shjtnyv9kh2uewd9hj7qgkwaehxw309aex2mrp0yhxg6t5w3hjuur4vghsdu406e\n- Spanish by nostr:nprofile1qqs07tjpyvvlq9ugdpax8h3jfrpwn7kr72k3tc7ky83tggn4et9eangpg3mhxw309ajxyartwdukjery09cxwctsd3ek6cnjdfnxs6t00pnhq7ttdvmkw7nsd3shxdrr0gery6nyva3h2ct0096kyerjw9jzummwd9hkutcprpmhxue69uhkv6tvw3jhytnwdaehgu3wwa5kuef0qyghwumn8ghj7mn0wd68ytnhd9hx2tcxdyhdq\n- Chinese by hypnotichemionus4 and nostr:nprofile1qqsyxnuhnymz0u0xru2watmqe25vlh8vzzje9jhlsfgvsff9942gc9gprfmhxue69uhhq7tjv9kkjepwve5kzar2v9nzucm0d5hsz9mhwden5te0wfjkccte9e3hsurvv9ujummjvuhsz9nhwden5te0wfjkccte9ehx7um5wghx6mm99urkr68m",
  "sig": "647f9d032f8799b81d331411bc69a1b61db9c4d8fbde06274c4f54075823003992023c968e7f2181a289a98befe3c0e2322473e70878962deaf080e173816e78"
}