{"type":"rich","version":"1.0","title":"amethyst wrote","author_name":"amethyst (npub142…3xrj0)","author_url":"https://nostr.now/npub142gywvjkq0dv6nupggyn2euhx4nduwc7yz5f24ah9rpmunr2s39se3xrj0","provider_name":"njump","provider_url":"https://nostr.now","html":"#Amethyst v1.16.0: My Fitness, BOLT12 Payments, and a Leaner Core\n\nHighlights:\n\n- Adds **My Fitness**, a dashboard over everything you have trained.\n- Moves **BOLT12 offers** into the profile payment rail, and zaps over BOLT11\n  when a wallet refuses one.\n- Opens the **zapped note** from wallet history.\n- Fixes **Blossom uploads**, broken on most servers since 1.15.0.\n- Takes **~40 MB off every `amy` distribution**.\n- Stops counting a relay that hung up as connected.\n- Updates **Arti to 2.6.0** for two medium-severity fixes.\n\n## New Features\n\n### My Fitness\n\n- Adds a training dashboard, reached from the drawer or a pinned bottom-bar slot.\n- Builds it from both sources: Health Connect, and the kind 1301 workouts you\n  published. Neither is required.\n- Summarises four weeks: this week against last, weekly averages, a breakdown by\n  activity, best efforts, active days and a day streak.\n- Shows distance, calories, steps, climb and heart rate only when a workout\n  carries them.\n- Offers to share a workout only when it is not already published.\n- Prefers the Health Connect copy when the same effort appears in both sources —\n  it carries the heart rate, steps and climb the published event drops.\n- Filters the Workouts feed by **Mine** from the top nav.\n- Reads workouts in the POWR dialect, which carry `start`/`end` and no `duration`.\n\n### Payments\n\n- Renders each BOLT12 offer as a chip in the profile payment rail. Offers were\n  already payable, but only through a small button in the profile header.\n- Removes both header wallet buttons. The rail lists everything they reached.\n- Shows the zap bolt to recipients who publish an offer and no lightning address.\n  The send path already paid them; the picker just never offered it.\n- Falls back to a BOLT11 zap when a wallet refuses an offer and the recipient also\n  publishes a lightning address.\n- Retries only refusals that mean nothing was attempted. A `PAYMENT_FAILED` can\n  still settle later, so retrying it could pay twice.\n- Reports a timeout when a wallet never answers, instead of hanging the zap.\n- Opens the zapped note when you tap a zap in wallet history.\n\n## Performance\n\n- Stops emptying the media connection pool on every client rebuild. Both HTTP\n  clients share one pool, so the proxy check misread every rebuild as a route\n  change.\n- Drops pooled connections once per real Tor route change instead.\n- Stops `debugState()` walking the whole cache on every backgrounding. Its nine\n  scans were built eagerly and then discarded unread.\n- Signs one Blossom read-auth token per server, not one per racing caller.\n\n## Improvements and Bug fixes\n\n- Sends the Blossom authorization token as standard padded Base64 again. Deployed\n  servers reject 1.15.0's unpadded base64url, so roughly two uploads in three\n  failed.\n- Points the Sovbit default Blossom server at `files.sovbit.host`.\n- Answers a relay's WebSocket CLOSE frame, in both the shared and the Android\n  socket. Without it a closed socket looked connected for up to four minutes,\n  silently discarding everything sent.\n- Counts connected relays from the pool's connected flow, which the pool now\n  clears itself whenever it drops a relay.\n- Renders a GIF with no `imeta` as a loading placeholder. It used to collapse the\n  whole note to a gap in the feed until the fetch finished.\n- Drains the event-sync outbox before closing the client. Events from the final\n  page were reported Done and never delivered.\n- Fixes 34 bugs found auditing `commons` and `commonsUI`. Among them: AES-GCM\n  initialised with a spec every JDK rejects; an `Onion-Location` header from any\n  host re-pointing Tor traffic for 24 hours; a bundled insert wedged after one\n  exception; a URL validator backtracking exponentially per keystroke.\n- Uses `https` in preview data and image-URL placeholders.\n\n## Desktop\n\n- Stops a silent account wipe on macOS. One Deny on the Keychain prompt rotated\n  the encryption key and orphaned every saved account.\n- Consolidates the keychain into a single `vault-v1` item, so a cold boot prompts\n  once.\n- Allows first-launch key bootstrap on Linux and Windows.\n\n## Cli\n\n- Ships ~40 MB lighter, now that `amy` no longer drags Compose UI and Skiko behind\n  `commons`.\n- Fails fast when a buzz-agent wrapper cannot be made executable.\n\n## Quartz\n\n- Answers a duplicate `EVENT` with `OK true`, per NIP-01, and a superseded\n  replaceable the same way. Clients used to get raw SQLite text they could not\n  classify, and retried forever.\n- Gives each socket adapter its own session, removing the pool's locking and\n  identity checks.\n\n## Build \u0026 Documentation\n\n- Updates Arti 2.3.0 → 2.6.0, the JNI crate to 0.22, the NDK to r30 and Rust to\n  1.98.1. Picks up TROVE-2026-24 and TROVE-2026-27, both reachable in normal use.\n- Splits Compose UI out of `commons` into a new `commonsUI` module. 236 files\n  moved and no consumer import changed.\n- Bumps LightCompressor-enhanced to 2.2.3.\n- Drops the unused Guardian Project Maven repository.\n- Runs relay-backed tests against geode instead of external relays.\n- Clears the compiler, Android Lint and Gradle 10 deprecation warnings.\n- Bumps `appCode` to 461.\n\n## Contributors\n\n- nostr:nprofile1qqsyvrp9u6p0mfur9dfdru3d853tx9mdjuhkphxuxgfwmryja7zsvhqpzamhxue69uhhv6t5daezumn0wd68yvfwvdhk6tcpzpmhxue69uhkummnw3ezumt0d5hszythwden5te0dehhxarj9emkjmn99uwfvhl6\n- nostr:nprofile1qqsv4zwtz8cuwh2mvc3zdrl5853g365t9j6mn25edlul7uz0eyzt0zcpzpmhxue69uhkummnw3ezumt0d5hszxnhwden5te0wf5kymewv46jumn0wd68y6tp9eshqup0qyd8wumn8ghj7um9dejxjapwdehhxenvv9ex2tnrdakj7nrm3sx\n- mstrofnone\n\n## Translations\n\n- Polish by nostr:nprofile1qqsdyfz0ewdhmgp3a4r3pxvezx5r8yalrgvjn38v2ml5qrusnv7yywgpzemhxue69uhkummnw3ezucm6v9ejuurvw4ej7qg0waehxw309a3h5ctn9e6x7up0qyg8wumn8ghj7cm6v9ejuurvw4ej79s8c53\n- Hindi by nostr:nprofile1qqs88dt78wgnzvaph6fcstfvsd98xc2qs8eg8tllwv2zlutu8ehec2cppemhxue69uhkummn9ekx7mp0qythwumn8ghj7un9d3shjtnswf5k6ctv9ehx2ap0qyt8wumn8ghj7un9d3shjtnyd968gmewwp6kytcmlz0lu\n- Hungarian by nostr:nprofile1qqsxekg0s8kxpcrka8ccwztv2m73kz6jy0ur8f7jc04rwr5p44w5acspzamhxue69uhhyetvv9ujumn0wd68ytnzv9hxgtcppemhxue69uhkummn9ekx7mp0qyg8wumn8ghj7mn0wd68ytnddakj7c0ns2l"}
