Amethyst's avatar
Amethyst
amethyst@vitorpamplona.com
npub142gy...xrj0
Nostr Client for Android
Amethyst's avatar
amethyst 1 week ago
#Amethyst v1.13.1: Follow-up Fixes for Buzz, Concord and the Keyboard Highlights: - Fixes the soft keyboard getting stuck open in chats. - Fixes duplicate items crashing the Discover and feed lists. - Adds per-event-kind toggles to the Home feed. - Signs Blossom read requests so media on auth-gated hosts loads. ## New Features - Adds per-event-kind toggles for the Home feed. - Signs Blossom read-auth so media hosted on auth-gated servers displays. - Lets admins delete a Buzz channel or relay group. - Honors CORD-02 §9: seals dissolved Concord communities read-only. - Allows single-character (continent) geohash precision in location channels. ## Performance - Preemptively signs Blossom reads for known auth-gated hosts, so the first request succeeds instead of round-tripping through a 401. - Makes the `observeNotes` dedup lock-free and race-safe under concurrent consumption. ## Improvements and Bug fixes - Stops the soft keyboard state from getting stuck open. - Stops nav-bar padding from stacking on top of the IME inset in chats. - Unions nav-bar and IME insets on the two remaining bare-Scaffold forms. - Prevents a duplicate LazyColumn key from `observeNotes` on addressable updates, and keeps the list sorted while deduping by id. - Dedupes Discover apps by coordinate to avoid duplicate LazyGrid keys. - Dedups `EventListMatchingFilter` (`observeEvents`) and hardens its emission contract. - Authenticates to the NIP-29 host relays of joined groups so private group content loads. - Keeps the back arrow visible until the exiting screen finishes leaving. - Bounds the context shown around a highlight to a window, trims edge blank lines, and collapses scraped whitespace. - Attributes a highlight to the author-marked `p` tag and drops alt captions. - Renders custom emoji in highlight comments. - Only tags explicit http(s) URLs as `r` references. - Opens a Concord community by tapping its name, not just its avatar. - Leaves room for the FAB in the Concord community channel list. - Makes the Buzz Messages toggle read the list it claims to change. - Renders the Buzz channel recent-poster facepile with the standard avatar. - Separates Buzz community rows with a hairline and drops the grey slab behind the Channels section. - Aligns leave vs remove-from-messages actions across chat types. - Normalizes top nav bar title font sizes and weights. - Raises the background mobile-data trigger to 500 MB and doubles the report-prompt thresholds. - Removes orphaned `buzz_dm_hide` translations. ## Desktop - Caches the OS Keyring handle so startup only prompts once. - Makes the "Enable OS notifications" button actually enable them. - Reloads the visible page when switching accounts. ## Quartz - Stops Namecoin lookup exceptions from leaking through `resolve()`. - Uses `Hex.isHex64` instead of a regex for the blob-id check. ## Build & Documentation - Resolves the `LocalCache` override, dropdown deprecation, and shadowed extension warnings. - Extracts duplicated string literals. ## Contributors - @Vitor Pamplona - @⚡ Dee Kay ⚡ - mstrofnone ## Translations - Czech, German, Brazilian Portuguese, and Swedish by @⚡ Dee Kay ⚡
Amethyst's avatar
amethyst 1 week ago
#Amethyst v1.13.0: Web Apps, Concord, Buzz, Log in with Amethyst, Git, Bolt12 and lots more. Highlights: - Adds an **in-app Browser** for Nostr WebApps - Adds support for **napplets (NIP-5D)** and **nsites (NIP-5A)** - Adds **Concord Support (Armada)**. - Adds **NIP-29 Groups (Flotilla)**. - Adds **Buzz workspaces, with agents**. - Adds a **Remote Signer (NIP-46)**. - Adds **Git Clone Support (NIP-34)**. - Adds **Relay Auth permissions (NIP-42)**. - Adds **BitChat Geo-channels**. - Adds **Blossom file display and sync**. - Adds **Podcasting 2.0**. - Adds **BOLT12 payments and zaps (NIP-B1)**. - Adds **proof-of-work (NIP-13)** publishing. - Redesigns **chat messages**. - Redesigns **accent colors**. - Redesigns **push notifications** ## New Features ### Web Apps, Sites & the Browser - Opens Nostr web apps (NIP-5D napplets) and static websites (NIP-5A nSites) directly inside Amethyst, rendered in an isolated, keyless sandbox process that cannot reach your private key, storage, or data. - Adds an in-app Browser — a drawer entry and pinnable bottom-bar tab — with an omnibox address bar, autocomplete, history, favorites, recents, and captured favicons. The address bar is drawn by Amethyst, never by the page, so its URL cannot be spoofed. - Adds "Log in with Amethyst": nSites open with a NIP-07 `window.nostr` provider, so standard Nostr web apps can sign in and request signatures as your active account — consent-gated, sign-only, and scoped per site. - Lets web apps, with your permission, pay through your wallet (NWC), run live relay subscriptions and queries, and read your identity (profile, lists, zaps, badges) — every capability brokered and permission-gated (once / this session / always). Payments always prompt with the amount shown. - Pins favorite web apps to the bottom bar as embedded, swap-in-place tabs that stay warm between visits. - Discovers web apps: the empty browser suggests a curated list plus nSites and napplets published by people you follow, and profiles gain an "Apps & Sites" tab. - Adds a Connected Apps / permissions screen to review and revoke what each app can do. - Routes nSite web traffic through Tor by default when Tor is active, with a per-site onion/globe toggle. - Gives each account its own web storage — cookies, logins, and site data no longer leak between the accounts on your device. Sites you were already signed into are signed out once; signing back in stores the session under the account you are using, and switching away and back keeps it. - Scopes granted permissions per account too, so each app asks once more under each account you use it with. A grant by one account no longer applies to the others. ### Communities (Concord) - Adds Concord: an end-to-end-encrypted communities protocol with channels, membership, invites, roles, moderation, and history — reachable from a hub in the drawer and pinnable to the bottom nav. - Creates and edits communities with encrypted icon/banner, relay editing, and channel management. - Invites and joins via minted invites with QR codes, tappable invite links, paste-to-redeem from Search, deep links, and direct member invites. - Chats in channels with a rich composer (@mentions, custom-emoji autocomplete, reply preview), encrypted image messages, reactions, replies, and typing indicators. - Adds threaded replies (inline or minichat modes) and delivery ticks for your own messages. - Groups channels by community in Messages with last-message previews, unread dots, facepiles, live typing, and per-type load toggles. - Adds moderation: ban/unban with read-time enforcement, role grants, a "Make admin" toggle, and a full member roster. A ban hides a member's posts for everyone else; removing their access to the community's keys takes a Refounding. - Backfills channel history across epochs, paging back to the true start of a channel. - Surfaces Concord replies and reactions on the Notifications tab with a community pill. - Lets authors edit their own channel messages (kind 3302). Latest edit wins, and it is non-destructive, so reactions and replies stay attached. Only the original author's edits take effect. ### Git Collaboration (NIP-34) - Browses Nostr git repositories in-app: a Git Repositories feed and a per-repo screen with README and Code tabs. - Reads code with branch/tag switching, file search, image preview, commit history, syntax highlighting, and word-level diff highlighting. - Reviews patches and pull requests with computed diffs and status actions; PR updates surface on the repo screen. The code browser needs a repository with an http(s) clone URL. - Manages issues: Issues and Patches & PRs tabs split by open/closed, issue labels with filtering, and a full-screen New Issue composer. - Edits a repository announcement from the repo screen, bookmarks repositories, and filters the feed to your own repos. - Adds a project-home dashboard with stats, languages, recent activity, and last-commit rows. ### Location Channels - Adds Location Channels: geohash-based public rooms that interoperate with BitChat, browsable from a dedicated drawer list and pinnable to the bottom nav. - Posts under an unlinkable per-area anonymous identity, or opt in to post as your real account. An optional nickname survives restarts, but it is a single handle reused in every area — setting one links your posts across areas. - Teleports to any place from a map picker or the feed-filter dialog to read and post to distant rooms, and follows a teleported place to keep its feed. - Reacts, zaps, and replies on location messages, with a "live near you" bubble on Home surfacing nearby rooms. - Adds a "pick on map" location picker to the short-note and all other composers. ### Groups (NIP-29) - Adds relay groups: group chat, a discovery feed with a top-bar filter and favorites, and join / leave / create / invite actions. - Adds subgroups (parent/child hierarchy), custom roles (kind 39003), threads, and message pinning. - Shares groups via `naddr` and invite links with one-tap join; inline group links render as self-loading cards. - Adds a map-based location picker when creating a group, and lets pinned group tabs act as bottom-nav roots. ### Buzz (Agent Workspaces) - Adds Buzz: a self-hosted workspace where humans and AI agents build together on a relay you own, built on the NIP-29 relay-group family with plaintext content so the relay can run search, audit, and workflows. Reachable from a "Buzz Workspaces" bottom-nav tab and the drawer Feeds list. - Renders workspace channels natively and composes messages; sections a community into Channels, Forums, inline DMs, and an Agent Console; and renders forum posts as Concord-style threads with the full chat composer. - Adds an agent-owner console with cost and personas tabs, an agent-fleet cost aggregator, live observer telemetry, persona create/edit, and NIP-OA attestation issuance. - Adds live typing indicators, presence dots, collapsible sections with unread and stars, a workspace canvas viewer and edit composer, and a bot "Working…" indicator. - Invites people to a channel or community and mints invite links; redeems invite links (intercepted into the in-app browser) and auto-invites mentioned non-members. - Wires Buzz direct messages end to end, titles a DM by its participant, and surfaces Buzz DMs in the Notification feed rendered as messages. - Discovers workspaces and DMs via the relay's own kinds, imports workspace channels from a relay in "Find groups", and routes Tor workspaces to clearnet when needed. - Adds a shared **Agent Work board**. Any channel member files a task, upvotes to reprioritize it, and watches the workspace's agent carry it to a pull request. Jobs that ship directly and gated workflow runs fold into one board, grouped by Needs approval / Working / Up next / Shipped. - Approves or denies a gated run in place. The "Approve & open PR" step authorizes a push and PR, but never merges or deploys. Adds a confirm step, an approver and workflow-definition picker, and Buzz Agent Persona editors for model, provider, and runtime. - Asks before adding you to a channel someone else put you in (Accept / Ignore / Leave). Narrates channel changes as plain-language system lines: "Bob added Alice", topic, visibility, and TTL changes, and more. - Notifies the requester when their agent job finishes or fails. Lets a self-hosted geode relay be the private Buzz workspace via a member-and-agent membership policy. ### Chat & Messages - Redesigns message rendering across every chat — DMs, public chats, groups, and communities — with modern bubbles, swipe-to-reply, send motion and press feedback, per-author name colors, jumbo emoji, day headers drawn above the messages they introduce, and a timestamp on the last message of each author run. - Replaces the message 3-dot menu with a compact two-stage long-press sheet that unpacks wrapping reactions and zap-amount presets in place. - Renders channel admin events as centered system messages, and hides a reply quote when it targets the message directly above. - Replaces the Messages FAB speed-dial with a full-screen, color-coded new-conversation chooser, and adds a Messages settings screen with a grouped-by-relay view and per-type load toggles. - Warns about DMs from senders reported by people you follow: flags a reported counterpart on the chat-list row and inside the room, with a per-user report-warning flow. ### Notifications - Redesigns push notifications into per-kind, observable, richly-rendered notifications that resolve inline @npub mentions to display names, render an inline image link as the big picture, and attribute a reply's parent to its real author. - Adds push notifications for Buzz DMs and for bare reactions and reposts to your notes, with repost-mute parity. Auto-dismisses a tray notification once its event is read in-app. - Rebuilds the in-app Notifications tab with infinite-scroll paging via a look-ahead buffer, time-based history paging with in-feed load markers, and auto-retry of stalled or faulty relays with an actionable relay detail. ### Remote Signer & Security - Lets other apps and websites sign through Amethyst for the first time (NIP-46): connect by scanning or pasting a `nostrconnect://` code, and keep signing in the background — whether your key is stored directly in Amethyst or delegated to an external signer like Amber (NIP-55). - Asks for informed consent before authorizing an app — showing its name and icon, which account will sign, the exact permissions, and an event preview — with per-account sheets and one-tap batched approval. - Manages connected apps from a dedicated screen with per-app relay list, live health, time-bound grants, and instant "forget this app". - Adds interactive relay login prompts (NIP-42): choose Once / Always / Never per relay, with venue-aware prompts for public chats, communities, and live streams, and one-tap rules to trust relays used by people you follow. Apps connected through the remote signer now ask before signing a relay login, instead of approving it automatically under "Let's be reasonable". ### Web of Trust (GrapeRank) - Discovers Web-of-Trust score providers via NIP-85 and shows hop distance and follower count on trust cards. Computing the scores — crawling the social graph, reverse-follower crawling, and publishing NIP-85 cards — is done by the `amy` command-line tool, not the app; see the Cli section. ### Publishing & Sync - Adds proof-of-work (NIP-13) publishing: a fire-and-forget mining queue with per-account difficulty and per-category settings, scheduled-post mining, and per-post overrides, shielded by a foreground service and mined across half the device's cores. - Adds NIP-77 negentropy sync as a first-class capability, with deletion (NIP-09/62) propagation so scoped syncs no longer strand deletions. - Shows PoW mining progress, and surfaces PoW, OpenTimestamps, and location markers as tap-to-explain pills in the note header. ### Podcasts - Adds Podcasting 2.0: renders shows in detail and thread views, surfaces episodes in the merged podcast feed, and plays trailers. - Shows person credits as real Nostr profiles, soundbites, in-app chapters, a transcript viewer, and a Top Supporters leaderboard. - Adds per-episode reactions and NIP-22 comments, a Podcast Bookmarks screen, and value-for-value Lightning splits paid per-minute during real playback. - Adds in-app podcast authoring: create and edit shows, episodes, and trailers from an authoring hub, with a value-for-value split editor that adds Nostr recipients by search. Verifies NIP-F4 podcast authors against their kind-10064 counter-claims. ### BOLT12 Payments & Zaps (NIP-B1) - Adds BOLT12 zaps: self-verifying kind-9736 events that prove a real BOLT12 Lightning payment. They carry a settlement proof instead of relying on an LNURL receipt. They fold into the same zap total and reactions row as Lightning zaps, with anonymous and receiptless (pay-only) variants. Only cryptographically verified proofs count toward the total. - Publishes and edits your own BOLT12 offer list (kind 10058) from an in-app editor. The list is cached, kept live, and restored across restarts. - Pays a recipient's published offer. Hand it to an external wallet as a `bitcoin:?lno=` (BIP21) intent, or pay in-app over a NWC wallet that supports it. - Sends zaps over NWC, using the new `pay`/`receive` methods (nostr-wallet-connect/nwc#2). Prefers BOLT12 over Lightning when the recipient offers it and the wallet supports it, and falls back to a Lightning zap otherwise. - Verifies payer proofs cryptographically: payment-hash preimage, invoice and proof signatures, and BOLT12 merkle reconstruction of selectively disclosed fields. Dims and does not count a proof that can't be bound to the offer. ### Wallet & Payments - Adds a Cashu wallet setup wizard: find-or-create with cross-relay discovery, mint suggestions, and a CashuMints screen; the wallet auto-publishes on mint add/remove. - Claims P2PK-locked Cashu tokens (NUT-11). Matches the lock against your wallet or identity key, and redeems all-or-nothing. Gives a clear error when a token is locked to a key this wallet can't sign for. - Adds a setting to hide the on-chain (Bitcoin) wallet, including from zap buttons. - Prefers NIP-44 encryption for NWC when the wallet advertises it. Adds a NWC-07 deep-link pairing helper. Posts a tray notification for incoming non-zap Lightning payments. ### Battery, Data & Background Service - Adds a resource-usage ledger: on-device battery and data accounting across relay connections, media, HTTP, proof-of-work, Tor, calls, decrypts, and remote signs, with per-screen foreground time and reconnect-churn tracking. Optional NIP-17 reports mail the summary to yourself. - Presents it on a usage screen with stat tiles, a trend chart, proportion bars, cellular-first bars, a Tor card, actionable insights, and a live memory card. - Adds a master switch for the always-on background notification service with per-account participation, a cost card that links to notification settings, and a distinct status-bar icon. - Scales `LocalCache` pruning to the OS memory-pressure level, and trims feed lists, rich-text/robohash/relay-info caches, the image cache, and the player warm pool under pressure. ### Look, Media & Navigation - Adds theme customization: pick an accent color (with a swatch picker), font, and font size. The accent now drives Material 3 containers, buttons, FABs, switches, unread dots, selected-reaction highlights, verified NIP-05 / image marks, and the Following badge. - Redesigns UI Preferences into grouped in-screen options with live font previews, and adds a settings search filter in the app bar. - Adds a Blossom media file manager: browse and manage stored blobs with per-file controls, mirror and `/media` toggles, an app-level "Sync all" with progress, and BUD-07 confirm-then-pay mirroring for paid servers. - Extends the Blossom manager with a gallery grid (video thumbnails and a full-screen zoomable viewer) and a per-file detail sheet. Adds an importer that copies blobs from other Blossom servers into yours. Falls back to a verified download-and-reupload when a target has no `/mirror`. - Redesigns the Media Servers screen as a single auto-saving canvas with a reorderable priority list and cached health probes. - Redesigns the bottom-bar setup with a live preview, drag-to-reorder, and real favicons; the default bar becomes Home, Messages, Wallet, Browser, Notifications. - Adapts the app shell to large screens: tier-scaled navigation transitions, a reading-column width cap on wide panes, and a two-pane Messages layout. - Nicknames people with NIP-85 contact cards (kind 30382) signed by your account key. The nickname shows above their real display name on the profile and supports custom emoji. - Adds fitness support: renders POWR strength workouts (kind 1301) and exercise templates (kind 33401) as cards, and merges close-by Health Connect sessions of the same type. - Renders Birdstar bird detections (kind 2473) with common-name titles and Wikidata links, surfaces Birdex life lists on home and profile, and renders PS1 memory-card saves (kind 38192) with an animated BIOS icon. - Adds a compose signature pre-filled in text-based post screens, and an optional subject/title field in the short-note composer. - Renders NIP-30 custom-emoji reactions as an avatar badge, a lone zap/nutzap as a large activity card, and NIP-84 highlights from web highlighter clients. - Supports NIP-51 mute-list hashtag entries and public-chat reply notifications. - Modernizes the Privacy, Profile UI, Home Tabs, and Calendar Reminder settings screens into grouped in-screen options. - Adds "Share as QR" for a note, with a choice of `note` or `naddr` payload and an image thumbnail for image-only notes. - Resolves NIP-05 identifiers (including Namecoin `.bit`) in the @-mention popover, wiring them to `nostr:` mentions. ## Performance - Speeds up napplet/nSite opens by overlapping WebView init, prefetching blobs in parallel, and fast-serving content-addressed blobs from cache. - Substantially faster GrapeRank crawls (background IO, mass pre-connect with cached DNS, batched contact reads, parallel outbox fetches, early dead-relay pruning) and faster scoring via Gauss-Seidel sweeps over a compact integer graph. - Speeds up NIP-77 reconcile with direct-built wire frames (~2.5x), O(1) range fingerprints, a live negentropy index, and an allocation-free idle watchdog. - Prefetches media and pre-parses note text ahead of the viewport, adds a k-way merge for the home feed, and pins indexes for multi-author queries. - Adopts a caching event decoder across Android/Desktop/CLI, batches Schnorr verification off the receive path, and keeps light/dark resolution O(1) after an accent change. - Parallelizes Blossom "Sync all", prefetches a joined group's history, and mines proof-of-work on half the device's cores. - Orders NIP-50 relay search by bm25 relevance and scales search and tag-watcher queries with corpus size, picking the SQLite filesystem driver by cost and materializing indexes at runtime. - Removes live-path allocations in `LiveEventStore` and `FilterIndex` (and on the frame/search paths), and snapshots `FilterIndex` with a persistent map. ## Improvements and Bug fixes - Normalizes accent theming: contrast-picks onPrimary so filled buttons/FABs stop washing out, bases light/dark on background luminance, and fixes accent regressions. - Keeps live HLS streams playing and caches only proven on-demand HLS; shows a browser-fallback overlay when a decoder stalls and pauses looping videos after 5 plays. - Adds an HTTP/2 keepalive ping to stop stale-connection image stalls. - Hardens the relay client: enforces blocked relays on every REQ/COUNT/publish, backs off from REQs relays repeatedly refuse, drops relays that fail hard during crawls, caches each relay's advertised LIMITS, and fixes reconnect backoff on network/transport changes. - Shows and edits Marmot (MLS) group icons in the feed and in group metadata, interoperable with other Marmot clients. - Opens zaps and reactions in their own thread view, turns Notify chips into bell mute-toggles that list every thread member, and replies with kind 1111 to Amethyst's own kind-1 thread roots. - Adds search, a local filter, and a top-nav feed filter to the App Recommendations screen, and shows a website's favicon and domain across every browser-connected app view. - Fixes nutzap relay routing to receive/advertise on inbox/DM (kind 10019) relays instead of outbox. - Fixes Concord invite handling (revocation, keyless CORD-05, clearer failure copy, no hang on bad links, skip re-join) and channel rows stuck on "No messages yet". - Persists the Concord community list and loads pinned communities from their own relays so cold boot no longer refetches, shows channels on Messages as soon as the control plane folds, warms channel previews so the list fills without opening each channel, and rank-gates the Ban/Remove affordances (CORD-04). - Sizes the video player box so live streams stop rendering black bars, and enforces the decoder budget when acquiring players. - Stops stamping our client tag on someone else's event template so external signers sign it unchanged. - Keeps calendar RSVP buttons on a single line, drops dead top padding on Home when there are no live bubbles, and modernizes the Zap the Devs donation card. - Rejects NIP-29 group state not signed by the relay, opens group posts in the group chat, and fixes subgroup edit safety and pinned-message jump. - Makes tapping a message timestamp open delivery info instead of toggling the time format, and right-aligns your own messages. - Recovers a media file's type from its extension when the imeta MIME is malformed, and moves several disk reads (boot receiver, signer policy) off the main thread. - Serializes account construction so concurrent loaders can't build duplicate accounts. - Routes Onion-Location through the Android app's HTTP clients and maps Tor/Arti errors to accurate SOCKS reply codes. - Extracts the rich-text renderer and many event cards (calendar/RSVP, podcast atoms/splits, relay discovery, code snippet, ecash mint, activity, Git diff/status, and more) into shared commons so Desktop and Android render identically. - Sends pictures in minichat thread replies (encrypted in Concord, plaintext in public chats). Resolves @-mentions in the minichat composer and tray quick-replies. Adds `p` tags for people cited in kind 9/11/1111 and Buzz stream messages, so mentions notify and resolve. - Stops the inline audio player from painting over the note below it. Marks every room type read from the Messages "mark as read" action. - Fixes numeric HTML entities in link-preview meta tags. Routes kind-39005 by tag shape, so Buzz thread summaries no longer parse as NIP-29 pin lists. - Shortens over-long translated strings across 23 locales and fixes duplicate and CDATA translation issues. ## Desktop - Redesigns notifications with a reworked inbox and native OS toast notifications. - Adds NIP-42 relay AUTH with an inline Once / Always / Never approval banner and persisted grants. - Makes NIP-17 private DMs reliable: resolves recipient inbox relays, fetches DM relay lists and account/Blossom config from outbox relays, and stops falling back to connected relays. - Adds Web-of-Trust score badges, Follow Packs (NIP-51) discovery with one-tap follow, note scheduling, opt-in NIP-37 draft sync, and a hashtag-spam filter. - Adds a Privacy Lock: gate the Messages and Wallet columns behind a password, with an auto-lock timeout. It is a screen gate, not encryption at rest — messages continue to sync while it is locked. - Renders rich text through the shared core (removes the desktop-only fork) and ships as a Flatpak bundle. - Adds moderation & safety: mute/block and NIP-56 report actions in the note menu with feed, thread, and profile enforcement (previously a silent no-op), NIP-36 content-warning blur with tap-to-reveal, a sensitive-content toggle, and management screens — with snackbar feedback and zero-relay send warnings. - Adds NIP-88 polls (render, vote, create) with a "Polls" search facet, and unifies the note ⋮ overflow and right-click menus. - Fixes a desktop-cache race that could wipe the follow list, and makes sidebar navigation replace the detail overlay instead of hiding behind it. ## Cli - Adds nak-style primitives: `amy decode`/`encode` (NIP-19/21), `verify`, `key` (generate/public/encrypt/decrypt/validate, NIP-49), and `filter`. - Adds query verbs: `amy fetch` (one-shot with code-mode outbox resolution), `subscribe` (live NDJSON), `count` (NIP-45), and `outbox USER` (NIP-65). - Adds `amy sync` — NIP-77 negentropy reconcile with deletion propagation — and `amy event` / `amy publish` for raw and pre-signed events. - Adds `amy encrypt`/`decrypt` (NIP-44/04) and `amy gift wrap`/`unwrap` (NIP-59). - Adds `amy blossom` (upload/download/list/delete/check/mirror, NIP-B7) with a live interop smoke test. - Adds `amy git` (NIP-34), `amy podcast` and `amy podcast20` (Podcasting 2.0 with V4V splits). - Rounds out `amy git` to full NIP-34 parity: `browse`/`cat`/`log` over smart-HTTP, `init` from a local checkout, `label` (NIP-32), `apply` a patch to the working tree, and `grasp list`/`set` (GRASP server list, kind 10317). - Adds `amy buzz` for block/buzz workspaces (channels, DMs, invite-link redemption), verified against a live Buzz relay. - Turns `amy` into the Buzz workflow/agent runner. `buzz agent serve`/`up`/ `doctor` run gated or parallel-backlog agents in isolated git worktrees that open PRs. `buzz workflow trigger`/`run`/`approve`/`deny` drive the human approval gate. - Adds `amy bolt12` (NIP-B1): decode offers and payer proofs, verify a zap, get/set a kind-10058 offer list, and a two-step intent → zap send. - Adds the `amy cashu` wallet (NIP-60/61): wallet lifecycle, balance, mint, receive/send (LN / token / nutzap), and maintenance. - Adds `amy admin` (NIP-86 relay moderation) and `amy serve` (run a relay by embedding geode). - Adds NIP-46 remote signing: `amy bunker` server, `amy login bunker://…`, and `amy login --nostrconnect`, gated with `--perms` and interactive approval. - Adds the `amy graperank` suite (crawl/score/publish/followers/rank/…), account-less crawl/score, and NIP-85 card publishing. - Adds `amy fof` (follows-of-follows, renamed from `amy wot`), `amy concord` (encrypted communities), `amy relaygroup` (NIP-29), and `amy geochat` (BitChat-interoperable geohash channels). - Adds NIP-13 proof of work (`amy pow`, `--pow` on posts), `amy kind`, `amy nip`, `amy namecoin`, `amy status`, and `amy logoff`. - Expands `amy nsite`/`napplet` with `publish`, `serve`, and `list`. - Switches the default event store to SQLite and hardens the output contract: single-line `--json`, exit codes 0/1/2/124, publish results carry each relay's rejection reason, and read-only verbs run without an account. ## Quartz - Adds NIP-77 negentropy sync (pipelined worker pool, multi-connection fan-out, bounded-memory streaming, `LiveNegentropyIndex`) and NIP-09/62 deletion propagation. - Adds NIP-13 proof-of-work publishing: a cooperative-cancellation miner and a `PoWNostrSigner` decorator that composes with any signer, plus NIP-59 gift-wrap mining on the outer wrap only. - Adds NIP-66 `RelayReachabilityStore` — a durable, shareable dead-relay cache backed by kind:30166 events. - Adds the Concord/CORD protocol foundation (key derivation, envelope layer, authority resolver, roles/moderation, CORD-05/06/07) and the NIP-5D/5A trust-boundary core (capability model, permission ledger, broker, wire protocol). - Implements Marmot (MLS-over-Nostr) group icons byte-for-byte with the mdk/whitenoise scheme, and fixes SecretTree ratchet preservation across restore. - Adds an OutboxDispatcher to fetch profile/contact events via each author's outbox relays, and richer NIP-89 app-handler parsing. - Adds the Buzz protocol surface (~78 event kinds spanning NIP-OA owner attestation, NIP-AM agent turn metrics, personas/teams/managed agents, streams, DMs, forums, presence, and moderation), verified against vectors generated by Buzz's own Rust reference. - Adds the BOLT12 zaps protocol layer (NIP-B1): kind-9736 zaps, kind-9737 zap intents, kind-10058 offer lists, full spec validation, and a payer-proof verifier with BOLT12 merkle reconstruction. NWC gains `pay`/`receive` methods. - Widens NIP-50 search indexing to more event kinds and tag-borne text. Indexes only the public petname and summary on contact cards (kind 30382), never the encrypted fields. ## Geode (standalone relay) - Adds relay-to-relay mirroring with strfry-router parity: a two-phase model (NIP-77 negentropy sync catch-up plus a live REQ tail), `down` / `up` / `both` directions, per-upstream mirror filters, and relay-to-relay trust. - Keeps mirrors alive across upstream restarts with a retry pump and ping keepalive, and advances the since-watermark correctly on reconnect. - Adds `import` / `export` NDJSON verbs and an optional no-full-text-search mode (`--no-search`) for lighter deployments. - Adds `[database]` tuning knobs with periodic `PRAGMA optimize`, and validates config knobs and mirror filters at boot. - Runs embedded in the CLI via `amy serve`. - Serves full-set negentropy NEG-OPENs from a live index and streams mirror catch-up IDs instead of materializing them. - Adds relayBench, a head-to-head benchmark harness (geode vs strfry vs any relay) measuring ingest, query, and NIP-77 sync over a shared corpus. - Enables a combined tag+kind+pubkey index, a cost-based filesystem-driver pick, and runtime index materialization, with new tag∩author and driver-selection relayBench shapes. - Ships a release pipeline: a GHCR Docker image, `.deb`/`.rpm` packages with a bundled JRE and systemd unit, a portable jlink'd tarball, and a Homebrew formula. Adds `--version`/`--help` and a boot smoke test in CI. - Lets operators pick any Quartz `IEventStore` backend via `[database].backend`: SQLite (default), filesystem, or a custom store loaded by class name. ## Build & Documentation - Rebuilds the Tor/Arti native library for the SOCKS reply-code fix, ships a Homebrew formula for `amy`, and seeds the Gradle distribution from a verified mirror in the web sandbox. - Adds NIP-29 group-chat test coverage across every assembler, filter shape, and relay integration. - Targets JVM 17 for Quartz, upgrades AGP, and replaces the abandoned android-test-report action with `mikepenz/action-junit-report`. - Adds a coding standard banning raw invisible/bidirectional Unicode in source (Trojan-Source, CVE-2021-42574) and replaces existing occurrences with `\u` escapes. ## Contributors - @Vitor Pamplona - @⚡ Dee Kay ⚡ - @Minced Beef Energy - @v - @greenart7c3 - @Gigi - roguehashrate - LubuSeb ## Translations - Czech, German, Brazilian Portuguese, and Swedish by @⚡ Dee Kay ⚡ - Spanish (Spain, Mexico, and US) by @⚡₿it₿y₿it⚡ - French by @npub106ef...r8fz - Hungarian by @summoner - Dutch by @Bartus - Hindi by @राज - Polish by @Polak - Slovenian by @StellarStoic - Chinese Simplified by hypnotichemionus4 - German by crowdin.pretended462
Amethyst's avatar
amethyst 1 month ago
#Amethyst v1.12.6: Napplets, Static Sites Protocol & BugFixes Highlights: - New protocol support for **Nostr Web Applets (NIP-5D)** and **static websites (NIP-5A)**, resolved straight from signed manifests over Blossom. - Cashu tokens that span **multiple mints** now redeem in full, and both Base64 alphabets are accepted. - A batch of stability fixes across notifications, playback, feeds, and the emoji pack screens. ## New Features - Add support for **Nostr Web Applets (NIP-5D)** and **static websites (NIP-5A)**. Napplet manifests (snapshot/root/named kinds) and the NIP-5A aggregate-hash layer land in Quartz, with a resolver that downloads each listed Blossom server in order and accepts only the blob whose recomputed SHA-256 matches the signed manifest — a substituted or corrupted blob fails verification and is skipped. ## Performance - Cashu token-prefix dispatch now compares against precomputed `DualCase` prefixes instead of case-folding the cashuA/cashuB markers on every call. ## Improvements and Bug fixes - Cashu: redeeming a pasted token now redeems **every mint/keyset group** in it (previously only the first), validating all mints are in the wallet up front and summing the redeemed amounts. The parser also tolerates both standard and url-safe Base64 and mixed-case `cashuA`/`cashuB` prefixes. - Stop the `DisappearingScaffold` top/bottom bars from overshooting their resting edge during the show/hide animation. - Dedupe emoji shortcodes in the Emoji Pack screen to prevent a `LazyGrid` crash, and dedupe emoji pack addresses in the My Emoji List grid. - Cap media-session artwork to the platform bitmap limit so large covers no longer crash playback. - Handle a missing camera app gracefully when taking photos or videos. - Snapshot live-stream status order before sorting, and snapshot feed filters too, to avoid `TimSort` "contract violation" crashes. - Notifications: call `startForeground` on every start command and always `stopSelf` when foreground promotion fails. - Guard the Health Connect permission check against service-bind failures. - Add a descriptive message to the media-download HTTP check. ## Cli - `amy napplet fetch` resolves and fetches a NIP-5D napplet. - `amy nsite fetch` resolves and verifies a NIP-5A static site / napplet. ## Quartz - Implement NIP-5D napplets and the NIP-5A static-site resolver (manifest model, path lookup, hash verification, Blossom candidate assembly) in `commonMain`, with HTTP injected so Quartz keeps no networking dependency. - Move the out-of-band Cashu token parser, the `cashuB` (v4) encoder, and the token container model into Quartz, so Desktop's rich-text viewer can now parse received Cashu tokens. Adds `kotlinx-serialization-cbor` (Apache-2.0). - Centralize Blossom protocol strings in Quartz. - Never let signer timeouts crash from auto-signing launches. ## Build & Documentation - Generate the changelog translator credits offline from a committed `translators.json`, track a rolling "since last tag" contributor list, and seed it from Crowdin on every sync without rewriting the timestamp each run. ## Contributors - @Vitor Pamplona ## Translations - _None this release._
Amethyst's avatar
amethyst 1 month ago
# v1.12.3-5: Relay Latency Health & a macOS Notarization Fix Highlights: - Tracks per-relay latency on Desktop and surfaces slow relays in the dashboard, a details popup, and a banner. - Fixes macOS notarization for the desktop DMG and the `amy` CLI tarball. ## New Features ### Relay Latency Health (Desktop) - Adds a per-relay latency tracker and a slow-relay classifier. - Wires the latency tracker into `RelayHealthStore` with persistence across launches. - Surfaces relay latency in the desktop dashboard, a relay-details popup, and an unhealthy-relay banner. ## Build & Documentation - Fixes macOS notarization for the desktop DMG and the `amy` CLI tarball by signing the Mach-O native libraries bundled inside jars (secp256k1, SQLite, JNA, Skiko, jkeychain, and ComposeMediaPlayer) — Apple's notary service recurses into jars and had rejected them as unsigned. - Fixes the macOS desktop DMG release build: Compose's signer maps the signing identity to a certificate via `security find-certificate`, which did not resolve the CI-imported certificate through the keychain search list (bare `codesign` did). The release workflow now exports the throwaway keychain path and points Compose's `signing.keychain` straight at it. - Resolves the Developer ID **common name** from the signing keychain and feeds it to Compose's `signing.identity`. Compose maps its identity to a certificate via `security find-certificate -c`, which only matches the exact "Developer ID Application: …" name — a fingerprint or partial/team-ID value (which bare `codesign` accepts) was rejected with "Could not find certificate ... in keychain []". The release workflow now points Compose at the imported keychain explicitly and supplies the canonical identity name. ## Contributors - @Vitor Pamplona - @Minced Beef Energy ## Translations - _None this release._
Amethyst's avatar
amethyst 1 month ago
#Amethyst v1.12.2: Road Events, Collapsable replies and some fixes Highlights: - Adds Roadstr road events (kind 1315/1316) with OpenStreetMap map - Expands the Cashu wallet to surface and manage balances held across every mint, with seed recovery and richer nutzap controls. - Collapses thread replies on click in thread view and shows the hidden reply count on collapsed cards. - Adds full-text search across far more event kinds, including direct messages, zap comments, polls, code snippets, and audio. ## New Features ### Road Events (Roadstr) - Adds kind 1315/1316 road event support, rendered with roadstr-accurate cards. - Renders the road event location on an OpenStreetMap map that follows the app's dark theme. - Modernizes road event cards with a map hero and a floating pill. - Includes road events in geohash feeds. ### Quartz Search - Adds a pausable, resumable full-text-search reindex to the SQLite and filesystem event stores, and clamps non-positive reindex batch sizes. - Indexes direct message content (NIP-17 ChatMessageEvent). - Indexes zap comments (LnZap request/receipt, on-chain zap, and nutzap). - Makes polls, code snippets, audio, and git/torrent replies and interest sets searchable. - Indexes parsed JSON fields of profile, channel, and app-handler events. - Indexes natural-language fields of more event kinds, and makes the remaining text-bearing events searchable. - Adds full-text-search reindexing to both the SQLite and filesystem event stores, pausable and resumable for large stores. - Runs the post-migration search reindex in the background so upgrades don't block on it. ### Cashu Wallet - Surfaces all token-holding mints and syncs them when the wallet opens. - Highlights balances held at unconfigured mints and lets users move those coins off. - Recovers from seed across every held mint, not just the configured ones. - Reframes edit-wallet as a mint editor; adds mints directly from the browser and verifies them in the list. - Moves mint recommendations to their own screen and nutzap-key rotation into the Danger Zone. - Adds stop-receiving-nutzaps and delete-wallet actions. - Keeps the Cashu receive invoice on screen during mint polling. ### Music & Playlists - Adds a full-screen music playlist composer with cover image and metadata. - Lets users reorder and remove tracks inside the playlist editor. - Adds a "Mine" option to the music and playlist feed filters. ### Reading & Sharing - Collapses thread replies on click in thread view and shows the hidden reply count on collapsed cards. - Modernizes the quote/repost choice popup and shows both fork states in the boost preview. - Reduces the scroll sensitivity for bringing back the nav and status bars. ## Share as Image - Adds Share as Image to a local file, renaming the upload flow to Share as Image Url. - Shows the image thumbnail in the share sheet for Share as Image. ## Public Chats - Requires at least one relay to create or edit a public chat - Broadcasts to observed relays when a channel declares none. # Pull Notifications - Better detects background state via a LifecycleEventObserver - Prunes the connected set when a relay leaves the pool. - Throttles notification relay-count updates to dodge Android's rate limit - Distinguishes foreground from background counts in the notification tray ## Tor Management - Warm-resets Tor on a dead-circuit self-heal instead of wiping all state. - Fixes a Tor bug by seeding `hasEverBootstrapped` from the on-disk guard sample. ## DM Loading Improvements - Tracks chatroom senders so DMs from followed contacts land in Known. ## Signer Fixes - Stops splitting emoji surrogate pairs when truncating alt/summary tags. ## Desktop - Wires macOS Developer ID signing and notarization. - Adds an in-process relay seam, a launch benchmark, and a Compose UI test pyramid. - Collapses icon decoding to a single memoized lazy for faster launch. ## Cli - Codesigns and notarizes the macOS `amy` tarball. - Publishes a no-JRE jar bundle and a Homebrew-core formula for `amy`. - Drops the Compose UI render stack from the `amy` runtime image. ## Build & Documentation - Bumps stable dependency versions. - Adds icon, supported NIPs, and publishing-relay documentation to Zapstore config - Adds a desktop release guard that fails the build if `osxkeychain.so` is stripped. ## Contributors - @Vitor Pamplona - @⚡ Dee Kay ⚡ - @Minced Beef Energy - @greenart7c3 - @KotlinGeek - @v ## Translations - Czech, German, Swedish, and Portuguese by @⚡ Dee Kay ⚡ - Hungarian by @summoner - Dutch by @Bartus - Polish by @Polak - Hindi by @राज - Slovenian by @StellarStoic - Spanish by @⚡₿it₿y₿it⚡ - Chinese by hypnotichemionus4 and @CXPLAY
Amethyst's avatar
amethyst 1 month ago
#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 1 month 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 2 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 @npub106ef...r8fz - 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 2 months 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 2 months 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 2 months ago
#Amethyst v1.09.1: Fixes - Fixes pull to refresh behavior - Fixes Desktop release CI - Adds Git Repo screens.