Divine 1.0.16 — Life in Loops
This one's all about creation. We poured this release into the tools that put more in your hands and less in the algorithm's: a deeper video editor, a sharper camera, and a feed that finally listens to you.
Make something wild 🎬
- New editor powers: clip transitions, reverse playback, a voice-over recorder, pinch-to-zoom canvas, crop/rotate/flip, multi-select to merge or delete clips, and timeline beat markers.
- Lip-sync camera mode — and yes, lip-sync can record past the 6.3s limit.
- Video stabilization, auto lens switching with a pinch-zoom ruler, and single-photo capture for stop-motion.
- Edit your own subtitles and republish them.
A feed that's yours 🌀
- Swipe left/right to tune your recommendations directly. No gaming the algorithm.
- Classics mode brings the archived Vines front and center.
- Instant cold-start — your home feed loads from disk cache the moment you open the app.
Talk to your people 💬
- Double-tap a message to like it, react with combined reaction pills, and share reels straight into DMs with a quoted preview.
- Read state now syncs across your devices.
Own what you make, choose what you see 🔐
- At-rest encryption for your local data.
- Background uploads that survive the app getting suspended.
- ProofMode carries its human-made provenance forward when you download a watermarked clip.
- Website and monetization links on your profile, plus avatar and banner cropping before upload.
A safer playground 🛡️
- New protections for under-16 accounts, adult content hidden by default until you opt in, and stronger blocklist and moderation controls.
Plus 284 translated strings across 17 languages, a unified search, and hundreds of fixes.
No slop. All human. Full commit-by-commit list below. 👇
What's Changed
- feat(auth): add under-16 family guidance flow by @NotThatKindOfDrLiz in #3531
- fix(images): cancel orphaned thumbnail downloads by @NotThatKindOfDrLiz in #4695
- feat(l10n): localize Apps/Integrations directory (#3628) by @realmeylisdev in #4889
- feat(l10n): localize share-copy + clipboard confirmations (#3628 Area K subset) by @realmeylisdev in #4891
- fix(feed): filter blocked/muted authors from Funnelcake REST feeds (#4782) by @realmeylisdev in #4887
- feat(l10n): localize remaining hardcoded UI strings — #3628 sweep (Auth, Comments, Inbox, ProofMode, For-You, Sounds, Discovery, Misc) by @realmeylisdev in #4890
- fix(ios): enable Swift Package Manager by @NotThatKindOfDrLiz in #4893
- ci(codemagic): publish Android builds to production by @rabble in #4898
- fix(timeline): simplify maxDuration calculation for track by @hm21 in #4915
- fix: explore search by opening unified search route by @hm21 in #4901
- feat(timeline): add width parameter to TimelineTrimHandles for improved drag interaction by @hm21 in #4907
- fix(startup): prevent entire app rebuild twice on startup by @hm21 in #4918
- fix(router): prevent video feed teardown on background review-status refetch by @hm21 in #4913
- chore(toolchain): upgrade Flutter 3.41.9 → 3.44.0 / Dart 3.12.0 by @realmeylisdev in #4917
- fix(notifications): reclassify misattributed video notifications as actor-anchored by @untreu2 in #4920
- fix(feed): content filters not reactively applied to feeds by @untreu2 in #4921
- feat(quick-actions): add home/lock screen camera widget by @hm21 in #4880
- fix(categories): degrade to emoji when a category SVG asset is missing by @realmeylisdev in #4926
- fix(bluesky): correct crosspost status endpoint and response key mapping by @rabble in #4922
- feat(feeds): send viewer language hints by @rabble in #4909
- feat(video-editor): composite proof mode progress tracking by @hm21 in #4810
- fix(auth): clarify returning-user sign-in and post-review route by @NotThatKindOfDrLiz in #4911
- fix(auth): remove local accounts from device cleanly by @NotThatKindOfDrLiz in #4924
- fix(test): de-flake minor-account-review under-13 support screen test by @realmeylisdev in #4949
- chore: update video-editor package to support SPM by @hm21 in #4935
- fix(nip17): NIP-17/44/59 crypto hardening (security review for #570) by @realmeylisdev in #4943
- fix(ci): handle FlutterFramework SPM deployment target by @rabble in #4957
- refactor(videos_repository): compose author feed via getAuthorFeed (#4788) by @realmeylisdev in #4931
- feat(dm): route NIP-17 DMs to kind-10050 inbox relays + harden moderation report DM (#570) by @realmeylisdev in #4944
- fix(feed): preserve seeded engagement counts by @rabble in #4904
- refactor(state): migrate profile feed to ProfileFeedCubit (#4788) by @realmeylisdev in #4937
- fix(feed): paginate for you recommendations with cursors by @rabble in #4961
- chore(ci): track iOS extension signing contract by @NotThatKindOfDrLiz in #4966
- fix(feed): filter blocked/muted authors on detail surfaces via shouldHideVideo (#4782) by @realmeylisdev in #4970
- fix(ci): remove archive-time Crashlytics upload by @NotThatKindOfDrLiz in #4971
- fix(reaction): centre DM reaction emoji on Android (#4954) by @realmeylisdev in #4984
- fix(video-editor): ensure speed-up feature works correctly by @hm21 in #4978
- fix(timeline): rebase markers after clip reorder and trim by @hm21 in #4979
- fix(dm): recover full conversation list after reinstall (#4953) by @realmeylisdev in #4973
- fix(feed): retry native age-gated playback by @NotThatKindOfDrLiz in #4884
- feat(db): SQLCipher at-rest encryption full implementation + device-QA plan (#570) by @realmeylisdev in #4981
- fix(inbox): limit notification label text to one line with ellipsis by @hm21 in #4982
- fix(ci): harden iOS SPM target patch by @NotThatKindOfDrLiz in #4959
- chore(deps): trim video editor lockfile churn by @NotThatKindOfDrLiz in #4963
- test(nip44): make vector fixture lookup workspace-safe by @NotThatKindOfDrLiz in #4955
- fix(drafts): migrate legacy drafts atomically to stop disappearing drafts by @untreu2 in #4988
- fix(notifications): keep most-recent timestamp when consolidating follows by @untreu2 in #4987
- ci(architecture): ratchet sanctioned ChangeNotifiers (#4738) by @realmeylisdev in #4789
- fix(profile): preserve tapped fullscreen video by @NotThatKindOfDrLiz in #4993
- fix(profile): backfill partial profile video loads by @NotThatKindOfDrLiz in #4994
- fix(language): remove ChangeNotifier from preference service by @NotThatKindOfDrLiz in #4995
- test(profile_feed): cover loadMore recovery and realtime ordering by @realmeylisdev in #5007
- fix(timeline): rebase markers for speed, delete, duplicate, split by @hm21 in #5005
- fix(playback): handle HTTP 202 as transient and abort stale source fallbacks by @hm21 in #5000
- fix(upload): preserve uploaded thumbnail URL on success (#4997) by @hm21 in #5002
- fix(event-cache): queue signed events until PersonalEventCache initializes by @hm21 in #5001
- fix(videos_repository): split live engagement counts in author-feed hydration by @realmeylisdev in #5006
- feat(moderation): engagement-list block filters + search blocklist reactivity (#948) by @realmeylisdev in #5014
- test(l10n): pin the content-policy disclosure invariant (#948) by @realmeylisdev in #5013
- feat(blocklist): read our own kind 10000 mute list (#948) by @realmeylisdev in #5012
- refactor(hashtag): move hashtag REST fetch into VideosRepository (#948) by @realmeylisdev in #5024
- feat(moderation): canTarget affordance gating + profile-search block filters (#948) by @realmeylisdev in #5025
- fix(deep-link): profile links use push/go/skip parity with video links by @untreu2 in #5023
- feat(funnelcake): log unrecognised list response shapes in _unwrapListResponse by @untreu2 in #5022
- fix(feed): stop replaying stale For You feed on cold start by @untreu2 in #5021
- fix(feed): preserve For You recommendation order on load-more by @rabble in #5033
- fix(video-player): guard millisecond conversions against NaN/infinite AVFoundation times by @rabble in #5034
- fix(blocklist): reset per-account state on identity change (#4969) by @realmeylisdev in #5031
- feat(audio): implement J-Cut audio anchoring and rebasing logic by @hm21 in #5032
- feat(video-editor): add reverse playback functionality for clips by @hm21 in #4716
- fix(feed): warm next video before preload grace by @NotThatKindOfDrLiz in #5015
- fix(notifications): refresh inbox on app resume by @NotThatKindOfDrLiz in #5018
- fix(timeline): preserve markers in clip history writes by @NotThatKindOfDrLiz in #5016
- fix(feed): open collaborator picker from attribution row by @rabble in #5037
- fix(feed): keep content-warned videos paused until View Anyway is tapped by @rabble in #5039
- fix(audio): enhance audio extraction with playback speed adjustments by @hm21 in #5048
- fix(lists): make curated list creation reliable and visible by @rabble in #5040
- chore(docs): relax rebase rule — only required at publish, handoff, and on conflicts by @hm21 in #5049
- fix(notifications): consume authoritative FCM target fields in the push path by @dcadenas in #5054
- fix(comments): load video threads from v2 API by @rabble in #5076
- fix(notifications): harden resume refresh and remove dead realtime subsystem by @dcadenas in #5051
- feat(profile): render website field in profile header by @realmeylisdev in #5106
- fix(firebase): guard default app initialization by @NotThatKindOfDrLiz in #5070
- feat(profile): add website field to Edit Profile screen by @realmeylisdev in #5109
- fix(feed): preserve home video position by @NotThatKindOfDrLiz in #5019
- fix(video): tombstone addressable deletes by @NotThatKindOfDrLiz in #5030
- fix(auth): redact BYOK verifier (embeds raw nsec) in verification error log by @rabble in #5055
- fix(feed): close check-then-act race in subscribeToVideoFeed by @rabble in #5059
- fix(upload): track processing-poll timers so dispose() cancels them by @rabble in #5060
- fix(publish): require relay OK before marking videos published by @rabble in #5056
- fix(library): name imported clips before saving by @rabble in #5061
- fix(auth): discard stale background RPC refresh after sign-out or account switch by @rabble in #5057
- fix(notifications): decide fallback UX for unfetchable coordinate-routed push taps by @dcadenas in #5114
- fix(relay): validate inbound relay frames by @rabble in #5092
- fix(router): relink AppShell transitional TODOs by @rabble in #5094
- fix(feed): ignore stale source load results by @rabble in #5082
- feat(analytics): track mobile surface performance by @rabble in #5081
- fix(feed): use inclusive timestamp pagination cursor by @rabble in #5085
- fix(comments): stop blocking thread load on relay by @rabble in #5087
- fix(feed): retry the failed feed type after connection errors, not discovery by @rabble in #5080
- fix(auth): retry destructive OAuth cleanup by @rabble in #5090
- fix(blocklist): refilter fullscreen snapshot feeds on blocklist version changes by @realmeylisdev in #5105
- fix(delete): clarify relay failure messages by @NotThatKindOfDrLiz in #5118
- feat(video-editor): capture pro_video_editor native logs in UnifiedLogger by @hm21 in #5117
- test(nip98): relay acceptance tests against local funnelcake-api stack by @realmeylisdev in #5111
- feat(camera): forward native DivineCamera diagnostics to UnifiedLogger by @hm21 in #5110
- fix(relay): replay pending messages from a snapshot by @rabble in #5088
- docs: add structured bug-fix workflow guidance by @NotThatKindOfDrLiz in #5119
- feat(video-player): forward native DivineVideoPlayer diagnostics to UnifiedLogger by @hm21 in #5115
- fix(auth): preserve secure storage on Android errors by @NotThatKindOfDrLiz in #5078
- fix(deep-link): hashtag and search links use push/go/skip parity by @untreu2 in #5131
- fix(media-cache): bump cupertino_http to v3 to restore NSURLSession path by @hm21 in #5102
- fix(auth): bound Keycast requests and refresh single-flight so re-login recovers without restart by @untreu2 in #5132
- fix(feed): auto-refresh For You on app resume when stale by @untreu2 in #5129
- feat(moderation): enable contentPolicyV2 by default (#948) by @realmeylisdev in #5043
- refactor(video-player): consolidate iOS/macOS Swift sources into shared darwin target by @hm21 in #5045
- fix(feed): paginate for you recommendations by @NotThatKindOfDrLiz in #5072
- chore(moderation): Phase 4 cleanup — remove contentPolicyV2 flag, delete dead MuteService + ContentModerationService (#5047) by @realmeylisdev in #5136
- fix(follow): follow button no longer reverts after tapping (#5144) by @realmeylisdev in #5147
- fix(upload): require thumbnail before publish by @NotThatKindOfDrLiz in #5075
- docs(moderation): refresh stale architecture docs after Phase 4 cleanup (#5137) by @realmeylisdev in #5138
- test(relay): kind-34236 relay acceptance coverage against local funnelcake by @realmeylisdev in #5141
- fix(profile): persist deleted video tombstones by @NotThatKindOfDrLiz in #5135
- feat(camera): add video stabilization with per-device mode selection by @hm21 in #5140
- test(pipeline): full video upload + publish E2E acceptance test (#3056) by @realmeylisdev in #5142
- test(nip98): let the #3052 acceptance test do real HTTP by @realmeylisdev in #5143
- ci(mobile): raise test concurrency to 4 + ratchet VGV tag baseline to 59 by @realmeylisdev in #5150
- test(upload): untag video_publish_flow + drop dead file IO (#3137) by @realmeylisdev in #5154
- test(bug-report): untag bug_report_service_upload_logs (#3137) by @realmeylisdev in #5155
- test(video-events): untag video_event_service_deletion (#3137) by @realmeylisdev in #5156
- test(video-events): untag video_event_service_blocklist_sweep (#3137) by @realmeylisdev in #5157
- feat(image): add @VisibleForTesting cache seam to VineCachedImage (#3137) by @realmeylisdev in #5158
- feat(video-recorder): auto lens switch with pinch zoom ruler by @hm21 in #5148
- test(upload): untag upload_publish_race_condition (#3137) by @realmeylisdev in #5153
- ci(mobile): ratchet VGV tag baseline 59 → 54 (#3137) by @realmeylisdev in #5160
- fix(startup): allow offline recorder launch by @NotThatKindOfDrLiz in #5074
- fix(test): stop manual acceptance tests leaking real network into the merged suite (#3137) by @realmeylisdev in #5163
- test(search): pin Explore→Search transition + focus contract by @realmeylisdev in #5167
- fix(blocklist): refilter curated/liked grids on broad blocklist changes by @realmeylisdev in #5169
- feat(video-editor): clip crop/rotate/flip transform (digital zoom) by @hm21 in #5161
- docs(search): document blocked-author filtering contract by @realmeylisdev in #5166
- docs(state): mark #3523 likes/comments/reposts gating as not planned by @realmeylisdev in #5171
- test(vgv): de-flake merge-isolate cascade victims + resume untags (#5159) by @realmeylisdev in #5180
- feat(video-editor): pinch-to-zoom canvas with zoom-tracking letterbox scrim by @hm21 in #5189
- test(ci): gate untagged tests that leak process-global singletons (#5183) by @realmeylisdev in #5186
- chore(reliability): add empty-catch, service-sentinel & ARB {error} ceilings (#4336) by @realmeylisdev in #5190
- chore(maintainability): add production Future.delayed ceiling ratchet (#4339) by @realmeylisdev in #5188
- feat(video-editor): multi-select clips to merge or delete by @hm21 in #5193
- fix(dm): recover full conversation list after reinstall regression (#5202) by @realmeylisdev in #5214
- fix(search): restore back navigation from search results screen by @hm21 in #5196
- fix(grid): center load-more indicator below grid with branded spinner by @hm21 in #5206
- fix(notifications): mark notifications seen on inbox open (#4708) by @realmeylisdev in #5170
- fix(db): preserve the durable database dir when clearing caches (#4968) by @realmeylisdev in #5191
- fix(video-editor): keep selected cover and overlay fonts on saved drafts (#5181) by @hm21 in #5201
- fix(thumbnails): keep grid thumbnails cached during fast scroll by @hm21 in #5208
- fix(notifications): route inbox taps to video detail by @rabble in #5220
- fix(video-editor): reflect audio start-trim on the timeline waveform by @hm21 in #5199
- fix(publish): REST-first video publish so a missing relay OK doesn't look failed by @rabble in #5221
- fix(library): prevent draft posts from dropping editor layers by @hm21 in #5203
- refactor(video): replace per-caller videosStream with a ViewSource-resolved FeedRepository by @untreu2 in #5211
- fix(profile): restore nostr badge display by @rabble in #5218
- fix(notifications): linkify nostr refs in comment quotes by @rabble in #5225
- fix(notifications): parse funnelcake notification fields by @rabble in #5222
- fix(router): accept dynamic DM route extras by @rabble in #5227
- chore(maintainability): add file-size ceiling ratchet (#4339) by @realmeylisdev in #5187
- fix(profile): continue sparse liked video pagination by @NotThatKindOfDrLiz in #5216
- fix(notifications): synthesize stable video route on metadata miss (#4730) by @realmeylisdev in #5228
- fix(feed): send recommendation session seed by @NotThatKindOfDrLiz in #5175
- style(design-system): migrate clean Icons.* to DivineIcon + add raw-Icons ratchet (#4803) by @realmeylisdev in #5233
- chore(comments): VineTheme author-name fonts + localize empty-state test (#4632) by @realmeylisdev in #5235
- chore(search): remove dead VideoSearchView widget by @realmeylisdev in #5165
- fix(explore): localize async error state, drop raw exception text by @realmeylisdev in #5168
- fix(video-editor): restore missing custom audio in export, plus volume-arc/scroll fixes by @hm21 in #5232
- refactor(profile): use BrandedLoadingIndicator in profile tab loaders by @hm21 in #5239
- feat(feed): instant cold-start home feed from disk cache by @hm21 in #5238
- fix(relay): lock non-production sessions to the environment relay host by @rabble in #5250
- feat(feed): warm adjacent feeds during foreground idle by @rabble in #5248
- chore(feed): remove dead VideoErrorOverlay widget by @realmeylisdev in #5246
- fix(feed): give the native "Verify age" button visible feedback by @realmeylisdev in #5245
- fix(video-editor): show timeline audio bar for invalid composition window by @hm21 in #5263
- fix(router): redirect fullscreen feed to home when extra args are missing (web reload) by @rabble in #5255
- fix(feed): loading state on the Verify age button during retry by @realmeylisdev in #5266
- fix(feed): fast-fail age-gate viewer auth on a hung remote signer by @realmeylisdev in #5264
- feat(env): bottom indicator line for environment and non-Divine relays by @rabble in #5253
- fix(web): point backend at api.divine.video + remove dead deploy scripts by @rabble in #5261
- test(startup): make initialization timing deterministic by @NotThatKindOfDrLiz in #5275
- feat(inbox): smooth Messages/Notifications switch with shared-axis transition by @hm21 in #5267
- fix(startup): hold splash until the redirect leaves /welcome (#5242) by @realmeylisdev in #5271
- fix(profile): preserve tapped history video by @NotThatKindOfDrLiz in #5281
- fix(categories): cache category list across app starts by @hm21 in #5277
- fix(publish): repair video upload publish failures by @rabble in #5292
- fix(startup): continue after DB cipher bootstrap failure by @rabble in #5287
- feat(profile): cache video tabs with stale-while-revalidate by @hm21 in #5279
- perf(profile): audit relay snapshots to fix high-video-count lag by @hm21 in #5282
- feat(feed): distinct "signer unreachable" message for age-gate Verify age by @realmeylisdev in #5291
- fix(profile): surface accepted collabs on the own profile (#5213) by @realmeylisdev in #5284
- fix(router): fail open when minor-account review status errors by @untreu2 in #5295
- fix(db): fail closed on cipher bootstrap errors by @rabble in #5298
- fix(upload): preserve drafts after failed publish by @NotThatKindOfDrLiz in #5299
- feat(notifications): stale-while-revalidate inbox loading + fix cache retention by @hm21 in #5307
- feat(profile): cache the Videos tab with stale-while-revalidate by @hm21 in #5305
- feat(analytics): extract analytics package and unify event schema by @untreu2 in #5296
- fix(notifications): route video reply targets correctly by @NotThatKindOfDrLiz in #5300
- fix(settings): hide blocked content filter categories by @NotThatKindOfDrLiz in #5303
- fix(feed): keep home feed paused behind nested pushed routes by @hm21 in #5309
- refactor(explore): split explore_screen.dart by tab by @untreu2 in #5297
- fix(dm): stop reinstall from showing established chats as message requests (#5304) by @realmeylisdev in #5311
- fix(inbox): keep compose FAB from covering the last conversation tile by @hm21 in #5313
- chore: remove orphaned upload/explore/badge widgets (#4803) by @realmeylisdev in #5324
- style(design-system): migrate the DiscoverLists subscribe toggle to DivineIcon (#4803) by @realmeylisdev in #5323
- fix(library): truncate library toolbar title to a single line by @hm21 in #5319
- feat(apps): Android per-frame origin attestation for Nostr bridge by @realmeylisdev in #5318
- fix(db): recover stale encrypted cache keys by @rabble in #5326
- fix(db): force SQLCipher runtime on iOS by @rabble in #5328
- fix(likes): keep liked videos from disappearing by @NotThatKindOfDrLiz in #5330
- docs(widgets): remove stale deleted widget references by @NotThatKindOfDrLiz in #5336
- feat(router): cross-fade tab transitions via StatefulShellRoute by @hm21 in #5315
- feat(db): migrate encryption to SQLite3MultipleCiphers by @rabble in #5331
- test(vgv): reduce skip optimizer baseline by @NotThatKindOfDrLiz in #5340
- fix(apps): harden Nostr bridge edge cases by @NotThatKindOfDrLiz in #5339
- fix(notifications): fall back to profile on any unresolvable in-app tap by @realmeylisdev in #5345
- ci(file-size): make 800-line ceiling advisory (warn, never fail CI) by @hm21 in #5350
- feat(video-recorder): add lip-sync camera mode by @hm21 in #5346
- fix(collabs): harden collaboration lifecycle edges by @NotThatKindOfDrLiz in #5338
- fix(ios): drop stale SQLCipher link flag orphaned by the MultipleCiphers migration by @realmeylisdev in #5354
- chore(l10n): remove stale badge explanation keys by @NotThatKindOfDrLiz in #5342
- feat(camera): add single-photo capture for stop-motion by @hm21 in #5352
- fix(video): restore owner edit delete actions by @rabble in #5360
- chore(macos): remove committed project.pbxproj backup files by @realmeylisdev in #5356
- feat(dm): shared-reel DM reply + reaction bar (q-tag share, group reactions) by @realmeylisdev in #5358
- fix(camera): restore iOS flash mode build by @rabble in #5367
- test(explore): stabilize top hashtags asset loading by @NotThatKindOfDrLiz in #5362
- feat(subtitles): creator subtitle editing + republish to Blossom & 39307 by @rabble in #5365
- fix(video-player): stop iOS texture frame driver on app background (build 766 crash) by @realmeylisdev in #5369
- fix(content-warnings): allow clearing video labels by @NotThatKindOfDrLiz in #5376
- fix(profile): invalidate stats after video delete by @NotThatKindOfDrLiz in #5373
- fix(dm): route followed 1:1 peers to inbox by participant count, not isGroup flag (#5374) by @realmeylisdev in #5387
- fix(video-player): dispose iOS players on FlutterEngine teardown (#5371) by @hm21 in #5390
- fix(profile): keep the settings button (log export) visible during load by @hm21 in #5382
- fix(lists): initialize people-list storage before watchers by @NotThatKindOfDrLiz in #5379
- feat(dm): quoted video preview on shared-reel replies (#5388) by @realmeylisdev in #5392
- fix(notifications): bound inbox load + isolate revalidation bar repaint by @hm21 in #5380
- fix(dm): visible padded play chip on quoted reply preview by @realmeylisdev in #5401
- perf(home-feed): release neighbour players and pause prefetch when backgrounded by @hm21 in #5394
- fix(proofmode): enrich home feed proof tags by @NotThatKindOfDrLiz in #5378
- fix(video-editor): resolve subtitle editor route by video id by @NotThatKindOfDrLiz in #5398
- perf(db): run SQLite on a background isolate + batch EventRouter writes by @hm21 in #5395
- perf(dm): batch/throttle DM ingestion + cache_sync on a background isolate (#5391) by @realmeylisdev in #5405
- perf(feed): reduce thermal load from video ingestion by @rabble in #5408
- perf(feed): drop eager per-event verbose logging on video parse by @rabble in #5410
- perf(ingestion): keep event persistence off the UI path by @rabble in #5406
- fix(video-editor): track native renders for detached teardown by @NotThatKindOfDrLiz in #5400
- fix(metadata): open mentioned user profiles from video text by @rabble in #5411
- fix(trust-safety): route content reports to source relay by @NotThatKindOfDrLiz in #5375
- docs(video-editor): explain native log warning default by @NotThatKindOfDrLiz in #5416
- perf(dm): one long-lived decrypt isolate per history drain (#5391) by @realmeylisdev in #5412
- fix(verifier): open native verification in system browser by @NotThatKindOfDrLiz in #5372
- test(dm): prove the history drain yields on the remote-signer per-event path (#5391) by @realmeylisdev in #5417
- feat(dm): Instagram-style combined reaction pill + who-reacted sheet by @realmeylisdev in #5403
- test(perf): trace remote-signer DM backfill main-isolate cost + frames (#5413) by @realmeylisdev in #5423
- perf(dm): decrypt remote-signer history drain in parallel by @realmeylisdev in #5426
- fix(dm): paint in-chat reaction chips optimistically (#5389) by @realmeylisdev in #5421
- fix(videos_repository): fall back when recommendations fail by @rabble in #5427
- fix(profile): fetch missing profile stats by @rabble in #5429
- perf(dm): move remote-signer gift-wrap validation off the main isolate by @realmeylisdev in #5434
- fix(dm): render flying reaction on one GPU layer (#5389) by @realmeylisdev in #5445
- fix(dm): add DB uniqueness guard for live DM self-reactions (#5419) by @realmeylisdev in #5449
- fix(dm): thread real blocklist into DM reaction displays (#5418) by @realmeylisdev in #5453
- fix(db): honor lowercase #a tag filter in event cache query by @rabble in #5431
- fix(video-editor): recover from stalled draft writes by @hm21 in #5440
- perf: cut UI-isolate CPU (theme lerp, redundant signing, feed rebuilds) by @hm21 in #5450
- fix(dm): stop re-decrypting reaction/deletion gift wraps every launch (#5452) by @realmeylisdev in #5456
- fix(video_editor): prevent text layer shrinking when adding many paint layers by @hm21 in #5457
- fix(divine_ui): symmetric DivineButton padding for better label overflow by @hm21 in #5446
- fix(blocking): publish blocks to the NIP-51 kind 10000 mute list by @untreu2 in #5435
- perf(subtitle): rebuild caption pill only on cue change by @hm21 in #5454
- fix(notifications): classify anchored comment replies by @NotThatKindOfDrLiz in #5464
- fix(db): match local nostr tag filters exactly by @NotThatKindOfDrLiz in #5463
- fix(feed): deduplicate addressable videos by @NotThatKindOfDrLiz in #5465
- fix(dm): count followed-but-unreplied unread chats in the Messages badge (#4976) by @realmeylisdev in #5473
- fix(video-editor): restore drafts with sticker layers without crashing by @hm21 in #5474
- fix(divine_ui): keep wider DivineButton padding when not stretched by @hm21 in #5469
- fix(dm): classify message requests with the real pubkey, not the empty cold-start one (#5374) by @realmeylisdev in #5480
- feat(camera): add previewOptimized + lowLatency stabilization modes by @hm21 in #5476
- fix(auth): break /welcome login loop on silent restore failure by @untreu2 in #5483
- fix(notifications): enrich cached refresh failures by @NotThatKindOfDrLiz in #5466
- feat(feed): filter unavailable videos across all surfaces by @untreu2 in #5482
- feat(video-editor): add clip transitions between clips by @hm21 in #5479
- fix(recorder): stop a stuck recording from the button and recover on stop failure by @hm21 in #5489
- docs: add CLAUDE.md importing AGENTS.md by @dcadenas in #5491
- chore(age-review): sync Greenlight parent email by @NotThatKindOfDrLiz in #5485
- chore(release): bump app version to 1.0.16 by @rabble in #5507
- fix(upload): retry transient Blossom auth setup failures by @rabble in #5502
- fix(upload): retry uploads when the signer is briefly unreachable by @hm21 in #5504
- fix(video-player): recover frozen texture mid-clip without waiting for the loop by @rabble in #5511
- feat(video-editor): per-layer enter/leave animations with combinable effects by @hm21 in #5494
- fix(video-editor): restrict clip transitions to debug builds by @hm21 in #5498
- fix(inbox): stabilize DM message ordering and drop dead DAO method (#4407) by @realmeylisdev in #5510
- fix(video-editor): release feed codecs when opening camera/editor by @hm21 in #5522
- fix(dm): stop conversation upsert from clobbering read state (#4977) by @realmeylisdev in #5506
- feat(bug-report): add runtime diagnostics to log export header by @hm21 in #5531
- fix(video-editor): recover from Qualcomm encoder failures on export by @hm21 in #5524
- feat(dm): read + publish the user's own kind-10050 DM inbox relays (#4974) by @realmeylisdev in #5493
- fix(video-editor): prevent overlapping clip transitions; show rendered output duration by @hm21 in #5508
- fix(video-recorder): smooth and extend hold-to-record drag zoom by @hm21 in #5533
- fix(video-editor): cross-fade thumbnail into preview on open by @hm21 in #5526
- fix(camera): smooth iOS preview with previewOptimized stabilization by @hm21 in #5520
- feat(feed): swipe left/right to directly tune your recommendations by @rabble in #5509
- fix(camera): stop Android preview crash on torn-down texture and encoder executor by @hm21 in #5535
- fix(explore): warm popular classic feed before switching by @rabble in #5513
- fix(feed): auto-retry the active video after it fails to load by @rabble in #5514
- fix(upload): yield bandwidth to feed playback with inter-chunk backpressure by @rabble in #5537
- fix(auth): preserve drafts when removing local account by @NotThatKindOfDrLiz in #5519
- feat(dm): cross-device DM read-state sync via self-encrypted markers (#4977) by @realmeylisdev in #5543
- fix(video-editor): stop preview playhead jumping back when a transition finishes rendering by @hm21 in #5539
- fix(video-editor): release preview decoder before export render by @hm21 in #5541
- fix(feed): ignore stale Nostr enrichment by @NotThatKindOfDrLiz in #5548
- fix(feed): preserve native video loop boundaries by @NotThatKindOfDrLiz in #5551
- refactor(feed): extract video_feed_page widget classes by @realmeylisdev in #5554
- test(player): cover native HLS auth-header transport (#4897) by @realmeylisdev in #5556
- refactor(video): remove orphaned videoPrewarmerProvider (#5553) by @hm21 in #5557
- fix(profile): recover own profile refresh by @rabble in #5552
- fix(apps): open verifier in system browser from Apps Directory + standardize spelling by @mbradley in #5500
- refactor(upload): delete dead UploadManager methods by @realmeylisdev in #5569
- feat(feed): add Classics mode to the home feed picker by @hm21 in #5564
- feat(video-recorder): make the zoom ruler interactive by @hm21 in #5559
- chore(media-cache): surface the cause of failed media downloads by @hm21 in #5567
- chore(macos): ignore Xcode-generated SwiftPM lockfiles by @hm21 in #5572
- refactor(upload): extract PendingUploadStore from UploadManager (#4507) by @realmeylisdev in #5574
- feat(l10n): localize video-publish error strings (below-UI-layer) (#4892) by @realmeylisdev in #5565
- fix(macos): use file-based keychain for secure storage in debug by @hm21 in #5571
- fix(media_cache): build Cronet engine eagerly so dart:io fallback engages by @hm21 in #5581
- fix(video-editor): surface the real cause of draft-save failures by @hm21 in #5587
- fix(upload): stop PendingUploadStore save queue double-enqueuing failed uploads by @realmeylisdev in #5585
- fix(search): bound NIP-50 relay query stalls by @NotThatKindOfDrLiz in #5562
- feat(video-editor): add voice-over recorder by @hm21 in #5570
- refactor(upload): delete dead getUploadsByStatus query helper by @realmeylisdev in #5580
- refactor(upload): extract UploadRetryPolicy + UploadProgressReporter (#4507) by @realmeylisdev in #5589
- fix(comments): keep just-posted comment visible while REST index lags by @realmeylisdev in #5599
- refactor(upload): invert crash-reporting blocker behind a port (#4507) by @realmeylisdev in #5601
- fix(nostr): recover failed client initialization by @NotThatKindOfDrLiz in #5600
- fix(nostr): guard ref after async gap in NostrService._initializeClient by @realmeylisdev in #5615
- fix(comments): dismiss keyboard when the comments sheet closes by @realmeylisdev in #5616
- fix(search): truncate overflowing hashtag in SearchTagChip by @hm21 in #5607
- fix(comments): open author profile when tapping the comment avatar by @realmeylisdev in #5617
- fix(video): keep clips and drafts loading past one corrupt row by @hm21 in #5613
- fix(video-recorder): keep recording stop responsive across slow saves and navigation races by @hm21 in #5609
- fix(video-editor): bump pro_video_editor to 2.1.1 for speed-effect export by @hm21 in #5606
- fix(models): ignore "unverified" verification tag in hasProofMode by @hm21 in #5611
- test(nostr): assert disposed-ref leak explicitly in init guard tests by @realmeylisdev in #5621
- fix(video-editor): guard editor capability sync and audio preview against unmount by @hm21 in #5628
- refactor(profile): split profile_setup_screen.dart by section (#4512) by @realmeylisdev in #5626
- fix(feed): prevent idle warmup contention by @NotThatKindOfDrLiz in #5549
- fix(media-cache): ignore processing responses by @NotThatKindOfDrLiz in #5597
- refactor(analytics): inject SurfacePerformanceTracker via Riverpod provider by @realmeylisdev in #5632
- fix(video-editor): clean up draft-local audio files on draft deletion by @hm21 in #5633
- refactor(di): inject clean infra services via Riverpod providers by @realmeylisdev in #5630
- perf(dm): adopt keycast nip17_unwrap_batch to drain remote-signer DM history in one call/page by @realmeylisdev in #5627
- fix(video-editor): drop clips with deleted source files to prevent frozen preview by @hm21 in #5635
- fix(video): prevent overlapping feed audio by @NotThatKindOfDrLiz in #5620
- refactor(analytics): remove dead VideoLoadingMetrics and metrics overlay by @realmeylisdev in #5629
- fix(auth): allow badges oauth navigation safely by @NotThatKindOfDrLiz in #5624
- refactor(analytics): inject ErrorAnalyticsTracker via Riverpod provider by @realmeylisdev in #5631
- fix(auth): preserve NIP-46 signer callback sessions by @NotThatKindOfDrLiz in #5622
- fix(video-editor): harden recording clip file races by @hm21 in #5639
- fix(moderation): wait for ready nostr session by @NotThatKindOfDrLiz in #5596
- fix(video-editor): handle COMPOSITION_ERROR from native setClips on draft reopen by @hm21 in #5637
- refactor(camera): route recorder permission asks through the gate by @hm21 in #5644
- build(macos): split debug codesigning and hardened runtime work out of #4029 by @hm21 in #5643
- fix(video-editor): stop iOS ProVideoEditor callback crash on FlutterEngine teardown by @hm21 in #5642
- fix(video-player): bound Android feed ExoPlayer buffers to curb OOM (#3419) by @hm21 in #5649
- feat(profile): track original Funnelcake profile event timestamps by @hm21 in #5648
- feat(video-editor): localize sticker descriptions and pack names by @hm21 in #5651
- fix(macos): drive camera and microphone permissions through native AVFoundation by @hm21 in #5650
- perf(dm): debounce DM unread-count cubit to coalesce write bursts by @realmeylisdev in #5652
- perf(dm): debounce conversation-list recompute to coalesce write bursts by @realmeylisdev in #5655
- perf(dm): skip redundant mark-read writes on outgoing-only conversation ticks by @realmeylisdev in #5658
- perf(dm): batch the per-page gift-wrap dedup probe into two IN queries by @realmeylisdev in #5660
- perf(cache-sync): track running byte total and batch LRU eviction by @realmeylisdev in #5662
- perf(dm): short-circuit statusFor when there are no in-flight queue rows by @realmeylisdev in #5663
- chore(metaswarm): configure Divine knowledge sources by @rabble in #5646
- fix(dm): stop reaction removal from popping the conversation screen by @realmeylisdev in #5666
- perf(test): speed up mobile test startup by @rabble in #5668
- fix(video): play and visualize imported audio in lip-sync recorder by @hm21 in #5685
- perf(share): make share-to-DM feel instant (offload, optimistic send, batched + shimmer contacts) by @realmeylisdev in #5673
- fix(share): lift the share-sheet message field above the keyboard by @realmeylisdev in #5689
- refactor(auth): migrate nostrconnect failure paths to reason codes by @realmeylisdev in #5684
- fix(video-player): scope Apple plugin registrar and register-time cleanup per engine by @hm21 in #5687
- fix(video-editor): split clips via frame-accurate splitVideo primitive by @hm21 in #5690
- fix(video-editor): stop doubling the split clip filename suffix by @hm21 in #5691
- fix(camera): bind native diagnostics sink to UI activity lifecycle by @hm21 in #5681
- chore(proofmode): downgrade expected missing proof logs by @NotThatKindOfDrLiz in #5699
- fix(video-editor): reconcile orphan-only undo/redo state by @hm21 in #5686
- fix(relay): retry video subscriptions after relay reconnect by @NotThatKindOfDrLiz in #5700
- fix(cache): initialize personal event cache after auth by @NotThatKindOfDrLiz in #5701
- docs: scope code-style line-length rule to Dart only by @hm21 in #5679
- feat(profile): route kind 0 publish through publishEventAwaitOk for relay-confirmed saves by @hm21 in #5674
- fix(profile): animate avatar lightbox with a Hero route and proportional radius by @hm21 in #5676
- feat(profile): crop avatars and banners before upload by @hm21 in #5682
- fix(content-warnings): respect age-restricted playback settings by @NotThatKindOfDrLiz in #5672
- fix(upload): preserve resumable sessions on socket drops by @NotThatKindOfDrLiz in #5702
- fix(age-verification): stop repeated video verification by @NotThatKindOfDrLiz in #5671
- fix(auth): handle duplicate email verification conflicts by @NotThatKindOfDrLiz in #5625
- fix(notifications): map kind-16 reposts when notification_type is absent by @realmeylisdev in #5709
- feat(reel): instagram-style reaction float animation by @realmeylisdev in #5704
- ci(hooks): mirror arb-consistency and untested-services-floor gates in pre-push by @dcadenas in #5706
- refactor(auth): dead-code cull + NostrKeyManager consolidation (#4741) by @realmeylisdev in #5716
- refactor(auth): break AuthenticationSource cycle + relocate BlockListSigner (#4741) by @realmeylisdev in #5717
- fix(video-editor): bump pro_image_editor to 12.11.1 for layer animation fix by @hm21 in #5714
- test(auth): characterization gap-fill before auth_service extraction (#4741) by @realmeylisdev in #5713
- feat(upload): OS-backed background uploads that survive app suspension by @hm21 in #5590
- feat(minor-safety): consume verified_minor + protected-minor state (#5730) by @mbradley in #5708
- refactor(router): split app_router.dart by feature module (#4508) by @realmeylisdev in #5711
- fix(video-editor): show timeline clip poster instantly on first open by @hm21 in #5722
- refactor(auth): retire NostrKeyManager, relocate legacy-key migration (#4741) by @realmeylisdev in #5724
- test(auth): stop signout_cleanup nulling the shared secure-storage channel (#4741) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5725
- docs(router): document route spread order invariant in app_router by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5734
- fix(ui): tighten search icon padding in prefix-icon text fields by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5736
- refactor(auth): extract SignerSecureStore from auth_service (#4741) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5729
- refactor(auth): extract SignerFactory — identity build + event signing (#4741) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5739
- refactor(auth): port the bunker auth-url launch behind AuthUrlLauncher (#4741) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5741
- fix(video-editor): bump pro_video_editor to 2.2.2 for rendering fixes by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5718
- fix(router): make the welcome→shell swap transition-free by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5745
- fix(likes): align addressable liker counts by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5748
- refactor(auth): extract RelayDiscoveryOrchestrator + inject BackgroundActivityManager (#4741) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5757
- feat(minor-safety): protected-minor adult-content lock (mobile) (#175) by @mbradley in https://github.com/divinevideo/divine-mobile/pull/5744
- fix(test): defuse #5340 re-bundled integration files, exception-safe restores by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5755
- fix(playback): handle media 202 as processing by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5550
- fix(video-editor): recover editor preview from decoder-init contention by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5752
- fix(editor): restore playback session after recording by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5766
- fix(nostr): verify inbound relay event signatures by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5774
- feat(moderation): hide nudity/sexual content by default until explicit opt-in by @rabble in https://github.com/divinevideo/divine-mobile/pull/5768
- fix(video): combine classic Vine and Divine engagement counts, show both in info sheet by @rabble in https://github.com/divinevideo/divine-mobile/pull/5771
- fix(feed): stop terminal playback retry loops by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5750
- fix(drafts): guard missing split clip files by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5781
- fix(editor): restore playback after voice-over by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5779
- fix(media_cache): stop reporting scroll-away image cancellations as fatal by @rabble in https://github.com/divinevideo/divine-mobile/pull/5782
- feat(l10n): translate all 284 missing keys across the 17 non-English locales by @rabble in https://github.com/divinevideo/divine-mobile/pull/5790
- refactor(auth): extract OAuthSessionCoordinator — single-flight refresh (#4741) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5805
- feat(share): unify share sheet on select-then-send recipients model by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5758
- fix(video-editor): pause playback when a scrub grabs the timeline mid follow-animation by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5810
- feat(dm): double-tap a message to like it by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5804
- feat(video-editor): pre-render per-clip speed for smooth preview playback by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5732
- fix(video_editor): stop trim handle lagging behind the finger by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5808
- fix(editor): stop split clip thumbnails flashing black by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5812
- fix(editor): layer animation reliability (timeline drop + export axis) by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5815
- fix(feed): stop the home overlay sliding on keyboard close by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5818
- refactor(auth): extract KnownAccountsRegistry — known-accounts CRUD + migration (#4741) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5807
- fix(dm): guard cubit emits after close during conversation scroll by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5824
- refactor(auth): extract NostrConnectCoordinator — nostrconnect:// flow (#4741) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5826
- fix(profile): don't re-claim owned usernames + classify claim network errors (#4199) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5830
- fix(likes): chunk the Kind 5 deletion REQ so it can't overflow the relay frame by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5831
- fix(upload): keep the picked cover thumbnail on publish by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5832
- test(vgv): heal-and-blame harness for shared channels + scoped-override helper (#5738) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5837
- feat(video_editor): tune adjustments with timeline sets by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5819
- feat(video_recorder): let lip-sync record past the 6.3s limit by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5835
- fix(logging): remove dead log batcher by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5785
- chore(logs): quiet routine foreground-idle warmup passes by @rabble in https://github.com/divinevideo/divine-mobile/pull/5792
- fix(video-editor): guard timeline clip controls against a torn-down editor by @rabble in https://github.com/divinevideo/divine-mobile/pull/5799
- fix(account): scope local creator data maintenance by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5791
- test(feed): cover bulk-stats hydration fallbacks in videos_repository by @rabble in https://github.com/divinevideo/divine-mobile/pull/5793
- chore(l10n): fix machine-translated sticker descriptions in all 17 locales by @rabble in https://github.com/divinevideo/divine-mobile/pull/5802
- refactor(feed): remove orphaned popularNowFeedProvider by @rabble in https://github.com/divinevideo/divine-mobile/pull/5797
- fix(feed): support desktop feed tuning swipes by @rabble in https://github.com/divinevideo/divine-mobile/pull/5786
- fix(push): encrypt FCM token in kind-3080 deregistration events by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5828
- fix(library): guard clip-delete Undo against a closed bloc by @rabble in https://github.com/divinevideo/divine-mobile/pull/5794
- refactor(router): retire forceExploreTabNameProvider by @rabble in https://github.com/divinevideo/divine-mobile/pull/5798
- chore: delete dead ShareVideoMenu widget by @rabble in https://github.com/divinevideo/divine-mobile/pull/5801
- fix(divine-camera): recover iOS audio after stale interruption by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5846
- docs(testing): coverage by layer; require tests to be able to fail by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5857
- refactor(app): remove obsolete keyboard framework-error suppression by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5864
- build(android): re-enable R8 minification by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5789
- feat(profile): add monetization links by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5665
- fix(playback): prefer raw direct upload sources by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5848
- fix(keycast): cache unsupported canonical signing by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5850
- fix(profile): scroll profile badges horizontally instead of wrapping by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5855
- fix(feed): dedupe addressable videos by coordinate across feeds by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5876
- fix(camera): fire the native permission dialog on the current page by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5879
- fix(db): recover corrupt local database by salvaging drafts/clips, not wiping by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5871
- fix(comments): scroll a newly-posted reply into view (#5854) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5861
- fix(camera): release iOS mic on pause and log audio diagnostics by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5869
- revert(reel): restore the pre-#5704 center reaction pop by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5841
- fix(notifications): classify likes on comments via targetCommentId by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5883
- fix(video_editor): provide tune bloc to the add-sheet route by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5895
- fix(profile): scope profile tab cache by viewer by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5868
- fix(camera): freeze preview on lens switch via SurfaceProducer by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5866
- perf(feed): cache action-button icon shadows in a RepaintBoundary by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5899
- test(video_editor): dedupe add-sheet test host builders by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5897
- perf(feed): cut startup widget rebuilds (profile dedup, icon cache, scroll-fade isolation) by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5890
- fix(db): quick_check the cipher-migration artifact before promotion by @rabble in https://github.com/divinevideo/divine-mobile/pull/5903
- feat(divine_ui): enable region-aware spell check in DivineTextField by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5886
- fix(l10n): correct CSAM report-reason mistranslation in all locales by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5902
- fix(oom): instrument + bound the 1.0.15 feed-video and ingestion memory sources by @rabble in https://github.com/divinevideo/divine-mobile/pull/5906
- perf(profile): render profile counts before relays connect (#5863) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5901
- fix(profile): cancel route-scoped feed subscription by @rabble in https://github.com/divinevideo/divine-mobile/pull/5910
- chore(android): migrate internal plugins to Flutter 3.44 built-in Kotlin by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5918
- fix(router): keep shell app bar stable during full-screen route push by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5924
- fix(infinite_video_feed): guard playback activation against disposed controller by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5926
- fix(share-videos): hydrate loop counts on shared-video previews by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5916
- feat(video-editor): keep marker controls open for rapid beat marking by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5917
- perf(nostr): skip re-verifying already-known events on cold start by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5888
- chore(main): route error-handler reporting through CrashReportingService (#4596) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5932
- perf(nostr): verify inbound relay events off the main isolate by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5894
- fix(video): enforce declared bitrate across recording and render by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5928
- feat(minor-safety): dev-options toggle for the protected-minor override (#5721) by @mbradley in https://github.com/divinevideo/divine-mobile/pull/5930
- feat(video-editor): combine draw layers via timeline multi-select by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5931
- fix(videos_repository): refresh new feed from relays by @rabble in https://github.com/divinevideo/divine-mobile/pull/5913
- fix(feed): prefer hls for divine blob playback by @rabble in https://github.com/divinevideo/divine-mobile/pull/5935
- perf(badges): batch dashboard relay lookups instead of serial awaits by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5946
- feat(analytics): add product event ingest queue by @rabble in https://github.com/divinevideo/divine-mobile/pull/5911
- fix(comments): hide stranded keyboard on sheet dismiss after background/resume by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5961
- fix(drafts): don't re-save a draft when reopening it to view by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5964
- perf(app): eliminate main-isolate CPU hotspots and raster jank by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5957
- feat(l10n): localize VideoDetailScreen copy (#5125) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5954
- refactor(providers): replace private Riverpod src imports by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5948
- perf(feed): paint the video backdrop only in the letterbox bars by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5965
- refactor(video-editor): remove dead VideoEditorLayerReorderSheet by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5943
- fix(library): show snackbar feedback when downloading a clip by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5974
- fix(feed): auto-dismiss the tuning Undo snackbar by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5972
- fix(video-editor): bump pro_video_editor to 2.5.1 to fix multi-clip editor freeze by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5979
- feat(proofmode): carry C2PA manifest forward on watermark download by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5976
- feat(video-editor): loop-restart transition between last and first clip by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5980
- feat(router): fade-upwards transition for camera and library flows by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5982
- feat(minor-safety): protected-minor DM restriction (mobile) (#176) by @mbradley in https://github.com/divinevideo/divine-mobile/pull/5754
- docs: align README with Divine brand guidelines by @rabble in https://github.com/divinevideo/divine-mobile/pull/5993
- docs: sync vendored brand guidelines with canonical by @rabble in https://github.com/divinevideo/divine-mobile/pull/5997
- docs: sync vendored brand guidelines (about.divine.video enrichment) by @rabble in https://github.com/divinevideo/divine-mobile/pull/5999
- fix(feed): skip + prune dead-media items in the home scrolling feed by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5969
- docs: rewrite README to reflect current state by @rabble in https://github.com/divinevideo/divine-mobile/pull/6001
- ci(packages): enforce per-package analysis options and CI workflows by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5955
- build(android): right-size Gradle/Kotlin JVM memory for the CI machine by @rabble in https://github.com/divinevideo/divine-mobile/pull/5995
- chore: Add local Android verifier setup command by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/5989
- fix(comments): keep reply composer above keyboard by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5947
- fix(comments): clear the stale engine text-input client on sheet dismiss by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6008
- fix(video-editor): disable clip Split/Speed while busy instead of hiding them by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6003
- fix(cache): bound runaway on-disk storage growth by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5986
- feat(camera): blur the front/back switch and fix its flashes by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5984
- fix(avatar): cache broken avatar URLs by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5945
- fix(c2pa): clarify signing TLS failures by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5950
- ci(android): set Gradle heap where Codemagic reads it + move to mac_mini_m4 by @rabble in https://github.com/divinevideo/divine-mobile/pull/6011
- feat(minor-safety): gate nsec export + key import for protected minors (#182) by @mbradley in https://github.com/divinevideo/divine-mobile/pull/5991
- fix: Show background upload notification immediately (no FGS deferral) by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/6032
- docs(test): investigate mobile test feedback performance by @rabble in https://github.com/divinevideo/divine-mobile/pull/6017
- fix(video-editor): keep timeline thumbnails stable across split renders and undo/redo by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6005
- feat(settings): storage management screen with configurable cache limit by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6009
- fix(dm): make DM reaction delivery durable (OK-confirm + auto-retry) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5977
- fix(minor-safety): refresh account-state providers on foreground-resume (#185) by @mbradley in https://github.com/divinevideo/divine-mobile/pull/6027
- ci(android): upload Google Play release as a draft to unblock the build by @rabble in https://github.com/divinevideo/divine-mobile/pull/6014
- fix(feed): prefer progressive mp4 over hls for short-video playback by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6036
- fix(video-publish): app auto-double-publishes videos on the audio-reuse path by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6025
- fix(divine_ui): keep DivineButton size constant with or without border by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6034
- feat(settings): move Developer Options to the settings hub with an off switch by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6039
- fix(dm): treat a blocked DM send as terminal in the queue drain (#186) by @mbradley in https://github.com/divinevideo/divine-mobile/pull/6028
- fix(list): show a single back button in curated list video mode by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6043
- fix(video): preserve unowned tags on metadata-edit republish by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6026
- test(curated-list): re-enable three FIXME-marked list service tests by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6041
- feat(support): add device and environment diagnostics to log export header by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6023
Full Changelog: 1.0.15...1.0.16