diff --git a/docs/changelog/v1.12.00.md b/docs/changelog/v1.12.00.md index 433d691716..cd242507c0 100644 --- a/docs/changelog/v1.12.00.md +++ b/docs/changelog/v1.12.00.md @@ -2,45 +2,26 @@ Highlights: -- **Cashu wallet** — a new in-app NIP-60 ecash wallet. -- **CLINK payments** — a new Lightning rail with budgets and a unified Send Payment screen. -- **Private posts & reactions** — post, reply, react, and zap privately via NIP-17. -- **Workouts** — record and browse NIP-101e workouts in a dedicated feed. -- **Activity cards** — likes, zaps, and nutzaps render as rich gradient cards. -- **Software Apps** — a browsable NIP-82 app directory. -- **Music** — publish and browse music tracks and playlists. -- **Podcasts** — a new NIP-F4 podcast feed with favorites and an inline player. -- **Desktop** — image compression, a new media player, group DMs, and a refreshed feed. +- Adds Cashu wallet: a new in-app NIP-60 ecash wallet. +- Adds CLINK payments: a new Lightning rail with budgets and a unified Send Payment screen. +- Adds App Store Feed: a browsable NIP-82 app directory. +- Adds Private posts: post, reply, react, and zap privately via NIP-17. +- 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 -- **CLINK — a new Lightning payment rail.** - - CLINK = Common Lightning Interface for Nostr Keys. - - Pay and get paid through CLINK Offers and Debits. - - An interoperable Lightning-over-Nostr scheme. - - Profiles can show a tappable CLINK Offer chip. - - Pay a contact directly from their profile. -- **Spending budgets for CLINK debits.** - - Set one-time or recurring limits. - - A debit connection pulls funds only up to the cap you set. -- **Discover offers by NIP-05.** - - Resolve a person's payment offer from their `name@domain` address. -- **Unified Send Payment screen.** - - Reach Lightning, CLINK, on-chain Bitcoin, and Cashu/nutzaps from one place. - - A "Pay from" selector chooses which wallet the money leaves. -- **On-chain payments.** - - Pay Bitcoin payment targets from the in-app on-chain wallet. - - Pay a contact's on-chain "Bit" recipient directly. -- **Unified payment-rail chips** on the profile header. - - Long-press any chip to copy that destination. -- **Manage multiple wallets.** - - Add an NWC (Nostr Wallet Connect) wallet. - - Add a CLINK debit wallet. - - Add a Cashu wallet. - - Pick between them from the payment flow. -- **Cashu ecash wallet (new, NIP-60).** +- 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. @@ -49,243 +30,220 @@ Highlights: - 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 -- **Private posts and replies.** - - Composed and delivered as NIP-17 gift wraps. - - An editable "Notify" block picks exactly who can read a private post. -- **Private reactions.** - - React and un-react privately. +- 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. -- **Private zaps.** +- Enhances support for Private zaps - Zaps on private notes are forced private. - Replies to a private zap route into the sender's DM room. -- **NIP-32 hashtag labels.** +- 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. -- **Compose polish.** +- Enhances post's compose screen - Richer notify chips in the new-post screen. - Modernized inline payment cards that show their descriptions. - - Quote-reposts (NIP-18) now count in the repost counter. -- **Hidden Words moderation.** +- 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 -- **Pin DM conversations** to the top of your chat list. +- 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. -- **@-mention search in Marmot (MLS) group chats.** +- 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. -- **Quoted chat messages in bubbles.** +- 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. -- **MLS reliability.** +- Fixes MLS reliability - Unread state now persists across app restarts. - The kind:445 backlog is no longer refetched on every launch. -- **Share to DM ("Send as DM").** +- 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. -- **Reply to zaps from the notification screen.** - - Reply directly to a zap from Notifications. - - Nutzap chips reply on long-press. -- **Group DMs (NIP-14 subjects).** - - 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. ### Reading & Feeds -- **Render LaTeX math** in notes. +- 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 +- Adds support for LaTeX math in notes. - Use `$...$` for inline equations. - Use `$$...$$` for block equations. -- **Activity cards.** +- 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. -- **Workouts (new, NIP-101e).** +- 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. -- **Music (new).** +- 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. -- **Software Apps directory (new, NIP-82).** +- 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. -- **App recommendations (NIP-89).** +- Enhances support for App recommendations (NIP-89). - Editable recommendations on your profile. - Tiered ordering in the recommendations editor. - Richer app cards with author attribution. -- **New community renderers.** - - Birdex species collections (kind 12473). - - Agora fundraiser campaigns (kind 33863). -- **Cleaner feeds.** - - Reactions and zaps anchor their own thread view. - - Reposts of an unsupported kind are hidden instead of showing blank cards. -- **Audio visualizer (new).** +- 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. -- **Podcasts (new, NIP-F4).** +- 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. -- **Video.** - - Swipe for brightness and volume in fullscreen video. - -### Settings - -- **Searchable settings.** - - A search box filters rows by title and curated keywords. - - Supports prefix matching and an empty-state. - -## Performance - -- Pinned-DM state reads are deferred to the row and menu. - - The chat list stays smooth. -- Parsed CLINK offers are cached for NIP-05 lookups. - - Uses case-insensitive keys. -- The "fix missing spaces" pass indexes URLs by their first character. - - Avoids repeated scans. ## Improvements and Bug fixes -- **Notifications.** - - The old "Global" tab is split into "Selected" (curated) and a raw "Global". - - Replies to likes/zaps now reach the "Curated" feed. - - The legacy "Global" filter migrates once to "Curated". - - A reply to a like/zap no longer drags in the original post's whole thread. -- **Note search.** - - No longer matches on `p`, `e`, `a`, `alt`, or `client` tags. - - Results are cleaner. -- **Anonymous posting.** - - Profile zaps that should be anonymous are no longer encrypted as private zaps. - - Media uploads in anonymous posts use an ephemeral signer. -- **Wallet.** - - The Cashu wallet row shows the Cashu logo instead of a generic icon. - - Own on-chain zaps highlight the bolt and show as pending in the counter. - - Tidied the wallet screen layout. - - Removed the wallet reordering drag-and-drop UI. -- **Zap settings.** - - Preset amounts are de-duplicated, so drag-to-reorder keeps working. - - Fixed the chip-drag interaction. -- **Cashu top-up** is now crash-safe on retry. - - Funds are checkpointed the instant they leave the wallet. - - They are never re-moved on a retry. -- **Zap popup.** - - Reacts to Lightning-address and Cashu/nutzap info as it loads. - - The payment rails now appear live as they resolve. -- **Tor.** - - Relay backoff is honored during Tor bootstrap. - - Payment and wallet relay connections now honor the "Money operations via Tor" setting. - - Previously they were forced over Tor, which broke NIP-47 and CLINK on Tor-blocking services. - - Sockets opened on the wrong transport are rebuilt. -- **DM history loading.** - - 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. -- **Live streams.** - - Fixed the live-stream chat relay fallback. -- **Polls.** - - Zap and non-zap polls now share the same option text. -- **Video.** - - Legacy NIP-71 videos resolve their address from the real `d` tag. -- **Media server.** - - The default media server no longer resets on every launch. -- **Accounts.** - - Deleting an account now clears its cached entry. -- **Metadata.** - - A non-spec birthday value can no longer drop an entire profile. -- **Deletions (NIP-09).** - - Deleting a note now severs child back-references. - - It detaches on-chain-zap, nutzap, and channel sources from the cache. -- **Hardening.** - - Many audit fixes across the private-posts, CLINK, and MLS paths. - - Covers off-main-thread crypto and leak prevention. - - Hides share/bookmark on private notes. -- **General.** - - Reduced runtime log noise. - - Fixed several edge-case crashes. +- 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. +- 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 -- **Image compression on upload.** +- 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. -- **New media player.** +- Adds new media player. - Replaced vlcj with kdroidFilter's ComposeMediaPlayer. - Uses a JCodec/FFmpeg backend. -- **Group DM parity with Android.** +- 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. -- **Replies tab** on the user profile. +- Adds Replies tab on the user profile. - Feeds also show reply context (parent embed plus label) inline. -- **Feed refresh.** +- 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.** +- 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. -- **Unhealthy-relay review.** +- Adds Unhealthy-relay review. - A banner and popup that flag relays behaving poorly. -- **Namecoin diagnostics.** +- Adds Namecoin diagnostics. - The diagnostics card was ported from the Android settings. ## Cli -- `amy offer` — CLINK offer info and request, including `--payer-data`. -- `amy debit` — CLINK debit info, pay, and budget. -- `amy zap --with ` — settle a zap invoice via a CLINK debit. -- `amy offer discover ` — resolve a profile's offer through NIP-05. +- Adds `amy offer` — CLINK offer info and request, including `--payer-data`. +- Adds `amy debit` — CLINK debit info, pay, and budget. +- Adds `amy zap --with ` — settle a zap invoice via a CLINK debit. +- Adds `amy offer discover ` — resolve a profile's offer through NIP-05. - Closed CLINK parity gaps (profile offer, follow, offer pay, GFY detail). -- Added a clink-headless interop harness. +- Adds a clink-headless interop harness. ## Quartz -- **Relay-server toolkit.** - - A `Flow` REQ-responder SPI with a storage-free dispatch engine. - - NIP-50 search parsing. - - Suspendable auth hooks. +- Adds Relay-server toolkit. + - Added a `Flow` REQ-responder SPI with a storage-free dispatch engine. + - Added NIP-50 search parsing. + - Added suspendable auth hooks. - Split engine/backend/policy packages. -- **NIP-45 approximate COUNT.** - - HyperLogLog construction, with wire support. -- **NIP-11.** +- 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. -- **Connection observability.** +- 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. -- **NIP-46.** - - Fixed a bunker double-resume and retry id-reuse race. -- **Other.** - - Fixed `q` (quote) tags being dropped by an inverted guard. - - Registered `CommunityRulesEvent` and CLINK DTO serializers (incl. Kotlin/Native). - - Relay failure logs are now diagnosable (exception class on null message, correct NIP-11 error label). +- 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 @@ -314,17 +272,19 @@ Highlights: - 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 and the Namecoin design doc. + - 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 (@npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z) -- davotoula -- nrobi144 -- mstrofnone -- Daneul Kim +- @npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z +- @npub1e2yuky03caw4ke3zy68lg0fz3r4gkt94hx4fjmlelacyljgyk79svn3eef +- @npub12cfje6nl2nuxplcqfvhg7ljt89fmpj0n0fd24zxsukja5qm9wmtqd7y76c +- @npub1w4uswmv6lu9yel005l3qgheysmr7tk9uvwluddznju3nuxalevvs2d0jr5 +- @npub1a3tx8wcrt789skl6gg7rqwj4wey0j53eesr4z6asd4h4jwrd62jq0wkq4k +- @npub1dn0tej4a5806qk9ts56j572sndvjk27l5qmsxf0z3mquknccve7s4k8tfp ## Translations