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

Amethyst
npub142gywvjkq0dv6nupggyn2euhx4nduwc7yz5f24ah9rpmunr2s39se3xrj0
hex
40e817712e397c07ba31784a92fa474aa095896a828c0e2dea0d09c60d49ee1enevent
nevent1qqsyp6qhwyhrjlq8hgchsj5jlfr54gy4394g9rqw9h4q6zwxp4y7u8sprpmhxue69uhhyetvv9ujuem4d36kwatvw5hx6mm9qgs24yz8xftq8kkdf7q5yzf4v7tn2ek78v0zp2y427mj3sa7f34ggjc5qtfpxKind-1 (TextNote)
#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.
- Use
- 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, orclienttags. - 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
dtag. - 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.
- Added a
- Adds NIP-45 approximate COUNT
- Added HyperLogLog with wire support.
- Enhances NIP-11 documents.
- Added the missing
bannerfield. - Relay limits are now a single source of truth served over NIP-11.
- Added the missing
- Adds Relay Connection observability.
- Stable per-connection ids.
- A per-connection
RequestContextthreaded 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
CommunityRulesEventand 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.
commonscommonTestnow compiles and runs on iOS targets.- CI runs the shared
commonTeston 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.
HtmlParsermade KMP (dropped its JavaCharsetdependency).- A consolidated package taxonomy with a new architecture doc.
- Moves shared, CLI-safe code out of the Android app into
- Licensing.
- Replaced the GPLv3
TarsosDSPdependency with an in-house pitch shifter for the voice anonymizer. - Keeps the project MIT-clean.
- Replaced the GPLv3
- Misc.
- Added a monochrome outline Cashu icon to the Material Symbols set.
- Renamed
ReplaceableVideoEventtoAddressableVideoEventfor spec accuracy. - Split the monolithic CHANGELOG into per-version files under
docs/changelog/. versionNamebranch detection sets the git cwd, so it works inside git worktrees.
- SonarQube cleanup (S1871).
- Merged duplicate
when/ifarms across the codebase. - Migrated
Logcalls to the lambda overload.
- Merged duplicate
- 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
原始 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"
}