{"type":"rich","version":"1.0","title":"amethyst wrote","author_name":"amethyst (npub142…3xrj0)","author_url":"https://nostr.now/npub142gywvjkq0dv6nupggyn2euhx4nduwc7yz5f24ah9rpmunr2s39se3xrj0","provider_name":"njump","provider_url":"https://nostr.now","html":"#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"}
