Files
amethyst/docs/changelog/v1.12.00.md
T

15 KiB

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

  • 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
  • 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.
  • 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.
  • 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

  • @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