diff --git a/docs/changelog/v1.12.00.md b/docs/changelog/v1.12.00.md index 7937ea2f16..5ad2616131 100644 --- a/docs/changelog/v1.12.00.md +++ b/docs/changelog/v1.12.00.md @@ -1,107 +1,161 @@ # v1.12.0: Payments, Private Posts & Workouts Highlights: -- **CLINK payments** — a new Lightning payment rail built on Offers and Debits, with spending budgets, NIP-05 offer discovery, and a unified Send Payment screen that brings Lightning, CLINK, on-chain and Cashu together in one place. -- **Private posts & reactions** — compose private replies and posts, react/un-react privately, and force-private zaps, all delivered end-to-end encrypted via NIP-17 gift wraps. -- **Workouts** — record and browse NIP-101e workout records (kind 1301) in a dedicated Workouts feed. -- **Math in notes** — write inline and block LaTeX (`$...$` and `$$...$$`) and have it render right in the timeline. -- **Activity cards** — likes, zaps and nutzaps now render as rich gradient "activity cards" that embed the post they reacted to, tappable straight to the thread. -- **App recommendations** — editable NIP-89 app recommendations on your profile, with richer app cards, screenshots and author attribution. -- **Pinned DMs** — pin your most important conversations to the top of the chat list, synced across your devices. -- **Desktop** — image-compression pipeline on upload, a new media player, group-DM parity with Android, a Replies tab, and a refreshed feed. + +- **CLINK payments.** A new Lightning rail built on Offers and Debits. Includes spending budgets, NIP-05 offer discovery, and a unified Send Payment screen. +- **Private posts & reactions.** Post, reply, react, and zap privately. Everything is 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. It renders right in the timeline. +- **Activity cards.** Likes, zaps, and nutzaps now render as rich gradient cards. Each card embeds the post it reacted to and taps through to the thread. +- **App recommendations.** Editable NIP-89 recommendations on your profile, with richer cards, screenshots, and author names. +- **Pinned DMs.** Pin important conversations to the top of the chat list. The pins sync across your devices. +- **Desktop.** Image compression on upload, a new media player, group-DM parity, a Replies tab, 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. Profiles can show a tappable CLINK Offer chip, and you can pay a contact directly from their profile. -- **Spending budgets for CLINK debits** — set one-time or recurring spending limits so a debit connection can pull funds up to a cap you control. -- **Discover offers by NIP-05** — resolve a person's payment offer straight from their `name@domain` address. -- **Unified Send Payment screen** — Lightning, CLINK, on-chain Bitcoin and Cashu/nutzaps are now all reachable from one screen, with a "Pay from" wallet selector to choose which wallet the money leaves. -- **Pay Bitcoin payment targets from the in-app on-chain wallet**, and 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. -- **Nutzap send progress bar** that matches the Lightning experience, plus a Cashu mint top-up screen and per-mint balances. + +- **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. +- **Spending budgets for CLINK debits.** Set one-time or recurring limits. A debit connection can then pull funds 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. + - A "Pay from" selector chooses which wallet the money leaves. +- **On-chain payments.** Pay Bitcoin payment targets from the in-app on-chain wallet. You can also 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. +- **Cashu improvements.** + - A send progress bar that matches the Lightning experience. + - A new mint top-up screen. + - Per-mint balances. ### Posting & Privacy -- **Compose private replies and private posts** delivered as NIP-17 gift wraps, with an editable "Notify" block so you choose exactly who can read a private post. -- **Private reactions and private un-react** — react and remove reactions privately, with safeguards that prevent private content from leaking publicly. -- **Force-private zaps on private notes**, and replies to private zaps are routed into the sender's DM room. -- **NIP-32 hashtag labels** — add first-class hashtag labels to posts; follow-hashtag labels are published through your outbox relays and surface in the hashtag feed. -- **Richer notify chips** in the new-post screen, modernized inline payment cards that surface their descriptions, and quote-reposts (NIP-18) now counted in the repost counter. + +- **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. +- **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. + - Follow-hashtag labels publish through your outbox relays. + - They surface in the hashtag feed. +- **Compose polish.** + - 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. ### Chat & DMs -- **Pin DM conversations** to the top of your chat list — synced across devices via a NIP-78 app-data event. -- **@-mention search in Marmot (MLS) group chats** — search and tag users in the group composer, with conversation participants ranked first and marked with an "In this chat" chip. -- **Quoted chat messages** now render inside chat bubbles with the proper chat-reply design, and the redundant reply row is skipped when the message is already quoted inline. -- **MLS unread state now persists across app restarts**, and the kind:445 backlog is no longer refetched on every launch. + +- **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. + - 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. +- **MLS reliability.** + - Unread state now persists across app restarts. + - The kind:445 backlog is no longer refetched on every launch. ### Reading & Feeds -- **Render LaTeX math** in notes with `$...$` (inline) and `$$...$$` (block) delimiters. -- **Activity cards** — reactions, zaps, likes and nutzaps render as gradient cards that embed the post they're about; a single tap on a like/zap chip opens that event's thread. -- **NIP-101e Workouts** — a dedicated feed for workout records (kind 1301). -- **Editable NIP-89 app recommendations** on your profile, with screenshots shown in app feed cards, an "by <author>" attribution line, and a full app detail screen. -- New community renderers: **Birdex species collections** (kind 12473) and **Agora fundraiser campaigns** (kind 33863). -- **Reactions and zaps anchor their own thread** view, and reposts whose boosted kind isn't supported are now hidden instead of showing blank cards. -- **Brightness/volume swipe gestures** in fullscreen video, and tap a podcast to open a show screen listing all its episodes. + +- **Render LaTeX math** in notes. Use `$...$` for inline and `$$...$$` for block equations. +- **Activity cards.** Reactions, zaps, likes, and nutzaps render as gradient cards that embed the post they're 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). +- **App recommendations.** Editable NIP-89 recommendations on your profile. + - Screenshots show in app feed cards. + - An "by <author>" line credits the author. + - A full app detail screen is available. +- **New community renderers.** + - Birdex species collections (kind 12473). + - Agora fundraiser campaigns (kind 33863). +- **Cleaner feeds.** Reactions and zaps anchor their own thread view. Reposts whose boosted kind isn't supported are now hidden instead of showing blank cards. +- **Media.** Swipe for brightness and volume in fullscreen video. Tap a podcast to open a show screen listing all its episodes. ### Settings -- **Searchable settings** — a search box filters settings rows by title and curated keywords, with prefix matching and an empty-state. + +- **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 individual row and menu so the chat list stays smooth. -- Parsed CLINK offers are cached for NIP-05 lookups (case-insensitive keys). -- The "fix missing spaces" rich-text pass now 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, using case-insensitive keys. +- The "fix missing spaces" rich-text pass indexes URLs by their first character. This avoids repeated scans. ## Improvements and Bug fixes -- **Notifications:** likes/zaps replies now correctly reach the "Curated" feed; the legacy "Global" filter migrates once to "Curated"; replies to a like/zap no longer drag in the original liked post's whole thread. -- **Note search** no longer matches on `p`, `e`, `a`, `alt` or `client` tags, so searches return cleaner results. -- **Anonymous posting:** profile zaps that should be anonymous are no longer accidentally 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; own on-chain zaps highlight the bolt and show as pending in the counter; tidied wallet screen layout. -- **Zap settings:** preset amounts are de-duplicated so drag-to-reorder keeps working, and the chip-drag interaction was fixed. -- **Cashu top-up** is now crash-safe on retry — funds are checkpointed the instant they leave the wallet and never re-moved on a retry. -- **Tor:** relay backoff is honored during Tor bootstrap; a new "money operations" relay category keeps payment traffic on the right transport. -- **Metadata:** a non-spec birthday value can no longer drop an entire profile. -- **Deletions (NIP-09):** deleting a note now properly severs child back-references and detaches on-chain-zap, nutzap and channel sources from the cache. -- Numerous audit and hardening fixes across the private-posts, CLINK, and MLS paths (off-main-thread crypto, leak prevention, share/bookmark hidden on private notes). +- **Notifications.** + - 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.** Searches no longer match 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 now 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.** Preset amounts are de-duplicated so drag-to-reorder keeps working. The chip-drag interaction was fixed. +- **Cashu top-up** is now crash-safe on retry. Funds are checkpointed the instant they leave the wallet and never re-moved. +- **Tor.** + - Relay backoff is honored during Tor bootstrap. + - A new "money operations" relay category keeps payment traffic on the right transport. +- **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 also 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 and fixed several edge-case crashes. ## Desktop -- **Image compression on upload** — a new compression pipeline with an Image Compression settings panel, per-post quality presets, batch progress in the composer, a preview-then-publish gate, and a fail-loud dialog if compression fails. -- **New media player** — replaced vlcj with kdroidFilter's ComposeMediaPlayer (JCodec/FFmpeg backend) for video playback. -- **Group DM parity with Android** — desktop now handles group direct messages the same way. -- **Replies tab** on the user profile, plus reply context (parent embed + label) shown inline in feeds. -- **Feed refresh** — inline card expansion, a "New posts" chip that slides in from the top, stick-to-top on prepend, and wired-up like/zap/comment actions. -- Copy a Blossom image URL on click with a hover tooltip and snackbar; collapsed-sidebar polish (tighter ripple + hover tooltips); Amethyst logo on the Tor and account-loading splashes. -- Restored inter-word spacing in rich text with mentions/hashtags, and fixed parent-author metadata loading. +- **Image compression on upload.** A new compression pipeline with: + - 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. +- **Replies tab** on the user profile. Feeds also show reply context (parent embed plus label) inline. +- **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. - **Namecoin diagnostics** card 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 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. -- Closed CLINK parity gaps (profile offer, follow, offer pay, GFY detail) and added a clink-headless interop harness. +- Closed CLINK parity gaps (profile offer, follow, offer pay, GFY detail). Added a clink-headless interop harness. ## Quartz -- **Relay-server toolkit** — major work toward running a relay from Quartz: a `Flow` REQ-responder SPI with a storage-free dispatch engine, NIP-50 search parsing, suspendable auth hooks, and split engine/backend/policy packages. +- **Relay-server toolkit.** Major work toward running a relay from Quartz: + - 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-11** improvements — the missing `banner` field, relay limits as a single source of truth served over NIP-11. -- **Connection observability** — stable per-connection ids and a per-connection `RequestContext` threaded into the event source; auth identity moved from policy into connection scope. -- **NIP-46** bunker fix for double-resume and retry id-reuse races. -- Fixed `q` (quote) tags being dropped by an inverted guard, and registered `CommunityRulesEvent` / CLINK DTO serializers (incl. Kotlin/Native targets). +- **NIP-11.** Added the missing `banner` field. Relay limits are now a single source of truth served over NIP-11. +- **Connection observability.** Stable per-connection ids and 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). ## Build & Documentation -- Updated all dependencies (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`. -- `commons` `commonTest` now compiles and runs on iOS targets, and CI runs the shared `commonTest` on iOS for `:commons`. +- **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`. +- **iOS CI.** `commons` `commonTest` now compiles and runs on iOS targets. CI runs the shared `commonTest` on iOS for `:commons`. - Split the monolithic CHANGELOG into per-version files under `docs/changelog/`. -- A large SonarQube cleanup pass (S1871) merging duplicate `when`/`if` arms across the codebase, plus `Log` lambda-overload migrations. -- Documented an Amethyst→commons migration plan and target package hierarchy, refreshed several Claude skills and the Namecoin design doc, and added a rule requiring a license check when introducing any new dependency. -- `versionName` branch detection now sets the git cwd so it works inside git worktrees. +- A large SonarQube cleanup pass (S1871) merged duplicate `when`/`if` arms. Also migrated `Log` calls to the lambda overload. +- 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 @@ -113,4 +167,14 @@ Highlights: ## Translations -Community translations contributed through Crowdin across 50+ locales, including Arabic, Bengali, Catalan, Czech, German, Greek, Spanish, Persian, Finnish, French, Gujarati, Hindi, Croatian, Hungarian, Indonesian, Italian, Hebrew, Japanese, Kazakh, Korean, Lithuanian, Latvian, Dutch, Polish, Portuguese (BR/PT), Russian, Slovenian, Serbian, Swedish, Swahili, Tamil, Thai, Turkish, Ukrainian, Vietnamese, and Chinese (Simplified/Traditional/Hong Kong). New CLINK, Send Payment, workouts, chat-history, reply-search and on-chain-failure strings (cs, de, sv, pt-BR) were added directly. +Community translations contributed through Crowdin across 50+ locales. Languages updated include: + +- Arabic, Bengali, Catalan, Czech, German, Greek +- Spanish, Persian, Finnish, French, Gujarati, Hindi +- Croatian, Hungarian, Indonesian, Italian, Hebrew, Japanese +- Kazakh, Korean, Lithuanian, Latvian, Dutch, Polish +- Portuguese (BR/PT), Russian, Slovenian, Serbian, Swedish, Swahili +- Tamil, Thai, Turkish, Ukrainian, Vietnamese +- Chinese (Simplified/Traditional/Hong Kong) + +New CLINK, Send Payment, workouts, chat-history, reply-search, and on-chain-failure strings (cs, de, sv, pt-BR) were added directly.