Releases: vitorpamplona/amethyst
Release v1.05.1: Bug Fixes
- Fixed mixed DMs between logged in users.
- Fixed draft screen click to edit post.
Release 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 @npub1a3tx8wcrt789skl6gg7rqwj4wey0j53eesr4z6asd4h4jwrd62jq0wkq4k
- Relay Information: New UI with expanded NIP-11 feature support
- Voice Notes & Replies: Redesigned experience by @npub1e2yuky03caw4ke3zy68lg0fz3r4gkt94hx4fjmlelacyljgyk79svn3eef
- Profile Banner: New default banner by @npub1tx5ccpregnm9afq0xaj42hh93xl4qd3lfa7u74v5cdvyhwcnlanqplhd8g
- Native Links: Intercept njump, yakihonne, primal, iris.to, zap.stream, and shosho.live to open directly on Amethyst by @npub1lu4l4wh7482u8vq0u63g2yuj8yqjdq8ne06r432n92rnd22lspcq0cxa32
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 @npub1e2yuky03caw4ke3zy68lg0fz3r4gkt94hx4fjmlelacyljgyk79svn3eef
- Centers QR dialog content and reduce excessive top spacing by @npub1qqqqqqz7nhdqz3uuwmzlflxt46lyu7zkuqhcapddhgz66c4ddynswreecw
- 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 @npub1e2yuky03caw4ke3zy68lg0fz3r4gkt94hx4fjmlelacyljgyk79svn3eef
- 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 @npub1e2yuky03caw4ke3zy68lg0fz3r4gkt94hx4fjmlelacyljgyk79svn3eef
- Fixes ConcurrentExceptions on event outboxes
Desktop:
- Base Compose Multiplatform Desktop App with posts and global/following feeds by @npub12cfje6nl2nuxplcqfvhg7ljt89fmpj0n0fd24zxsukja5qm9wmtqd7y76c
Web:
- New website by @npub18ams6ewn5aj2n3wt2qawzglx9mr4nzksxhvrdc4gzrecw7n5tvjqctp424
Quartz:
- Adds support for Trust Provider lists and Contact Cards for NIP-85
- Early support for Payment targets as per NIP-A3 by @npub1w4uswmv6lu9yel005l3qgheysmr7tk9uvwluddznju3nuxalevvs2d0jr5
- Initial support for NIP 46 by @npub1w4uswmv6lu9yel005l3qgheysmr7tk9uvwluddznju3nuxalevvs2d0jr5
- 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
- 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 @npub1e2yuky03caw4ke3zy68lg0fz3r4gkt94hx4fjmlelacyljgyk79svn3eef
- Polish by @npub16gjyljum0ksrrm28zzvejydgxwfm7xse98zwc4hlgq8epxeuggushqwyrm
- Hungarian by @npub1ww8kjxz2akn82qptdpl7glywnchhkx3x04hez3d3rye397turrhssenvtp @npub1dnvslq0vvrs8d603suykc4harv94yglcxwna9sl2xu8grt2afm3qgfh0tp
- Hindi by @npub1ww6huwu3xye6r05n3qkjeq62wds5pq0jswhl7uc59lchc0n0ns4sdtw5e6
- Slovenian by @npub1qqqqqqz7nhdqz3uuwmzlflxt46lyu7zkuqhcapddhgz66c4ddynswreecw
- Spanish by @npub1luhyzgce7qtcs6r6v00ryjxza8av8u4dzh3avg0zks38tjktnmxspxq903
- Latvian by @npub1l60stxkwwmkts76kv02vdjppka9uy6y3paztck7paau7g64l687saaw6av
- Dutch by @npub1w4la29u3zv09r6crx5u8yxax0ffxgekzdm2egzjkjckef7xc83fs0ftxcd
- French by @npub106efcyntxc5qwl3w8krrhyt626m59ya2nk9f40px5s968u5xdwhsjsr8fz and Alexis Magzalci
- Chinese by @npub1gd8e0xfkylc7v8c5a6hkpj4gelwwcy99jt90lqjseqjj2t253s2s6ch58h
Release v1.04.2: Fix for Google Play
Release v1.04.1 BugFixes
- 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 the disappearance of the Zap the Devs Manual Payment screen
- Fixes the Zap the Devs Manual Payment screen staying behind the status bar
Translations:
- Polish by @npub16gjyljum0ksrrm28zzvejydgxwfm7xse98zwc4hlgq8epxeuggushqwyrm
- Hungarian by @npub1dnvslq0vvrs8d603suykc4harv94yglcxwna9sl2xu8grt2afm3qgfh0tp
Download: http://amethyst.social
Release 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 nostr:nprofile1qqswc4nrhvp4lrjct0ayy0ps8f2hvj8e2guucp63dwcx6m6e8pka9fqpr4mhxue69uhkummnw3ezucnfw33k76twv4ezuum0vd5kzmp0qy08wumn8ghj7un9d3shjtnwdaehgu3wwa5hyetydejhgtn2wqhsz9nhwden5te0v4jx2m3wdehhxarj9ekxzmny9ue5n65v
- Follow Pack creation, management and feed view
- Image gallery in posts by nostr:nprofile1qqsv4zwtz8cuwh2mvc3zdrl5853g365t9j6mn25edlul7uz0eyzt0zcpzpmhxue69uhkummnw3ezumt0d5hszxnhwden5te0wf5kymewv46jumn0wd68y6tp9eshqup0qyd8wumn8ghj7um9dejxjapwdehhxenvv9ex2tnrdakj7nrm3sx
- 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 nostr:nprofile1qqs827g8dkd07zjvlhh60csytujgd3l9mz7x807xk3fewge7rwlukxgppemhxue69uhkummn9ekx7mp0qydhwumn8ghj7argv4nx7un9wd6zumn0wd68yvfwvdhk6tcpz9mhxue69uhkummnw3ezumrpdejz7d9xcpk
- Adds live/offline indicator to live bubbles by nostr:nprofile1qqsv4zwtz8cuwh2mvc3zdrl5853g365t9j6mn25edlul7uz0eyzt0zcpzpmhxue69uhkummnw3ezumt0d5hszxnhwden5te0wf5kymewv46jumn0wd68y6tp9eshqup0qyd8wumn8ghj7um9dejxjapwdehhxenvv9ex2tnrdakj7nrm3sx
- Refines the video compression procedure by nostr:nprofile1qqsv4zwtz8cuwh2mvc3zdrl5853g365t9j6mn25edlul7uz0eyzt0zcpzpmhxue69uhkummnw3ezumt0d5hszxnhwden5te0wf5kymewv46jumn0wd68y6tp9eshqup0qyd8wumn8ghj7um9dejxjapwdehhxenvv9ex2tnrdakj7nrm3sx
- Replaces MP4 parser libraries with native MediaMuxer / MediaCodec by nostr:nprofile1qqsv4zwtz8cuwh2mvc3zdrl5853g365t9j6mn25edlul7uz0eyzt0zcpzpmhxue69uhkummnw3ezumt0d5hszxnhwden5te0wf5kymewv46jumn0wd68y6tp9eshqup0qyd8wumn8ghj7um9dejxjapwdehhxenvv9ex2tnrdakj7nrm3sx
- Adds a H.265/HEVC codec to reduce file size by up to 50% while maintaining the same quality by nostr:nprofile1qqsv4zwtz8cuwh2mvc3zdrl5853g365t9j6mn25edlul7uz0eyzt0zcpzpmhxue69uhkummnw3ezumt0d5hszxnhwden5te0wf5kymewv46jumn0wd68y6tp9eshqup0qyd8wumn8ghj7um9dejxjapwdehhxenvv9ex2tnrdakj7nrm3sx
- Optimizes video file structure by moving metadata to the beginning, so videos start playing more quickly by nostr:nprofile1qqsv4zwtz8cuwh2mvc3zdrl5853g365t9j6mn25edlul7uz0eyzt0zcpzpmhxue69uhkummnw3ezumt0d5hszxnhwden5te0wf5kymewv46jumn0wd68y6tp9eshqup0qyd8wumn8ghj7um9dejxjapwdehhxenvv9ex2tnrdakj7nrm3sx
- 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 nostr:nprofile1qqs827g8dkd07zjvlhh60csytujgd3l9mz7x807xk3fewge7rwlukxgppemhxue69uhkummn9ekx7mp0qydhwumn8ghj7argv4nx7un9wd6zumn0wd68yvfwvdhk6tcpz9mhxue69uhkummnw3ezumrpdejz7d9xcpk
- 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 ...
Release v1.03.0: Built-in video recording
#Amethyst v1.03.0: Built-in video recording
New Features:
- Adds "record and post video" button to new Post Screens by @npub1e2yuky03caw4ke3zy68lg0fz3r4gkt94hx4fjmlelacyljgyk79svn3eef
- 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 @npub1a3tx8wcrt789skl6gg7rqwj4wey0j53eesr4z6asd4h4jwrd62jq0wkq4k
- 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 @npub16gjyljum0ksrrm28zzvejydgxwfm7xse98zwc4hlgq8epxeuggushqwyrm
- Hungarian by @npub1dnvslq0vvrs8d603suykc4harv94yglcxwna9sl2xu8grt2afm3qgfh0tp
Download: http://amethyst.social
Release v1.02.1
- 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.
Release v1.02.0 NIP-17 Crash report DMs
#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: http://amethyst.social
Release v1.01.0: New Community Implementation
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
Release v1.00.5
- Fixes a crash from multiple relays in the same line when following two specific users
- Updates translations