What's Changed
- Remove unnecessary null assertion in SecureKeyStorage by @vitorpamplona in #4131
- Add picture and video kinds to all home feed legs by @vitorpamplona in #4133
- New Crowdin Translations by @github-actions[bot] in #4132
- chore: sync geode Homebrew formula to v1.16.0 by @github-actions[bot] in #4136
- chore: sync amethyst-nostr cask to v1.16.0 by @github-actions[bot] in #4139
- chore: sync winget manifests to v1.16.0 by @github-actions[bot] in #4138
- chore: sync amy Homebrew formula to v1.16.0 by @github-actions[bot] in #4137
- New Crowdin Translations by @github-actions[bot] in #4140
- Pin NDK version for reproducible APK builds by @vitorpamplona in #4142
- New Crowdin Translations by @github-actions[bot] in #4143
- Add 32-bit ABI support (armeabi-v7a, x86) to Arti build by @vitorpamplona in #4144
- Overhaul QR scanner with Camera2, zxing-cpp, and reproducible builds by @vitorpamplona in #4146
- NIP-52: Add relay hints for calendar RSVPs and appointments by @vitorpamplona in #4145
- fix(qr): audit follow-ups — keep key material off the screen and out of the log, guard the QR native library by @vitorpamplona in #4147
- Migrate NIP-47 Jackson serializers to Kotlin Serialization by @vitorpamplona in #4148
- Progressive Health Connect reads: show partial results while metrics load by @vitorpamplona in #4151
- New Crowdin Translations by @github-actions[bot] in #4150
- Add NIP-CC geocaching support (kinds 37516, 7516, 7517, 37517) by @vitorpamplona in #4152
- Extract calendar screen state to ViewModel by @vitorpamplona in #4153
- New Crowdin Translations by @github-actions[bot] in #4154
- fix: geocache log relays, multi-code picture picker, and stop the scanner pumping zoom by @vitorpamplona in #4155
- Add @OptIn(ExperimentalCoroutinesApi) to calendar test classes by @vitorpamplona in #4156
- fix: stop the QR scanner pumping the zoom in and out by @vitorpamplona in #4158
- Detect and report coroutine leaks in unit tests by @vitorpamplona in #4157
- fix: wallet-connect deep links with one colon, and explain why bunker:// cannot sign in by @vitorpamplona in #4160
- Fix nav-bar tab switching to restore stacks from other tabs by @vitorpamplona in #4161
- Move LocalCache into commons, and clear the blockers on retiring the Desktop fork by @vitorpamplona in #4149
- Fix notification deep links and add inline reply feedback by @vitorpamplona in #4162
- Correct Health Connect declaration and Data safety form by @vitorpamplona in #4163
- NIP-71 video interop, and a renderer for every NIP-51 list kind by @vitorpamplona in #4135
- New Crowdin Translations by @github-actions[bot] in #4159
- Marmot: warn when invites land on another device by @vitorpamplona in #4165
- Optimize Marmot message log with segmented encryption and sender ratchet tracking by @vitorpamplona in #4167
- Migrate search field to OutputTransformation and TextFieldState by @vitorpamplona in #4168
- Migrate string resources from R to Compose Resources by @vitorpamplona in #4169
- New Crowdin Translations by @github-actions[bot] in #4166
- refactor: break AccountSettings' UI coupling and move the first 23 model files to commons by @vitorpamplona in #4171
- Add backup conflict detection and resolution UI by @vitorpamplona in #4174
- New Crowdin Translations by @github-actions[bot] in #4173
- Local Blossom cache: fix video playback, harden the bridge, route it only at the HTTP layer by @vitorpamplona in #4172
- Keep PoW mining alive when app backgrounded, fix draft deletion race by @vitorpamplona in #4179
- fix(marmot): blank the sender's path on Update proposals by @jeremyd in #4178
- fix(marmot): keep populated parents when adding a leaf by @jeremyd in #4177
- refactor: move the UI's bottom layers (theme, leaf composables, Route/INav) from amethyst into commonsUI by @vitorpamplona in #4176
- Fix race condition in PoWPublishQueue job removal by @vitorpamplona in #4180
- New Crowdin Translations by @github-actions[bot] in #4175
- Implement DECK-0003 (SNO) reader, rasterizer, and Cyberspace bag opening by @vitorpamplona in #4186
- fix(marmot): accept extensions every member supports in GCE proposals by @jeremyd in #4182
- feat(marmot): Ed25519.keyPairFromSeed by @jeremyd in #4183
- feat(marmot): send and return authenticated_data on application messages by @jeremyd in #4184
- feat(marmot): caller-chosen group_id and optional required_capabilities by @jeremyd in #4187
- feat(marmot): optional leaf lifetime on createKeyPackage by @jeremyd in #4188
- refactor: Render/Display split, batches 1–3 — shared displays for AccountViewModel-bound composables by @vitorpamplona in #4185
- New Crowdin Translations by @github-actions[bot] in #4181
- fix: address the audit of the Render/Display split — desktop uses the shared dialogs, no blank group messages by @vitorpamplona in #4189
- refactor: one shared user avatar, shared user and event observers, score tags by @vitorpamplona in #4191
- refactor: share SafeImeInsets, DisappearingScaffold, emoji and name text, clipboard, screen layout, FAB padding and route builders by @vitorpamplona in #4193
- refactor: share the UI settings and toasts, add LocalDisplaySettings, call LocalCache directly by @vitorpamplona in #4194
- New Crowdin Translations by @github-actions[bot] in #4192
- Add Decentralized Lists (kinds 9998, 39998, 9999, 39999) support by @vitorpamplona in #4197
- test(commons): record decentralized lists as searchable but not rendered by @vitorpamplona in #4198
- Increase URL preview read limit to 2 MB for YouTube compatibility by @vitorpamplona in #4200
- Add Cordn group messaging UI and runtime implementation by @vitorpamplona in #4201
- New Crowdin Translations by @github-actions[bot] in #4195
- Replace JacksonMapper with native JSON serialization in CordnMigration by @vitorpamplona in #4202
- fix: green main again — the three CI jobs #4201 broke by @vitorpamplona in #4203
- refactor: move the preference layer off EncryptedSharedPreferences and into commons by @vitorpamplona in #4190
- fix(browser): the two device crashes in the new Compose chrome by @vitorpamplona in #4204
- Migrate backup conflict strings to composResources by @vitorpamplona in #4205
- DRAFT — hold: d-tag collision for addressable tagging targets is a Tapestry spec defect by @vitorpamplona in #4199
- refactor: rename Quartz event classes to match their NIP names by @vitorpamplona in #4207
- feat(browser): name the browser the hand-off tile will open by @vitorpamplona in #4208
- feat(browser): Chrome-PWA parity and a shared Compose chrome for every browser surface by @vitorpamplona in #4211
- refactor(commonsUI): move ScreenLayout, TimeAgo, the theme core, chat bubbles and single-blocker components by @vitorpamplona in #4210
- feat(quartz): NIP-FE relay commands over HTTP by @vitorpamplona in #4212
- fix(browser): the pill's site-settings line only told the truth after you opened page info by @vitorpamplona in #4213
- New Crowdin Translations by @github-actions[bot] in #4206
- chore(i18n): fill missing cs/de/sv/pt-BR translations and pluralise count strings by @davotoula in #4217
- New Crowdin Translations by @github-actions[bot] in #4218
- New Crowdin Translations by @github-actions[bot] in #4219
- fix(quartz): give search the release notes, list roles and caption words it was missing by @vitorpamplona in #4215
- fix(audio): make the audio visualizer update in real time by @davotoula in #4216
- Migrate 68 unblocked ui/ files to commons and commonsUI by @vitorpamplona in #4221
- fix(quartz): a superseded replaceable is REPLACED (OK false), not a duplicate by @vitorpamplona in #4222
- New Crowdin Translations by @github-actions[bot] in #4220
- fix(quartz): NIP-FE review fixes, NIP-98 sign-in policy vote, frames without sub id, drop /neg by @vitorpamplona in #4214
- fix(embed): stop RemoteImeView taking focus from the rest of the app by @vitorpamplona in #4224
- feat: redesign Backup Keys (hand-copyable nsec, confirm-then-encrypt ncryptsec) + NIP-49 fixes by @vitorpamplona in #4209
- New Crowdin Translations by @github-actions[bot] in #4223
- New Crowdin Translations by @github-actions[bot] in #4225
- New Crowdin Translations by @github-actions[bot] in #4227
- fix(cast): Android 17 Chromecast discovery, receiver failure messages and teardown fixes by @davotoula in #4226
- New Crowdin Translations by @github-actions[bot] in #4229
- Add navDrawer() to distinguish drawer destinations from in-app pushes by @vitorpamplona in #4230
- Add NIP-FE (HTTP relay commands) support to geode by @vitorpamplona in #4231
- fix(marmot): send reactions and deletions inside the group, not as NIP-17 DMs by @vitorpamplona in #4233
- fix(marmot): treat the relay echo of our own unconfirmed commit as its confirmation by @vitorpamplona in #4232
- New Crowdin Translations by @github-actions[bot] in #4234
- fix(relay): drop a kind the relay refuses by name instead of losing the whole REQ by @vitorpamplona in #4238
- fix(marmot): apply edits from other clients, live and after restart by @vitorpamplona in #4240
- feat(android): opt into ARM Memory Tagging Extension (async) by @vitorpamplona in #4228
- New Crowdin Translations by @github-actions[bot] in #4241
- feat: catch up with the last 3 months of NIP spec changes by @vitorpamplona in #4236
- fix(quartz): NIP-62 vanish matches the url clients write; NIP-77 reconcile ignores REQ page limits by @vitorpamplona in #4243
- fix(relay): fit a REQ under a relay's filter-count cap by merging (re-land of #4239) by @vitorpamplona in #4242
- Add Tor connection splash screen with escape hatch for desktop by @vitorpamplona in #4249
- Marmot/White Noise interop batch: 22 fixes, tested on tablet + WN Android + WN iOS by @vitorpamplona in #4245
- New Crowdin Translations by @github-actions[bot] in #4247
- Fix Material 3 API deprecations and test GC issues by @vitorpamplona in #4250
- Fix iOS charset decoder and test naming by @vitorpamplona in #4252
- Upgrade dependencies: Compose, Kotlin, Gradle, and libraries by @vitorpamplona in #4251
- test: pin cache fixtures so a GC can't flake 13 test classes by @vitorpamplona in #4254
- fix: NIP-49 passwords on Linux, private zaps over NIP-46 and in Android notifications by @vitorpamplona in #4255
- New Crowdin Translations by @github-actions[bot] in #4253
- chore(i18n): translate 61 new strings into cs, de, sv, pt-BR; pluralize password min-length by @davotoula in #4256
- New Crowdin Translations by @github-actions[bot] in #4257
- Calendar: show appointments inside RSVP cards with attendee faces by @vitorpamplona in #4258
- refactor: one UI, waves 4–5 — Account, AccountViewModel, NoteCompose and RichTextViewer into commons/commonsUI by @vitorpamplona in #4248
- fix(calendar): the RSVP strip drops its time label past a week by @vitorpamplona in #4259
- Implement CORD spec conformance: fragments, pins, rekey, dissolution by @vitorpamplona in #4262
- New Crowdin Translations by @github-actions[bot] in #4263
- Add NIP-71 video view events and push notification support by @vitorpamplona in #4266
- fix(quartz): correct tag readers found by the graph link review; remove ForkTag by @vitorpamplona in #4267
- New Crowdin Translations by @github-actions[bot] in #4268
- feat(concord): pins, disappearing messages, Invite Registry and Direct Invites by @vitorpamplona in #4264
- fix(concord): cross-client interop with Armada and Accordion by @vitorpamplona in #4265
- Fix amy build by @vitorpamplona in #4274
- fix(mls): name the sender when a ratchet generation is reused by @jeremyd in #4270
- feat(mls): keep skipped-generation secrets across a restore by @jeremyd in #4271
- feat(mls): derive secret-tree leaves from the unexpanded node secrets by @jeremyd in #4275
- feat(mls): open late application messages from retained former epochs by @jeremyd in #4272
- refactor: one-UI step 6 waves 3–7 — upload port, 140 shared screens, audit fixes by @vitorpamplona in #4278
- Extract test constants in ConcordChannelListFragmentationTest by @vitorpamplona in #4281
- Fix image zoom transition clipping during open/close animation by @vitorpamplona in #4280
- feat(concord): private channels, Kick, audit fixes and the remaining CORD features by @vitorpamplona in #4277
- New Crowdin Translations by @github-actions[bot] in #4279
- feat: display Ultra HDR photos in HDR by @davotoula in #4284
- Add Buzz protocol event types and NIP-MP conformance fixtures by @vitorpamplona in #4282
- Concord: Direct Invites in Notifications/Messages, inline confirmations, AUTH prompt on Concord relays, amy honors Kicks by @vitorpamplona in #4283
- Add NIP-34 Git status event rendering support by @vitorpamplona in #4288
- fix(browser): ask before any page-initiated download is saved by @vitorpamplona in #4287
- New Crowdin Translations by @github-actions[bot] in #4285
- fix(browser): embedded browser/napplet tabs: black screens, NIP-07 routing, Tor proxy, lifecycle by @vitorpamplona in #4260
- feat(cordn): fold "Review invitations" into the Cordn card on the new-conversation screen by @vitorpamplona in #4291
- chore: translate new commonsUI strings into cs, de, sv and pt-BR by @davotoula in #4292
- New Crowdin Translations by @github-actions[bot] in #4294
- Split kind 38000 into mint recommendations, prediction markets and ballots by @vitorpamplona in #4293
- chore(actions): bump the actions group with 2 updates by @dependabot[bot] in #4289
- fix(buzz): Buzz Desktop interop fixes from a live two-way test by @vitorpamplona in #4295
- Add NIP-38 music status sharing (now playing) feature by @vitorpamplona in #4297
- Preview pages without OpenGraph from title, description, and favicon by @vitorpamplona in #4298
- test: point the search-parity oracle at wss://search.brainstorm.world by @vitorpamplona in #4299
- New Crowdin Translations by @github-actions[bot] in #4296
- refactor: one-UI step 6, waves 7–10 — 204 of 252 screens shared by @vitorpamplona in #4290
- Add audio card UI for playable media in posts by @vitorpamplona in #4300
- New Crowdin Translations by @github-actions[bot] in #4301
- fix: follow-ups that missed #4300 (Linux now-playing timeout, audio cover overflow) by @vitorpamplona in #4302
- Display NIP-82 software apps as compact rows in app curation sets by @vitorpamplona in #4303
- Add NIP-17 group chat subject rename system message by @vitorpamplona in #4304
- Refactor chat UI: extract preview text logic, add render tests by @vitorpamplona in #4305
- Drop blank lines after block-level rich text segments by @vitorpamplona in #4307
- Fix possessive @mentions and prevent p-tags in NIP-17 DMs by @vitorpamplona in #4308
- New Crowdin Translations by @github-actions[bot] in #4306
- Move load progress from ProgressBar to BrowserChromeHost pill by @vitorpamplona in #4310
- New Crowdin Translations by @github-actions[bot] in #4311
- Unify Apple and Linux LargeCache to shared Kotlin/Native impl by @vitorpamplona in #4313
- Add search engine selection and improve browser omnibox UX by @vitorpamplona in #4312
- New Crowdin Translations by @github-actions[bot] in #4314
- New Crowdin Translations by @github-actions[bot] in #4315
- feat: show Tor connection in sidebar by @atesfurkan in #4309
- Add NIP-42 relay auth event rendering and preview support by @vitorpamplona in #4316
- Index natural-language tag values in Decentralized Lists by @vitorpamplona in #4318
- New Crowdin Translations by @github-actions[bot] in #4319
- Add NIP-92 imeta support for profile picture and banner by @vitorpamplona in #4320
- Pin TimeUtils.now() for ts-mls fixture KeyPackage lifetime by @vitorpamplona in #4321
- fix: v1.17.0 release QA — R8 contract, Marmot latency, browser/map/empty-state polish by @vitorpamplona in #4322
New Contributors
- @atesfurkan made their first contribution in #4309
Full Changelog: v1.16.0...v1.17.0