# v1.12.0: Payments, Private Posts & Workouts

Highlights:

- Adds Cashu wallet: a new in-app NIP-60 ecash wallet.
- Adds CLINK payments: a new Lightning rail with budgets and a unified Send Payment screen.
- Adds App Store Feed: a browsable NIP-82 app directory.
- Adds Private posts: post, reply, react, and zap privately via NIP-17.
- 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, BookmarkSet, 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

- @npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z
- @npub1e2yuky03caw4ke3zy68lg0fz3r4gkt94hx4fjmlelacyljgyk79svn3eef
- @npub12cfje6nl2nuxplcqfvhg7ljt89fmpj0n0fd24zxsukja5qm9wmtqd7y76c
- @npub1w4uswmv6lu9yel005l3qgheysmr7tk9uvwluddznju3nuxalevvs2d0jr5
- @npub1a3tx8wcrt789skl6gg7rqwj4wey0j53eesr4z6asd4h4jwrd62jq0wkq4k
- @npub1dn0tej4a5806qk9ts56j572sndvjk27l5qmsxf0z3mquknccve7s4k8tfp

## Translations

- Czech, German, Swedish, and Portuguese by @npub1e2yuky03caw4ke3zy68lg0fz3r4gkt94hx4fjmlelacyljgyk79svn3eef
- Hungarian by @npub1dnvslq0vvrs8d603suykc4harv94yglcxwna9sl2xu8grt2afm3qgfh0tp
- Dutch by @npub1w4la29u3zv09r6crx5u8yxax0ffxgekzdm2egzjkjckef7xc83fs0ftxcd
- Polish by @npub16gjyljum0ksrrm28zzvejydgxwfm7xse98zwc4hlgq8epxeuggushqwyrm
- Hindi by @npub1ww6huwu3xye6r05n3qkjeq62wds5pq0jswhl7uc59lchc0n0ns4sdtw5e6
- Slovenian by @npub1qqqqqqz7nhdqz3uuwmzlflxt46lyu7zkuqhcapddhgz66c4ddynswreecw
- Spanish by @npub1luhyzgce7qtcs6r6v00ryjxza8av8u4dzh3avg0zks38tjktnmxspxq903
- Chinese by hypnotichemionus4 and @npub1gd8e0xfkylc7v8c5a6hkpj4gelwwcy99jt90lqjseqjj2t253s2s6ch58h
