Amethyst's avatar
Amethyst
amethyst@vitorpamplona.com
npub142gy...xrj0
Nostr Client for Android
Amethyst's avatar
amethyst yesterday
#Amethyst v1.12.1: Health Connect, Samsung/Google Watch Workouts, Share as Image Highlights: - Adds Health Connect: detect recorded workouts and suggest a NIP-101e post. - Adds Share as Image: turn any note into an uploaded image and share it. - Adds Immersive scrolling: hide the OS system bars while reading and in full-screen media. - Fixes Desktop deployment ## New Features ### Workouts - Detects workouts from Health Connect and suggests a kind 1301 post. - Re-scans Health Connect when the app resumes. - Adds a recent-workouts carousel to the New Workout composer. - Moves Health Connect entirely into the New Workout composer. - Defaults the workout distance unit to the phone's measurement system. - Renders workout notes through the kind-1 text pipeline. - Shows workout metrics in the viewer's own units. - Records the source app or device name from Health Connect. - Aligns Health Connect import with RUNSTR (active calories and title). - Adds a Compose setting to disable workout suggestions. - Limits the feed workout banner to today's workouts. ### Sharing - Shares any note as an uploaded image. - Adds a share-as-image screen with an image preview. ### Reading - Hides the OS status bar during scroll immersive mode. - Hides the OS system bars during full-screen media. ## Improvements and Bug fixes - Modernizes the New Workout composer. - Tightens the New Workout composer vertical spacing. - Centers the activity type chips in the New Workout composer. - Uses the Add icon on the New Workout FAB for consistency. - Stops the connect card from flashing on every screen open. - Keeps Health Connect prefs off the main thread (StrictMode). - Adds the Android 14+ Health Connect permission rationale activity-alias. - Polishes the share-as-image screen. - Fixes a Tor race: sets Active deterministically so the bootstrap callback can't race it. ## Desktop - Ships a consistent macOS .icns and multi-size Windows .ico. - Excludes leaked kotlinx-coroutines-test from the release dmg. ## Translations - Promotes Kenyan Swahili to the base resource qualifier. ## Contributors - @Vitor Pamplona - @⚡ Dee Kay ⚡ - @Minced Beef Energy - @greenart7c3 - @npub1a3tx...kq4k - @v ## Translations - Czech, German, Swedish, and Portuguese by @⚡ Dee Kay ⚡ - Hungarian by @summoner - Dutch by @Bartus - Polish by @Polak - Hindi by @npub1ww6h...w5e6 - Slovenian by @StellarStoic - Spanish by @⚡₿it₿y₿it⚡ - Chinese by hypnotichemionus4 and @CXPLAY
Amethyst's avatar
amethyst 2 days ago
#Amethyst v1.12.0: Cashu, CLINK, Private Posts, Music, Podcasts, Apps & Workouts Highlights: - Adds Cashu wallet: in-app NIP-60 wallet. - Adds CLINK payments: a new Lightning rail - Adds App Store Feed form ZapStore - Adds Private posts: post, reply, react, and zap privately via NIP-59. - Adds Workout Feed: record and browse NIP-101e workouts in a dedicated feed. - Adds Reaction cards: likes, zaps, and nutzaps render as rich gradient cards. - Adds Music Feed: publish and browse music tracks and playlists. - Adds Podcasts Feed: a new NIP-F4 podcast feed with favorites and an inline player. - Adds support for hashtag labels to posts after they're published. - Adds AppFunctions to allow Gemini to call Amethyst locally. ## New Features ### Payments - Adds unified zap popup for lightning, CLINK, on-chain, and Cashu in one place - Quick 3-state toggle to quickly pick the source of your zap - Defaults to options that both receiver and sender can use - The payment rails now appear live as they resolve. - Adds full Cashu support (NIP-60/61) - A full in-app ecash wallet, beyond the previous redeem-only support. - Create and add a Cashu wallet, with its own screen and settings. - Browse and pick mints from a mint directory. - Mint ecash from Lightning and melt it back to Lightning. - Send and receive ecash tokens. - Top up a mint from a standalone screen. - See per-mint balances on the wallet. - Send NIP-61 nutzaps from the wallet, with a Lightning-style send progress bar. - Cashu top-up is crash-safe on retry. - Funds are checkpointed the instant they leave the wallet. - Adds full CLINK support - Pay and get paid through CLINK Offers and Debits. - Render all schemas inside of Notes - Profiles can show a tappable CLINK Offer chip. - Set one-time or recurring limits. - Resolve a person's payment offer by NIP-05. - A debit connection pulls funds only up to the cap you set. - Adds Unified Send Payment screen. - Long-press any chip in the Profile or this screen to copy that destination. - Use Lightning, CLINK, on-chain Bitcoin, and Cashu/nutzaps from one place. - A "Pay from" selector chooses which wallet the money leaves. - Pay Bitcoin payment targets from the in-app on-chain wallet. ### Posting & Privacy - Adds private posts and private replies - Create and view private posts, replies, and reactions. - Customize who the receivers are for posts and replies. - Adds support for Private reactions to all feeds - React and un-react privately automatically. - Safeguards prevent private content from leaking publicly. - Enhances support for Private zaps - Zaps on private notes are forced private. - Replies to a private zap route into the sender's DM room. - Adds support for NIP-32 hashtag labels. - Add first-class hashtag labels to posts. - Follow-hashtag labels publish through your outbox relays. - They surface in the hashtag feed. - Enhances post's compose screen - Richer notify chips in the new-post screen. - Modernized inline payment cards that show their descriptions. - Enhances hidden words screen - A per-row unblock button on the Hidden Words screen. - Remove a single muted word without clearing the whole list. ### Chat & DMs - Re-engineers DM bootstrapping with dynamic loading - Only loads the last 7 days worth of DMs. - Per-relay download windows realign when DMs are pruned. - A slow Tor connect is no longer mislabeled as "stalled". - The paused-history card shows parked relays. - The sync marker is now tappable. - Adds support for pinning DM conversations - Pins sync across devices via a NIP-78 app-data event. - Adds support for @-mention search in Marmot (MLS) group chats - Search and tag users in the group composer. - Conversation participants rank first. - They are marked with an "In this chat" chip. - Fixes quoted chat messages being rendered as posts - Quotes render inside chat bubbles with the proper chat-reply design. - The redundant reply row is skipped when the quote is already inline. - Fixes MLS reliability - Unread state now persists across app restarts. - The kind:445 backlog is no longer refetched on every launch. - Adds Share to DM ("Send as DM") flow - A new Android share-sheet target, alongside "New Post". - Share text, an image, or a video from another app into a DM. - Pick a recent conversation; the chat composer opens pre-filled and editable. ### Reading & Feeds - Enhances Tor reliability and connection speed - Connects faster by reusing the network directory between launches (about 3× quicker on warm starts). - Watchtower rebuilds Tor automatically when it looks connected but no relay traffic is flowing. - Recovers from stuck entry guards that could leave Tor unable to connect across app restarts. - No longer hangs on a hostile network — bootstrap gives up after 60s and retries instead of wedging. - Holds Tor-routed relays until the proxy is ready, cutting wasted battery and network on launch and Wi-Fi/cellular switches. - Stays stable through self-heal resets and network changes. - Adds new Notifications top nav filter - The old "Global" tab is split into "Curated" and a raw "Global". - Curated is the current system that requires your involvement on a thread to notify you. - Global shows everything, including all hell threads. - Replies to likes/zaps now reach the notifications feed. - Adds Reply to zaps and reactions from the notification screen - Pre-loads reply threads from the feed so opening a thread is faster. - Adds support for LaTeX math in notes. - Use `$...$` for inline equations. - Use `$$...$$` for block equations. - Adds support for first-class reaction rendering - Reactions and zaps anchor their own thread view. - Reactions, zaps, likes, and nutzaps render as gradient cards. - Each card embeds the post it's about. - A single tap on a like/zap chip opens that event's thread. - Adds support for Workouts (new, NIP-101e) - Create and publish workout records (kind 1301), interoperable with the RUNSTR dialect. - Browse a dedicated Workouts feed. - Filter by exercise type, author, community, or hashtag. - Richer workout cards: a hero metric, a fixed stats grid, splits-style breakdowns, and the source app. - Adds support for Music (new) - First-class support for tracks (kind 36787) and playlists. - Browse Music Tracks and Music Playlists feeds. - Publish a new track and create playlists. - Add a track to a playlist from a bottom sheet. - Adds support for Software Apps directory (new, NIP-82). - Browse software applications (kind 32267). - Filter by follows, author, hashtag, or global. - An app detail screen shows screenshots and the author. - Tap a screenshot to open it fullscreen. - Enhances support for App recommendations (NIP-89). - Editable recommendations on your profile. - Tiered ordering in the recommendations editor. - Richer app cards with author attribution. - Adds support for Birdex species collections (kind 12473). - Adds support for Agora fundraiser campaigns (kind 33863). - Adds Audio visualizer picker - A live visualizer for audio-only notes. - Real-time FFT spectrum from the track's decoded audio (no mic, no new permission). - Styles: Classic (default), Spectrum Bars, Color Waves, Radial Ring, Aurora Glow, Static, and Off. - Each style has a live preview in the settings picker. - Your choice syncs across devices via NIP-78. - Fills the art area in fullscreen and shows a fixed strip in the feed. - Adds support for Podcasts (new, NIP-F4) - Dedicated podcast and episode feeds, filterable by follows, authors, communities, or hashtags. - Mark podcasts as favorites. - Tap a podcast to open a show screen with all its episodes and an inline player. - Translatable show and episode descriptions on the feed cards. - The episode audio player is squared so the controls get room. ## Improvements and Bug fixes - Adds Searchable settings. - A search box filters rows by title and curated keywords. - Supports prefix matching and an empty-state. - Adds Swipe for brightness and volume in fullscreen video. - Fixes Quote-reposts (NIP-18) not counting in the repost counter. - Hides reposts of unsupported kinds instead of showing blank cards. - Fixes URLs glued to other words: the "fix missing spaces" pass now indexes URLs by their first character. - Search no longer matches text in `p`, `e`, `a`, `alt`, or `client` tags. - Media uploads in anonymous posts use the ephemeral signer. - Fixes anonymous profile zaps being encrypted as private zaps. - The Cashu wallet row shows the Cashu logo instead of a generic icon. - On-chain zaps highlight the bolt and show as pending in the counter. - Removed the wallet options reordering drag-and-drop UI. - De-duplicates preset amounts in Zap Settings - Fixes the chip-drag interaction in Zap Settings. - Fixes the live-stream chat relay fallback - Zap and non-zap polls now share the same option text when composing a post - Fixes Legacy NIP-71 videos to resolve their address from the real `d` tag. - Fixes the default media server resetting on every launch. - Fixes account cache: Deleting an account now clears its cached entry. - Adds support for birthdays on profile - Fixes cache child back-references when deleting notes - Detaches on-chain-zap, nutzap, and channel sources on cache deletion - Honors relay connection backoff during Tor bootstrap. - Heals sockets opened on the wrong transport by rebuilding them. - Recovers relay connections after the device wakes from sleep. - Keeps a relay's reconnect backoff from resetting on a momentary connection. - Honors the "Money operations via Tor" setting for payments and wallet relay connections - Reduces runtime log noise. - Fixes several edge-case crashes. - Fixes IPv6-literal URLs in posts - Reorganizes changelog into versioned files - Audit fixes across the private-posts, CLINK, and MLS paths. - Adds off-main-thread crypto and leak prevention. - Hides share/bookmark on private notes. ## Desktop - Adds image compression on upload: - An Image Compression settings panel. - Per-post quality presets. - Batch progress in the composer. - A preview-then-publish gate. - A fail-loud dialog if compression fails. - Adds new media player. - Replaced vlcj with kdroidFilter's ComposeMediaPlayer. - Uses a JCodec/FFmpeg backend. - Adds Group DM parity with Android. - Set and update a group name (subject) on encrypted group chats. - Create a group by selecting multiple recipients in the New DM dialog. - Rooms are marked read when opened. - Messages from muted authors no longer mark a room unread. - Desktop now handles group direct messages the same way. - Adds Replies tab on the user profile. - Feeds also show reply context (parent embed plus label) inline. - Adds Feed refresh. - Inline card expansion. - A "New posts" chip that slides in from the top. - Stick-to-top on prepend. - Wired-up like/zap/comment actions. - Smaller fixes. - Copy a Blossom image URL on click, with a hover tooltip and snackbar. - Collapsed-sidebar polish: tighter ripple and hover tooltips. - Amethyst logo on the Tor and account-loading splashes. - Restored inter-word spacing in rich text with mentions/hashtags. - Fixed parent-author metadata loading. - Adds Unhealthy-relay review. - A banner and popup that flag relays behaving poorly. - Adds Namecoin diagnostics. - The diagnostics card was ported from the Android settings. ## Cli - Adds `amy offer` — CLINK offer info and request, including `--payer-data`. - Adds `amy debit` — CLINK debit info, pay, and budget. - Adds `amy zap --with <ndebit>` — settle a zap invoice via a CLINK debit. - Adds `amy offer discover <nip05>` — resolve a profile's offer through NIP-05. - Closed CLINK parity gaps (profile offer, follow, offer pay, GFY detail). - Adds a clink-headless interop harness. ## Quartz - Adds Relay-server toolkit. - Added a `Flow<Event>` REQ-responder SPI with a storage-free dispatch engine. - Added NIP-50 search parsing. - Added suspendable auth hooks. - Split engine/backend/policy packages. - Adds NIP-45 approximate COUNT - Added HyperLogLog with wire support. - Enhances NIP-11 documents. - Added the missing `banner` field. - Relay limits are now a single source of truth served over NIP-11. - Adds Relay Connection observability. - Stable per-connection ids. - A per-connection `RequestContext` threaded into the event source. - Auth identity moved from policy into connection scope. - Fixes NIP-46 double-resume and retry id-reuse race - Fixes NIP-46 error serialization issues - Fixes `q` (quote) tags being dropped by an inverted guard. - Fixes `CommunityRulesEvent` and CLINK DTO serializers - Improves Relay failure logs - Fixes disk cache to recreate cache dir if cleared at runtime ## Build & Documentation - **Dependency updates.** - Bumped Kotlin, Compose Multiplatform 1.11.1, Coil 5, OkHttp 5, Jackson, AndroidX, Firebase, and more. - Adapted the Blossom interceptor test to OkHttp 5's `Interceptor.Chain`. - **iOS CI.** - `commons` `commonTest` now compiles and runs on iOS targets. - CI runs the shared `commonTest` on iOS for `:commons`. - **Amethyst → commons migration (KMP/iOS).** - Moves shared, CLI-safe code out of the Android app into `commons`. - Decryption caches (Mute/People/Community, Hashtag, Favorite-algo, Trust-provider). - Models: InterestSet, LabeledBookmarkList, NwcWalletEntry, CashuToken, OwnedEmojiPack. - The link-preview fetcher, relay broadcast tracker, and CLI-safe util extensions. - `HtmlParser` made KMP (dropped its Java `Charset` dependency). - A consolidated package taxonomy with a new architecture doc. - **Licensing.** - Replaced the GPLv3 `TarsosDSP` dependency with an in-house pitch shifter for the voice anonymizer. - Keeps the project MIT-clean. - **Misc.** - Added a monochrome outline Cashu icon to the Material Symbols set. - Renamed `ReplaceableVideoEvent` to `AddressableVideoEvent` for spec accuracy. - Split the monolithic CHANGELOG into per-version files under `docs/changelog/`. - `versionName` branch detection sets the git cwd, so it works inside git worktrees. - **SonarQube cleanup (S1871).** - Merged duplicate `when`/`if` arms across the codebase. - Migrated `Log` calls to the lambda overload. - **Documentation.** - Updated Privacy Policy to the new requirements from the PlayStore - Documented an Amethyst→commons migration plan and target package hierarchy. - Refreshed several Claude skills, documentation and the Namecoin design doc. - Added a rule requiring a license check when adding any new dependency. ## Contributors - @Vitor Pamplona - @⚡ Dee Kay ⚡ - @Minced Beef Energy - @greenart7c3 - @npub1a3tx...kq4k - @v ## Translations - Czech, German, Swedish, and Portuguese by @⚡ Dee Kay ⚡ - Hungarian by @summoner - Dutch by @Bartus - Polish by @Polak - Hindi by @npub1ww6h...w5e6 - Slovenian by @StellarStoic - Spanish by @⚡₿it₿y₿it⚡ - Chinese by hypnotichemionus4 and @CXPLAY
Amethyst's avatar
amethyst 2 months ago
#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's avatar
amethyst 2 months ago
#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's avatar
amethyst 2 months ago
#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's avatar
amethyst 2 months ago
#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's avatar
amethyst 7 months ago
#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 @npub1a3tx...kq4k - 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 @npub1ww6h...w5e6 - Slovenian by @StellarStoic - Polish by @Polak - Hungarian by @npub1ww8k...nvtp @summoner - Spanish by @⚡₿it₿y₿it⚡ - Latvian by @ℂ𝕠𝕠𝕠𝕝 - Dutch by @Bartus - French by @npub106ef...r8fz - Chinese by @CXPLAY - Thai by @npub1vm0k...xp8e - Persian by @npub1cpaz...xxpk Download:
Amethyst's avatar
amethyst 1 year ago
#Amethyst v0.91.0: Edge to edge feeds Hidden words now filter by the user's fields as well. You can hide by name, profile picture, banner, lightning and nip-05 addresses and about me fields. Features: - Finishes Edge to Edge transition for Android 15 - Adds compression settings to the media uploading screen by @⚡ Dee Kay ⚡ - Adds sliding animations in all inner screens - Adds copy stack to clipboard for error messages that have an exception - Enables the use of hidden words for all visible properties of the user Bug Fixes - Fixes blank alt field when no alt text is provided on NIP-96 - Fixes missing Private Home/Outbox relay list after loading from backup - Fixes keyboard padding issues when using physical keyboards on the message screens. - Fixes token sanitization when using gcompatup with unified push by @greenart7c3 - Fixes moving top buttons on the full screen dialog for images and videos. - Fixes weird padding of the key backup screen - Fixes using npub instead of pubkey in hex when communicating with Amber - Fixes blinking on crossfades when the system's light/dark theme is different than the app's theme - Fixes a mix of languages after changing language in Settings - Fixes disables saving m3u8 files locally (streaming can't be saved) - Fixes Community tab not loading up with Global filter - Fixes size of default banner when the profile is not loaded yet. Code Quality Improvements: - Inverts Layouts to place Navigation on top of Scaffold and allow custom scaffolds per route - Refactors navigation to improve clarity - Restructures screens into their own packages - Restructures navigation functions as a single object - Refactors all TopBars to use default material 3 ones - Simplifies the "and 2 more" translations for the relay recommendation user lists - Removes unnecessary observers from the transition in the bottom nav layouts. - Normalizes cache directories in the Application class - Fixes text field recompositions because of new keyboard actions - Moves the profile zap to threads - Updates to AGP 8.6.0 - Updates zoomable and kotlin serialization Updated translations: - Czech, German, Swedish and Portuguese by @⚡ Dee Kay ⚡ - Thai by @npub1vm0k...xp8e - Dutch by @Bartus - Hungarian by @npub1ww8k...nvtp - Bengali by @npub13qtw...x23t - Polish by @Polak - Hungarian by @npub1ww8k...nvtp - Chinese by @CXPLAY Download via [Obtainium](http://amethyst.social) or [Zap.Store](https://zap.store/)