diff --git a/docs/changelog/v1.12.00.md b/docs/changelog/v1.12.00.md index 0500c90f4a..7a9c5e66d6 100644 --- a/docs/changelog/v1.12.00.md +++ b/docs/changelog/v1.12.00.md @@ -2,60 +2,67 @@ Highlights: -- **Cashu wallet** — a new in-app NIP-60 ecash wallet with mint management, top-ups, and NIP-61 nutzaps. -- **CLINK payments** — a new Lightning rail with spending budgets, NIP-05 offer discovery, and a unified Send Payment screen. -- **Private posts & reactions** — post, reply, react, and zap privately, all end-to-end encrypted via NIP-17 gift wraps. -- **Workouts** — record and browse NIP-101e workout records (kind 1301) in a dedicated feed. -- **Math in notes** — write inline and block LaTeX that renders right in the timeline. -- **Audio visualizer** — a live, styleable visualizer that reacts to whatever audio is playing. -- **Activity cards** — likes, zaps, and nutzaps render as rich gradient cards that tap through to the thread. -- **Software Apps** — a browsable NIP-82 app directory, plus editable NIP-89 app recommendations on your profile. -- **Music** — publish and browse music tracks and playlists, with their own feeds. -- **Pinned DMs** — pin important conversations to the top of the chat list, synced across devices. -- **Desktop** — image compression on upload, a new media player, group-DM parity, a Replies tab, and a refreshed feed. +- **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. +- **Math in notes** — write inline and block LaTeX in the timeline. +- **Audio visualizer** — a live, styleable visualizer for whatever audio is playing. +- **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. +- **Pinned DMs** — pin conversations to the top of the chat list. +- **Desktop** — image compression, a new media player, group DMs, and a refreshed feed. ## New Features ### Payments -- **CLINK — a new Lightning payment rail.** Pay and get paid through CLINK Offers and Debits, an interoperable Lightning-over-Nostr scheme. +- **CLINK — a new Lightning payment rail.** + - Pay and get paid through CLINK Offers and Debits. + - An interoperable Lightning-over-Nostr scheme. - Profiles can show a tappable CLINK Offer chip. - - You can pay a contact directly from their profile. + - 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 straight from their `name@domain` address. -- **Unified Send Payment screen.** Reach every rail from one place: - - Lightning, CLINK, on-chain Bitcoin, and Cashu/nutzaps. +- **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 and pick between wallet types from the payment flow. +- **Manage multiple wallets.** - Add an NWC (Nostr Wallet Connect) wallet. - Add a CLINK debit wallet. - Add a Cashu wallet. -- **Cashu ecash wallet (new, NIP-60).** A full in-app ecash wallet, beyond the previous redeem-only support. - - Create and add a Cashu wallet, with a dedicated wallet screen and settings. + - Pick between them from the payment flow. +- **Cashu ecash wallet (new, NIP-60).** + - 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. - - A standalone mint top-up screen. - - Per-mint balances on the wallet. - - Send NIP-61 nutzaps from the wallet, with a send progress bar that matches the Lightning experience. + - Top up a mint from a standalone screen. + - See per-mint balances on the wallet. + - Send NIP-61 nutzaps from the wallet. + - A send progress bar that matches the Lightning experience. ### Posting & Privacy - **Private posts and replies.** - Composed and delivered as NIP-17 gift wraps. - - An editable "Notify" block lets you choose exactly who can read a private post. + - An editable "Notify" block picks exactly who can read a private post. - **Private reactions.** - React and un-react privately. - Safeguards prevent private content from leaking publicly. - **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.** Add first-class hashtag labels to posts. +- **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.** @@ -70,17 +77,19 @@ Highlights: - **Pin DM conversations** to the top of your chat list. - Pins sync across devices via a NIP-78 app-data event. -- **@-mention search in Marmot (MLS) group chats.** Search and tag users in the group composer. +- **@-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** now render inside chat bubbles with the proper chat-reply design. - - The redundant reply row is skipped when the message is already quoted inline. +- **Quoted chat messages in bubbles.** + - 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.** - Unread state now persists across app restarts. - The kind:445 backlog is no longer refetched on every launch. - **Share to DM.** - A new "Share to DM" route sends content straight into a conversation. - - The room screen accepts a shared attachment so the draft opens pre-filled. + - The room screen accepts a shared attachment, so the draft opens pre-filled. - **Reply to zaps from the notification screen.** - Reply directly to a zap from Notifications. - Nutzap chips reply on long-press. @@ -94,16 +103,20 @@ Highlights: - 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 feed.** A dedicated feed for NIP-101e workout records (kind 1301). -- **Music (new).** Tracks (kind 36787) and playlists get first-class support. +- **Workouts feed.** + - A dedicated feed for NIP-101e workout records (kind 1301). +- **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).** Browse software applications (kind 32267). +- **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).** Editable recommendations on your profile. +- **App recommendations (NIP-89).** + - Editable recommendations on your profile. - Tiered ordering in the recommendations editor. - Richer app cards with author attribution. - **New community renderers.** @@ -111,11 +124,13 @@ Highlights: - Agora fundraiser campaigns (kind 33863). - **Cleaner feeds.** - Reactions and zaps anchor their own thread view. - - Reposts whose boosted kind isn't supported are hidden instead of showing blank cards. -- **Audio visualizer (new).** A live visualizer that reacts to the audio you're playing. + - Reposts of an unsupported kind are hidden instead of showing blank cards. +- **Audio visualizer (new).** + - A live visualizer that reacts to the audio you're playing. - Real-time FFT spectrum driven from the playback PCM stream. - Selectable styles: Classic, Static, Aurora, Waves, and Radial. - - A settings screen with live previews; your choice syncs via NIP-78. + - A settings screen with live previews. + - Your choice syncs via NIP-78. - Fills the height in fullscreen and shows a fixed strip in the feed. - **Podcasts.** - Tap a podcast to open a show screen listing all its episodes. @@ -132,9 +147,12 @@ Highlights: ## Performance -- Pinned-DM state reads are deferred to the row and menu, keeping the chat list smooth. -- Parsed CLINK offers are cached for NIP-05 lookups, using case-insensitive keys. -- The "fix missing spaces" pass indexes URLs by their first character to avoid repeated scans. +- 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 @@ -150,7 +168,7 @@ Highlights: - 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 now shows the Cashu logo instead of a generic icon. + - 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. - **Zap settings.** @@ -159,39 +177,54 @@ Highlights: - **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.** It now reacts to Lightning-address and Cashu/nutzap info loading, so the payment rails appear live as they resolve. +- **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. - A new "money operations" relay category keeps payment traffic on the right transport. + - 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, and the sync marker is 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 now 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. + - 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, leak prevention, and hiding share/bookmark on private notes. -- Reduced runtime log noise. -- Fixed several edge-case crashes. + - Covers off-main-thread crypto and leak prevention. + - Hides share/bookmark on private notes. +- **General.** + - Reduced runtime log noise. + - Fixed several edge-case crashes. ## Desktop -- **Image compression on upload.** A new compression pipeline with: +- **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.** Replaced vlcj with kdroidFilter's ComposeMediaPlayer (JCodec/FFmpeg backend). -- **Group DM parity with Android.** Desktop now handles group direct messages the same way. +- **New media player.** + - Replaced vlcj with kdroidFilter's ComposeMediaPlayer. + - Uses a JCodec/FFmpeg backend. +- **Group DM parity with Android.** + - Desktop now handles group direct messages the same way. - **Replies tab** on the user profile. - Feeds also show reply context (parent embed plus label) inline. - **Feed refresh.** @@ -205,8 +238,10 @@ Highlights: - 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.** A banner and popup that flag relays behaving poorly. -- **Namecoin diagnostics** card ported from the Android settings. +- **Unhealthy-relay review.** + - A banner and popup that flag relays behaving poorly. +- **Namecoin diagnostics.** + - The diagnostics card was ported from the Android settings. ## Cli @@ -219,12 +254,13 @@ Highlights: ## Quartz -- **Relay-server toolkit.** Major work toward running a relay from Quartz: +- **Relay-server toolkit.** - A `Flow` REQ-responder SPI with a storage-free dispatch engine. - NIP-50 search parsing. - Suspendable auth hooks. - Split engine/backend/policy packages. -- **NIP-45 approximate COUNT** via HyperLogLog construction, with wire support. +- **NIP-45 approximate COUNT.** + - HyperLogLog construction, with wire support. - **NIP-11.** - Added the missing `banner` field. - Relay limits are now a single source of truth served over NIP-11. @@ -232,28 +268,35 @@ Highlights: - 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. -- Fixed `q` (quote) tags being dropped by an inverted guard. -- Registered `CommunityRulesEvent` and CLINK DTO serializers (including Kotlin/Native targets). +- **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). ## Build & Documentation - **Dependency updates.** - Bumped Kotlin, Compose Multiplatform 1.11.1, Coil 5, OkHttp 5, Jackson, AndroidX, Firebase, and more. - - The Blossom interceptor test was adapted to OkHttp 5's `Interceptor.Chain`. + - 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).** A large effort moving shared, CLI-safe code out of the Android app into `commons` so it works on every front end: +- **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, keeping the project MIT-clean. -- 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/`. +- **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. @@ -261,7 +304,6 @@ Highlights: - Documented an Amethyst→commons migration plan and target package hierarchy. - Refreshed several Claude skills and the Namecoin design doc. - Added a rule requiring a license check when adding any new dependency. -- `versionName` branch detection now sets the git cwd, so it works inside git worktrees. ## Contributors