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 - @KotlinGeek - @v ## Translations - Czech, German, Swedish, and Portuguese by @⚡ Dee Kay ⚡ - Hungarian by @summoner - Dutch by @Bartus - Polish by @Polak - Hindi by @राज - Slovenian by @StellarStoic - Spanish by @⚡₿it₿y₿it⚡ - Chinese by hypnotichemionus4 and @CXPLAY
Amethyst'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 - @KotlinGeek - @v ## Translations - Czech, German, Swedish, and Portuguese by @⚡ Dee Kay ⚡ - Hungarian by @summoner - Dutch by @Bartus - Polish by @Polak - Hindi by @राज - Slovenian by @StellarStoic - Spanish by @⚡₿it₿y₿it⚡ - Chinese by hypnotichemionus4 and @CXPLAY
Amethyst's avatar
amethyst 0 months ago
#Amethyst v1.11.0: Calendars Highlights: 1. NIP-52 Calendars — feed, day/week/month views, event/collection editors, RSVP, ICS export, "starting soon" notifications, share-as-nostr-link, gallery picker. 2. On-Chain zaps — splits with dust gating, shows in the reaction gallery, display transaction history, privacy guidance 3. Payment-targets redesign (QR + copy + pay), public-address chip + confirmation 4. Inline nowhere-link cards in rich text. PRs: - Restore Lightning Address + LNURL fields in Edit Profile - Raise the default maximum hashtag limit from 5 to 8 - Include on-chain zaps in notification summary stats - Add electrum.nmc.ethicnology.com to default ElectrumX server set - Translate call-permission and git-repo strings (cs, pt-BR, sv, de) + New Crowdin translations - Subscribe and observe PaymentTargetsEvent for other users - Only bridge to local cache when URL is BUD-01 layout; dedupe public-channel rows; normalize video/x-m4v to video/mp4 - Enable Send when typed name resolves via NIP-05; on-chain Bit recipient - Inline Namecoin resolution indicator + result row on on-chain zaps - Inline Namecoin resolution indicator in global search bar - Long-press to copy Nostr Address, Website, LN Address, identities, payment targets - macOS VLC bundled discovery and video rendering - Make RelayAuthenticator authStatus thread-safe - Pad GitRepositoryOverview content to clear top/bottom bars - Use LargeCache for RelayAuthenticator authStatus - MIME-type normalization for MediaStore - Split delivery vs display, add Categories section in notifications - Accept floating-point dimensions in imeta so image space is reserved pre-load - Explain hashtag-limit hide reason in HiddenNote - Route media-upload signing through launchSigner - Render nowhere links inline as branded cards - Release MediaController after 30s in background; skip timer for PiP - Clickable on-chain card opens transaction history; tappable on-chain rows + txid index in LocalCache - Disable ProGuard optimization entirely on desktop (fixes kmp-tor crash); .deb launch CI smoke test - Show on-chain zappers in expanded reactions gallery - Convert hashtag-limit message to <plurals> and add cs/pt-BR/sv/de translations - Restore long-press on root note + anchor popup to the card - Keep filter chips visible on empty on-chain transactions list - Make playback notification tap open the note on warm-pool resume - Validate zap receipts against LNURL provider's nostrPubkey (NIP-57 Appendix F) - Stable sort in ShortsFeedFilter to avoid TimSort contract crash - Align push notifications with Notifications feed filter; resolve addressable events to their replaceable note; WakeUp bypass + lookup hoist - Update on-chain-zap + headers-explorer plans for NIP-BC inline SPV tags - Start zoomable dialog close animation from zoomed bounds - Scaffold I2P as a parallel privacy transport to Tor; route-aware HTTP stack; BlockedRouteException - Reorder feed filter popup sections (DVMs before Communities, interest sets next to hashtags) - Stop spinning Around Me when Geocoder is unavailable - NIP-52 calendars — feed, day/week/month views, RSVP, ICS export, reminders, edit, share-as-nostr-link, participant picker, multi-day bars - Audit follow-ups on MLS reply paths; route reply button on MLS messages to the encrypted group - Use LaunchedEffect instead of remember for VM reset - Switch to Dispatchers.IO around the whole executeAsync call in relay-info - Drop crossfade around the card feed in notifications - Observe locale in CalendarDateTimePickerButton - Modernize zap amount choice popup to match reactions popup style - Catch ForegroundServiceStartNotAllowedException in PlaybackService - Include crashing thread name in crash report - Convert remaining .gradle files to Kotlin DSL - Redesign payment targets modal with QR, copy and pay buttons - Add Public chip to on-chain wallet card; clarify privacy guidance on on-chain wallet popup - Require running material-symbols-subset.sh when adding new icons; add new information icon - Re-add Nostrcheck.me Blossom server to defaults - Surface on-chain zaps from the reactions zap button - On-chain zap splits — drop sender from splits, merge duplicates, gate Send on dust - On-chain option on the Zap the Devs button - On-chain handoff from the custom-zap dialog - Keep listening on default index+search relays for users with no kind 10002 - Skip offline relays when fetching user metadata - Include indexer and proxy relays in the trusted relay list to avoid Tor - Confirm on-chain copy with public-address warning - Swallow LegacyCursorAnchorInfo IllegalArgumentException - Render ContactListEvent in NoteCompose with tap-through user list; add preview for DisplayContactList ## Contributors - @Vitor Pamplona - @⚡ Dee Kay ⚡ - @Minced Beef Energy - @greenart7c3 - @KotlinGeek - @v ## Translations - Czech, German, Swedish, and Portuguese by @⚡ Dee Kay ⚡ - Hungarian by @summoner - French by @Anthony 🇫🇷 - Dutch by @Bartus - Polish by @Polak - Hindi by @राज - Slovenian by @StellarStoic - Bengali by @Cats😺 - Spanish by @⚡₿it₿y₿it⚡ - Chinese by hypnotichemionus4 and @CXPLAY - Russian by Anton Zhao
Amethyst's avatar
amethyst 1 month ago
#Amethyst 1.10.0: OnChain wallets - ci: remove macos-13 x64 build legs by @vitorpamplona in #2939 - Replace linuxdeploy with appimagetool for AppImage packaging by @vitorpamplona in #2940 - Sync inner note highlight fade with parent background color by @vitorpamplona in #2941 - Handle denied call permissions with settings dialog by @vitorpamplona in #2942 - Fix gradient rendering with transparent background colors by @vitorpamplona in #2943 - Add NIP-BC onchain Bitcoin zaps support (send, receive, display) by @vitorpamplona in #2944
Amethyst's avatar
amethyst 1 month ago
#Amethyst v1.09.2: Fixes - Fix Blossom blob detection to reject non-compliant filenames - fix(desktop): add ProGuard keep rules so desktop builds actually launch - fix(desktop): mirror Android ProGuard strategy for release builds - Fix: pause video playback when app goes to background - feat(desktop): wire NamecoinSettingsSection into Settings screen - feat(desktop): wire Import Follow List dialog into UI - Fix crash when toggling home tabs with persisted pager state - Dedupe public channels in known chat list by channel id - Route NIP-43 relay join/leave through launchSigner - Migrate DNS cache from SharedPreferences to cacheDir - Filter DNS poison (loopback / any-local) from non-loopback hosts - perf(dns-cache): hand-rolled binary persistence format for SurgeDnsStore - Ignore duplicated hashtags when processing hashtag spam - New Crowdin translations
Amethyst's avatar
amethyst 1 month ago
#Amethyst v1.09.1: Fixes - Fixes pull to refresh behavior - Fixes Desktop release CI - Adds Git Repo screens.