#Amethyst v1.12.6: Napplets, Static Sites Protocol & BugFixes
Highlights:
- New protocol support for **Nostr Web Applets (NIP-5D)** and **static websites
(NIP-5A)**, resolved straight from signed manifests over Blossom.
- Cashu tokens that span **multiple mints** now redeem in full, and both Base64
alphabets are accepted.
- A batch of stability fixes across notifications, playback, feeds, and the
emoji pack screens.
## New Features
- Add support for **Nostr Web Applets (NIP-5D)** and **static websites
(NIP-5A)**. Napplet manifests (snapshot/root/named kinds) and the NIP-5A
aggregate-hash layer land in Quartz, with a resolver that downloads each
listed Blossom server in order and accepts only the blob whose recomputed
SHA-256 matches the signed manifest — a substituted or corrupted blob fails
verification and is skipped.
## Performance
- Cashu token-prefix dispatch now compares against precomputed `DualCase`
prefixes instead of case-folding the cashuA/cashuB markers on every call.
## Improvements and Bug fixes
- Cashu: redeeming a pasted token now redeems **every mint/keyset group** in it
(previously only the first), validating all mints are in the wallet up front
and summing the redeemed amounts. The parser also tolerates both standard and
url-safe Base64 and mixed-case `cashuA`/`cashuB` prefixes.
- Stop the `DisappearingScaffold` top/bottom bars from overshooting their
resting edge during the show/hide animation.
- Dedupe emoji shortcodes in the Emoji Pack screen to prevent a `LazyGrid`
crash, and dedupe emoji pack addresses in the My Emoji List grid.
- Cap media-session artwork to the platform bitmap limit so large covers no
longer crash playback.
- Handle a missing camera app gracefully when taking photos or videos.
- Snapshot live-stream status order before sorting, and snapshot feed filters
too, to avoid `TimSort` "contract violation" crashes.
- Notifications: call `startForeground` on every start command and always
`stopSelf` when foreground promotion fails.
- Guard the Health Connect permission check against service-bind failures.
- Add a descriptive message to the media-download HTTP check.
## Cli
- `amy napplet fetch` resolves and fetches a NIP-5D napplet.
- `amy nsite fetch` resolves and verifies a NIP-5A static site / napplet.
## Quartz
- Implement NIP-5D napplets and the NIP-5A static-site resolver (manifest model,
path lookup, hash verification, Blossom candidate assembly) in `commonMain`,
with HTTP injected so Quartz keeps no networking dependency.
- Move the out-of-band Cashu token parser, the `cashuB` (v4) encoder, and the
token container model into Quartz, so Desktop's rich-text viewer can now parse
received Cashu tokens. Adds `kotlinx-serialization-cbor` (Apache-2.0).
- Centralize Blossom protocol strings in Quartz.
- Never let signer timeouts crash from auto-signing launches.
## Build & Documentation
- Generate the changelog translator credits offline from a committed
`translators.json`, track a rolling "since last tag" contributor list, and
seed it from Crowdin on every sync without rewriting the timestamp each run.
## Contributors
- @Vitor Pamplona
## Translations
- _None this release._
Amethyst
amethyst@vitorpamplona.com
npub142gy...xrj0
Nostr Client for Android
# v1.12.3-5: Relay Latency Health & a macOS Notarization Fix
Highlights:
- Tracks per-relay latency on Desktop and surfaces slow relays in the dashboard, a details popup, and a banner.
- Fixes macOS notarization for the desktop DMG and the `amy` CLI tarball.
## New Features
### Relay Latency Health (Desktop)
- Adds a per-relay latency tracker and a slow-relay classifier.
- Wires the latency tracker into `RelayHealthStore` with persistence across launches.
- Surfaces relay latency in the desktop dashboard, a relay-details popup, and an unhealthy-relay banner.
## Build & Documentation
- Fixes macOS notarization for the desktop DMG and the `amy` CLI tarball by signing the Mach-O native libraries bundled inside jars (secp256k1, SQLite, JNA, Skiko, jkeychain, and ComposeMediaPlayer) — Apple's notary service recurses into jars and had rejected them as unsigned.
- Fixes the macOS desktop DMG release build: Compose's signer maps the signing
identity to a certificate via `security find-certificate`, which did not
resolve the CI-imported certificate through the keychain search list (bare
`codesign` did). The release workflow now exports the throwaway keychain path
and points Compose's `signing.keychain` straight at it.
- Resolves the Developer ID **common name** from the signing keychain and feeds
it to Compose's `signing.identity`. Compose maps its identity to a certificate
via `security find-certificate -c`, which only matches the exact
"Developer ID Application: …" name — a fingerprint or partial/team-ID value
(which bare `codesign` accepts) was rejected with "Could not find certificate
... in keychain []". The release workflow now points Compose at the imported
keychain explicitly and supplies the canonical identity name.
## Contributors
- @Vitor Pamplona
- @Minced Beef Energy
## Translations
- _None this release._
#Amethyst v1.12.2: Road Events, Collapsable replies and some fixes
Highlights:
- Adds Roadstr road events (kind 1315/1316) with OpenStreetMap map
- Expands the Cashu wallet to surface and manage balances held across every mint, with seed recovery and richer nutzap controls.
- Collapses thread replies on click in thread view and shows the hidden reply count on collapsed cards.
- Adds full-text search across far more event kinds, including direct messages, zap comments, polls, code snippets, and audio.
## New Features
### Road Events (Roadstr)
- Adds kind 1315/1316 road event support, rendered with roadstr-accurate cards.
- Renders the road event location on an OpenStreetMap map that follows the app's dark theme.
- Modernizes road event cards with a map hero and a floating pill.
- Includes road events in geohash feeds.
### Quartz Search
- Adds a pausable, resumable full-text-search reindex to the SQLite and filesystem event stores, and clamps non-positive reindex batch sizes.
- Indexes direct message content (NIP-17 ChatMessageEvent).
- Indexes zap comments (LnZap request/receipt, on-chain zap, and nutzap).
- Makes polls, code snippets, audio, and git/torrent replies and interest sets searchable.
- Indexes parsed JSON fields of profile, channel, and app-handler events.
- Indexes natural-language fields of more event kinds, and makes the remaining text-bearing events searchable.
- Adds full-text-search reindexing to both the SQLite and filesystem event stores, pausable and resumable for large stores.
- Runs the post-migration search reindex in the background so upgrades don't block on it.
### Cashu Wallet
- Surfaces all token-holding mints and syncs them when the wallet opens.
- Highlights balances held at unconfigured mints and lets users move those coins off.
- Recovers from seed across every held mint, not just the configured ones.
- Reframes edit-wallet as a mint editor; adds mints directly from the browser and verifies them in the list.
- Moves mint recommendations to their own screen and nutzap-key rotation into the Danger Zone.
- Adds stop-receiving-nutzaps and delete-wallet actions.
- Keeps the Cashu receive invoice on screen during mint polling.
### Music & Playlists
- Adds a full-screen music playlist composer with cover image and metadata.
- Lets users reorder and remove tracks inside the playlist editor.
- Adds a "Mine" option to the music and playlist feed filters.
### Reading & Sharing
- Collapses thread replies on click in thread view and shows the hidden reply count on collapsed cards.
- Modernizes the quote/repost choice popup and shows both fork states in the boost preview.
- Reduces the scroll sensitivity for bringing back the nav and status bars.
## Share as Image
- Adds Share as Image to a local file, renaming the upload flow to Share as Image Url.
- Shows the image thumbnail in the share sheet for Share as Image.
## Public Chats
- Requires at least one relay to create or edit a public chat
- Broadcasts to observed relays when a channel declares none.
# Pull Notifications
- Better detects background state via a LifecycleEventObserver
- Prunes the connected set when a relay leaves the pool.
- Throttles notification relay-count updates to dodge Android's rate limit
- Distinguishes foreground from background counts in the notification tray
## Tor Management
- Warm-resets Tor on a dead-circuit self-heal instead of wiping all state.
- Fixes a Tor bug by seeding `hasEverBootstrapped` from the on-disk guard sample.
## DM Loading Improvements
- Tracks chatroom senders so DMs from followed contacts land in Known.
## Signer Fixes
- Stops splitting emoji surrogate pairs when truncating alt/summary tags.
## Desktop
- Wires macOS Developer ID signing and notarization.
- Adds an in-process relay seam, a launch benchmark, and a Compose UI test pyramid.
- Collapses icon decoding to a single memoized lazy for faster launch.
## Cli
- Codesigns and notarizes the macOS `amy` tarball.
- Publishes a no-JRE jar bundle and a Homebrew-core formula for `amy`.
- Drops the Compose UI render stack from the `amy` runtime image.
## Build & Documentation
- Bumps stable dependency versions.
- Adds icon, supported NIPs, and publishing-relay documentation to Zapstore config
- Adds a desktop release guard that fails the build if `osxkeychain.so` is stripped.
## 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
#Amethyst v1.12.1: Health Connect, Samsung/Google Watch Workouts, Share as Image
Highlights:
- Adds Health Connect: detect recorded workouts and suggest a NIP-101e post.
- Adds Share as Image: turn any note into an uploaded image and share it.
- Adds Immersive scrolling: hide the OS system bars while reading and in full-screen media.
- Fixes Desktop deployment
## New Features
### Workouts
- Detects workouts from Health Connect and suggests a kind 1301 post.
- Re-scans Health Connect when the app resumes.
- Adds a recent-workouts carousel to the New Workout composer.
- Moves Health Connect entirely into the New Workout composer.
- Defaults the workout distance unit to the phone's measurement system.
- Renders workout notes through the kind-1 text pipeline.
- Shows workout metrics in the viewer's own units.
- Records the source app or device name from Health Connect.
- Aligns Health Connect import with RUNSTR (active calories and title).
- Adds a Compose setting to disable workout suggestions.
- Limits the feed workout banner to today's workouts.
### Sharing
- Shares any note as an uploaded image.
- Adds a share-as-image screen with an image preview.
### Reading
- Hides the OS status bar during scroll immersive mode.
- Hides the OS system bars during full-screen media.
## Improvements and Bug fixes
- Modernizes the New Workout composer.
- Tightens the New Workout composer vertical spacing.
- Centers the activity type chips in the New Workout composer.
- Uses the Add icon on the New Workout FAB for consistency.
- Stops the connect card from flashing on every screen open.
- Keeps Health Connect prefs off the main thread (StrictMode).
- Adds the Android 14+ Health Connect permission rationale activity-alias.
- Polishes the share-as-image screen.
- Fixes a Tor race: sets Active deterministically so the bootstrap callback can't race it.
## Desktop
- Ships a consistent macOS .icns and multi-size Windows .ico.
- Excludes leaked kotlinx-coroutines-test from the release dmg.
## Translations
- Promotes Kenyan Swahili to the base resource qualifier.
## 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
#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
#Amethyst v1.11.0: Calendars
Highlights:
1. NIP-52 Calendars — feed, day/week/month views, event/collection editors, RSVP, ICS export, "starting soon" notifications, share-as-nostr-link, gallery picker.
2. On-Chain zaps — splits with dust gating, shows in the reaction gallery, display transaction history, privacy guidance
3. Payment-targets redesign (QR + copy + pay), public-address chip + confirmation
4. Inline nowhere-link cards in rich text.
PRs:
- Restore Lightning Address + LNURL fields in Edit Profile
- Raise the default maximum hashtag limit from 5 to 8
- Include on-chain zaps in notification summary stats
- Add electrum.nmc.ethicnology.com to default ElectrumX server set
- Translate call-permission and git-repo strings (cs, pt-BR, sv, de) + New Crowdin translations
- Subscribe and observe PaymentTargetsEvent for other users
- Only bridge to local cache when URL is BUD-01 layout; dedupe public-channel rows; normalize video/x-m4v to video/mp4
- Enable Send when typed name resolves via NIP-05; on-chain Bit recipient
- Inline Namecoin resolution indicator + result row on on-chain zaps
- Inline Namecoin resolution indicator in global search bar
- Long-press to copy Nostr Address, Website, LN Address, identities, payment targets
- macOS VLC bundled discovery and video rendering
- Make RelayAuthenticator authStatus thread-safe
- Pad GitRepositoryOverview content to clear top/bottom bars
- Use LargeCache for RelayAuthenticator authStatus
- MIME-type normalization for MediaStore
- Split delivery vs display, add Categories section in notifications
- Accept floating-point dimensions in imeta so image space is reserved pre-load
- Explain hashtag-limit hide reason in HiddenNote
- Route media-upload signing through launchSigner
- Render nowhere links inline as branded cards
- Release MediaController after 30s in background; skip timer for PiP
- Clickable on-chain card opens transaction history; tappable on-chain rows + txid index in LocalCache
- Disable ProGuard optimization entirely on desktop (fixes kmp-tor crash); .deb launch CI smoke test
- Show on-chain zappers in expanded reactions gallery
- Convert hashtag-limit message to <plurals> and add cs/pt-BR/sv/de translations
- Restore long-press on root note + anchor popup to the card
- Keep filter chips visible on empty on-chain transactions list
- Make playback notification tap open the note on warm-pool resume
- Validate zap receipts against LNURL provider's nostrPubkey (NIP-57 Appendix F)
- Stable sort in ShortsFeedFilter to avoid TimSort contract crash
- Align push notifications with Notifications feed filter; resolve addressable events to their replaceable note; WakeUp bypass + lookup hoist
- Update on-chain-zap + headers-explorer plans for NIP-BC inline SPV tags
- Start zoomable dialog close animation from zoomed bounds
- Scaffold I2P as a parallel privacy transport to Tor; route-aware HTTP stack; BlockedRouteException
- Reorder feed filter popup sections (DVMs before Communities, interest sets next to hashtags)
- Stop spinning Around Me when Geocoder is unavailable
- NIP-52 calendars — feed, day/week/month views, RSVP, ICS export, reminders, edit, share-as-nostr-link, participant picker, multi-day bars
- Audit follow-ups on MLS reply paths; route reply button on MLS messages to the encrypted group
- Use LaunchedEffect instead of remember for VM reset
- Switch to Dispatchers.IO around the whole executeAsync call in relay-info
- Drop crossfade around the card feed in notifications
- Observe locale in CalendarDateTimePickerButton
- Modernize zap amount choice popup to match reactions popup style
- Catch ForegroundServiceStartNotAllowedException in PlaybackService
- Include crashing thread name in crash report
- Convert remaining .gradle files to Kotlin DSL
- Redesign payment targets modal with QR, copy and pay buttons
- Add Public chip to on-chain wallet card; clarify privacy guidance on on-chain wallet popup
- Require running material-symbols-subset.sh when adding new icons; add new information icon
- Re-add Nostrcheck.me Blossom server to defaults
- Surface on-chain zaps from the reactions zap button
- On-chain zap splits — drop sender from splits, merge duplicates, gate Send on dust
- On-chain option on the Zap the Devs button
- On-chain handoff from the custom-zap dialog
- Keep listening on default index+search relays for users with no kind 10002
- Skip offline relays when fetching user metadata
- Include indexer and proxy relays in the trusted relay list to avoid Tor
- Confirm on-chain copy with public-address warning
- Swallow LegacyCursorAnchorInfo IllegalArgumentException
- Render ContactListEvent in NoteCompose with tap-through user list; add preview for DisplayContactList
## Contributors
- @Vitor Pamplona
- @⚡ Dee Kay ⚡
- @Minced Beef Energy
- @greenart7c3
- @KotlinGeek
- @v
## Translations
- Czech, German, Swedish, and Portuguese by @⚡ Dee Kay ⚡
- Hungarian by @summoner
- French by @Anthony 🇫🇷
- Dutch by @Bartus
- Polish by @Polak
- Hindi by @राज
- Slovenian by @StellarStoic
- Bengali by @Cats😺
- Spanish by @⚡₿it₿y₿it⚡
- Chinese by hypnotichemionus4 and @CXPLAY
- Russian by Anton Zhao
#Amethyst 1.10.0: OnChain wallets
- ci: remove macos-13 x64 build legs by @vitorpamplona in #2939
- Replace linuxdeploy with appimagetool for AppImage packaging by @vitorpamplona in #2940
- Sync inner note highlight fade with parent background color by @vitorpamplona in #2941
- Handle denied call permissions with settings dialog by @vitorpamplona in #2942
- Fix gradient rendering with transparent background colors by @vitorpamplona in #2943
- Add NIP-BC onchain Bitcoin zaps support (send, receive, display) by @vitorpamplona in #2944
#Amethyst v1.09.2: Fixes
- Fix Blossom blob detection to reject non-compliant filenames
- fix(desktop): add ProGuard keep rules so desktop builds actually launch
- fix(desktop): mirror Android ProGuard strategy for release builds
- Fix: pause video playback when app goes to background
- feat(desktop): wire NamecoinSettingsSection into Settings screen
- feat(desktop): wire Import Follow List dialog into UI
- Fix crash when toggling home tabs with persisted pager state
- Dedupe public channels in known chat list by channel id
- Route NIP-43 relay join/leave through launchSigner
- Migrate DNS cache from SharedPreferences to cacheDir
- Filter DNS poison (loopback / any-local) from non-loopback hosts
- perf(dns-cache): hand-rolled binary persistence format for SurgeDnsStore
- Ignore duplicated hashtags when processing hashtag spam
- New Crowdin translations
#Amethyst v1.09.1: Fixes
- Fixes pull to refresh behavior
- Fixes Desktop release CI
- Adds Git Repo screens.