Damus
Amethyst profile picture
Amethyst
@amethyst
#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

- @Vitor Pamplona
- @⚡ Dee Kay ⚡
- @Minced Beef Energy
- @greenart7c3
- @KotlinGeek
- @v

## Translations

- Czech, German, Swedish, and Portuguese by @⚡ Dee Kay ⚡
- Hungarian by @summoner
- Dutch by @Bartus
- Polish by @Polak
- Hindi by @राज
- Slovenian by @StellarStoic
- Spanish by @⚡₿it₿y₿it⚡
- Chinese by hypnotichemionus4 and @CXPLAY
4725❤️33❤️8🚀7💜3👀2🔥2
murmur · 4d
I can turn this into audio for the thread — goes live once 1,000 sats land here. One zap or many.
ngmi · 4d
Wen playstore?
Constantin · 4d
For v1.12.0, I can see it on GitHub, but only for Linux (even if I clicked "download for Android") and nothing on ZapStore. 🤷
Name Redacted · 4d
FYI the Mac release seems to be broken. I downloaded from your official git, it would initially not open it for security, when I bypassed that as it tried to load I got multiple error pop ups so had to uninstall
⚡ Dee Kay ⚡ · 4d
Latex rendering is 🔥 https://blossom.primal.net/3295b58ff48a269600380351d2f4be32abc44360f608649f7df171f1b8b4c978.jpg
AU9913 · 4d
Where is the music feeds?
⚡₿it₿y₿it⚡ · 4d
Hey nostr:nprofile1qqsyvrp9u6p0mfur9dfdru3d853tx9mdjuhkphxuxgfwmryja7zsvhqelpt5w I'm a little behind with the Spanish localizations, sorry. I think we should join all 3 variants or just keep the main one since they're not so different after all.
Globe99 · 4d
JFC this is massive, going to need a Users Manual soon! Does LaTeX work in Longform articles? Also, how to use Gemini?
thePR0M3TH3AN ✝️ BIP110 · 4d
Dang. 🔥
Y老师 · 3d
请问下载网址在哪里?
Max · 3d
Are you guys even shipping enough?
rambler · 3d
This fixed the broken NWC issue with nostr:nprofile1qqstxwlea9ah3u6kjjszu6a7lrnhqkfh8eptp2z6v0e9558tlkkl2rgpz4mhxue69uhhyetvv9ujuerpd46hxtnfduhszxnhwden5te0wfjkccte9ekkjmnfvf5hguewvdshx6p0qythwumn8ghj7un9d3shjtnswf5k6ctv9ehx2ap0wsvavr 🙏
NoStrFromObject · 3d
googleplaystore .12, new behavior bug? select? videos (.mp4) not decoding, not starting, but when clicking the overlay open in browser and then switching back to amethystz it then starts rendering playing nostr:nevent1qqs0fqcdplaz4he6x66r6cay7sw79ez3kvnr4nzjf7u47a8sa40m6dgppemhxue69uhkummn9ekx7mp0...
Terry Yiu · 3d
Are you planning on having Amethyst support iOS?
Logen · 3d
HOLY CRAP!!! THIS IS A HUGE UPDATE
DrShift · 3d
What the heck.. I am still reading ^^ Big Update!
Name Redacted · 1d
What exactly is podcast supposed to do? I have a feed of place holders and it doesn't find one single podcast I search? Am I mistaken on what it is supposed to do?