From 2d14e85bf30f4694cadd3a6349b07f26e8ba36d3 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sat, 22 Aug 2026 13:03:40 -0400 Subject: [PATCH 1/3] docs(changelog): add v1.14.0 release notes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Assembled from everything in v1.13.1..main: 158 PR merges (124 substantive, 34 Crowdin syncs), 5 ngit proposals merged outside the GitHub PR flow, and 15 direct-to-main commits. Coverage was verified in both directions rather than assumed — every PR resolves to a bullet that literally appears in the file, and every bullet is claimed by some commit. That audit caught five defects in the first draft: - A bullet crediting BUD-01 Blossom read-auth, which is PR #3789 and shipped in v1.13.1 — the GitHub search window overlapped the tag date. - #3819's Concord fix (entities pinned across a Refounding) missing; only the log-quieting half of that PR had been written up. - #3855's per-host strike-out / unreachability tracking missing. - #3818's re-probe on the local Blossom toggle missing. - The mention notification icon reshape (6fac964d), which has no PR at all and so was invisible to a PR-only sweep. Six PRs are deliberately omitted, each for a stated reason: #3801/#3802/#3805 sync packaging to v1.13.1 and belong to the previous release, #3845 is test-only, #3878 is behavior-preserving renames, #3956 is a CI lint fix. Also records npubs for nrobi144, dmnyc, dskvr, alexgleason and mstrofnone in github.json, and corrects mstrofnone's key in TEMPLATE.md. The five already published changelogs keep the key they shipped with. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Gs2gi3sZfQ7SHrVm2njLMw --- docs/changelog/README.md | 1 + docs/changelog/TEMPLATE.md | 2 +- docs/changelog/github.json | 5 +- docs/changelog/v1.14.00.md | 275 +++++++++++++++++++++++++++++++++++++ 4 files changed, 281 insertions(+), 2 deletions(-) create mode 100644 docs/changelog/v1.14.00.md diff --git a/docs/changelog/README.md b/docs/changelog/README.md index 535fc96ca4..5081422ec5 100644 --- a/docs/changelog/README.md +++ b/docs/changelog/README.md @@ -2,6 +2,7 @@ Release notes for Amethyst, one file per version. Files are named with zero-padded version numbers so they sort correctly in any file browser. Use [`TEMPLATE.md`](TEMPLATE.md) as the starting point for the next release. +- [v1.14.0 — Highlights, Relay Login, and a Much Faster Start](v1.14.00.md) - [v1.13.1 — Follow-up Fixes for Buzz, Concord and the Keyboard](v1.13.01.md) - [v1.13.0 — Web Apps, Communities & Git](v1.13.00.md) - [v1.12.6 — Napplets, Static Sites & Cashu Multi-Mint](v1.12.06.md) diff --git a/docs/changelog/TEMPLATE.md b/docs/changelog/TEMPLATE.md index ca7903666c..9ddb59fd14 100644 --- a/docs/changelog/TEMPLATE.md +++ b/docs/changelog/TEMPLATE.md @@ -48,7 +48,7 @@ comment and fill in the sections below; drop any section that doesn't apply. - @npub12cfje6nl2nuxplcqfvhg7ljt89fmpj0n0fd24zxsukja5qm9wmtqd7y76c - @npub1w4uswmv6lu9yel005l3qgheysmr7tk9uvwluddznju3nuxalevvs2d0jr5 - @npub1a3tx8wcrt789skl6gg7rqwj4wey0j53eesr4z6asd4h4jwrd62jq0wkq4k -- @npub1dn0tej4a5806qk9ts56j572sndvjk27l5qmsxf0z3mquknccve7s4k8tfp +- @npub1gvv9ahktvavf9qjtrgm62le7gplmmchd5usp5wpfhr85hf79kncqj8xchs - @npub1ncff8m25y0c058xdljmxhpr4lxetzjpea6uq9733qmp4slfts43qawj87x ## Translations diff --git a/docs/changelog/github.json b/docs/changelog/github.json index 8c76ab5fa1..f8daf75711 100644 --- a/docs/changelog/github.json +++ b/docs/changelog/github.json @@ -5,7 +5,10 @@ "nrobi144": "npub12cfje6nl2nuxplcqfvhg7ljt89fmpj0n0fd24zxsukja5qm9wmtqd7y76c", "greenart7c3": "npub1w4uswmv6lu9yel005l3qgheysmr7tk9uvwluddznju3nuxalevvs2d0jr5", "KotlinGeekDev": "npub1a3tx8wcrt789skl6gg7rqwj4wey0j53eesr4z6asd4h4jwrd62jq0wkq4k", - "mstrofnone": "npub1dn0tej4a5806qk9ts56j572sndvjk27l5qmsxf0z3mquknccve7s4k8tfp", + "mstrofnone": "npub1gvv9ahktvavf9qjtrgm62le7gplmmchd5usp5wpfhr85hf79kncqj8xchs", + "dmnyc": "npub1aeh2zw4elewy5682lxc6xnlqzjnxksq303gwu2npfaxd49vmde6qcq4nwx", + "dskvr": "npub1uac67zc9er54ln0kl6e4qp2y6ta3enfcg7ywnayshvlw9r5w6ehsqq99rx", + "alexgleason": "npub1q3sle0kvfsehgsuexttt3ugjd8xdklxfwwkh559wxckmzddywnws6cd26p", "believethehype": "npub1nxa4tywfz9nqp7z9zp7nr7d4nchhclsf58lcqt5y782rmf2hefjquaa6q8", "dergigi": "npub1dergggklka99wwrs92yz8wdjs952h2ux2ha2ed598ngwu9w7a6fsh9xzpc" } diff --git a/docs/changelog/v1.14.00.md b/docs/changelog/v1.14.00.md new file mode 100644 index 0000000000..5d10a9f354 --- /dev/null +++ b/docs/changelog/v1.14.00.md @@ -0,0 +1,275 @@ +# v1.14.0: Highlights, Relay Login, and a Much Faster Start + +Highlights: + +- Improves **NIP-84 Highlights** — composer, feed, and share intent. +- Redesigns **relay login (NIP-42)** and ends the per-relay prompt storm. +- Adds Share targets to **Pictures, Videos, Shorts and Torrents** feeds. +- Adds a screen that explains **why every relay subscription exists**. +- Fixes the cold-start **out-of-memory kill** and cuts time to first paint. +- Brings **Desktop** to parity on profiles, DMs, settings and key backup. +- Adds **Trusted Lists** (kinds 30392–30395) to Quartz. + +## New Features + +### Highlights (NIP-84) + +- Adds a Highlight composer, with an annotation field, a passage editor, and a + source reference that can be a Nostr event or a web URL. +- Adds a Highlights feed, filterable by authors, follows, hashtags and geohashes. +- Accepts shared text from any app as a new highlight. + +### Feeds and Composing + +- Adds four home feed content types: Pictures (NIP-68), Videos and Shorts + (NIP-71), and Torrents (NIP-35), each with its own toggle. +- Adds "New Picture", "New Short" and "New Video" share targets, so media shared + into Amethyst opens the matching composer instead of a text note with a link. +- Adds a bulk audience picker to the short-note composer: search people lists and + follow packs, review the members, then add them all at once. +- Adds a poll results page with per-option vote counts and a filterable voter + list, replacing the feed card's four-avatar preview. +- Shows rich previews for comments scoped to external content (NIP-73), both in + the "replying to" line and as the thread's title. +- Offers a "Copy Original / Copy Translated" chooser when copying a note that has + been translated. +- Opens the edit screen when a draft reply is tapped in a thread. + +### Relay Login (NIP-42) + +- Redesigns the relay login permissions screen. Explicit exceptions, relays + blocked by your block list, and recent logins are now three separate sections. +- Starts new accounts on "always log in" instead of deciding per relay. +- Remembers a login for the rest of the session when you answer without ticking + "remember", so a reconnect stops asking again. +- Honors "always log in" for relays your own account does not publish to. +- Makes the "reading someone I follow" toggle reachable — it sat behind a + first-party gate that could never be true. +- Counts NIP-29 groups and Concord communities as rooms you joined, so their + host relays authenticate under "my relays and venues". +- Waits for an auth challenge to resolve rather than letting the fetch time out. + +### Relay Traffic, Explained + +- Records why every relay-bound filter exists — its purpose, the entities it + serves and the account that asked — and renders that back on a new screen. +- Fixes the multi-account subscriptions that screen exposed as never running. +- Breaks the resource ledger down by cause, so it reports *why* relay data was + spent, not just how much. +- Stops the automatic "High resource usage detected" dialog on app open. The + ledger keeps recording and Settings still shows the report. + +### Chats, Groups and Communities + +- Mutes a public chat from a long press in Messages or from the channel menu. +- Deletes (kind 9008) and archives NIP-29 channels, with the Buzz community UI to + match. +- Keeps a channel invite's replies, reactions and zaps inside the relay that sent + the invite, instead of broadcasting them to your outbox. +- Derives Buzz channel invites from cached membership notices, so they stop + appearing and disappearing. +- Redesigns channel invite cards as feed rows, with the person who added you as + the row's author. +- Shows the hosting relay's name chip on relay group message headers. +- Splits the Concord Control Plane's stream key so a staff-held `control_root` + write-gates it (CORD-02 §2). +- Closes the Concord CORD-05/06 invite lifecycle: an Invite List, a re-mint on + Refounding, and revocation. +- Stops pinning Concord entities whose chain crosses a Refounding, which was + discarding their newer state on every refold. +- Closes seven Concord soft-ban holes — a banned member kept `control_root`, half + the Control Plane never read the banlist, and the invite button still worked. + +### Everything Else + +- Makes the left drawer configurable, so entries you don't use can be hidden. +- Adds ngit-specific search to the Git Repositories screen. +- Supports IPv6 overlay relays (Yggdrasil) with RFC 5952 canonical addresses, + fixing one relay counting as two and Tor-proxying an unreachable overlay. +- Adds a Nostr badge watermark to the notification icons, reshapes the mention + icon, and adds dedicated reply and mark-as-read action icons. +- Runs verified NIP-5D artifacts in an opaque `srcdoc` sandbox behind a first-head + CSP, and advertises only the NAP domains actually implemented. + +## Performance + +- Scans NIP-19 entities, hashtags and legacy `#[n]` references without ICU. On + Android, `Regex.matchAt` copied the whole note content into native memory per + candidate, which grew a cold start to ~1.9 GB and got the app killed. +- Scans note content by literal instead of restarting the regex engine at every + position in every note. +- AOT-compiles the relay ingest path with a baseline profile. Release cold-start + ingest was spending 36× more CPU interpreting bytecode than verifying + signatures. +- Demotes the ~650 relay and ingest worker threads below the UI thread, so the + connect storm cannot starve the first frames (~40% faster first paint). +- Reclaims memory under heap pressure and stops leaking sandboxed WebView + Activities. +- Bounds the duplicate-frame decoder cache in both size and age. +- Stops blocking coroutine workers on synchronous OkHttp calls, which released + their CPU permits and starved the dispatcher. +- Stops the outbox getting slower with every publish — it rebuilt an immutable map + per send, copying every pending entry. +- Stripes the subscription-state lock per relay, ending the ANR convoy that had + 37 of 52 workers spinning on one lock. +- Memoizes Concord guestbook envelope opens, so the fold stops re-decrypting the + whole buffer on every arrival. +- Caches the painter on its first miss in `painterRes`. +- Optimizes the proof-of-work mining hot loop for the Android runtime. +- Skips the ~220 ms system call when the app locale has not actually changed. +- Confines the Blossom cache probe and server resolver to the IO dispatcher, and + re-probes it when the toggle flips. +- Releases dead subscription rows, so connect and disconnect stop scanning every + subscription ever created. +- Prefetches NIP-73 external-content preview URLs so those cards stop popping in + mid-scroll. +- Adds fixed-size hex codecs for 32- and 64-byte values. + +## Improvements and Bug fixes + +- Settles the keyboard inside navigation, so leaving a screen mid-animation stops + stranding `imePadding` across the whole app. +- Routes the draft-saving editors through `KeyboardAwareBackHandler`, so a + predictive back gesture no longer races the IME close. +- Raises the keyboard again when you tap a field in an embedded tab that was + already focused. +- Pads for the soft keyboard in full-screen napplet hosts on Android 15+. +- Fixes the crash when switching between two pinned web-app tabs. +- Stops drawing a blank parent card above a top-level community post. +- Fixes Cashu wallet balances reading low: proofs are now backfilled past the + relay's page cap and history is paged. +- Keeps PDF previews stable — the page ratio is cached, so scrolling back no + longer collapses the card and replays the grow-in animation. +- Stops rendering non-media NIP-94 files as video. +- Repairs `imeta` MIME types written as a bare subtype, so those images can be + shared again. +- Works around a fatal media3 crash on Low-Latency HLS streams. +- Drives the "Can't reach this relay over Tor" banner from live socket state + instead of a bare six-second timer. +- Stops a lone repost from being bundled into the always-on service notification, + where it inherited the ongoing flag and refused to swipe away. +- Fails push registration loudly on an HTTP error, instead of caching a token for + a device that will never receive anything. +- Listens for location only while foregrounded, and fixes the meter that reported + 7 hours of listening against 9 seconds of foreground. +- Excludes quote characters from parsed URLs. +- Fixes the OpenGraph meta parser losing every tag after an apostrophe inside a + comment or script, which broke link previews on some sites. +- Requests the follower-count provider's kind 30382 cards, so the count stops + rendering as `--`. +- Gives the invite roster line's member count its unit, so a bare number no longer + reads as counting the avatars beside it. +- Removes the recent-poster facepile from Concord and Buzz channel rows. +- Renders every NIP-71 video subtype through the shared interface. +- Reworks the chat bubble reply swipe on lower-level pointer APIs, so it only + claims the gesture once the motion is clearly horizontal. +- Turns the default log into a boot narrative instead of a firehose. +- Converts the drawer's hidden-count to a plural, fills the untranslated backlog + for Czech, German, Swedish and Brazilian Portuguese, restores placeholders + dropped from German and Polish plurals, and drops an unused plural. + +## Desktop + +- Enriches the DM composer and message list: emoji picker with custom emoji, + @mentions, reply-quoting with jump-to-original, Nostr-native GIF search, rich + message rendering, per-message image quality, and encrypted file uploads. +- Redesigns Settings as a searchable accordion of labeled cards, with + expand/collapse-all and a filter over titles and keywords. +- Brings the profile screen to parity: banner, rich-text bio, a CLINK offer field, + six new tabs (Followers, Following, Relays, Bookmarks, Yours, Zaps received) and + header actions. +- Adds a guided "save your keys" step on first run and a key backup in Settings. + Android gets a soft nudge after signup. +- Loads metadata and reactions only for what is on screen, through the shared + finders in `commons`, and unsubscribes when it leaves. +- Enables the master notification switch when the OS permission is already + granted. +- Publishes Windows arm64 and Linux arm64 desktop builds. + +## Cli + +- Gives `amy` the Concord key lifecycle it was missing: accept a promotion, follow + a Refounding, perform one, and recover when left out of it. +- Publishes Windows and Linux arm64 assets for `amy` and `geode`. +- Reports "no relays" only when there really were none, and pins the buzz wrapper + copies against the argument surface they call. + +## Quartz + +- Adds Trusted Lists (kinds 30392–30395), the aggregate counterpart to NIP-85 + Trusted Assertions, and indexes their labels for NIP-50 search. +- Fixes a `SharedKeyCache` collision that could return one peer's shared secret + for another peer's message, and compares MACs in constant time. +- Measures NIP-66 relay health from traffic the client already makes, streams + probe verdicts as relays answer, checks read and write separately, lets a + monitor publish what it learned without dialling, and merges verdicts into the + record they replace instead of overwriting it. +- Measures `rtt-open` as the transport handshake, not the time the call spent + queued in the dispatcher. +- Records sync coverage per kind rather than one interval per filter, keys its + persistence with a typed band, closes a drained leg, and terminates a paged walk + against a relay that ignores `until`. +- Strikes a host out and tracks its unreachability with publish-safe semantics, + so a dead host stops being retried at the same rate as a live one. +- Sizes negentropy reconcile windows from the caller's own index, states the + relay's cap, and lets a caller decline an id before its body crosses the wire. +- Normalizes every accessory timeout to an idle window, drops the `maxTotalMs` + ceiling that cut healthy fetches, and stops `fetchAllPages` cropping a streaming + page. +- Stops COUNT inheriting the REQ page size, which capped a count at 500. +- Suspends the incoming-message chain down to `SubscriptionListener.onEvent`, so a + consumer that cannot keep up no longer blocks every shared worker. +- Compares every filter in `FiltersChanged`, not just the first. +- Fixes an `InProcessWebSocket` race that delivered a connect-time AUTH challenge + before `onOpen`. +- Adds `StoreQueryContext`, carrying the NIP-42-authenticated caller identity into + observer-relative stores. +- Adds a NIP-50 search grammar (quoted phrases, negation) with weighted field + extraction, and shares the store-semantics rules across implementations. +- Parses metadata leniently everywhere, and recovers blank, single-element and + malformed kind-0 content instead of dropping the profile. +- Parses `ServiceType` without splitting on a separator that may not be there. +- Declares pointer hints on Report, ChatMessage, Classifieds and ChannelCreate. +- Refreshes `created_at` while mining, so a post that takes minutes to mine does + not publish stale. +- Decouples the `LocalCache` and `Account` god classes into single-purpose + collaborators, 3,800 lines lighter, with no behavior change. + +## Build & Documentation + +- Adds a `:baselineprofile` module that records a real startup journey, replacing + the hand-authored profile's wildcards. +- Notarizes the macOS DMG and verifies it, adds `libegl1` to the arm64 `.deb` + dependencies, and moves the Homebrew and Winget bumps onto a maintainer machine. +- Shrinks the mirror-sync throughput corpus on CI, which had been timing out the + `test-geode` job for weeks. +- Confines the QUIC stream drainer to the producer's event loop, deflaking it + under parallel test load. +- Hardens `workflow-ship.sh` and pins it with a regression harness. +- Adds three store-implementer skills: event store semantics, NIP-85 trusted + assertions and searchable events. +- Bumps 30+ dependencies plus Gradle, Compose, Firebase, Media3, Ktor and OkHttp. + +## Contributors + +- @npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z +- @npub1e2yuky03caw4ke3zy68lg0fz3r4gkt94hx4fjmlelacyljgyk79svn3eef +- @npub12cfje6nl2nuxplcqfvhg7ljt89fmpj0n0fd24zxsukja5qm9wmtqd7y76c +- @npub1aeh2zw4elewy5682lxc6xnlqzjnxksq303gwu2npfaxd49vmde6qcq4nwx +- @npub1uac67zc9er54ln0kl6e4qp2y6ta3enfcg7ywnayshvlw9r5w6ehsqq99rx +- @npub1q3sle0kvfsehgsuexttt3ugjd8xdklxfwwkh559wxckmzddywnws6cd26p +- @npub1gvv9ahktvavf9qjtrgm62le7gplmmchd5usp5wpfhr85hf79kncqj8xchs + +## Translations + +- Chinese Simplified by @npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z +- Czech by @npub1e2yuky03caw4ke3zy68lg0fz3r4gkt94hx4fjmlelacyljgyk79svn3eef and @npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z +- Dutch by @npub1w4la29u3zv09r6crx5u8yxax0ffxgekzdm2egzjkjckef7xc83fs0ftxcd and @npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z +- German by @npub1e2yuky03caw4ke3zy68lg0fz3r4gkt94hx4fjmlelacyljgyk79svn3eef and @npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z +- Hindi by @npub1ww6huwu3xye6r05n3qkjeq62wds5pq0jswhl7uc59lchc0n0ns4sdtw5e6 and @npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z +- Hungarian by @npub1dnvslq0vvrs8d603suykc4harv94yglcxwna9sl2xu8grt2afm3qgfh0tp and @npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z +- Latvian by @npub1l60stxkwwmkts76kv02vdjppka9uy6y3paztck7paau7g64l687saaw6av +- Polish by @npub16gjyljum0ksrrm28zzvejydgxwfm7xse98zwc4hlgq8epxeuggushqwyrm and @npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z +- Brazilian Portuguese by @npub1e2yuky03caw4ke3zy68lg0fz3r4gkt94hx4fjmlelacyljgyk79svn3eef and @npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z +- Slovenian by @npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z +- Swedish by @npub1e2yuky03caw4ke3zy68lg0fz3r4gkt94hx4fjmlelacyljgyk79svn3eef and @npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z From 43f0fcf038b7039ec0103014a1cb5959c219868d Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sat, 22 Aug 2026 13:03:54 -0400 Subject: [PATCH 2/3] chore(release): bump to 1.14.0 app 1.13.1 -> 1.14.0, appCode 456 -> 457. That single edit drives Android's versionName/versionCode, Desktop and CLI packageVersion, quartz's Maven version and geode's RelayInfo.VERSION. RELEASE_NOTES_ID is repointed, which RELEASE_OPS notes happens on x.y.0 releases and not on patches. Also syncs the docs that state a version rather than illustrate one. quartz and geode both read libs.versions.app, so their install snippets were stale claims about what Maven Central and the release assets actually carry: - README.md, quartz-integration SKILL.md and its gradle-setup.md reference -> quartz 1.14.0 - geode/README.md install commands -> geode 1.14.0 The Homebrew/Winget "not bootstrapped" notes in RELEASE_OPS.md and BUILDING.md were stamped v1.13.1. Re-verified before moving the stamp rather than re-stamping blind: Homebrew/homebrew-cask has no amethyst-nostr.rb and microsoft/winget-pkgs has no VitorPamplona/Amethyst, both still 404, so the claim holds. The bump-script invocations beside them named v1.13.2, a tag that never existed, and are now copy-pasteable. Left alone deliberately: everything under */packaging/ and translators.json's tag, which the bump workflows and the Crowdin job write after the tag exists (bumping by hand would commit wrong hashes and a dead URL); BUILDING.md's asset-name and git-checkout samples, which are illustrations; and the "invisible until v1.13.1" line in RELEASE_OPS.md, which is history. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Gs2gi3sZfQ7SHrVm2njLMw --- .claude/skills/quartz-integration/SKILL.md | 6 +++--- .../quartz-integration/references/gradle-setup.md | 8 ++++---- BUILDING.md | 6 +++--- README.md | 10 +++++----- RELEASE_OPS.md | 6 +++--- amethyst/build.gradle.kts | 2 +- geode/README.md | 6 +++--- gradle/libs.versions.toml | 4 ++-- 8 files changed, 24 insertions(+), 24 deletions(-) diff --git a/.claude/skills/quartz-integration/SKILL.md b/.claude/skills/quartz-integration/SKILL.md index a6cb8bac3a..433ee6787f 100644 --- a/.claude/skills/quartz-integration/SKILL.md +++ b/.claude/skills/quartz-integration/SKILL.md @@ -7,7 +7,7 @@ description: Integration guide for using the Quartz Nostr KMP library in externa Reference for integrating `com.vitorpamplona.quartz:quartz` into external Nostr KMP projects. -**Published artifact**: `com.vitorpamplona.quartz:quartz:1.13.1` (Maven Central) +**Published artifact**: `com.vitorpamplona.quartz:quartz:1.14.0` (Maven Central) **Targets**: JVM 21+, Android (minSdk 21+), iOS (XCFramework `quartz-kmpKit`) **License**: MIT @@ -19,7 +19,7 @@ Reference for integrating `com.vitorpamplona.quartz:quartz` into external Nostr ```toml [versions] -quartz = "1.13.1" +quartz = "1.14.0" [libraries] quartz = { module = "com.vitorpamplona.quartz:quartz", version.ref = "quartz" } @@ -41,7 +41,7 @@ kotlin { ```kotlin dependencies { - implementation("com.vitorpamplona.quartz:quartz:1.13.1") + implementation("com.vitorpamplona.quartz:quartz:1.14.0") } ``` diff --git a/.claude/skills/quartz-integration/references/gradle-setup.md b/.claude/skills/quartz-integration/references/gradle-setup.md index 40f5711029..31fb38d8e6 100644 --- a/.claude/skills/quartz-integration/references/gradle-setup.md +++ b/.claude/skills/quartz-integration/references/gradle-setup.md @@ -3,7 +3,7 @@ ## Current version ``` -com.vitorpamplona.quartz:quartz:1.13.1 +com.vitorpamplona.quartz:quartz:1.14.0 ``` Check latest: https://central.sonatype.com/artifact/com.vitorpamplona.quartz/quartz @@ -16,7 +16,7 @@ Check latest: https://central.sonatype.com/artifact/com.vitorpamplona.quartz/qua ```toml [versions] -quartz = "1.13.1" +quartz = "1.14.0" [libraries] quartz = { module = "com.vitorpamplona.quartz:quartz", version.ref = "quartz" } @@ -55,7 +55,7 @@ kotlin { ```kotlin // build.gradle.kts (app module) dependencies { - implementation("com.vitorpamplona.quartz:quartz:1.13.1") + implementation("com.vitorpamplona.quartz:quartz:1.14.0") } ``` @@ -70,7 +70,7 @@ plugins { } dependencies { - implementation("com.vitorpamplona.quartz:quartz:1.13.1") + implementation("com.vitorpamplona.quartz:quartz:1.14.0") // JNA needed for libsodium (NIP-44) on JVM implementation("net.java.dev.jna:jna:5.18.1") } diff --git a/BUILDING.md b/BUILDING.md index aa29c7ba11..02c1d68fc6 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -533,7 +533,7 @@ reads an optional per-release changelog from ## Bootstrap runbook (one-time) -> **Status as of v1.13.1: neither Homebrew nor Winget has been bootstrapped.** +> **Status as of v1.14.0: neither Homebrew nor Winget has been bootstrapped.** > `https://formulae.brew.sh/api/cask/amethyst-nostr.json` and > `microsoft/winget-pkgs/manifests/v/VitorPamplona/Amethyst` both 404, so > **Amethyst does not currently ship through either channel.** The bump @@ -584,7 +584,7 @@ The token then lives only in that maintainer's shell: ```bash export HOMEBREW_GITHUB_API_TOKEN=ghp_... # classic PAT, `repo` scope -scripts/bump-homebrew-cask.sh v1.13.2 +scripts/bump-homebrew-cask.sh v1.14.0 ``` Create one at @@ -600,7 +600,7 @@ Same split, and it needs **no token at all**. `scripts/bump-winget.sh` drives runs fine from macOS or Linux: ```bash -scripts/bump-winget.sh v1.13.2 +scripts/bump-winget.sh v1.14.0 ``` CI (`bump-winget.yml`, `GITHUB_TOKEN` only) does the bookkeeping: downloads the diff --git a/README.md b/README.md index d8cb0aaec0..3b3fed42ee 100644 --- a/README.md +++ b/README.md @@ -328,16 +328,16 @@ repositories { Add the following line to your `commonMain` dependencies: ```gradle -implementation('com.vitorpamplona.quartz:quartz:1.13.1') +implementation('com.vitorpamplona.quartz:quartz:1.14.0') ``` Variations to each platform are also available: ```gradle -implementation('com.vitorpamplona.quartz:quartz-android:1.13.1') -implementation('com.vitorpamplona.quartz:quartz-jvm:1.13.1') -implementation('com.vitorpamplona.quartz:quartz-iosarm64:1.13.1') -implementation('com.vitorpamplona.quartz:quartz-iossimulatorarm64:1.13.1') +implementation('com.vitorpamplona.quartz:quartz-android:1.14.0') +implementation('com.vitorpamplona.quartz:quartz-jvm:1.14.0') +implementation('com.vitorpamplona.quartz:quartz-iosarm64:1.14.0') +implementation('com.vitorpamplona.quartz:quartz-iossimulatorarm64:1.14.0') ``` Check versions on [MavenCentral](https://central.sonatype.com/search?q=com.vitorpamplona.quartz) diff --git a/RELEASE_OPS.md b/RELEASE_OPS.md index 5b4b6eef39..a4c80e3ff8 100644 --- a/RELEASE_OPS.md +++ b/RELEASE_OPS.md @@ -190,7 +190,7 @@ itself reads from. `Homebrew/homebrew-cask` (cask `amethyst-nostr`) and `microsoft/winget-pkgs` (`VitorPamplona.Amethyst`) — but **neither package has ever been submitted upstream**, so both workflows detect that and skip with a `::warning::`. As of -**v1.13.1** these two channels deliver nothing; macOS and Windows users get the +**v1.14.0** these two channels deliver nothing; macOS and Windows users get the desktop app from GitHub Releases only. Two separate faults kept this invisible until v1.13.1, both now fixed: @@ -219,9 +219,9 @@ readable by anyone with push access here), so a maintainer runs the last step: ```bash # after merging the sync PRs export HOMEBREW_GITHUB_API_TOKEN=ghp_... # classic PAT, `repo` scope -scripts/bump-homebrew-cask.sh v1.13.2 +scripts/bump-homebrew-cask.sh v1.14.0 -scripts/bump-winget.sh v1.13.2 # no token — uses your `gh` auth +scripts/bump-winget.sh v1.14.0 # no token — uses your `gh` auth ``` Both scripts re-verify the published artifact's sha256 before submitting, and diff --git a/amethyst/build.gradle.kts b/amethyst/build.gradle.kts index 5c68a2e93a..29d5e686d9 100644 --- a/amethyst/build.gradle.kts +++ b/amethyst/build.gradle.kts @@ -85,7 +85,7 @@ android { .get() .toInt() versionName = generateVersionName(libs.versions.app.get(), rootDir) - buildConfigField("String", "RELEASE_NOTES_ID", "\"f54843af6397f78e39fa75dbe3b7f7de14eb18c4f9c56e60e7825a2c6715719b\"") + buildConfigField("String", "RELEASE_NOTES_ID", "\"00d306e01792e48b93638b73b57a7eb8b89622a338b1b4f529622150d46cd710\"") testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { diff --git a/geode/README.md b/geode/README.md index 78b46b565a..f803a7e3e1 100644 --- a/geode/README.md +++ b/geode/README.md @@ -32,7 +32,7 @@ docker run -d --name geode -p 7447:7447 \ ``` with `in_memory = false` and `file = "/var/lib/geode/events.db"` in your -`geode.toml`. Pin a version (`:1.13.1`) instead of `:latest` for reproducible +`geode.toml`. Pin a version (`:1.14.0`) instead of `:latest` for reproducible deploys. To build the image yourself, from the repo root: ```bash @@ -47,7 +47,7 @@ it — a minimal JRE is bundled, so no system Java is required. It installs to `/opt/geode/` with the launcher at `/opt/geode/bin/geode`. ```bash -sudo dpkg -i geode-1.13.1-linux-x64.deb # or: sudo rpm -i geode-1.13.1-linux-x64.rpm +sudo dpkg -i geode-1.14.0-linux-x64.deb # or: sudo rpm -i geode-1.14.0-linux-x64.rpm ``` To run it as a managed service, wire up the shipped systemd unit @@ -69,7 +69,7 @@ formula: [`packaging/homebrew/geode.rb`](packaging/homebrew/geode.rb). Download `geode---.tar.gz`, unpack, and run: ```bash -tar xzf geode-1.13.1-linux-x64.tar.gz +tar xzf geode-1.14.0-linux-x64.tar.gz ./geode/bin/geode --config geode/share/geode/config.example.toml ``` diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2e528ee187..81e152b1e6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,8 +2,8 @@ # Amethyst app version — single source of truth consumed by both Android (amethyst/) # and Desktop (desktopApp/). `appCode` is the Android versionCode: a monotonic # integer that must increment on every release, even when `app` is unchanged. -app = "1.13.1" -appCode = "456" +app = "1.14.0" +appCode = "457" accompanistAdaptive = "0.37.3" cachemapVersion = "0.2.4" composeMultiplatform = "1.11.1" From 68c1e4d1fe5f5b7e20ca39d0515d8c807c3e8e39 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sat, 22 Aug 2026 13:04:48 -0400 Subject: [PATCH 3/3] docs(changelog): credit the translators Crowdin recorded without a language MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit scripts/translators.sh buckets contributors whose sinceLastTag entry carries an empty languages list under "(unknown language)". Dropping that bucket, as the first draft did, silently uncredited 18 people who did translate this cycle — the language is what is missing, not the contribution. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Gs2gi3sZfQ7SHrVm2njLMw --- docs/changelog/v1.14.00.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/changelog/v1.14.00.md b/docs/changelog/v1.14.00.md index 5d10a9f354..1eece864da 100644 --- a/docs/changelog/v1.14.00.md +++ b/docs/changelog/v1.14.00.md @@ -273,3 +273,22 @@ Highlights: - Brazilian Portuguese by @npub1e2yuky03caw4ke3zy68lg0fz3r4gkt94hx4fjmlelacyljgyk79svn3eef and @npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z - Slovenian by @npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z - Swedish by @npub1e2yuky03caw4ke3zy68lg0fz3r4gkt94hx4fjmlelacyljgyk79svn3eef and @npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z +- Additional translations, with the language not recorded by Crowdin, by + @npub106efcyntxc5qwl3w8krrhyt626m59ya2nk9f40px5s968u5xdwhsjsr8fz, + @npub10ug9xs24ay5339agakaqk556t6zvq9qn5vm0vlhc4pu25cx0l32qxhrm9e, + @npub13qtw3yu0uc9r4yj5x0rhgy8nj5q0uyeq0pavkgt9ly69uuzxgkfqwvx23t, + @npub16gjyljum0ksrrm28zzvejydgxwfm7xse98zwc4hlgq8epxeuggushqwyrm, + @npub19jk45jz45gczwfm22y9z69xhaex3nwg47dz84zw096xl6z62amkqj99rv7, + @npub1cdy4mhznq7dex8u8ylnlws5vj0ckzgnxyyxq4h87pyk8m6s0pf3ssspdkl, + @npub1cpazafytvafazxkjn43zjfwtfzatfz508r54f6z6a3rf2ws8223qc3xxpk, + @npub1gd8e0xfkylc7v8c5a6hkpj4gelwwcy99jt90lqjseqjj2t253s2s6ch58h, + @npub1luhyzgce7qtcs6r6v00ryjxza8av8u4dzh3avg0zks38tjktnmxspxq903, + @npub1qqqqqqz7nhdqz3uuwmzlflxt46lyu7zkuqhcapddhgz66c4ddynswreecw, + @npub1raspu6ag9kfcw9jz0rz4z693qwmqe5sx6jdhhuvkwz5zy8rygztqnwfhd7, + @npub1tr66yvqghfdgwv9yxhmg7xx6pvgvu5uvdc42tgdhsys8vvzdt8msev06fl, + @npub1ust7u0v3qffejwhqee45r49zgcyewrcn99vdwkednd356c9resyqtnn3mj, + @npub1vm0kq43djwdd4psjgdjgn9z6fm836c35dv7eg7x74z3n3ueq83jqhkxp8e, + @npub1w4uswmv6lu9yel005l3qgheysmr7tk9uvwluddznju3nuxalevvs2d0jr5, + @npub1wujmwnq0we8qs44fhxsducavekk3r2y3ln3kplhstk99n4spaqpqpzamjm, + @npub1ww8kjxz2akn82qptdpl7glywnchhkx3x04hez3d3rye397turrhssenvtp, + @npub1x3azxuysp5vmfer4vgs4jn5tmfcx4ew8sh0qnev7gczljxsr7jwqa3g4el.