#Amethyst v1.08.0: Arti Tor
- Migrates C Tor lib to Rust Tor lib (hopefully no more random crashes)
- Fixes highlight of users when composing and tagging
Team:
- @Vitor Pamplona
- @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- @Minced Beef Energy
- @greenart7c3
- @KotlinGeek
- @summoner
- @Anthony π«π·
- @Polak
- @ΰ€°ΰ€Ύΰ€
- @StellarStoic
- @CatsπΊ
- @β‘βΏitβΏyβΏitβ‘
- @CXPLAY
Amethyst
amethyst@vitorpamplona.com
npub142gy...xrj0
Nostr Client for Android
#Amethyst 1.07.3: New Shorts UI
- Migrates Shorts UI out of a paged design
- New edge-to-edge feed for Pictures only
- New edge-to-edge feed for Shorts only
- New edge-to-edge feed for long Videos only
- Migrates Badges to kind 10008
- Migrates Bookmarks to kind 10003
- Fixes AOSP keyboard auto-correction bug
- Fixes Poll's top nav filter
- Fixes loading of Bookmark sets
- Fixes sorting stability by including event ids
- Fixes cursor position in quote post field
- Fixes rendering of nostr: uris when composing
- Adds Basic support for reaction notifications
- Refactors NIP-58 Badges on Quartz
- Refactors LocalCache methods
- Improves the Chess UI (debug only)
- Add error handling to Tor services
#Amethyst v1.07.2: GIF Keyboard Support
- Adds GIF uploads support from Keyboard
- Migrates text fields and @ modifiers to the new Jetpack Compose states
- Fixes Bug that wasn't openning Amber to sign
- Fixes Bug on rejections using old Ambers
- Replaces hex input with user search dialog in relay management (allow/ban user)
#Amethyst v1.07.0
Amethyst:
- Adds support to Pin Notes
- Adds support to Polls feed screen
- Adds support for Requests to Vanish
- Adds support for Relay management (NIP-86) from Amethyst
- Adds support for Relay monitor assessments (NIP-66) in the Relay Info screen.
- Adds support for Relay member information (NIP-43) in the Relay Info screen
- Adds support for WebBookmarks
- Adds support for Zap Goals
Quartz:
- Rewords the NostrClient API for simplicity
- Adds NIP-15: Nostr Marketplace protocol
- Adds NIP-24: Birthday field support
- Adds NIP-29: Relay-based groups
- Adds NIP-32: Labeling protocol
- Adds NIP-43: Relay access metadata and membership management
- Adds NIP-60: Cashu wallet & spending history
- Adds NIP-61: Nutzaps protocol support
- Adds NIP-62: Request to Vanish feature β data deletion with relay compliance testing
- Adds NIP-66: Relay monitor discovery events
- Adds NIP-69: P2P Order Events (kind 38383)
- Adds NIP-75: Zap Goals support
- Adds NIP-77: Negentropy set reconciliation protocol support
- Adds NIP-7D: Thread events (kind 11)
- Adds NIP-85: Trusted Assertions β assertions for events and addressables
- Adds NIP-86: Relay management UI and client implementation
- Adds NIP-87: Ecash mint discoverability β Cashu and Fedimint event types
- Adds NIP-89: Compliance fixes, PlatformLinkTag parsing, app handler extensions
- Adds NIP-90: All DVM kind event classes from data-vending-machines spec
- Adds NIP-A4: Add k tag to zap requests and enforce e tag prohibition
- Adds NIP-BE: Bluetooth Low Energy mesh
- Adds NIP-C7: Chat messages (kind9)
- Adds NIP-5A: Static website event rendering
- Adds NIP-51, kind 10001: Pinned notes
Improvements and Fixes:
- Show toast instead of dialog on media download success
- Dynamically adjust preferred Blossom server when list changes
- Add relay discovery to node master
- Add scroll to settings page
- Solves crashing when multiple relays with the same url are included in the resulting list.
- Keep screen on during PiP playback
- Desktop feed loading β broken profile nav
- Use getOrCreateNote for reply linking to fix flaky thread test
- Route ReadsScreen following-mode events through cache
- Pin ElectrumX server certs for Samsung One UI 7 / Android 16 compatibility
- Duplicate keys in relay management lazy column β sort pubkeys
- URL detector β fixes localhost:3030 strings, Japanese character URLs
- Web Bookmarks floating action button shape (circle) and open graph previews.
- NIP-86 requests now send Accept and Content-Type headers
- On DMs, activates decryption for all filetypes that match decryption url with the cipher info, not only binaries
- Adds a try/finally to subscriptions to make sure they close even in crashes.
- Protects against crashes when the signer sends an unverifiable payload back to Amethyst
Desktop:
- Cache-centric architecture for feeds
- Render reposts and quoted notes in feed
Performance
- Non-blocking startup procedures
- 20x Faster Rfc3986Normalizer
- Url Detector without using regex
- Parallelize preference file access at startup
- Remove internal runBlocking calls
- Lazy loading the memory trimming service
- Speeding up DrawerContent rendering
- Eagerly delete temp files in upload pipeline
Refactoring:
- Simplify NostrClient API for beginners
- Simplify relay API with Closeable serve()
- URL detector readability improvements
- Restructure NIP-90 DVMs packages
- Reorganize NIP-BE into subpackages
- Move public messages and trusted assertions out of experimental
Migrations & Deprecation Fixes
- Migrate LocalClipboardManager
- Migrate to semantics-based Autofill API
- Migrate TabRow to Material 3 variants
- Migrate `ContextCompat.startActivity`
- Solves deprecation & cast warnings
Platform & Build
- Add linuxX64 target
- Add explicit permissions to GitHub Actions
- Stop Gradle daemons after build steps
- Increase Android CI build timeout
- Update video compression library to latest
- Update dependencies,
- Add local maven repo for easier library dev
- Remove libsodium files
- Git hooks installation in worktrees
- Fixes proxy access for VLC files in claude's web environment.
- Log level filtering
- Parallelize BaseDBTest forEachDB
Documentation
- Add CLIENT.md guide for building Nostr clients with Quartz
- Add RELAY.md guide for building relays with Ktor, NostrServer, SQLite
Contributors
- @Vitor Pamplona β Primary development
- @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ β Log level filtering, video compression, toast downloads, CI fixes, git worktree fix
- @Minced Beef Energy β Desktop cache architecture, desktop bugfixes
- @greenart7c3 β CI workflow permissions
- @KotlinGeek β Remove libsodium files
- **mstrofnone** β ElectrumX cert pinning for Samsung One UI 7
Translations
- Czech, German, Swedish, and Portuguese by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Hungarian by @summoner
- French by @Anthony π«π·
- 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.06.3
- Add support for multiple choice polls
- Add drag-to-seek to the video progress bar
- Hide video controls on playback start
- Bigger recording STOP button for @Derek Ross
- Fixes non http uris in the references tag
- Makes sure quote tags happen once
- Removes clickable NIP-05 when @ tagging
- Removes naddr to index articles in bookmarks
- Checks if p tags are pubkeys on drafts load
- Scroll to the replied message when clicking reply preview in chat
- Add an anonymous reply (tap picture)
- Fixes pool rendering when labels are too different
- Use uri-reference-kmp, deprecates java impl
- Fixes crashing in URLs with japanese chars
- Set followers to fix LazyColumn key conflicts
- Clickable relay rows on the profile page
- Move cache lookups from NavHost route
- Improvements to the status of attestations. Validity first, then Processing status.
- Fixes Tor Manager flow value
- Improves Tor binding lifecycle.
- Simplifies the report feed in the user profile
- Clears inconsistencies in translated strings
- Fixes client tags on Quartz
- Fixes routes for AppDefinition events.
#Amethyst v1.06.1 Fixes
- Improvements to the rendering of Polls.
- Solves some of the crashes of the concurrent modification exception
- Fixes URL parsers with Japanese chars
- Fixes Wallet import from Primal on Poco phones
- Improves the wording of the Last Seen
- Fixes for "Cannot disable reuse from root if it was caused by other groups"
- Fixes comparator to avoid Comparison method violates its general contract!
- Improves zap-store settings
#Amethyst 1.06
Polls:
- Adds creating and rendering NIP-85
- Redesign of the poll and zap poll cards
- Adds special notification card for active polls
Relay Feeds
- Adds support for rendering relay feeds
- Adds support for NIP-51 favorite relay feeds
- Shows favorite relays in the top nav filter
- Clickable wss:// links
- New user gets nostr.wine to fav relay feeds
Media Player
- Redesigned player controls
- Supports music with waveform animations
- Migrates to new Media3 content views
- Improved Picture in Picture actions
- Fix playback lifecycle issues on PiP
- Adds support for uploading audio
NWC Wallets:
- Adds support for in-app Wallets
- Adds receive and pay actions
- Adds views for balance and transactions
- Adds transaction filtering by type
- Adds pagination to transaction screen
- Adds test cases from other repos to guarantee interoperability
Calendar:
- Renders NIP-52 Calendar appointments
- Supports calendar time and date slots
- Refactored the early implementation on Quartz for easier use
Code Snippets:
- Adds support for NIP-C0 Code Snippets
- Replies using NIP-22
NIPs on Nostr
- Adds support for event kind 30817
- Replies using NIP-22
PayTo:
- Adds support for NIP-A3 Payment targets by @greenart7c3
Blossom BUD-10:
- Adds support for "Blossom:" URIs on the post
- Supports automatic discovery of servers
- Includes support in previews
- Includes support for encryption when using it in NIP-17 DMs.
Expirations
- Adds enhanced support for custom expirations in any new post.
- Displays expirations on posts and DMs
Relay Monitors:
- Adds support for NIP-66 Relay monitor and discovery support to Quartz
Attestations:
- Adds support for rendering Attestations (
- Recommendations, Requests and Attestor Declarations are also included.
Chess:
- Adds support for Chess/Jester protocol
- Full chess game implemented
- Supports for game challenges and view external games
- Running on debug only for now
DMs:
- Removes NIP-04 DMs
- Blocks sending if the receiver doesn't have NIP-17 relay lists.
- Removes force-activate NIP-17
Push Notifications:
- Adds support for inline reply
- Adds support for notification grouping
- Adds support for Async image Loading
- Removed NIP-04 notifications
Long Form:
- Adds support for writing Markdown content
- Includes support for auto-saving drafts
- Includes support for editing
Uploads:
- Adds support to upload Documents & audio
- Adds toggle to stip file metadata regardless of compression by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Adds encrypted file upload fallback option for NIP-17 chats
- Removes support for NIP-96 and updates Blossom recommendations
Content Warning:
- Adds an description field in new post
- Displays reason on warning composables
Settings redesign:
- Consolidate settings into a single Settings hub screen
- Redesigns Zap and NWC setup screens
- Redesigns Custom zap amount screens
- Adds brand new Translation Settings screen
- Adds blockchain explorer settings page for OTS verification
- Adds reactions row settings (enable/disable, order, show/hide counters) by @greenart7c3
- Tapping on Zap without any pre-configured amount opens the custom dialog
Content parsers:
- URL/URI parser rewrite in Kotlin multiplatform
- Fixes characters attached to URLs or nostr URLs without a space
- Massively increases parsing performance
- Treat multibyte characters as URL terminators in RichTextParser by @kojira
- Adds a parser for blossom and wss uris
UI Improvements:
- Minimizes parent thread rendering in quoted notes by @The Daniel π
- New Material 3 UI for DropDowns by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- New Material 3 UI for feed filters by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Draft Screen requests confirmation before deleting drafts on swipe
- Swipe to switch tabs. Main screen and messages by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Adds support for rendering Zap events when quoted inside of posts.
- Adds a Broadcasting feedback pop-up in the Complete UI mode
Relay Management:
- Adds relay search tooltip when adding relays
- Adds the list of keys using each relay to the relay information
- Adds active subscriptions and outbox event in the queue to relay information
- Adds a complete list of event kind names to the subscription card to relay information
- Tracks and displays connection success rate on relay settings
- Adds relay settings export functionality
- Adds NIP-45 count queries to show how many events each relay has.
- Adds Relay sync utility to help users move posts between relays.
Search:
- Breaks the search filter into two subscriptions to prioritize Metadata without punishing content.
- Fixes the need to start user searches with @ in user fields
- Fixes the stability of the search feed when the user navigates away and back.
- Replaces about me for NIP-05 in the user search results
- Adds relay URL search to the search page
- Forces returning one user when searching by nip-05
- Removes outdated versions of addressables from the search results
Profiles:
- Adds support for NIP-39 External Identities with kind 10011
- Adds a profile picture upload button when the user has no picture
- Adds last seen to the user profile
- Adds nprofile and npub copy options to the profile
- Groups received zap amounts by sending the user in the profile tab
- Increases the limit of Zap downloads for profiles to 1000
- Simplifies profile edit screen layout by @The Daniel π
- Migrates profile galleries to display a thumbnail for videos
- Fixes profile galleries' aspect ratios
- Adds support for Namecoin .bit urls to NIP-05 and choice of ElectrumX server to resolve namecoins.
Onboarding
- Adds bulk follow screens to search for a user and to copy his/her follow list
Voice message by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Adds voice anonymization
- Change from "hold to record" to "click to start, click to stop"
- Display kind 1 voice replies as an audio waveform
- Increases max voice record duration to 600 seconds
- Switches the public message event to use quoted posts for replies
Fixes:
- Fixes "forked from" label rendering
- Avoids crashing when the `k` tag cannot be parsed to a number
- Only use Voice Reply events when replying to voice notes. Others just receive a URL.
- Fixes the lack of update in the follow count on the UserProfile page
- Fixes out of memory when downloading large videos
- Fixes Jackson deserialization for empty Filters and add regression test by @greenart7c3
- Fixes NullPointerException when the filter contains tags
- Fixes download cancellations when screen components disappear
- Migrates to use "title" instead of "name" tags for NIP-51 lists
- Adds a longer crop for npubs so that we can see vanity keys better
- Fixes the need to have tags and kinds for inbox.nostr.wine to work
- Blocks the size of Relay Auth Status arrays from growing forever with auth messages
- Fixes crash when getting OpenGraph tags of invalid URLs
- Fixes NIP-44 key mutation in NIP-46 connect
- Location permission watcher moved outside screens to avoid recreation
- Solves the sorting contract crash on search by precaching all values before sorting users.
- Fixes lingering relay connections from loading follows outbox's settings.
- Enhance NIP-38 user status display with emoji support and metadata tags
- Fixes bug on Show More calculations for very long texts without spaces
- Fixing IO Dispatchers and coroutine scopes of choice
- Fixes anySync parallel operation that was returning the first result, not the first positive "any".
- Fixes Req onCannotConnect listeners to the relays that actually sent the req
- Fixes hanging subscriptions when exceptions happen during NostrClient utility methods
Defaults:
- Switches wss://nostr.band to wss://antiprimal.net, wss://relay.ditto.pub on app defaults
- Adds wss://nostr.wine, wss://news.utxo.one as favorite relay feeds
- Adds wss://directory.yabu.me and wss://profiles.nostr1.com as index relays
- Adds electrumx.testls.space, nmc2.bitcoins.sk, 46.229.238.187 and i665jpwsq46zlsdbnj4axgzd3s56uzey5uhotsnxzsknzbn36jaddsid.onion as ElectrumX servers
Quartz:
- Adds Relay Server implementation with NIP-45 COUNT and NIP-42 AUTH support
- Adds support for dynamic auth policies to the relay implementation.
- Migrates Quartz EventStore from Android-only to KMP
- Adds a reqUntilEoseAsFlow extension to the Nostr Client
- Adds a reqBypassingRelayLimits extension to the Nostr Client
- Adds comprehensive NIP-46 Bunker support
- Adds comprehensive support for NIP-47 non-payment methods.
Adds complete support for iOS to Quartz by @KotlinGeek
- Provide implementation for Rfc3986 on iOS, using the Swift Rfc3986UriBridge.
- Provide implementation for LargeCache, using a CacheMap
- Provide implementation for fastFindURLs()
- Provide implementation for makeAbsoluteIfRelativeUrl() in ServerInfoParser.ios.kt
- Provide implementation for UrlEncoder
- Provide implementation for UnicodeNormalizer
- Provide implementation for GZip compression/decompression. Some small fixes in URLs.ios.kt
- Provide implementation for AESCBC
- Provide implementation for AESGCM
- Provide implementation for DigestInstance
- Provide implementation for LibSodium
Amethyst Desktop by @Minced Beef Energy
- Adds NIP-46 Bunker Login
- Adds Support for Chess
- Adds Thread Screens
- Adds advanced search with query engine and filter panel
- Adds encrypted DMs (NIP-04/NIP-17)
- Adds proper empty states with EOSE tracking
- Adds multi-column deck layout
- Adds Full media parity β images, video, audio, encrypted DMs, upload, lightbox
- Adds advanced search with NIP-50, collapsible sections, and nav state preservation
- Clear stored credentials on logout
- Adds bunker heartbeat indicator
- Adds QR-based signer pairing
- Migrates lifecycle-viewmodel KMP dependencies to KMP/Commons
- Migrates drawReplyLevel modifier to KMP/Commons
- Migrates ThreadFilter to KMP/Commons
- Migrates Card interface and CardFeedState to KMP/Commons
- Migrates Channels (public chats, ephemeral channels, and live streams) Account modules to KMP/Commons
- Migrates private chatroom models to KMP/Commons
- Migrates reports states to KMP/Commons
- Migrates Emoji State to KMP/Commons
- Migrates lud06 to lud16 mapping to KMP/Quartz
- Migrates the new LocalCache observables to KMP/Commons
- Migrates rich text parser from JVM to KMP/Commons
Code Quality
- Migrates to AGP 9.0
- Adds Amethyst Desktop to CI/CD and Release builds
- Removes the in-app memory counter methods
- Refactors the old NIP-05 code on Quartz
- Migrates contact list management to addressable notes
- Creates new observable flows for LocalCache.
- Moves metadata methods from User to UserCache objects
- Separate Addressable vs Replaceable event class bases
- Avoid dependency on AccountSettings for NwcSignerState
- Finishes the transition to EventHint objects for building events.
- Lots of code review fixes by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Large accessibility review by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Moves Top Nav Filter markers from Strings to full objects.
- Removes support for feed definitions
- AccountState refactoring
AI:
- Add SKILL.md for AI agent customization
- Add settings and hooks to setup Android Development for the agent
Updated translations:
- Czech, German, Swedish, and Portuguese by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Hungarian by @summoner
- French by @Anthony π«π·
- Polish by @Polak
- Hindi by @ΰ€°ΰ€Ύΰ€
- Slovenian by @StellarStoic
- Bengali by @CatsπΊ
- Chinese by hypnotichemionus4
- Spanish by @β‘βΏitβΏyβΏitβ‘
Attestr
Search assertions, publish attestations, and review lifecycle status, comments, and zaps.
#Amethyst v1.05.1: BugFixes
- Fixed mixed DMs between logged-in users.
- Fixed draft screen click to edit post.


Amethyst - Nostr Client for Android
Join the social network you control. The most feature-rich Nostr client for Android.
#Amethyst v1.05.0: Bookmark Lists, Voice Notes, and WoT Scores
This release introduces Bookmark List management, a complete overhaul of Voice Notes/YakBaks, and the debut of Web of Trust (WoT) scores for a safer social experience.
This version adds support for creating, managing, deleting, and viewing multiple bookmark lists, which include both public and private members. You will find an improved "Bookmarks" menu option in the sidebar and extra bookmark options in the context menu of each post, allowing you to add posts directly to one or more individual lists.
The Voice Notes UI has been redesigned to allow recording directly within the new Post Screen and a dedicated Voice Reply screen. Users can record a new voice message, preview it with waveform visualization, re-record if needed, select a media server, and post the reply. You now have full control.
Amethyst now supports Trusted Assertions. By connecting to a WoT provider, you can see trust scores and verified follower counts directly on user pictures. This helps filter signal from noise, identifying reputable accounts to follow, which DMs to open, and which notifications to prioritize. To activate this, you will need to find a provider capable of computing these scores. While providers are currently limited and resource-constrained, we hope more will bring their own algorithms to Nostr over time.
Quartz received a significantly improved database engine capable of sub-microsecond queries using Android's default SQLite database. The engine is optimized for mobile environments, using as little memory as
possible to avoid impacting other apps.
In the background, we have begun building Amethyst Desktop. While much work remains, the goal is a standalone, mouse-first application that moves away from mobile-centric UI layouts.
New Features
- Trusted Assertions: Added support for trust scores displayed on user profile pictures
- WoT Followers: Displays verified follower counts in user profiles
- Bookmark Lists: Full support for custom lists by @KotlinGeek
- Relay Information: New UI with expanded NIP-11 feature support
- Voice Notes & Replies: Redesigned experience by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Profile Banner: New default banner by @Purple Painter
- Native Links: Intercept njump, yakihonne, primal, iris.to, zap.stream, and shosho.live to open directly on Amethyst by @Kirpy
Improvements:
- New in-memory graph-based cache scheme; moved reports and WoT scores to this new system
- Disabled top bar reappearance to prevent feed shifting when navigating between pages
- Lenient Kotlin Serialization to prevent crashes from malformed JSON;
- Removed expired addressable events from cache
- Moves reports from the old caching system to the new Graph-based one.
- Reverted to a 500-post load limit for Profile screens to handle high-reply accounts
- Moved the QR Code screen from a Dialog to a full Route.
- Re-adds name as a tagging name to the profile edit page.
Performance:
- Faster event id checker by serializing, sha256 hashing, and ID comparison without creating any intermediary buffers.
- Faster event JSON parsers by avoiding new variables and thus garbage collection calls
- Faster tag array Deserializer
- Manages the pool state without having to loop through relays, saving some milliseconds of processing.
- Adds a cache system for WoT scores
- Improved Compose stability for video UI
BugFixes:
- Fixes JSON serialization of UTF-8 Emoji surrogates for compatibility with standard Nostr implementations
- Improves error message on zap configuration errors with detailed NWC URI by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Centers QR dialog content and reduce excessive top spacing by @StellarStoic
- Closes subscriptions when ending them on NostrClient instead of waiting for them to finish
- Requires a relay to be an outbox/inbox relay to be able to NOTIFY a user of a payment
- Improves the speed of parsing of invalid kinds inside an address string
- Fixes count not working for LIMIT queries in the DB
- Fixes icon bug with incorrect resource id by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Fixes missing updates to the feed when the top list is not yet available locally
- Fixes List of supported NIPs as Integers on NIP-11 by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Fixes ConcurrentExceptions on event outboxes
Desktop:
- Base Compose Multiplatform Desktop App with posts and global/following feeds by @Minced Beef Energy
Web:
- New website by @Derek Ross
Quartz:
- Adds support for Trust Provider lists and Contact Cards for NIP-85
- Early support for Payment targets as per [NIP-A3](https://github.com/nostr-protocol/nips/pull/2119) by @greenart7c3
- Initial support for NIP 46 by @greenart7c3
- Adds support for fast MurMur hash 3 64 bits
- Adds a nextLong secure random method
- Removing the generalist approach of ptag-mentions
- Removes deprecated fields in UserMetadata
- Removes compose bom from Quartz to avoid unnecessary dependencies.
- Removes datetime dependencies from Quartz
- Adds dependency on coroutines directly (instead of through compose runtime)
- Removes old secp256 target dependencies
- Adds Default scope for NostrClient and Relay Authenticator
Quartz-Event Store:
- Moves from text tags to probabilistic 64-bit MurMur Hash3 integers for performance
- Moves from range index queries to kind,pubkey queries by default.
- Adds simpler SQL queries for specific simple Nostr filters
- Expose SQL query plans, vacuum, and analyse to lib users
- Implements AND Tag queries from [NIP-91](https://github.com/nostr-protocol/nips/pull/1365)
- Implements GiftWrap deletions by p-Tag with deletions and vanish requests
- Offers several indexing strategy options to users.
- Adds several test cases that verify not only the SQL but also the indexes used
- Exposes raw queries that return columns for relays that might not need the tag array
- Forces the use of the index on Addressables and Replaceables on triggers
- Fixes duplicated events being returned from the DB
- Fixes unused Or condition in the SQL builder
- Refine the structure of the module classes for the DB
- Removes the Statement cache since statements are not thread safe
- Creating interfaces for multiple EventStores
Code Quality:
- Updates kotlin, compose, multiplatform, activity, serialization, media3, mockk, secp256, tor, androidxCamera, stdlib
- Adds a compose stability plugin to allow traces in debug
- Updates to the latest Zapstore config
- Updates quarts instructions in the ReadMe.
Updated translations:
- Czech, German, Swedish, and Portuguese by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Polish by @Polak
- Hungarian by @summoner
- Hindi by @ΰ€°ΰ€Ύΰ€
- Slovenian by @StellarStoic
- Spanish by @β‘βΏitβΏyβΏitβ‘
- Latvian by @βπ π π π
- Dutch by @Bartus
- French by @Anthony π«π· and Alexis Magzalci
- Chinese by @CXPLAY
#Amethyst v1.04.1: Bug fixes
- Fixes crashing when starting
- Fixes hashtag unfollowing for mixed case tags
- Fixes release Id for the zap the devs button
- Fixes quartz version for a release to Maven
- Fixes disappearing of the Zap the Devs Manual Payment screen
- Fixes back button of the Zap the Devs Manual Payment screen staying behind the status bar
Translations:
- Polish by @Polak
- Hungarian by @summoner
Download: 

Amethyst - Nostr Client for Android
Join the social network you control. The most feature-rich Nostr client for Android.
#Amethyst v1.04.0: Lists for all
This version adds support for creating, managing, deleting, and viewing follow lists, which include both public and private members. We've also added similar UI to support for creating, managing, deleting, and viewing follow packs from following.space, allowing you to assemble following lists not only for yourself, but also as a starter packs for other users. You will find a new "My Lists" menu option in the side bar and Follow buttons when extended behavior to add users directly into lists or packs.
This version also introduces significant improvements to the quality of video compression and hash checks during media upload/download, along with new codecs and a new image gallery for displaying sequences of images in posts. The startup loading of outbox relay lists and user metadata for large follow lists (> 1000 people) has been significantly improved with new mechanisms to search for missing outbox relay lists.
The Top Bar filter "All Follows" now merges all follow lists, follow packs, following hashtags, following geotags, and following communities into a single feed. Two new options were also added: "All User Follows," which includes only the main and other follow lists, and "Default Follow List," which is the standard follow list used by every client.
Finally, we completed our Quartz migration to Kotlin Multiplatform, added significant performance improvements when processing events and running cryptographic procedures, as well as new ease-of-use extensions.
New Features:
- People List creation and management by @KotlinGeek
- Follow Pack creation, management and feed view
- Image gallery in posts by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Finishes migration of Quartz to Kotlin Multiplatform
- New Filters in the top nav bar
- Performance improvements across all features
Improvements:
- Adds support to rejection replies from NIP-55 signers by @greenart7c3
- Adds live/offline indicator to live bubbles by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Refines the video compression procedure by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Replaces MP4 parser libraries with native MediaMuxer / MediaCodec by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Adds a H.265/HEVC codec to reduce file size by up to 50% while maintaining the same quality by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Optimizes video file structure by moving metadata to the beginning, so videos start playing more quickly by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Adds "All User Follows" feed filter in the top nav bar that removes hashtags, communities and geotag follows
- Adds "Default Follow List" feed filter in the top nav bar that contains only Kind 3 follows
- Shows a dialog to select a signer when using multiple signers are present by @greenart7c3
- Saves bandwidth by avoiding constant REQ updates before EOSEs come back in a subscription
- Changes the following icon on top of user's pictures to include follows in all lists and follow sets
- Removes non-outbox relays from the outbox lists
- Adds support bigger, up to 4GB, payloads in NIP-44
- Restructures the default REQ limits from each relay in all feeds
- Adds a guarantee incoming message order to OkHttp websocket implementations to avoid EOSE mismatch
- Only downloads DMs and Drafts if the account is writeable / nsec is present
- Adds support for copying/cloning follow lists in the UI.
- Adds a default relay list for indexers in new accounts with local backup
- Smoothes the disappearing effect for the Top and Bottom navigation.
- Adds support for NWC deep links and removes hardcoded Alby integration
- Adds a missing outbox relay list popup on posting new notes
- Adds a missing inbox relay list check on notification screens
- Migrates to njump.to to disperse shareable links
Quartz:
- Migrates Quartz from Android to CommonMain (Kotlin Multiplatform)
- Adds a maven publishing to ship quartz
- Fully converts OpenTimestamp Java codebase to Kotlin, migrating the sync and async HTTP call interfaces to OkHttp and coroutines
- Redesigns parsing of relay commands, messages and filters for performance in Jackson.
- Uses KotlinX Serialization when speed is not a requirement
- Migrates all Jackson field annotations to Kotlin Serialization
- Migrates Regex use in Quarts to Kotlin's Regex class
- Migrates Base64 library from Android to Kotlin
- Migrates UUID library from Android/Java to Kotlin
- Migrates LRUCache usage from Android/Java to Kotlin collections
- Migrates all String to bytearray conversions to Kotlin methods
- Migrates all System.arraycopy calls to kotlin native ones.
- Separates parsing code from the data classes in Companion objects
- Exposes Rfc3986 normalizations to each platform.
- Exposes URI parsing classes to each platform.
- Exposes URL Encoders to each platform.
- Exposes BigDecimal to each platform.
- Exposes the Url Detector to each platform.
- Exposes Mac instances to each platform
- Exposes Diggest instances to each platform.
- Exposes BitSet to each platform.
- Exposes GZip to each platform.
- Exposes Secp256k1 to each platform.
- Exposes SecureRandom to each platform.
- Exposes Time in seconds to each platform.
- Exposes the LargeCache to each platform.
- Exposes AES CBC and AES GCM encryption/decryption to each platform
- Migrate test assertions to Kotlin Tests
- Exposes Address class to each platform because of the Parceleable requirement in Android
- Creates our own ByteArrayOutputStream.
- Removes threadsafe features inside our Bloomfilters because we don't need that consistency
- Migrates UserMetadata parser from Jackson to Kotlin serialization
- Removes @Static methods in each tag.
- Adds an EventTemplate serializer
- Removes the need for KotlinX Datetime
- Adds support for LibSodium in the JVM desktop platform
- Creates a shared test build for iOS targets
- Increases the Bloom filter space to better use hints in the app.
- Removes support for iOS in x86
- Creates a performant JacksonMapper just for NIP-55, which stays in the Android build only.
- Keeps the event store in the android build due to the SQL Lite dependency
- Removes @syncronized tags in favor of Mutexes.
- Improved sendAndWaitForResponse NostrClient method to properly account for returns from each relay.
- Removes the need for GlobalScope and async calls
- Removes the dependency on Jackson's error classes across the codebase.
- Moves the hint to quote tag extension methods to their own packages.
- Migrates NIP-06 and Blossom uploads to use Kotlin Serialization
- Adds ease of use functions for the downloadFirst nostr client extension method
- Refactors error logging in BasicRelayClient
- Starts NostrClient in active instead of waiting for a connect() call
- Adds initial test cases for NostrClient and extensions
- Adds an option to ignore failed reconnection delays that should be used when the network settings change.
- Adds a build template option for NIP-42 AUTHs
- Moves quartz to Java 21 due to binary inconsistencies between the multiple builds of KMP (tests conflicting with main)
- Adds support for COUNT relay messages
- Treat COUNT as query only, not subscriptions in the NostrClient
- Moves statistics collection out of the inner classes to be an external option for app developers instead.
- Restructuring relay classes to maintain order of incoming messages for relay listeners
- Defers all processing of incoming messages to coroutines via channels, freeing OkHttp's thread as soon as possible.
- Simplifies the main relay class by using attached listener modules for each function of the relay client.
- Migrate defaultOnConnect calls to become listener based and moved to NostrClients
- Coordinates REQs so that if an update is required to be sent but the server has not finished processing events, waits for it to finish and sends it later as soon as EOSE or Close arrives
- Correctly maintain the local and server state of each Req.
- Avoid subsequent REQ updates before EOSE or CLOSE calls.
- Refactors NostrClient authenticators to do complete operation as an optional module
- Breaks down Relay Client modules (Auth, Reqs, Counts, Event submissions) in the Relay Pool class.
- Creates listeners just for REQ subscriptions
- Move statistics to outside the base relay class as a listener
- Move logs to outside the base relay class as a listener
- Better structures a Standalone Relay client
- More appropriately communicate errors to the listeners
- Remove relay states on listeners, move each to its own method
- Removes the hardcoded Dispatchers on Quartz
- Adds streaming hash utility function, follow the existing pool/worker design
- Adds fast search for events and addresses in the Deletion Event
- Adds an update method for to create a new event template from an event.
Fixes and UI Improvements:
- Changes the DVM feed to sort by follows that liked or zapped the DVM
- Changes the icon of account preferences to translation for now
- Improves click and long press interactions with the relay list item and status bar items
- Fixes the visual references to communities and hashtags in the top right of the post
- Removes disappearing top and bottom bars from settings screens
- Fixes tall top bars on Ephemeral and Public Chat rooms
- Fixes lack of live stream name on the top bar
- Fixes animations to navigate from and to list screens
- Fixes cursor behind the keyboard when typing long texts.
- Fixes line wrap in the relay info top nav bar title
- Moves message button to Profile Actions
- Fixes User profile banner being off place in short images
- Also fixes spacing of the Follow button
- Adds an option to render a user gallery from hex keys instead of full User objects
- Adds context to the highlights
- Increases the contrast of placeholder text
- Refines performance of the QuickAction menu bar
- Fixes hidden words not being applied to NIP-04 DMs on notifications
- Fixes not loading some event kinds in notifications
- Fixes crash when updating a metadata with null name
- Fixes crash when attempting to share an image that is still loading by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Fixes disappearing stats on relay screen by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Fixes proper switch between single and two-pane layouts on rotation by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Fixes sendAndWaitForResponse never receiving a response by @greenart7c3
- Fixes NWC URI parsing bug by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Fixes bookmark removal from Private/Public removing from both by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Fixes OutOfMemoryError for large file uploads by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Fixes DecryptZapRequest CommandType by @greenart7c3
- Fixes location being added to note even after deselecting it by @greenart7c3
- Fixes crash when trying to parse unparseable NIP-11s
- Prevents resource leaks with file streams by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Removes any relay url that has a percent-encoded null byte, regardless of size
- Forces streaming url online check when the stream is offline but the user enters the chat
- Fixes duplicated loading of NIP-11 relay info by different parts of the screen
- Fixes the new Video events as non replaceable, while keeping the old ones in the replaceable
- Fixes crash on starting when the contentResolver is not ready yet.
- Fixes addressable deletions deleting not only the past when updating feeds
- Fixes long form previews when missing the author's picture
- Fixes feed filter update when changing the top nav filter
- Fixes crash when sorting with the same createdAt in the discovery feeds
- Fixes reply routes when clicking in the Conversations tab when the event is a PublicChat, LiveStream or Ephemeral Chat
- Fixes livestream chats appearing on home bubbles after the live stream is finished
- Fixes not sending the live stream events anywhere when the stream doesn't have a relay set declared
- Fixes animations when selecting Tor options in the privacy screen
- Fixes animations jumping when loading privacy screen
- Fixes the use of index relays and search relays to load users and events as well as become the default for global feeds.
- Fixes mark as read when drafts are the latest message in the chat
- Fixes showing blog posts in the future in the Discovery reads
- Fixes crashing when comparing int and long in Live Events comparator
- Fixes recompositions of subject add-on to text on rendering
- Fixes crash on trying to change dont translate from options
- Fixes NPE on the ln invoice callback with errors parser
- Fixes parsing encrypted NIP-28 chats
- Fixes disappearing relay stats (larger LRU cache)
- Fixes sendAndWait nostr client coroutine that was waiting forever
- Fixes lack of req by forcing an updateFilter at the start of new subs with the client.
- Fixes bug that skipped loading follow's metadata on startup
- Fixes issues when unfollowing a hashtag from old contact lists
- Fixes relay list flickering bug
- Fixes crash when checking and creating new users from `p` tags.
- Fixes the author of the highlight
- Fixes scope lifecycle of media uploads to avoid cancellation while uploading
- Fixes parser for null and default values from NIP-55 using Jackson
- Fixes relay icons not showing up when sending DMs
- Fixes imeta parsing with multiple urls
- Fixes relay-specific global feed matching incoming note checks
- Fixes video progressive download by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Fixes several usages of Reflection when serializing classes
- Fixes a bug on loading event test database for the HintBloom filter test
- Forces relay status updates when connecting and disconnecting
- Only shows live stream bubbles that are not playing 24/7 with active follows in the past 15 minutes.
- Opens Follow Packs on following.space
Performance:
- Restructures the parser and serialization of the relay messages and commands for performance
- Speeds up the generation of Bech32 addresses
- Migrates memory counters from Long to Int
- Avoids using JSON parsers with DataStore to speed up loading time (loading the parser itself takes ~300ms)
- Adds new benchmarks for NIP-44 operations
- Reduces memory consumption for NIP-44 operations, avoiding GC
- Faster Hkdf functions with less array copying and allocations (which can be impactful if the ciphertext is large)
- Faster Mac calculations by avoiding array assemblies before calling the function
- Faster Hash check calculations avoiding the creation of a separate bytearray to compare ids
- About 30-40% event hashing performance boost by building the json by hand and skipping string encoders when not needed.
- 30% Faster isHex for strings with precisely 32 bytes.
- Loads the main account in parallel faster before the screen needs it
- Merge expanding and checking HMac functions to avoid re-creating the Mac instance.
- Separates EOSE cache for drafts alone.
- Speeds up the loading of users in follow lists on start up
- Speeds up OkHttp startup
- Adds submap index queries to the addressable large cache
- Performance improvement for the address serializer.
- Adds a default cut off for notifications from random relays to 1 week ago.
- Increases local video disk cache to 1GB
- Defers the initialization of disk caches for videos and images to a few seconds after loading
- Only listens to notification feed changes when the UI is visible
- Separates a relay failure tracker to a module
- Caches the User object for each Account to avoid being deleted by the soft reference on Local Cache
- Moves all Dispatchers.Default to the IO threadpool because of the amount of Synchronized code in dependencies blocking heavy threads
- Only download reports from the author's outbox relay if we have it (don't use our default bootstrapping relays for reports)
- Keep a local cache of following geoshahes and hashtags in lowercase.
- Don't intern signatures, content and stringified tags since they are not usually duplicated
- Unifies the parser for the tag array across the app
- Adds simplified extensions to create Requests from NostrClient
- Adds a Start request callback to the request listener
- Adds a req that returns the list of events in order of arrival
- Adds a flatten straight into a set utility
- Adds a decrypted people and follow list cache on the account class and updates TopNav to use the new caching
- Creates slim ListItem composables
- Marks address, user states, edits and channel metadata view models as Compose Stable
- Removes unnecessary list of icons drawer rows, which affected Compose stability
- Improves the composition of NIP-05 lines
- Adds a pre-parser to find image galleries and video links before rendering.
- Adds the user outbox relays when loading addressables by that user.
- Avoids sending CLOSE to subs that are already closed.
- Rejects additional urls with %20 and fixes "Wss" ones.
Code Quality
- Reduce http max requests when in emulator to avoid crashing by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Resolve intermittent CI build failures by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Fix benchmark apk location by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Change from runBlocking to runTest where appropriate by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Reduce errors in log: concurrent modification exception by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Moves the precision of mills to seconds on the isOnline Check
- Migrates to use suspending routines for OTS, statuses and edit flows
- Unify outbox calculation in the RelayOutbox loader
- Refactors zap the devs card view
- Creates an interface for NostrClient strategies
- Adds an isMobileOrFalse flow in connectivity to speed UI updates
- Removes one of the Application dependencies in viewmodel
- Changes the Theme class to only take the preferred theme directly.
- Adds dependency on NWC to Account to avoid linking directly with the Application class
- Migrates Account management to an Application lifecycle to prepare for multi-account screens
- Establishes a scope for each account loaded so that flows can be killed on sign off
- Moves the event processor to the Account class
- Creates an interface for the DualHttpClientManager to allow IDE previews
- Removing the dependency on an application class from AccountViewModel
- Removes dependency on the viewModel on AccountFeedStates
- Moves account saving from StateViewModel to Account
- Removes dependency on the application class from DecryptAndIndexProcessor
- Changes the name and singleton of the nav to avoid confusing the auto import
- Switches account cache to a flow to allow observers
- Removes dependency in the Amethyst class from Playback calculator
- Removes the dependency on windowSizeClass and displayFeatures to be passed in the global preferences of the app (which is activity independent)
- Moves the OTS processor from Account's decrypt process to Application since it doesn't need the account information.
- Separates Application dependencies into an AppModules class to create only after the OnCreate event.
- Switches TorSettings to be per Application and not per Account anymore
- Since TorSettings is now global, moves the okHttpClient determinations out of the Account-based classes into the Application.
- Since TorSettings is now global, set's up Coil's image loader only once when creating the Application
- Moves UISettings state to App Modules instead of viewmodel
- Migrates TorSettings and UISettings to DataStore
- New tor evaluator service for relay connections now uses all account's trusted relays and dm relays at the same time.
- Migrates composable-state-based UISettings to Flow-based UI settings, while observing connectivity status
- Removes the displayFeatures and windowSizeClass from the shared model
- Fixes not requesting Notification Permissions for APIs older than Tiramisu in the FDroid flavor
- Moves the NIP-11 document cache from singleton to the App Modules
- Avoids using AccountViewModel to check NIP-11 Relay documents
- Moves the UI Settings usage in composables to functions that do not observe the state since they don't need to refresh the screen when changed.
- Refactors UI Settings screen to separate components and remove the sharedViewModel
- Only starts Internal Tor if that option is selected in the TorSettings.
- Turn TorSettings into a data class to observe changes to it
- Drops the SharedPreferences ViewModel to use UISettingsFlow directly from App Modules
- Reorganizes OTS Events after simplification of the OkHttp based on TorSettings.
- Applies memory trimming service to all logged-in accounts at the same time
- Adds a test for native vs libsodium chacha20
- Added test for emulator to set maxRequests to 128 to prevent crashing emulator by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Dumps the number of relay hints urls in the DB
- Creates our own Coil Logger to minimize trash stacks in the logs
- Adds a declared outbox lists for follows state
- Removes the deprecated hacks to store communities, hashtags and geohashes on Contact Lists
- Updates deprecated Clipboard manager
- Updates emoji and user autocomplete state to use Account and avoid linking AccountViewModel
- Refactors many viewModels to avoid using callback lambdas
- Correctly marks EOSE for filters that are aligned with the Req State from NostrClient
- Changes User loading features in a tentative to make them faster since they are used by all functions in the app.
- Creates an Account follow list per Relay state that only includes shared relays as a better source of functioning relays
Deprecations:
- Removes fmt.wiz.biz from bootstrap relays
- Removes void.cat from default servers by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Removes filestr share links
- removes zapstr.live share links
Updated translations:
- Czech, German, Swedish and Portuguese by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Hindi by @ΰ€°ΰ€Ύΰ€
- Slovenian by @StellarStoic
- Polish by @Polak
- Hungarian by @Zoltan β‘οΈ @summoner
- Spanish by @β‘βΏitβΏyβΏitβ‘
- Latvian by @βπ π π π
- Dutch by @Bartus
- French by @Anthony π«π·
- Chinese by @CXPLAY
- Thai by @123π¦ΰΈΰΈ₯ΰΈ²ΰΈΰΈ₯ΰΈ²ΰΈ‘ΰΈΰΈΆΰΉΰΈΰΈΰΈ
- Persian by @L
Download: 

Amethyst - Nostr Client for Android
Join the social network you control. The most feature-rich Nostr client for Android.
#Amethyst v1.04.0: Lists for all
This version adds support for creating, managing, deleting, and viewing follow lists, which include both public and private members. We've also added similar UI to support for creating, managing, deleting, and viewing follow packs from following.space, allowing you to assemble following lists not only for yourself, but also as a starter packs for other users. You will find a new "My Lists" menu option in the side bar and Follow buttons when extended behavior to add users directly into lists or packs.
This version also introduces significant improvements to the quality of video compression and hash checks during media upload/download, along with new codecs and a new image gallery for displaying sequences of images in posts. The startup loading of outbox relay lists and user metadata for large follow lists (> 1000 people) has been significantly improved with new mechanisms to search for missing outbox relay lists.
The Top Bar filter "All Follows" now merges all follow lists, follow packs, following hashtags, following geotags, and following communities into a single feed. Two new options were also added: "All User Follows," which includes only the main and other follow lists, and "Default Follow List," which is the standard follow list used by every client.
Finally, we completed our Quartz migration to Kotlin Multiplatform, added significant performance improvements when processing events and running cryptographic procedures, as well as new ease-of-use extensions.
New Features:
- People List creation and management by @KotlinGeek
- Follow Pack creation, management and feed view
- Image gallery in posts by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Finishes migration of Quartz to Kotlin Multiplatform
- New Filters in the top nav bar
- Performance improvements across all features
Improvements:
- Adds support to rejection replies from NIP-55 signers by @greenart7c3
- Adds live/offline indicator to live bubbles by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Refines the video compression procedure by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Replaces MP4 parser libraries with native MediaMuxer / MediaCodec by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Adds a H.265/HEVC codec to reduce file size by up to 50% while maintaining the same quality by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Optimizes video file structure by moving metadata to the beginning, so videos start playing more quickly by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Adds "All User Follows" feed filter in the top nav bar that removes hashtags, communities and geotag follows
- Adds "Default Follow List" feed filter in the top nav bar that contains only Kind 3 follows
- Shows a dialog to select a signer when using multiple signers are present by @greenart7c3
- Saves bandwidth by avoiding constant REQ updates before EOSEs come back in a subscription
- Changes the following icon on top of user's pictures to include follows in all lists and follow sets
- Removes non-outbox relays from the outbox lists
- Adds support bigger, up to 4GB, payloads in NIP-44
- Restructures the default REQ limits from each relay in all feeds
- Adds a guarantee incoming message order to OkHttp websocket implementations to avoid EOSE mismatch
- Only downloads DMs and Drafts if the account is writeable / nsec is present
- Adds support for copying/cloning follow lists in the UI.
- Adds a default relay list for indexers in new accounts with local backup
- Smoothes the disappearing effect for the Top and Bottom navigation.
- Adds support for NWC deep links and removes hardcoded Alby integration
- Adds a missing outbox relay list popup on posting new notes
- Adds a missing inbox relay list check on notification screens
- Migrates to njump.to to disperse shareable links
Quartz:
- Migrates Quartz from Android to CommonMain (Kotlin Multiplatform)
- Adds a maven publishing to ship quartz
- Fully converts OpenTimestamp Java codebase to Kotlin, migrating the sync and async HTTP call interfaces to OkHttp and coroutines
- Redesigns parsing of relay commands, messages and filters for performance in Jackson.
- Uses KotlinX Serialization when speed is not a requirement
- Migrates all Jackson field annotations to Kotlin Serialization
- Migrates Regex use in Quarts to Kotlin's Regex class
- Migrates Base64 library from Android to Kotlin
- Migrates UUID library from Android/Java to Kotlin
- Migrates LRUCache usage from Android/Java to Kotlin collections
- Migrates all String to bytearray conversions to Kotlin methods
- Migrates all System.arraycopy calls to kotlin native ones.
- Separates parsing code from the data classes in Companion objects
- Exposes Rfc3986 normalizations to each platform.
- Exposes URI parsing classes to each platform.
- Exposes URL Encoders to each platform.
- Exposes BigDecimal to each platform.
- Exposes the Url Detector to each platform.
- Exposes Mac instances to each platform
- Exposes Diggest instances to each platform.
- Exposes BitSet to each platform.
- Exposes GZip to each platform.
- Exposes Secp256k1 to each platform.
- Exposes SecureRandom to each platform.
- Exposes Time in seconds to each platform.
- Exposes the LargeCache to each platform.
- Exposes AES CBC and AES GCM encryption/decryption to each platform
- Migrate test assertions to Kotlin Tests
- Exposes Address class to each platform because of the Parceleable requirement in Android
- Creates our own ByteArrayOutputStream.
- Removes threadsafe features inside our Bloomfilters because we don't need that consistency
- Migrates UserMetadata parser from Jackson to Kotlin serialization
- Removes @Static methods in each tag.
- Adds an EventTemplate serializer
- Removes the need for KotlinX Datetime
- Adds support for LibSodium in the JVM desktop platform
- Creates a shared test build for iOS targets
- Increases the Bloom filter space to better use hints in the app.
- Removes support for iOS in x86
- Creates a performant JacksonMapper just for NIP-55, which stays in the Android build only.
- Keeps the event store in the android build due to the SQL Lite dependency
- Removes @syncronized tags in favor of Mutexes.
- Improved sendAndWaitForResponse NostrClient method to properly account for returns from each relay.
- Removes the need for GlobalScope and async calls
- Removes the dependency on Jackson's error classes across the codebase.
- Moves the hint to quote tag extension methods to their own packages.
- Migrates NIP-06 and Blossom uploads to use Kotlin Serialization
- Adds ease of use functions for the downloadFirst nostr client extension method
- Refactors error logging in BasicRelayClient
- Starts NostrClient in active instead of waiting for a connect() call
- Adds initial test cases for NostrClient and extensions
- Adds an option to ignore failed reconnection delays that should be used when the network settings change.
- Adds a build template option for NIP-42 AUTHs
- Moves quartz to Java 21 due to binary inconsistencies between the multiple builds of KMP (tests conflicting with main)
- Adds support for COUNT relay messages
- Treat COUNT as query only, not subscriptions in the NostrClient
- Moves statistics collection out of the inner classes to be an external option for app developers instead.
- Restructuring relay classes to maintain order of incoming messages for relay listeners
- Defers all processing of incoming messages to coroutines via channels, freeing OkHttp's thread as soon as possible.
- Simplifies the main relay class by using attached listener modules for each function of the relay client.
- Migrate defaultOnConnect calls to become listener based and moved to NostrClients
- Coordinates REQs so that if an update is required to be sent but the server has not finished processing events, waits for it to finish and sends it later as soon as EOSE or Close arrives
- Correctly maintain the local and server state of each Req.
- Avoid subsequent REQ updates before EOSE or CLOSE calls.
- Refactors NostrClient authenticators to do complete operation as an optional module
- Breaks down Relay Client modules (Auth, Reqs, Counts, Event submissions) in the Relay Pool class.
- Creates listeners just for REQ subscriptions
- Move statistics to outside the base relay class as a listener
- Move logs to outside the base relay class as a listener
- Better structures a Standalone Relay client
- More appropriately communicate errors to the listeners
- Remove relay states on listeners, move each to its own method
- Removes the hardcoded Dispatchers on Quartz
- Adds streaming hash utility function, follow the existing pool/worker design
- Adds fast search for events and addresses in the Deletion Event
- Adds an update method for to create a new event template from an event.
Fixes and UI Improvements:
- Changes the DVM feed to sort by follows that liked or zapped the DVM
- Changes the icon of account preferences to translation for now
- Improves click and long press interactions with the relay list item and status bar items
- Fixes the visual references to communities and hashtags in the top right of the post
- Removes disappearing top and bottom bars from settings screens
- Fixes tall top bars on Ephemeral and Public Chat rooms
- Fixes lack of live stream name on the top bar
- Fixes animations to navigate from and to list screens
- Fixes cursor behind the keyboard when typing long texts.
- Fixes line wrap in the relay info top nav bar title
- Moves message button to Profile Actions
- Fixes User profile banner being off place in short images
- Also fixes spacing of the Follow button
- Adds an option to render a user gallery from hex keys instead of full User objects
- Adds context to the highlights
- Increases the contrast of placeholder text
- Refines performance of the QuickAction menu bar
- Fixes hidden words not being applied to NIP-04 DMs on notifications
- Fixes not loading some event kinds in notifications
- Fixes crash when updating a metadata with null name
- Fixes crash when attempting to share an image that is still loading by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Fixes disappearing stats on relay screen by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Fixes proper switch between single and two-pane layouts on rotation by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Fixes sendAndWaitForResponse never receiving a response by @greenart7c3
- Fixes NWC URI parsing bug by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Fixes bookmark removal from Private/Public removing from both by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Fixes OutOfMemoryError for large file uploads by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Fixes DecryptZapRequest CommandType by @greenart7c3
- Fixes location being added to note even after deselecting it by @greenart7c3
- Fixes crash when trying to parse unparseable NIP-11s
- Prevents resource leaks with file streams by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Removes any relay url that has a percent-encoded null byte, regardless of size
- Forces streaming url online check when the stream is offline but the user enters the chat
- Fixes duplicated loading of NIP-11 relay info by different parts of the screen
- Fixes the new Video events as non replaceable, while keeping the old ones in the replaceable
- Fixes crash on starting when the contentResolver is not ready yet.
- Fixes addressable deletions deleting not only the past when updating feeds
- Fixes long form previews when missing the author's picture
- Fixes feed filter update when changing the top nav filter
- Fixes crash when sorting with the same createdAt in the discovery feeds
- Fixes reply routes when clicking in the Conversations tab when the event is a PublicChat, LiveStream or Ephemeral Chat
- Fixes livestream chats appearing on home bubbles after the live stream is finished
- Fixes not sending the live stream events anywhere when the stream doesn't have a relay set declared
- Fixes animations when selecting Tor options in the privacy screen
- Fixes animations jumping when loading privacy screen
- Fixes the use of index relays and search relays to load users and events as well as become the default for global feeds.
- Fixes mark as read when drafts are the latest message in the chat
- Fixes showing blog posts in the future in the Discovery reads
- Fixes crashing when comparing int and long in Live Events comparator
- Fixes recompositions of subject add-on to text on rendering
- Fixes crash on trying to change dont translate from options
- Fixes NPE on the ln invoice callback with errors parser
- Fixes parsing encrypted NIP-28 chats
- Fixes disappearing relay stats (larger LRU cache)
- Fixes sendAndWait nostr client coroutine that was waiting forever
- Fixes lack of req by forcing an updateFilter at the start of new subs with the client.
- Fixes bug that skipped loading follow's metadata on startup
- Fixes issues when unfollowing a hashtag from old contact lists
- Fixes relay list flickering bug
- Fixes crash when checking and creating new users from `p` tags.
- Fixes the author of the highlight
- Fixes scope lifecycle of media uploads to avoid cancellation while uploading
- Fixes parser for null and default values from NIP-55 using Jackson
- Fixes relay icons not showing up when sending DMs
- Fixes imeta parsing with multiple urls
- Fixes relay-specific global feed matching incoming note checks
- Fixes video progressive download by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Fixes several usages of Reflection when serializing classes
- Fixes a bug on loading event test database for the HintBloom filter test
- Forces relay status updates when connecting and disconnecting
- Only shows live stream bubbles that are not playing 24/7 with active follows in the past 15 minutes.
- Opens Follow Packs on following.space
Performance:
- Restructures the parser and serialization of the relay messages and commands for performance
- Speeds up the generation of Bech32 addresses
- Migrates memory counters from Long to Int
- Avoids using JSON parsers with DataStore to speed up loading time (loading the parser itself takes ~300ms)
- Adds new benchmarks for NIP-44 operations
- Reduces memory consumption for NIP-44 operations, avoiding GC
- Faster Hkdf functions with less array copying and allocations (which can be impactful if the ciphertext is large)
- Faster Mac calculations by avoiding array assemblies before calling the function
- Faster Hash check calculations avoiding the creation of a separate bytearray to compare ids
- About 30-40% event hashing performance boost by building the json by hand and skipping string encoders when not needed.
- 30% Faster isHex for strings with precisely 32 bytes.
- Loads the main account in parallel faster before the screen needs it
- Merge expanding and checking HMac functions to avoid re-creating the Mac instance.
- Separates EOSE cache for drafts alone.
- Speeds up the loading of users in follow lists on start up
- Speeds up OkHttp startup
- Adds submap index queries to the addressable large cache
- Performance improvement for the address serializer.
- Adds a default cut off for notifications from random relays to 1 week ago.
- Increases local video disk cache to 1GB
- Defers the initialization of disk caches for videos and images to a few seconds after loading
- Only listens to notification feed changes when the UI is visible
- Separates a relay failure tracker to a module
- Caches the User object for each Account to avoid being deleted by the soft reference on Local Cache
- Moves all Dispatchers.Default to the IO threadpool because of the amount of Synchronized code in dependencies blocking heavy threads
- Only download reports from the author's outbox relay if we have it (don't use our default bootstrapping relays for reports)
- Keep a local cache of following geoshahes and hashtags in lowercase.
- Don't intern signatures, content and stringified tags since they are not usually duplicated
- Unifies the parser for the tag array across the app
- Adds simplified extensions to create Requests from NostrClient
- Adds a Start request callback to the request listener
- Adds a req that returns the list of events in order of arrival
- Adds a flatten straight into a set utility
- Adds a decrypted people and follow list cache on the account class and updates TopNav to use the new caching
- Creates slim ListItem composables
- Marks address, user states, edits and channel metadata view models as Compose Stable
- Removes unnecessary list of icons drawer rows, which affected Compose stability
- Improves the composition of NIP-05 lines
- Adds a pre-parser to find image galleries and video links before rendering.
- Adds the user outbox relays when loading addressables by that user.
- Avoids sending CLOSE to subs that are already closed.
- Rejects additional urls with %20 and fixes "Wss" ones.
Code Quality
- Reduce http max requests when in emulator to avoid crashing by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Resolve intermittent CI build failures by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Fix benchmark apk location by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Change from runBlocking to runTest where appropriate by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Reduce errors in log: concurrent modification exception by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Moves the precision of mills to seconds on the isOnline Check
- Migrates to use suspending routines for OTS, statuses and edit flows
- Unify outbox calculation in the RelayOutbox loader
- Refactors zap the devs card view
- Creates an interface for NostrClient strategies
- Adds an isMobileOrFalse flow in connectivity to speed UI updates
- Removes one of the Application dependencies in viewmodel
- Changes the Theme class to only take the preferred theme directly.
- Adds dependency on NWC to Account to avoid linking directly with the Application class
- Migrates Account management to an Application lifecycle to prepare for multi-account screens
- Establishes a scope for each account loaded so that flows can be killed on sign off
- Moves the event processor to the Account class
- Creates an interface for the DualHttpClientManager to allow IDE previews
- Removing the dependency on an application class from AccountViewModel
- Removes dependency on the viewModel on AccountFeedStates
- Moves account saving from StateViewModel to Account
- Removes dependency on the application class from DecryptAndIndexProcessor
- Changes the name and singleton of the nav to avoid confusing the auto import
- Switches account cache to a flow to allow observers
- Removes dependency in the Amethyst class from Playback calculator
- Removes the dependency on windowSizeClass and displayFeatures to be passed in the global preferences of the app (which is activity independent)
- Moves the OTS processor from Account's decrypt process to Application since it doesn't need the account information.
- Separates Application dependencies into an AppModules class to create only after the OnCreate event.
- Switches TorSettings to be per Application and not per Account anymore
- Since TorSettings is now global, moves the okHttpClient determinations out of the Account-based classes into the Application.
- Since TorSettings is now global, set's up Coil's image loader only once when creating the Application
- Moves UISettings state to App Modules instead of viewmodel
- Migrates TorSettings and UISettings to DataStore
- New tor evaluator service for relay connections now uses all account's trusted relays and dm relays at the same time.
- Migrates composable-state-based UISettings to Flow-based UI settings, while observing connectivity status
- Removes the displayFeatures and windowSizeClass from the shared model
- Fixes not requesting Notification Permissions for APIs older than Tiramisu in the FDroid flavor
- Moves the NIP-11 document cache from singleton to the App Modules
- Avoids using AccountViewModel to check NIP-11 Relay documents
- Moves the UI Settings usage in composables to functions that do not observe the state since they don't need to refresh the screen when changed.
- Refactors UI Settings screen to separate components and remove the sharedViewModel
- Only starts Internal Tor if that option is selected in the TorSettings.
- Turn TorSettings into a data class to observe changes to it
- Drops the SharedPreferences ViewModel to use UISettingsFlow directly from App Modules
- Reorganizes OTS Events after simplification of the OkHttp based on TorSettings.
- Applies memory trimming service to all logged-in accounts at the same time
- Adds a test for native vs libsodium chacha20
- Added test for emulator to set maxRequests to 128 to prevent crashing emulator by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Dumps the number of relay hints urls in the DB
- Creates our own Coil Logger to minimize trash stacks in the logs
- Adds a declared outbox lists for follows state
- Removes the deprecated hacks to store communities, hashtags and geohashes on Contact Lists
- Updates deprecated Clipboard manager
- Updates emoji and user autocomplete state to use Account and avoid linking AccountViewModel
- Refactors many viewModels to avoid using callback lambdas
- Correctly marks EOSE for filters that are aligned with the Req State from NostrClient
- Changes User loading features in a tentative to make them faster since they are used by all functions in the app.
- Creates an Account follow list per Relay state that only includes shared relays as a better source of functioning relays
Deprecations:
- Removes fmt.wiz.biz from bootstrap relays
- Removes void.cat from default servers by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Removes filestr share links
- removes zapstr.live share links
Updated translations:
- Czech, German, Swedish and Portuguese by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Hindi by @ΰ€°ΰ€Ύΰ€
- Slovenian by @StellarStoic
- Polish by @Polak
- Hungarian by @Zoltan β‘οΈ @summoner
- Spanish by @β‘βΏitβΏyβΏitβ‘
- Latvian by @βπ π π π
- Dutch by @Bartus
- French by @Anthony π«π·
- Chinese by @CXPLAY
- Thai by @123π¦ΰΈΰΈ₯ΰΈ²ΰΈΰΈ₯ΰΈ²ΰΈ‘ΰΈΰΈΆΰΉΰΈΰΈΰΈ
- Persian by @L
Download: 

Amethyst - Nostr Client for Android
Join the social network you control. The most feature-rich Nostr client for Android.
#Amethyst v1.03.0: Built-in video recording
New Features:
- Adds "record and post video" button to new Post Screens by @β‘ Dee Kay β‘πΈπͺπ¬π§π¨πΏπ§π·π¦πΉ
- Updates the User Profile's Relay List to an outbox version
- Activates live streams to the top feed bubble
- Enables the use of custom TextToSpeech Engines
Improvements:
- Improves the list of visible authors on live stream bubbles
- Adds the error status to the URL normalizer to avoid checking it again
- Adds a follow list state from kind 3 to keep following users in memory.
- Moves from RelationshipStatus to ContactCard as per NIP update
Fixes:
- Removes crashing relay URIs with null-encoded bytes (%00)
- Reverts to using androidLibrary plugin for Quartz until KMP publishing guidance is updated. by @KotlinGeek
- Fixes product title when in a quoted post
- Fixes live flag for streaming when the URL is not available anymore.
- Fixes bug on opening the Relay Settings page with duplicated Trusted and Blocked relays.
- Avoids NPEs in the maxOfOrNull iterator with concurrent lists
- Assemble NIP-17 Crash Report properties as a table and crash as a code block
- Improves the design of the Crash Report permission screen with a cancel button.
- Adds basic support for expirations in DMs
Updated Translations
- Polish by @Polak
- Hungarian by @summoner
Download: 

Amethyst - Nostr Client for Android
Join the social network you control. The most feature-rich Nostr client for Android.
#Amethyst v1.02.1: Bugfixes
- Upgrade AGP to 8.12.2
- Sets Quartz to Java 1_8
- Creates a bootstrap relay list specifically for inbox relays
- Register lists as Account fields to avoid GC of user settings.
- Fixes inability to delete relays from certain relay lists.
Download: 

Amethyst - Nostr Client for Android
Join the social network you control. The most feature-rich Nostr client for Android.
#Amethyst v1.02.0: NIP-17 Crash report DMs
- Adds a crash interceptor and offers to send crash reports via NIP-17
- Fixes startup crash on Android 12 or earlier
- Removes old DB migration
- Fixes crash when pasting an invalid NIP-47 URI into the zap settings
- Fixes crash when NWC doesn't return an invoice preimage
- Fixes crash when loading a user with a null name
- Fixes readonly crash on DVM requests
- Speeds up first-time logins by not waiting for Tor
- Fixes a parser benchmark
- Moves test assets to resources to make it work with kmp
- Migrates Quartz to a KMP project
- Converts OpenTimestamps code from Java to Kotlin
- Moves OTS OkHttp setup to Quartz
- Migrates NIP-49 from Java to Kotlin
- Removes nostr.bg from bootstrap relays
- Updates translations
Download: 

Amethyst - Nostr Client for Android
Join the social network you control. The most feature-rich Nostr client for Android.
#Amethyst v1.01: New Community Moderation support
Features:
- Upgrades NIP-72 communities to use NIP-22 comments as root posts
- Adds moderation queue feed
- Adds in-app approval procedures
- Adds drafts for community posts
- Redesigns the "about us" section of communities.
Fixes:
- Fixes accessibility TalkBack issues
- Fixes the edit draft button in the long-press menu
- Fixes the inability to delete relays from some lists.
- Fixes unwanted NOTIFY requests from other people's relay lists
- Fixes some DM push notification issues
- Fixes notification registration for first-time logins
- Avoids sending expired events to the relays
- Fixes draft deletes staying in some feeds
- Intercepts backhandler to save drafts
- Moves draft deletion calculations out of the UI thread
Download: 

Amethyst - Nostr Client for Android
Join the social network you control. The most feature-rich Nostr client for Android.
#Amethyst v1.00.5: Bugfix
- Fixes a crash when a follow has multiple relays in the same tag in their relay list.
- Updates translations
Download: 

Amethyst - Nostr Client for Android
Join the social network you control. The most feature-rich Nostr client for Android.