#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
amethyst@vitorpamplona.com
npub142gy...xrj0
Nostr Client for Android
#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 @Anthony 🇫🇷
- Hungarian by @summoner
- Dutch by @Bartus
- Hindi by @राज
- Polish by @Polak
- Slovenian by @StellarStoic
- Chinese Simplified by hypnotichemionus4
- German by crowdin.pretended462
#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._
# 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 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 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 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 1.06
Polls:
- Adds creating and rendering NIP-85
- Redesign of the poll and zap poll cards
- Adds special notification card for active polls
Relay Feeds
- Adds support for rendering relay feeds
- Adds support for NIP-51 favorite relay feeds
- Shows favorite relays in the top nav filter
- Clickable wss:// links
- New user gets nostr.wine to fav relay feeds
Media Player
- Redesigned player controls
- Supports music with waveform animations
- Migrates to new Media3 content views
- Improved Picture in Picture actions
- Fix playback lifecycle issues on PiP
- Adds support for uploading audio
NWC Wallets:
- Adds support for in-app Wallets
- Adds receive and pay actions
- Adds views for balance and transactions
- Adds transaction filtering by type
- Adds pagination to transaction screen
- Adds test cases from other repos to guarantee interoperability
Calendar:
- Renders NIP-52 Calendar appointments
- Supports calendar time and date slots
- Refactored the early implementation on Quartz for easier use
Code Snippets:
- Adds support for NIP-C0 Code Snippets
- Replies using NIP-22
NIPs on Nostr
- Adds support for event kind 30817
- Replies using NIP-22
PayTo:
- Adds support for NIP-A3 Payment targets by @greenart7c3
Blossom BUD-10:
- Adds support for "Blossom:" URIs on the post
- Supports automatic discovery of servers
- Includes support in previews
- Includes support for encryption when using it in NIP-17 DMs.
Expirations
- Adds enhanced support for custom expirations in any new post.
- Displays expirations on posts and DMs
Relay Monitors:
- Adds support for NIP-66 Relay monitor and discovery support to Quartz
Attestations:
- Adds support for rendering Attestations (
- Recommendations, Requests and Attestor Declarations are also included.
Chess:
- Adds support for Chess/Jester protocol
- Full chess game implemented
- Supports for game challenges and view external games
- Running on debug only for now
DMs:
- Removes NIP-04 DMs
- Blocks sending if the receiver doesn't have NIP-17 relay lists.
- Removes force-activate NIP-17
Push Notifications:
- Adds support for inline reply
- Adds support for notification grouping
- Adds support for Async image Loading
- Removed NIP-04 notifications
Long Form:
- Adds support for writing Markdown content
- Includes support for auto-saving drafts
- Includes support for editing
Uploads:
- Adds support to upload Documents & audio
- Adds toggle to stip file metadata regardless of compression by @⚡ Dee Kay ⚡
- Adds encrypted file upload fallback option for NIP-17 chats
- Removes support for NIP-96 and updates Blossom recommendations
Content Warning:
- Adds an description field in new post
- Displays reason on warning composables
Settings redesign:
- Consolidate settings into a single Settings hub screen
- Redesigns Zap and NWC setup screens
- Redesigns Custom zap amount screens
- Adds brand new Translation Settings screen
- Adds blockchain explorer settings page for OTS verification
- Adds reactions row settings (enable/disable, order, show/hide counters) by @greenart7c3
- Tapping on Zap without any pre-configured amount opens the custom dialog
Content parsers:
- URL/URI parser rewrite in Kotlin multiplatform
- Fixes characters attached to URLs or nostr URLs without a space
- Massively increases parsing performance
- Treat multibyte characters as URL terminators in RichTextParser by @kojira
- Adds a parser for blossom and wss uris
UI Improvements:
- Minimizes parent thread rendering in quoted notes by @Dr. The Daniel 🖖
- New Material 3 UI for DropDowns by @⚡ Dee Kay ⚡
- New Material 3 UI for feed filters by @⚡ Dee Kay ⚡
- Draft Screen requests confirmation before deleting drafts on swipe
- Swipe to switch tabs. Main screen and messages by @⚡ Dee Kay ⚡
- Adds support for rendering Zap events when quoted inside of posts.
- Adds a Broadcasting feedback pop-up in the Complete UI mode
Relay Management:
- Adds relay search tooltip when adding relays
- Adds the list of keys using each relay to the relay information
- Adds active subscriptions and outbox event in the queue to relay information
- Adds a complete list of event kind names to the subscription card to relay information
- Tracks and displays connection success rate on relay settings
- Adds relay settings export functionality
- Adds NIP-45 count queries to show how many events each relay has.
- Adds Relay sync utility to help users move posts between relays.
Search:
- Breaks the search filter into two subscriptions to prioritize Metadata without punishing content.
- Fixes the need to start user searches with @ in user fields
- Fixes the stability of the search feed when the user navigates away and back.
- Replaces about me for NIP-05 in the user search results
- Adds relay URL search to the search page
- Forces returning one user when searching by nip-05
- Removes outdated versions of addressables from the search results
Profiles:
- Adds support for NIP-39 External Identities with kind 10011
- Adds a profile picture upload button when the user has no picture
- Adds last seen to the user profile
- Adds nprofile and npub copy options to the profile
- Groups received zap amounts by sending the user in the profile tab
- Increases the limit of Zap downloads for profiles to 1000
- Simplifies profile edit screen layout by @Dr. The Daniel 🖖
- Migrates profile galleries to display a thumbnail for videos
- Fixes profile galleries' aspect ratios
- Adds support for Namecoin .bit urls to NIP-05 and choice of ElectrumX server to resolve namecoins.
Onboarding
- Adds bulk follow screens to search for a user and to copy his/her follow list
Voice message by @⚡ Dee Kay ⚡
- Adds voice anonymization
- Change from "hold to record" to "click to start, click to stop"
- Display kind 1 voice replies as an audio waveform
- Increases max voice record duration to 600 seconds
- Switches the public message event to use quoted posts for replies
Fixes:
- Fixes "forked from" label rendering
- Avoids crashing when the `k` tag cannot be parsed to a number
- Only use Voice Reply events when replying to voice notes. Others just receive a URL.
- Fixes the lack of update in the follow count on the UserProfile page
- Fixes out of memory when downloading large videos
- Fixes Jackson deserialization for empty Filters and add regression test by @greenart7c3
- Fixes NullPointerException when the filter contains tags
- Fixes download cancellations when screen components disappear
- Migrates to use "title" instead of "name" tags for NIP-51 lists
- Adds a longer crop for npubs so that we can see vanity keys better
- Fixes the need to have tags and kinds for inbox.nostr.wine to work
- Blocks the size of Relay Auth Status arrays from growing forever with auth messages
- Fixes crash when getting OpenGraph tags of invalid URLs
- Fixes NIP-44 key mutation in NIP-46 connect
- Location permission watcher moved outside screens to avoid recreation
- Solves the sorting contract crash on search by precaching all values before sorting users.
- Fixes lingering relay connections from loading follows outbox's settings.
- Enhance NIP-38 user status display with emoji support and metadata tags
- Fixes bug on Show More calculations for very long texts without spaces
- Fixing IO Dispatchers and coroutine scopes of choice
- Fixes anySync parallel operation that was returning the first result, not the first positive "any".
- Fixes Req onCannotConnect listeners to the relays that actually sent the req
- Fixes hanging subscriptions when exceptions happen during NostrClient utility methods
Defaults:
- Switches wss://nostr.band to wss://antiprimal.net, wss://relay.ditto.pub on app defaults
- Adds wss://nostr.wine, wss://news.utxo.one as favorite relay feeds
- Adds wss://directory.yabu.me and wss://profiles.nostr1.com as index relays
- Adds electrumx.testls.space, nmc2.bitcoins.sk, 46.229.238.187 and i665jpwsq46zlsdbnj4axgzd3s56uzey5uhotsnxzsknzbn36jaddsid.onion as ElectrumX servers
Quartz:
- Adds Relay Server implementation with NIP-45 COUNT and NIP-42 AUTH support
- Adds support for dynamic auth policies to the relay implementation.
- Migrates Quartz EventStore from Android-only to KMP
- Adds a reqUntilEoseAsFlow extension to the Nostr Client
- Adds a reqBypassingRelayLimits extension to the Nostr Client
- Adds comprehensive NIP-46 Bunker support
- Adds comprehensive support for NIP-47 non-payment methods.
Adds complete support for iOS to Quartz by @KotlinGeek
- Provide implementation for Rfc3986 on iOS, using the Swift Rfc3986UriBridge.
- Provide implementation for LargeCache, using a CacheMap
- Provide implementation for fastFindURLs()
- Provide implementation for makeAbsoluteIfRelativeUrl() in ServerInfoParser.ios.kt
- Provide implementation for UrlEncoder
- Provide implementation for UnicodeNormalizer
- Provide implementation for GZip compression/decompression. Some small fixes in URLs.ios.kt
- Provide implementation for AESCBC
- Provide implementation for AESGCM
- Provide implementation for DigestInstance
- Provide implementation for LibSodium
Amethyst Desktop by @Minced Beef Energy
- Adds NIP-46 Bunker Login
- Adds Support for Chess
- Adds Thread Screens
- Adds advanced search with query engine and filter panel
- Adds encrypted DMs (NIP-04/NIP-17)
- Adds proper empty states with EOSE tracking
- Adds multi-column deck layout
- Adds Full media parity — images, video, audio, encrypted DMs, upload, lightbox
- Adds advanced search with NIP-50, collapsible sections, and nav state preservation
- Clear stored credentials on logout
- Adds bunker heartbeat indicator
- Adds QR-based signer pairing
- Migrates lifecycle-viewmodel KMP dependencies to KMP/Commons
- Migrates drawReplyLevel modifier to KMP/Commons
- Migrates ThreadFilter to KMP/Commons
- Migrates Card interface and CardFeedState to KMP/Commons
- Migrates Channels (public chats, ephemeral channels, and live streams) Account modules to KMP/Commons
- Migrates private chatroom models to KMP/Commons
- Migrates reports states to KMP/Commons
- Migrates Emoji State to KMP/Commons
- Migrates lud06 to lud16 mapping to KMP/Quartz
- Migrates the new LocalCache observables to KMP/Commons
- Migrates rich text parser from JVM to KMP/Commons
Code Quality
- Migrates to AGP 9.0
- Adds Amethyst Desktop to CI/CD and Release builds
- Removes the in-app memory counter methods
- Refactors the old NIP-05 code on Quartz
- Migrates contact list management to addressable notes
- Creates new observable flows for LocalCache.
- Moves metadata methods from User to UserCache objects
- Separate Addressable vs Replaceable event class bases
- Avoid dependency on AccountSettings for NwcSignerState
- Finishes the transition to EventHint objects for building events.
- Lots of code review fixes by @⚡ Dee Kay ⚡
- Large accessibility review by @⚡ Dee Kay ⚡
- Moves Top Nav Filter markers from Strings to full objects.
- Removes support for feed definitions
- AccountState refactoring
AI:
- Add SKILL.md for AI agent customization
- Add settings and hooks to setup Android Development for the agent
Updated translations:
- Czech, German, Swedish, and Portuguese by @⚡ Dee Kay ⚡
- Hungarian by @summoner
- French by @Anthony 🇫🇷
- Polish by @Polak
- Hindi by @राज
- Slovenian by @StellarStoic
- Bengali by @Cats😺
- Chinese by hypnotichemionus4
- Spanish by @⚡₿it₿y₿it⚡
Attestr
Search assertions, publish attestations, and review lifecycle status, comments, and zaps.
#Amethyst v1.04.0: Lists for all
This version adds support for creating, managing, deleting, and viewing follow lists, which include both public and private members. We've also added similar UI to support for creating, managing, deleting, and viewing follow packs from following.space, allowing you to assemble following lists not only for yourself, but also as a starter packs for other users. You will find a new "My Lists" menu option in the side bar and Follow buttons when extended behavior to add users directly into lists or packs.
This version also introduces significant improvements to the quality of video compression and hash checks during media upload/download, along with new codecs and a new image gallery for displaying sequences of images in posts. The startup loading of outbox relay lists and user metadata for large follow lists (> 1000 people) has been significantly improved with new mechanisms to search for missing outbox relay lists.
The Top Bar filter "All Follows" now merges all follow lists, follow packs, following hashtags, following geotags, and following communities into a single feed. Two new options were also added: "All User Follows," which includes only the main and other follow lists, and "Default Follow List," which is the standard follow list used by every client.
Finally, we completed our Quartz migration to Kotlin Multiplatform, added significant performance improvements when processing events and running cryptographic procedures, as well as new ease-of-use extensions.
New Features:
- People List creation and management by @KotlinGeek
- Follow Pack creation, management and feed view
- Image gallery in posts by @⚡ Dee Kay ⚡
- Finishes migration of Quartz to Kotlin Multiplatform
- New Filters in the top nav bar
- Performance improvements across all features
Improvements:
- Adds support to rejection replies from NIP-55 signers by @greenart7c3
- Adds live/offline indicator to live bubbles by @⚡ Dee Kay ⚡
- Refines the video compression procedure by @⚡ Dee Kay ⚡
- Replaces MP4 parser libraries with native MediaMuxer / MediaCodec by @⚡ Dee Kay ⚡
- Adds a H.265/HEVC codec to reduce file size by up to 50% while maintaining the same quality by @⚡ Dee Kay ⚡
- Optimizes video file structure by moving metadata to the beginning, so videos start playing more quickly by @⚡ Dee Kay ⚡
- Adds "All User Follows" feed filter in the top nav bar that removes hashtags, communities and geotag follows
- Adds "Default Follow List" feed filter in the top nav bar that contains only Kind 3 follows
- Shows a dialog to select a signer when using multiple signers are present by @greenart7c3
- Saves bandwidth by avoiding constant REQ updates before EOSEs come back in a subscription
- Changes the following icon on top of user's pictures to include follows in all lists and follow sets
- Removes non-outbox relays from the outbox lists
- Adds support bigger, up to 4GB, payloads in NIP-44
- Restructures the default REQ limits from each relay in all feeds
- Adds a guarantee incoming message order to OkHttp websocket implementations to avoid EOSE mismatch
- Only downloads DMs and Drafts if the account is writeable / nsec is present
- Adds support for copying/cloning follow lists in the UI.
- Adds a default relay list for indexers in new accounts with local backup
- Smoothes the disappearing effect for the Top and Bottom navigation.
- Adds support for NWC deep links and removes hardcoded Alby integration
- Adds a missing outbox relay list popup on posting new notes
- Adds a missing inbox relay list check on notification screens
- Migrates to njump.to to disperse shareable links
Quartz:
- Migrates Quartz from Android to CommonMain (Kotlin Multiplatform)
- Adds a maven publishing to ship quartz
- Fully converts OpenTimestamp Java codebase to Kotlin, migrating the sync and async HTTP call interfaces to OkHttp and coroutines
- Redesigns parsing of relay commands, messages and filters for performance in Jackson.
- Uses KotlinX Serialization when speed is not a requirement
- Migrates all Jackson field annotations to Kotlin Serialization
- Migrates Regex use in Quarts to Kotlin's Regex class
- Migrates Base64 library from Android to Kotlin
- Migrates UUID library from Android/Java to Kotlin
- Migrates LRUCache usage from Android/Java to Kotlin collections
- Migrates all String to bytearray conversions to Kotlin methods
- Migrates all System.arraycopy calls to kotlin native ones.
- Separates parsing code from the data classes in Companion objects
- Exposes Rfc3986 normalizations to each platform.
- Exposes URI parsing classes to each platform.
- Exposes URL Encoders to each platform.
- Exposes BigDecimal to each platform.
- Exposes the Url Detector to each platform.
- Exposes Mac instances to each platform
- Exposes Diggest instances to each platform.
- Exposes BitSet to each platform.
- Exposes GZip to each platform.
- Exposes Secp256k1 to each platform.
- Exposes SecureRandom to each platform.
- Exposes Time in seconds to each platform.
- Exposes the LargeCache to each platform.
- Exposes AES CBC and AES GCM encryption/decryption to each platform
- Migrate test assertions to Kotlin Tests
- Exposes Address class to each platform because of the Parceleable requirement in Android
- Creates our own ByteArrayOutputStream.
- Removes threadsafe features inside our Bloomfilters because we don't need that consistency
- Migrates UserMetadata parser from Jackson to Kotlin serialization
- Removes @Static methods in each tag.
- Adds an EventTemplate serializer
- Removes the need for KotlinX Datetime
- Adds support for LibSodium in the JVM desktop platform
- Creates a shared test build for iOS targets
- Increases the Bloom filter space to better use hints in the app.
- Removes support for iOS in x86
- Creates a performant JacksonMapper just for NIP-55, which stays in the Android build only.
- Keeps the event store in the android build due to the SQL Lite dependency
- Removes @syncronized tags in favor of Mutexes.
- Improved sendAndWaitForResponse NostrClient method to properly account for returns from each relay.
- Removes the need for GlobalScope and async calls
- Removes the dependency on Jackson's error classes across the codebase.
- Moves the hint to quote tag extension methods to their own packages.
- Migrates NIP-06 and Blossom uploads to use Kotlin Serialization
- Adds ease of use functions for the downloadFirst nostr client extension method
- Refactors error logging in BasicRelayClient
- Starts NostrClient in active instead of waiting for a connect() call
- Adds initial test cases for NostrClient and extensions
- Adds an option to ignore failed reconnection delays that should be used when the network settings change.
- Adds a build template option for NIP-42 AUTHs
- Moves quartz to Java 21 due to binary inconsistencies between the multiple builds of KMP (tests conflicting with main)
- Adds support for COUNT relay messages
- Treat COUNT as query only, not subscriptions in the NostrClient
- Moves statistics collection out of the inner classes to be an external option for app developers instead.
- Restructuring relay classes to maintain order of incoming messages for relay listeners
- Defers all processing of incoming messages to coroutines via channels, freeing OkHttp's thread as soon as possible.
- Simplifies the main relay class by using attached listener modules for each function of the relay client.
- Migrate defaultOnConnect calls to become listener based and moved to NostrClients
- Coordinates REQs so that if an update is required to be sent but the server has not finished processing events, waits for it to finish and sends it later as soon as EOSE or Close arrives
- Correctly maintain the local and server state of each Req.
- Avoid subsequent REQ updates before EOSE or CLOSE calls.
- Refactors NostrClient authenticators to do complete operation as an optional module
- Breaks down Relay Client modules (Auth, Reqs, Counts, Event submissions) in the Relay Pool class.
- Creates listeners just for REQ subscriptions
- Move statistics to outside the base relay class as a listener
- Move logs to outside the base relay class as a listener
- Better structures a Standalone Relay client
- More appropriately communicate errors to the listeners
- Remove relay states on listeners, move each to its own method
- Removes the hardcoded Dispatchers on Quartz
- Adds streaming hash utility function, follow the existing pool/worker design
- Adds fast search for events and addresses in the Deletion Event
- Adds an update method for to create a new event template from an event.
Fixes and UI Improvements:
- Changes the DVM feed to sort by follows that liked or zapped the DVM
- Changes the icon of account preferences to translation for now
- Improves click and long press interactions with the relay list item and status bar items
- Fixes the visual references to communities and hashtags in the top right of the post
- Removes disappearing top and bottom bars from settings screens
- Fixes tall top bars on Ephemeral and Public Chat rooms
- Fixes lack of live stream name on the top bar
- Fixes animations to navigate from and to list screens
- Fixes cursor behind the keyboard when typing long texts.
- Fixes line wrap in the relay info top nav bar title
- Moves message button to Profile Actions
- Fixes User profile banner being off place in short images
- Also fixes spacing of the Follow button
- Adds an option to render a user gallery from hex keys instead of full User objects
- Adds context to the highlights
- Increases the contrast of placeholder text
- Refines performance of the QuickAction menu bar
- Fixes hidden words not being applied to NIP-04 DMs on notifications
- Fixes not loading some event kinds in notifications
- Fixes crash when updating a metadata with null name
- Fixes crash when attempting to share an image that is still loading by @⚡ Dee Kay ⚡
- Fixes disappearing stats on relay screen by @⚡ Dee Kay ⚡
- Fixes proper switch between single and two-pane layouts on rotation by @⚡ Dee Kay ⚡
- Fixes sendAndWaitForResponse never receiving a response by @greenart7c3
- Fixes NWC URI parsing bug by @⚡ Dee Kay ⚡
- Fixes bookmark removal from Private/Public removing from both by @⚡ Dee Kay ⚡
- Fixes OutOfMemoryError for large file uploads by @⚡ Dee Kay ⚡
- Fixes DecryptZapRequest CommandType by @greenart7c3
- Fixes location being added to note even after deselecting it by @greenart7c3
- Fixes crash when trying to parse unparseable NIP-11s
- Prevents resource leaks with file streams by @⚡ Dee Kay ⚡
- Removes any relay url that has a percent-encoded null byte, regardless of size
- Forces streaming url online check when the stream is offline but the user enters the chat
- Fixes duplicated loading of NIP-11 relay info by different parts of the screen
- Fixes the new Video events as non replaceable, while keeping the old ones in the replaceable
- Fixes crash on starting when the contentResolver is not ready yet.
- Fixes addressable deletions deleting not only the past when updating feeds
- Fixes long form previews when missing the author's picture
- Fixes feed filter update when changing the top nav filter
- Fixes crash when sorting with the same createdAt in the discovery feeds
- Fixes reply routes when clicking in the Conversations tab when the event is a PublicChat, LiveStream or Ephemeral Chat
- Fixes livestream chats appearing on home bubbles after the live stream is finished
- Fixes not sending the live stream events anywhere when the stream doesn't have a relay set declared
- Fixes animations when selecting Tor options in the privacy screen
- Fixes animations jumping when loading privacy screen
- Fixes the use of index relays and search relays to load users and events as well as become the default for global feeds.
- Fixes mark as read when drafts are the latest message in the chat
- Fixes showing blog posts in the future in the Discovery reads
- Fixes crashing when comparing int and long in Live Events comparator
- Fixes recompositions of subject add-on to text on rendering
- Fixes crash on trying to change dont translate from options
- Fixes NPE on the ln invoice callback with errors parser
- Fixes parsing encrypted NIP-28 chats
- Fixes disappearing relay stats (larger LRU cache)
- Fixes sendAndWait nostr client coroutine that was waiting forever
- Fixes lack of req by forcing an updateFilter at the start of new subs with the client.
- Fixes bug that skipped loading follow's metadata on startup
- Fixes issues when unfollowing a hashtag from old contact lists
- Fixes relay list flickering bug
- Fixes crash when checking and creating new users from `p` tags.
- Fixes the author of the highlight
- Fixes scope lifecycle of media uploads to avoid cancellation while uploading
- Fixes parser for null and default values from NIP-55 using Jackson
- Fixes relay icons not showing up when sending DMs
- Fixes imeta parsing with multiple urls
- Fixes relay-specific global feed matching incoming note checks
- Fixes video progressive download by @⚡ Dee Kay ⚡
- Fixes several usages of Reflection when serializing classes
- Fixes a bug on loading event test database for the HintBloom filter test
- Forces relay status updates when connecting and disconnecting
- Only shows live stream bubbles that are not playing 24/7 with active follows in the past 15 minutes.
- Opens Follow Packs on following.space
Performance:
- Restructures the parser and serialization of the relay messages and commands for performance
- Speeds up the generation of Bech32 addresses
- Migrates memory counters from Long to Int
- Avoids using JSON parsers with DataStore to speed up loading time (loading the parser itself takes ~300ms)
- Adds new benchmarks for NIP-44 operations
- Reduces memory consumption for NIP-44 operations, avoiding GC
- Faster Hkdf functions with less array copying and allocations (which can be impactful if the ciphertext is large)
- Faster Mac calculations by avoiding array assemblies before calling the function
- Faster Hash check calculations avoiding the creation of a separate bytearray to compare ids
- About 30-40% event hashing performance boost by building the json by hand and skipping string encoders when not needed.
- 30% Faster isHex for strings with precisely 32 bytes.
- Loads the main account in parallel faster before the screen needs it
- Merge expanding and checking HMac functions to avoid re-creating the Mac instance.
- Separates EOSE cache for drafts alone.
- Speeds up the loading of users in follow lists on start up
- Speeds up OkHttp startup
- Adds submap index queries to the addressable large cache
- Performance improvement for the address serializer.
- Adds a default cut off for notifications from random relays to 1 week ago.
- Increases local video disk cache to 1GB
- Defers the initialization of disk caches for videos and images to a few seconds after loading
- Only listens to notification feed changes when the UI is visible
- Separates a relay failure tracker to a module
- Caches the User object for each Account to avoid being deleted by the soft reference on Local Cache
- Moves all Dispatchers.Default to the IO threadpool because of the amount of Synchronized code in dependencies blocking heavy threads
- Only download reports from the author's outbox relay if we have it (don't use our default bootstrapping relays for reports)
- Keep a local cache of following geoshahes and hashtags in lowercase.
- Don't intern signatures, content and stringified tags since they are not usually duplicated
- Unifies the parser for the tag array across the app
- Adds simplified extensions to create Requests from NostrClient
- Adds a Start request callback to the request listener
- Adds a req that returns the list of events in order of arrival
- Adds a flatten straight into a set utility
- Adds a decrypted people and follow list cache on the account class and updates TopNav to use the new caching
- Creates slim ListItem composables
- Marks address, user states, edits and channel metadata view models as Compose Stable
- Removes unnecessary list of icons drawer rows, which affected Compose stability
- Improves the composition of NIP-05 lines
- Adds a pre-parser to find image galleries and video links before rendering.
- Adds the user outbox relays when loading addressables by that user.
- Avoids sending CLOSE to subs that are already closed.
- Rejects additional urls with %20 and fixes "Wss" ones.
Code Quality
- Reduce http max requests when in emulator to avoid crashing by @⚡ Dee Kay ⚡
- Resolve intermittent CI build failures by @⚡ Dee Kay ⚡
- Fix benchmark apk location by @⚡ Dee Kay ⚡
- Change from runBlocking to runTest where appropriate by @⚡ Dee Kay ⚡
- Reduce errors in log: concurrent modification exception by @⚡ Dee Kay ⚡
- Moves the precision of mills to seconds on the isOnline Check
- Migrates to use suspending routines for OTS, statuses and edit flows
- Unify outbox calculation in the RelayOutbox loader
- Refactors zap the devs card view
- Creates an interface for NostrClient strategies
- Adds an isMobileOrFalse flow in connectivity to speed UI updates
- Removes one of the Application dependencies in viewmodel
- Changes the Theme class to only take the preferred theme directly.
- Adds dependency on NWC to Account to avoid linking directly with the Application class
- Migrates Account management to an Application lifecycle to prepare for multi-account screens
- Establishes a scope for each account loaded so that flows can be killed on sign off
- Moves the event processor to the Account class
- Creates an interface for the DualHttpClientManager to allow IDE previews
- Removing the dependency on an application class from AccountViewModel
- Removes dependency on the viewModel on AccountFeedStates
- Moves account saving from StateViewModel to Account
- Removes dependency on the application class from DecryptAndIndexProcessor
- Changes the name and singleton of the nav to avoid confusing the auto import
- Switches account cache to a flow to allow observers
- Removes dependency in the Amethyst class from Playback calculator
- Removes the dependency on windowSizeClass and displayFeatures to be passed in the global preferences of the app (which is activity independent)
- Moves the OTS processor from Account's decrypt process to Application since it doesn't need the account information.
- Separates Application dependencies into an AppModules class to create only after the OnCreate event.
- Switches TorSettings to be per Application and not per Account anymore
- Since TorSettings is now global, moves the okHttpClient determinations out of the Account-based classes into the Application.
- Since TorSettings is now global, set's up Coil's image loader only once when creating the Application
- Moves UISettings state to App Modules instead of viewmodel
- Migrates TorSettings and UISettings to DataStore
- New tor evaluator service for relay connections now uses all account's trusted relays and dm relays at the same time.
- Migrates composable-state-based UISettings to Flow-based UI settings, while observing connectivity status
- Removes the displayFeatures and windowSizeClass from the shared model
- Fixes not requesting Notification Permissions for APIs older than Tiramisu in the FDroid flavor
- Moves the NIP-11 document cache from singleton to the App Modules
- Avoids using AccountViewModel to check NIP-11 Relay documents
- Moves the UI Settings usage in composables to functions that do not observe the state since they don't need to refresh the screen when changed.
- Refactors UI Settings screen to separate components and remove the sharedViewModel
- Only starts Internal Tor if that option is selected in the TorSettings.
- Turn TorSettings into a data class to observe changes to it
- Drops the SharedPreferences ViewModel to use UISettingsFlow directly from App Modules
- Reorganizes OTS Events after simplification of the OkHttp based on TorSettings.
- Applies memory trimming service to all logged-in accounts at the same time
- Adds a test for native vs libsodium chacha20
- Added test for emulator to set maxRequests to 128 to prevent crashing emulator by @⚡ Dee Kay ⚡
- Dumps the number of relay hints urls in the DB
- Creates our own Coil Logger to minimize trash stacks in the logs
- Adds a declared outbox lists for follows state
- Removes the deprecated hacks to store communities, hashtags and geohashes on Contact Lists
- Updates deprecated Clipboard manager
- Updates emoji and user autocomplete state to use Account and avoid linking AccountViewModel
- Refactors many viewModels to avoid using callback lambdas
- Correctly marks EOSE for filters that are aligned with the Req State from NostrClient
- Changes User loading features in a tentative to make them faster since they are used by all functions in the app.
- Creates an Account follow list per Relay state that only includes shared relays as a better source of functioning relays
Deprecations:
- Removes fmt.wiz.biz from bootstrap relays
- Removes void.cat from default servers by @⚡ Dee Kay ⚡
- Removes filestr share links
- removes zapstr.live share links
Updated translations:
- Czech, German, Swedish and Portuguese by @⚡ Dee Kay ⚡
- Hindi by @राज
- Slovenian by @StellarStoic
- Polish by @Polak
- Hungarian by @Zoltan ⚡️ @summoner
- Spanish by @⚡₿it₿y₿it⚡
- Latvian by @ℂ𝕠𝕠𝕠𝕝
- Dutch by @Bartus
- French by @Anthony 🇫🇷
- Chinese by @CXPLAY
- Thai by @123🦈ปลาฉลามขึ้นบก
- Persian by @L
Download: 

Amethyst - Nostr Client for Android
Join the social network you control. The most feature-rich Nostr client for Android.
#Amethyst v1.00.0: Full Outbox
This version completes our migration to the outbox model, where the app dynamically manages the relay list used to pull posts from your follows' own relay lists. By default, the app will connect to relays that aren't in your lists through our embedded Tor. Normal usage will connect to hundreds of relays. Many of them will fail, and that's ok. Nostr has baked-in redundancy; these failures won't affect your experience.
New relay lists were added to the UI to help you manage how the app works. Specifically, you can now block relays and add trusted relays. Trusted relays will connect outside of Tor, which is faster, but allows those relays to see your IP. You should only add relays there if you trust the relay operator. Proxy relays (like filter.nostr.wine) can be added to the proxy list. After that, the app will only use those relays to download the content for your feeds, disabling the outbox model. DMs and other non-outbox functionality will still use their own relays. Broadcasting relays can be added to push your events out there. Every new event from the app will be sent to all broadcasting relays. Finally, the new Indexer list allows you to choose which relays to use to find users, like purplepages.es.
For users of our Quartz library, we have finished all of the work to change the library's mindset from a fixed list to a dynamic pool of relays. Now, each NIP has its own dedicated folder and defines its own tags and caching structures. This expansion allows us to add diverse functionalities such as relay clients, relay servers, event builders, Nostr filter builders, caching systems, deletion and event hint indexers, helper functions, and more—all specifically tailored to each individual NIP. This modular approach creates the space to develop each NIP independently and integrate them into Amethyst as distinct modules, while still sharing Amethyst's main relay and cache engine when necessary. We expect fewer breaking changes as we move forward with it. At some point, Quartz will move to its own repository and be converted to a Kotlin Multiplatform project for each NIP/module. This will allow us to build demo/testing applications for each NIP in the same repo.
This version adds support for:
- YakBak Voice Messages
- Picture-in-Picture pop-ups
- Public Messages
- Coolr.chat's Ephemeral Chats
- Follow packs
- Reads feed in the discovery tab
- Hidden cashu tokens in emojis
Features:
- Reengineered relay, relay pool, and nostr client to manage dynamic pools
- Reengineered note cache for a garbage collector-friendly version
- Reengineered media pre-loading and caching to minimize layout changes
- Reengineered decryption cache, now per account
- Reengineered chat channels cache
- Reengineered the indexing of Addresses to data classes
- Reengineered EOSE cache and managers
- Migrates to a Flow-based design for all account information and services
- Migrates to a Compose subscription model for relay filters
- Adds 90-day expiration to all drafts
- Deprecate stringified JSON in favor of tags on user metadata kind 0 events
- Adds support for live events at the top of the feed.
- Migrates Video events to non-replaceable kinds
- Migrates NIP-51 to use NIP-44 encryptions
- Migrates Chat, Community, Location, and Hashtag follows to their own lists
- Migrates to reply with NIP-22 for everything but kind 1s.
- Massively improves relay hint selections
- Removes relay picker when sending new posts
- Removes general relay list (kind3)
- Adds new relay lists: Trusted, Blocked, Proxy, and Broadcasting
- Moves most of the Dialogs to full-screen routes
- Breaks NewPostScreen and ViewModels into Screens and ViewModels for each supporting NIP
- Adds support for creating and replying to NIP-22 geo scope posts
- Performance Improvements by not re-verifying duplicated events
- Adds Content Sensitivity setting to the Security filter screen
- Adds Translation setting to a new screen.
- Extends AsyncImage to correctly use pre-loaded aspect ratio and avoid jitter
- Adds imeta tags for images and urls inside the content of the Classifieds
- Adds new default banner for empty profiles
- Finishes the migration from LiveData to Flow
- Restructures the old static datasource model into dynamic filter assemblers.
- Moves filter assemblers, viewModels and DAL classes to their own packages.
- Creates Composable observers for Users and Notes
- Unifies all Filter Assembler lifecycle watchers to a few classes
- Moves relay authentication to a coordinator class for all accounts in all relays.
- Moves the relay NOTIFY parser to its own coordinator class for all accounts
- Moves the connection between filters and event cache to its own coordinator class
- Adds support for Tor in push notifications
- Isolated Connectivity services, from Compose to Flow
- Isolated Tor services, from Compose to TorService
- Isolated Memory trimming services, from Compose to Flow
- Isolated Image Caching services, from Compose to Flow
- Isolated Video Caching services
- Isolated Logging services
- Isolated NIP-95 Caching services
- Isolated Pokey receiver services
- Isolated OkHttpClient-building services as flows
- Hold off on all DM attachments until the message is sent.
- Adds previews for any number of urls, events, and media uploads on new post screens.
- Adds zap split, zap raiser, and geolocation symbols for DMs and channel messages
- Adds picture upload for NIP-28 metadata
- Adds support for community relays on NIP-28
- Adds a pool of ExoPlayers when multiple videos are playing
- Moves DVM's last announcement restriction from 90 days to 365 days
Quartz:
- Adds a NostrClient with filter and event outbox cache
- Adds a Basic RelayClient and parsers for all relay commands
- Migrates signers from callback to suspending functions
- Migrates event create functions to builders with templates
- Migrates the filter design to a filter per relay
- Migrates hardcoded tag filters in events to the Tag's parser and assembly functions.
- Normalizes all relay URLs
- Formalizes relay hint providers per kind
- Event store support with SQLite
- Reengineered NIP-55 Android signer and its cache
- Reengineered exception handling for signer errors
- Adds support for the Request to Vanish NIP - 62
- Migrates all NIP-51 lists to the new event-tag structure.
- Migrates Drafts and NIP-04 and NIP-17 DMs to the new structure
- Migrates Bookmarks to the new structure
- Migrates NIP-56 to the newest tag structure
- Adds support for nip70 Protected Tags
- Adds full support for nip73 External Content IDs
- Adds support for NIP-48 proxy tags
- Removes the old "datasource" model
- Adds a Bloom-based hint indexer with MurMur hash
- Adds a PoW miner
- Restructures thread helpers for NIP-10
- Migrates Zap splits, zapraisers, subject, alts, and content warning to their own packages.
Dev Team:
- @Vitor Pamplona
- @Don't Believe The Vibe 🌱🍋🍊
- @greenart7c3
- @KotlinGeek
- @⚡ Dee Kay ⚡
Translations:
- Czech, German, Swedish, and Portuguese by @⚡ Dee Kay ⚡
- Dutch by @Bartus
- French by @Anthony 🇫🇷
- Polish by @Polak
- Chinese by @CXPLAY
- Slovenian by @StellarStoic
- Thai by @123🦈ปลาฉลามขึ้นบก
- Bengali by @Cats😺
- Hindi by @राज
- Spanish by @⚡₿it₿y₿it⚡
- Hungarian by @Zoltan ⚡️ and @summoner
- Persian by @L
Download: 

Amethyst - Nostr Client for Android
Join the social network you control. The most feature-rich Nostr client for Android.
#Amethyst v0.92.0: Tor and NFC-hosted transient accounts
This version ships with a Tor service enabled by default to access .onion urls and untrusted relays from the Outbox model. It also offers NFC-hosted transient accounts: accounts that log off as soon as the app goes to the background, deleting all traces of the account from the phone.
Write your ncryptsec to an NFC tag and hide it in your clothing. When you need to use Amethyst, tap the tag, insert your password and login. Lock the screen to delete everything. If you are an activist and if your phone is confiscated, they will never find anything on the phone. Not even your public key. Ncryptsec is a NIP-49-based password-encrypted nsec. If you need, you can destroy and dispose the NFC tag.
Features:
- Adds tor node
- Adds multiple settings for the use of Tor
- Adds privacy presets to simplify Tor choices
- Adds support for NFC-hosted transient accounts
- Adds button to take and add pictures from camera by @greenart7c3
- Adds Uncompressed option when uploading media by @⚡ Dee Kay ⚡
- Adds support for Bloom filters
- Adds zapstore yaml setup
- Adds mempool api to verify OTS via Tor
Bug Fixes
- Fixes the zap options available for the Zap the Devs button
- Fixes edit draft not working when using the quick action menu by @greenart7c3
- Fixes opengraph url preview tags from substack by @⚡ Dee Kay ⚡
- Fixes the parsing of d-tags with colons in them
- Fixes back button not working after opening a nostr link from the web
- Fixes push notifications when using amber by @greenart7c3
- Fixes NIP-47 implementation to force relay for the NWC connection.
- Fixes OTS web calls via Tor using mempool's api
- Fixes the loading of localhost urls using Tor
- Fixes .onion urls not using tor even if available
- Fixes show buffering animation when loading videos
- Fixes folowing icon position on chat user pictures
Performance
- Starts to build all OkHttp clients from a main root client to keep the same thread pool
- Caches OTS web calls to avoid pinging the server repeatedly for the same event.
Code Quality Improvements:
- Updates navigation compose, lifecycle, fragment, activity, composeBoms and AGP to 8.6.1
- Improves OTS Verification error messages
Updated translations:
- Czech, German, Swedish and Portuguese by @⚡ Dee Kay ⚡
- Dutch by @Bartus
- French by @Anthony 🇫🇷
- Polish by @Polak
- Chinese by @CXPLAY
- Slovenian by @StellarStoic
- Thai by @123🦈ปลาฉลามขึ้นบก
- Bengali by @Cats😺
- Hindi by @राज
- Spanish by @⚡₿it₿y₿it⚡
- Hungarian by @Zoltan ⚡️
Download via 

Amethyst - Nostr Client for Android
Join the social network you control. The most feature-rich Nostr client for Android.
#Amethyst v0.91.0: Edge to edge feeds
Hidden words now filter by the user's fields as well. You can hide by name, profile picture, banner, lightning and nip-05 addresses and about me fields.
Features:
- Finishes Edge to Edge transition for Android 15
- Adds compression settings to the media uploading screen by @⚡ Dee Kay ⚡
- Adds sliding animations in all inner screens
- Adds copy stack to clipboard for error messages that have an exception
- Enables the use of hidden words for all visible properties of the user
Bug Fixes
- Fixes blank alt field when no alt text is provided on NIP-96
- Fixes missing Private Home/Outbox relay list after loading from backup
- Fixes keyboard padding issues when using physical keyboards on the message screens.
- Fixes token sanitization when using gcompatup with unified push by @greenart7c3
- Fixes moving top buttons on the full screen dialog for images and videos.
- Fixes weird padding of the key backup screen
- Fixes using npub instead of pubkey in hex when communicating with Amber
- Fixes blinking on crossfades when the system's light/dark theme is different than the app's theme
- Fixes a mix of languages after changing language in Settings
- Fixes disables saving m3u8 files locally (streaming can't be saved)
- Fixes Community tab not loading up with Global filter
- Fixes size of default banner when the profile is not loaded yet.
Code Quality Improvements:
- Inverts Layouts to place Navigation on top of Scaffold and allow custom scaffolds per route
- Refactors navigation to improve clarity
- Restructures screens into their own packages
- Restructures navigation functions as a single object
- Refactors all TopBars to use default material 3 ones
- Simplifies the "and 2 more" translations for the relay recommendation user lists
- Removes unnecessary observers from the transition in the bottom nav layouts.
- Normalizes cache directories in the Application class
- Fixes text field recompositions because of new keyboard actions
- Moves the profile zap to threads
- Updates to AGP 8.6.0
- Updates zoomable and kotlin serialization
Updated translations:
- Czech, German, Swedish and Portuguese by @⚡ Dee Kay ⚡
- Thai by @123🦈ปลาฉลามขึ้นบก
- Dutch by @Bartus
- Hungarian by @Zoltan ⚡️
- Bengali by @Cats😺
- Polish by @Polak
- Hungarian by @Zoltan ⚡️
- Chinese by @CXPLAY
Download via [Obtainium](http://amethyst.social) or [Zap.Store](https://zap.store/)