Divine

co.openvine.app
by Divine HQ _@divinehq.divine.video

Divine is a new 6-second looping video app, inspired by Vine, with a commitment to preserving authentic human creativity. AI slop is not permitted in the app. Built on Nostr, you can create, share and discover short form videos, with full ownership of your content, followers and user name. Note: the app is currently in beta. We'd love your feedback - please share via Support in the app.

First release: Feb 21, 2026, 11 total releases.

Most recent release: Sep 24, 2026.

Website Repo

Appears in 12 app stacks.

0 sats / 0 zaps received in the past year.

Sats Received

Underlying data available via MCP: app_zaps, app_releases.

Zap Count

Underlying data available via MCP: app_zaps, app_releases.

Releases

  • Sep 24, 2026 1.0.23
    ## What's Changed * docs(agents): require reading the source Zendesk ticket, and keep it out of this repo by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8371 * fix(local_stack): start invite service on Apple Silicon by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8373 * fix(dm): say which request the bulk sweep kept by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8349 * chore(legal): show Shorebird updater licenses in the app by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8374 * ci(tests): make shared-channel leaks fail the test that caused them by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8364 * fix(a11y): give the feed-mode selector a 48dp tap target by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8367 * ci(tests): keep unrelated test files in stable shards by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8376 * fix(dm): derive the live DM since: window in the clock the relay filters by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8361 * test(helpers): keep auth fixture state consistent by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8383
    More…
    * fix(dm): bind an incoming reaction to the last e/p tag per NIP-25 by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8379 * fix(minor-review): show the 15-day response deadline by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8381 * fix(account): stop failed signer recovery from delaying startup by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8375 * fix(dm): enforce moderation-notice removal at the repository boundary by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8400 * fix(dm): avoid generated handles while profiles load by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8394 * fix(dm): stop offline sweeps burning the reaction retry budget by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8387 * fix(profile): show real counts in the message request preview by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8405 * fix(likes): bind a reaction to the last e tag per NIP-25 by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8397 * feat(dm): publish the kind-10050 DM inbox list so NIP-17 senders can reach divine users by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8378 * test(dm): drop two inherited stubs and strengthen account-switch coverage by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8410 * fix(dm): name a group conversation for the room, not one of its members by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8395 * test(dm): declare each DM decision stub where its decision is made by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8412 * test(dm): freeze shared-setUp stub counts so the shape cannot regrow by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8414 * fix(dm): stop the startup dedup pass from erasing a group conversation by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8401 * fix(nostr_sdk): send reads only to requested relays by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8417 * fix(dm): source the conversation header's follower count from ProfileStats by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8416 * test(dm): cover transaction rollback and membership on the DM persist paths by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8425 * test(widgets): scope positional finders that feed a decoration cast by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8423 * fix(dm): publish the sender's self-wrap to their own kind-10050 inbox relays by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8435 * fix(dm): keep vanished accounts from flashing generated handles by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8384 * fix(dm): route gift-wrapped DM reactions to the recipient's kind-10050 inbox by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8437 * docs(nostr_sdk): replace the settle window's latency basis with measured data by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8440 * fix(observability): report the real memory peak, pressure events, and stop crowding the log by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8445 * fix(dm): recover group conversations erased by the startup dedup pass by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8426 * fix(dm): make the forced recovery drain actually reach the window it was bumped for by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8442 * fix(avatar): decode avatars at their slot size instead of full resolution by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8447 * fix(dm): stop scoring a fallback-pool OK as delivery on an unreadable inbox by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8436 * ci(tests): publish a failing shard's seed and replay recipe by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8419 * fix(dm): bound the send segments that sit outside the publish backstop by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8448 * fix(analytics): stop leaking into the background activity registry by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8402 * refactor(async): pay down production Future.delayed sites and fix the ratchet by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8333 * fix(release): keep Zapstore icon aligned with iOS by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8469 * fix(dm): tell the user when a resend failed again by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8463 * fix(reporting): refuse self-reports before they publish (#8352) by @mbradley in https://github.com/divinevideo/divine-mobile/pull/8454 * fix(privacy): redact filesystem paths from bug report diagnostics by @mbradley in https://github.com/divinevideo/divine-mobile/pull/8470 * test(enforcement): restore the guard against rendering a moderation reason by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8479 * docs(dm): record the retired moderation key as unrecovered by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8477 * feat(l10n): make Divine available in Telugu by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8478 * test(dm): prove relays silently omit late gift wraps (#8439) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8504 * fix(settings): guide profile-less users from NIP-05 by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8496 * fix(profile): keep failed batch lookups indeterminate by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8513 * fix(observability): stop reporting image decode allocation failures as fatal by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8480 * fix(dm): stop showing a DM reaction as sent when the recipient's inbox could not be read by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8514 * fix(dm): close the three retired-thread writes the composer notice missed by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8490 * fix(dm): make every NIP-04 dual-send failure observable by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8502 * fix(dm): carry the reply tag on the NIP-04 twin, when it resolves by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8509 * fix(media-cache): stop SafeCacheInfoRepository mutating FlutterError.onError by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8482 * refactor(async): replace AsyncUtils timer-backed waits with cancellable coordination by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8489 * fix(dm): clear the nip04 latch when the peer proves they speak NIP-17 by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8505 * feat(lists): rebuild the list detail screen to the new design by @Chardot in https://github.com/divinevideo/divine-mobile/pull/8453 * feat(support): add a Clear Logs action to Support Center by @mbradley in https://github.com/divinevideo/divine-mobile/pull/8494 * fix(dm): guard the unscoped DmRepository reads and writes when the owner is unknown by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8525 * fix(dm): resolve DM send-target peers through the shared naming chain by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8533 * fix(dm): read the NIP-44 extended length prefix and bound oversized DMs by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8529 * fix(logging): export log timestamps in UTC by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8520 * fix(profile): resolve people-picker and shared-row identity through the vanished step by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8536 * chore(tooling): add lnav log formats for app exports and CI logs by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8521 * fix(dm): stop scoring a delete-for-everyone as sent when the recipient's inbox could not be read by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8532 * fix(dm): unlatch a one-way thread from the peer's advertised inbox by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8524 * ci(android): send release builds to internal testing first by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8549 * fix(playback): play new uploads while renditions are processing by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8559 * fix(explore): require 18+ verification for restricted featured tabs by @mbradley in https://github.com/divinevideo/divine-mobile/pull/8541 * fix(notifications): request Inbox refresh after foreground push by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8552 * fix(profile): keep newly published videos in the profile grid by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8560 * docs(agent): restore shared safety and delivery rules by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8579 * fix(dm): make message restore recover when the relay pool has gone idle by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8554 * fix(db): keep rollback journals with their databases by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8567 * fix(search): keep avatar failures private by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8582 * fix(video-metadata): keep lower options reachable while typing by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8577 * fix(moderation): scope adult-content verification to the active account by @mbradley in https://github.com/divinevideo/divine-mobile/pull/8538 * fix(dm): keep a refused delete-for-everyone visible, replayable, and announced by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8206 * fix(search): cancel superseded query work by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8581 * fix(search): put exact account matches first by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8578 * fix(db): recover hot rollback journals during startup by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8568 * fix(dm): close four ways a direct message is lost silently by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8597 * fix(video-editor): stop a stuck export from disabling Post forever with no explanation by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8592 * fix(dm): keep loading old messages fast after a brief signer hiccup by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8585 * fix(follow): order the contact list by created_at, not by p-tag count by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8555 * fix(reporting): surface dropped image insertions in the content report field by @mbradley in https://github.com/divinevideo/divine-mobile/pull/8511 * fix(push): keep notifications registered across account switches by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/8562 * fix(dm): let each local account keep its own copy of a group message by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8586 * test(dm): guarantee a resent direct message still arrives as one message by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8589 * fix(settings): resume NIP-05 setup after profile creation by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8613 * refactor(search): keep people-search cancellation always active by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8603 * fix(testing): stop conversation-list tests failing on slow runners by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8606 * fix(testing): stop font loading order from changing layout tests by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8607 * fix(dm): keep failed appeals visible after moderation rotation by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8611 * fix(observability): keep shared log exports within device limits by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8609 * fix(dm): restrict only confirmed Greenlight accounts by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8608 * fix(dm): hide player replies in closed and blocked conversations by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8605 * docs(reporting): define private evidence for DM abuse reports by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8610 * fix(verify): tell people which part of their proof failed instead of always blaming the npub by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8614 * fix(dm): stop reporting group DM delivery to a recipient whose inbox we could not read by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8590 * fix(perf): make Android image allocation failures measurable by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8604 * fix(support): explain rejected keyboard image insertions by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8621 * fix(dm): stop charging a group DM's retry budget twice when the sweep already owns the attempt by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8624 * refactor(di): make startup, crash reporting, and background lifecycle injectable by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8615 * fix(a11y): name the profile row's icon-only buttons for screen readers by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8638 * fix(dm): keep oversized messages from freezing the inbox by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8612 * fix(perf): reduce memory used by feed and profile images by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8623 * refactor(divine-ui): prevent untranslated accessibility labels by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8632 * chore(tooling): block undocumented empty catches in production Dart by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8634 * fix(collabs): prevent creators from inviting themselves by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8631 * fix(dm): stop dropping a DM when the recipient's inbox is on relays we don't already query by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8630 * fix(account-deletion): keep users blocked until deletion is confirmed by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/8584 * fix(e2e): stop dead settings tests from hiding copy drift by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8633 * fix(likes): stop publishing a second like when the first one already landed by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8626 * fix(ios): stop Xcode builds from failing on the iOS 13 Swift package floor by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8642 * fix(dm): stop telling established accounts that chats haven't finished restoring by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8643 * fix(collabs): prevent saved drafts from inviting their creator by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8645 * fix(observability): stop dropping crash reports filed before Crashlytics finishes initializing by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8637 * refactor(di): make five more services injectable and delete three dead code paths by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8640 * fix(dm): keep refused reaction removals retryable by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8622 * fix(collabs): prevent malformed collaborator keys from reaching video events by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8650 * fix(testing): keep font metrics stable across merged tests by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8656 * test: make "unchanged" assertions fail when the code they test is a no-op by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8639 * test(dm): pin that closed moderation threads offer no reaction-removal retry by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8660 * chore(process): stop ungrounded post-merge reviews by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8655 * fix(test): stop one widget test from failing unrelated tests at random by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8666 * feat(tooling): distinguish concurrent sessions by active worktree by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8654 * chore(async): block added waits in baselined files by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8635 * fix(dm): stop three ways a moderation notice becomes unreachable, and write down what each DM store keeps by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8667 * fix(ui): show the right account on a second profile link, and announce the closed-thread exit by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8670 * fix(verifier): sign the account-unlink request with the URL it actually sends by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8711 * fix(dm): run the DM startup repairs once an identity is known, not a signer by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8707 * ci(e2e): ensure iOS tests run against the newly built app by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8653 * fix(e2e): catch copy changes the Maestro guard was passing as clean by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8684 * chore(ratchets): make design-system cleanups stick instead of quietly unwinding by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8689 * refactor(bookmarks): stop exporting a bookmark-lookup helper nothing calls by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8686 * fix(dm): stop rebuilding messages after local encryption fails by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8704 * fix(repositories): stop a failed cache clear from half-clearing likes and reposts by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8722 * fix(tooling): make the stale-branch report able to recommend anything by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8682 * refactor(video): remove unused playback state code by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8709 * fix(media): dispose the images that blurhash placeholders and watermark rendering create by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8678 * fix(bookmarks): keep the tags other clients wrote on a saved-videos list by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8721 * fix(dm): hide conversations that only contain yourself by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8694 * refactor(profile): decide once whether a profile link is your own by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8718 * fix(nostr): keep Divine's client tag off ephemeral gift wraps by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8698 * chore(android): track the gradle wrapper so fresh worktrees can run gradle tooling by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8719 * fix(auth): fall back remotely without hiding local signer failures by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8723 * chore(bookmarks): remove the duplicate unused bookmark model by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8731 * fix(mentions): tag handles that contain a dot or a hyphen by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8716 * docs(testing): explain strict package coverage requirements by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8733 * test(share-sheet): prevent unverified clip-import failures by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8735 * chore(seed-media): stop shipping unused preload videos by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8738 * test(dm): verify bulk request actions close the sheet by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8736 * fix(divine_ui): hide drag handles when sheets cannot be dragged by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8737 * docs(perf): explain how to compare feed-load samples by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8743 * perf(feed): reduce repeated work during feed state comparisons by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8740 * test(lists): ensure list backup stops after account changes by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8749 * docs(video): explain which auth signal gates what in the video providers by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8700 * test: catch inactive negative-path mechanisms by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8679 * docs(ci): preserve historical test-performance measurements by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8770 * docs(video-editor): explain why exports do not trim to the common track end by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8789 * fix(video-player): tell 403 and 404 playback failures apart without reading error text by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8793 * refactor(services): delete four unused services and their test scaffolding by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8760 * feat(update): make available updates easier to find by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8680 * fix(dm): stop group messages addressed only to yourself, and hide the ones already sent by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8765 * fix(test): stop shared Hive boxes leaking rows between test suites by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8746 * fix(e2e): restore the key-backup journey through Nostr Settings by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8780 * fix(divine_ui): keep locked scrollable sheets open by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8805 * test(editor): stop cleanup tests racing editor teardown by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8778 * refactor(video-editor): share one canvas render-size calculation by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8791 * fix(video_clip): stop the clip preview animation flying a blank rectangle by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8794 * test(crosspost): cover polling recovery after timeout by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8809 * fix(auth): remember accounts that follow nobody by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8750 * fix(people-lists): keep other clients' list data when membership changes by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8784 * fix(relay): stop sending teardown frames to a relay that is not connected by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8788 * chore(analyzer): require direct dependency declarations by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8754 * fix(video-editor): let cancel actually stop an export that is still normalizing clips by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8790 * test(crosspost): make provisioning poll regressions observable by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8808 * refactor(video): remove misleading inactive home-feed expansion by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8739 * fix(e2e): keep iOS smoke tests responsive by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8751 * feat(settings): let people turn analytics collection off by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8795 * docs(metrics): correct how many videos actually show a loop count by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8787 * fix(notifications): preserve other clients' data when toggling bells by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8816 * fix(editor): clean up files after in-flight autosaves by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8820 * build(seed-media): keep screenshot fixtures out of release builds by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8785 * test(e2e): cover current account and profile journeys by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8777 * chore(deps): document permanent C2PA source pin by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8758 * test(editor): stop clip proof work racing test teardown by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8819 * fix(e2e): stop the key-backup journey dying on the Nostr Keys screen by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8811 * fix(tooling): stop the stale-branch report recommending worktrees still in use by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8786 * fix(bug-report): attach the app locale to bug reports by @mbradley in https://github.com/divinevideo/divine-mobile/pull/8600 * test: restore reliable active-video and pagination coverage by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8752 * docs(testing): explain package CI safeguards by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8781 * test(vgv): prevent package tests from leaking state between files by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8759 * test(editor): prove saved draft files survive session cleanup by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8823 * fix(editor): retry cleanup after temporary failures by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8821 * fix(moderation): page the NIP-32 labeler query instead of scanning all history by @mbradley in https://github.com/divinevideo/divine-mobile/pull/8817 * ci(testing): run service tests for affected app changes by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8764 * fix(editor): finish clip processing after leaving the editor by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8845 * fix(ios): declare two Apple privacy APIs the App Store build ships undeclared by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8844 * fix(nostr): stop relay sends from retrying for minutes by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8741 * fix(nostr-sdk): keep private keys out of diagnostics by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8744 * fix(vgv): stop non-code text from hiding leaked test globals by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8853 * fix(video-editor): delete the partial export file on cancel or failure (#8818) by @mbradley in https://github.com/divinevideo/divine-mobile/pull/8855 * fix(e2e): stop stale copy assertions from passing CI by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8873 * docs(rules): describe how the prune report actually decides containment by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8841 * chore(analyzer): enforce Riverpod override list types by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8854 * fix(video-player): remove track-end gaps from looping previews by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8810 * fix(video): display anamorphic videos at correct proportions by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8846 * chore(analyzer): require reasons for suppressed diagnostics by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8857 * chore(agents): prevent Codex hooks from timing out early by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8858 * test(e2e): delete unused remove-keys assertion by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8835 * test(providers): make foreground-state tests use the production provider by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8860 * test: remove disabled tests for retired behavior by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8874 * test: remove obsolete skipped test cases by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8875 * fix(account): stop a new account inheriting the previous account's data by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8708 * fix(ios): stop unused device identifier access from shipping by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8878 * chore(dependencies): maintain device attestation as a first-party package by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8779 * ci(ios): detect Apple required-reason API changes by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8880 * test(dm): catch a silent screen-reader regression in the who-reacted sheet by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8696 * fix(editor): remove orphaned clip files when a video session ends by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8840 * fix(auth): sign three backend requests with the URL they actually send by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8720 * fix(people-lists): stop membership edits caching the wrong event and failing silently by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8834 * refactor(video-feed): make the loop-seam policy something a test can catch by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8907 * fix(video-editor): stop the export progress bar reading 0% through a healthy render by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8910 * fix(video-editor): take the plugin release that stops a drawing killing the app by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8914 * chore(config): delete the unused AppConfig.appVersion constant by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8685 * refactor(crossposting): serve one crossposter client, and stop a dead field deleting connections by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8705 * feat(compose): pick who you mean when you tag someone in a caption by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8724 * test(account): make the account-deletion tests catch an unwanted sign-out by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8918 * test(video): restore subscription deduplication coverage by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8881 * test(async): make provider synchronization explicit by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8753 * fix(ci): prevent service tests from silently missing new dependencies by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8859 * test(video): restore subscription replacement coverage by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8882 * fix(local_stack): keep the default Funnelcake stack current by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8884 * test(profile): remove obsolete drafts menu tests and cover the library button by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8887 * test(router): restore location stream coverage by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8883 * test(explore): remove obsolete skipped display suite by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8889 * test(relays): restore NIP-11 settings coverage by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8890 * test(settings): retire obsolete scaffold skips by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8892 * fix(tooling): stop reporting a shallow clone as a merge conflict by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8903 * fix(blocklist): make unblock clear every copy of a hidden account by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8742 * refactor(video-editor): measure the screen colour when green screen opens by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8792 * test(seen-videos): synchronize persistence hydration by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8895 * test(e2e): align Maestro journeys with current app by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8891 * fix(curation): stop the provider from staying stuck in loading state by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8861 * test(account): delete obsolete deletion flow suite by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8888 * test(hashtags): retire stale feed harness skips by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8894 * fix(moderation): receive new safety labels without restarting the app by @mbradley in https://github.com/divinevideo/divine-mobile/pull/8869 * test(feature-flags): remove obsolete skipped cases by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8886 * test: remove remaining obsolete skipped cases by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8879 * perf(privacy): move diagnostic sanitization off the main isolate (#7080) by @mbradley in https://github.com/divinevideo/divine-mobile/pull/8919 * ci(qa): run only relevant mobile checks by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8868 * test: remove obsolete skipped test files by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8871 * fix(blocklist): surface the mute-list publish result from block/unblock by @mbradley in https://github.com/divinevideo/divine-mobile/pull/8922 * fix(crossposting): bind the ATProto crosspost token and keep secrets out of its errors (#8825) by @mbradley in https://github.com/divinevideo/divine-mobile/pull/8920 * test(e2e): reduce PR smoke to deterministic journeys by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8872 * chore(analyzer): prevent async safety debt from growing by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8870 * fix(support): open support chat during startup by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8926 * test(feature-flags): remove a permanently disabled screen test by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8927 * test(router): restore route harness coverage by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8928 * test(e2e): keep Maestro coverage tiers from drifting by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8932 * test(settings): verify Blossom AppBar follows the appearance theme by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8923 * fix(logging): include relay activity in support exports by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8936 * test(video-player): stop one test file's fake video player answering the next file's calls by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8908 * test(video-editor): let four editor suites run with the rest of the tests by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8909 * fix(supporters): prevent purchases when verification is unavailable by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8938 * test(profile): restore current-user redirect coverage by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8885 * fix(startup): let restored sessions open offline by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8945 * fix(logging): keep relay failures visible without duplicate console logs by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8947 * fix(search): show matching lists in search results by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8949 * feat(video-editor): show plain-wall guidance in chroma key controls by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8911 * fix(editor): stop timeline thumbnails from competing with the editor preview by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8958 * fix(audio): free the disk space a deleted My Sounds import leaves behind by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8961 * fix(follow): keep login prefetch from undoing newer follow changes by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8953 * chore(deps): upgrade to Flutter 3.47.2 and drop the freezed models it breaks by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8915 * ci(logging): block new package logs from bypassing support exports by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8951 * fix(audio): tell people when a saved sound's file is gone instead of playing silence by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8912 * fix(video-editor): make the library clip preview loop like the editor and the export by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8959 * fix(media-cache): reclaim old cache files that no cleanup path could ever delete by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8960 * fix(support): include the screens visited before a bug report by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8956 * feat(audio): show how often a sound has been reused while picking one by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8963 * fix(l10n): converge the appeal action label across account-status and minor-review (#8248) by @mbradley in https://github.com/divinevideo/divine-mobile/pull/8929 * refactor(logging): decouple shared logging values from app models by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8946 * fix(ios): stop release archives from silently dropping privacy manifests by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8970 * feat(video-editor): lift a clip onto the canvas and place it freely by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8964 * test(router): restore Explore navigation coverage by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8950 * fix(feed): drop leftover seen-video wiring and keep the feed rendered across rebuilds by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8985 * fix(proof): verify a signed video before it overwrites the recording by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8987 * fix(router): stop a stale saved route from crashing the app on launch by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8986 * fix(ci): allow tracked files to move without weakening CI limits by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8745 * fix(input): stop iOS autocorrect rewriting typed relay and web addresses by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9008 * fix(router): prevent startup from breaking navigation state by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9010 * fix(feed): stop empty-feed diagnostics from querying relays by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9016 * perf(feed): measure visible and fresh load phases by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9023 * chore(tooling): flag malformed issue titles when they are created or renamed by @mbradley in https://github.com/divinevideo/divine-mobile/pull/8937 * fix(proof): stop throwing away genuine C2PA signatures after signing by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9019 * docs: plan faster video playback when returning to Divine by @rabble in https://github.com/divinevideo/divine-mobile/pull/8981 * fix(logging): catch formatted imports that bypass support logging by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8968 * feat(auth): add marketing opt-in to create-account flow by @mbradley in https://github.com/divinevideo/divine-mobile/pull/8452 * test(perf): enforce native feed first-frame budget in CI by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/8766 * fix(dm): re-publish the DM inbox list if the relay never ends up serving it by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8994 * fix(nostr): keep live follow, like, repost and comment updates working on relays that enforce the subscription-id limit by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9018 * fix(counts): report an unanswered count as unknown instead of downloading thousands of events by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8996 * refactor(cache): bound and migrate the PersonalEventCacheService Hive boxes by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8324 * fix(e2e): stop leaving a real private key on the test device clipboard by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8980 * fix(audio): stop storing imported tracks inside the open draft by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8988 * perf(reposts): stop unresolved reposts from delaying feed loads by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9038 * fix(audio): stop repeated warnings for unavailable sounds by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9037 * fix(dm): resume message history recovery after silent relays by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9039 * fix(account-deletion): keep support timeout across relaunches by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9034 * test(router): stop the hashtag route test from hanging cache recovery tests in CI by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9050 * fix(supporters): recover paid purchases and confirm access before success by @rabble in https://github.com/divinevideo/divine-mobile/pull/8982 * test(router): prove the crash guard holds when the app rebuilds its router by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9020 * fix(profile): always show Report and Block on another user's profile by @mbradley in https://github.com/divinevideo/divine-mobile/pull/9021 * fix(perf): keep concurrent feed timings accurate by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9029 * feat(analytics): explain follower counts in Creator Analytics (#8276) by @mbradley in https://github.com/divinevideo/divine-mobile/pull/8877 * fix(bug-report): strip photo metadata from attachments by @rabble in https://github.com/divinevideo/divine-mobile/pull/9049 * chore(privacy): declare app-collected data types in the iOS manifest by @rabble in https://github.com/divinevideo/divine-mobile/pull/9058 * docs(privacy): record the iOS privacy-label decisions by @rabble in https://github.com/divinevideo/divine-mobile/pull/9052 * fix(feed): show cached videos when switching feeds by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9014 * docs(release): stop premature marketing-version bumps by @rabble in https://github.com/divinevideo/divine-mobile/pull/9061 * fix(nostr): keep the events relays already sent when another relay never answers by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9059 * fix(video-player): comment videos loop without the track-end seam on Android by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9067 * test(router): prove route recovery keeps navigation usable by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9060 * fix(storage): show the app's real disk footprint and let users remove leftover files by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9071 * docs(privacy): fix iOS privacy notes that no longer match the app's manifest by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9072 * fix(nostr): prevent COUNT retries past caller deadline by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9064 * fix(relays): stop reconnecting and double-dialling relays at startup and sign-in by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9025 * feat(nostr): tell a complete relay read from a truncated one by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9065 * fix(dm): stop message restore from retrying forever by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9088 * feat(compose): credit more than one creator as Inspired By by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8726 * fix(proofmode): stop iOS proofs from recording the phone's network addresses by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9085 * fix(a11y): give the feed follow badge a centered 44dp target by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/8366 * test(m3u8): remove a network check that could not fail by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9089 * feat(analytics): tag view events with the app version by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9068 * feat(video-editor): green screen for detached clips with a see-through cutout by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9069 * fix(player): stop keeping a second, unreclaimable copy of cached videos by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9075 * chore(deps): migrate to the standalone material_ui and cupertino_ui packages by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9044 * feat(video-editor): let a slide animation start where you tap on the video by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9012 * test(video-events): replace obsolete skipped provider coverage by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9090 * fix(perf): keep local release builds out of the Firebase Performance dataset by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9095 * refactor(video-events): remove unused dependency providers by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9099 * docs(data-foundation): describe the current migration strategy by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9119 * docs(maintainability): keep the simplicity audit accurate without manual refreshes by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9128 * test(feed): replace timing sleeps in fullscreen feed tests by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9143 * fix(account): let users cancel stale deletion attempts by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9145 * test(services): replace stale coverage debt with behavioral tests by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9147 * fix(account): keep saved account caches warm when switching by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9136 * fix(analytics): prevent duplicate and unbalanced shell events by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9137 * test(video): lock feed behavior before extraction by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9151 * chore(account): remove the unused permanent name-release path by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9144 * chore(audio): record timing details for missing sound reports by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9115 * chore(test): validate Very Good CLI 1.5.0 before exclusion adoption by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9141 * chore(ios): stop shipping Google's ads-measurement SDK in the iOS app by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9093 * fix(nostr): stop a feed subscription waiting behind other subscriptions' replays by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9094 * fix(analytics): keep the recording app version on replayed view events by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9164 * fix(reporting): save reports immediately and send them when connected by @mbradley in https://github.com/divinevideo/divine-mobile/pull/8822 * docs(analyzer): make async safety debt ownership explicit by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9127 * chore(deps): complete the move away from Flutter Material by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9159 * test(hashtags): restore clickable hashtag coverage by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9117 * docs(test): teach deterministic async synchronization by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9142 * refactor(bloc): clarify when background work must finish by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9158 * test(guardrails): fail CI for empty test groups by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9152 * test(tooling): prevent Hive test home leaks by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9102 * fix(ci): ship Dart debug symbols for Play Console in Android releases by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9162 * fix(observability): report a corrupt local database once, not per call site by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9163 * fix(video-editor): take the plugin release that keeps a huge sticker from killing the app by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9165 * fix(video-editor): decode timeline thumbnails in one pass so they stop starving the preview player by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9169 * chore(video): remove unused video subscription setup by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9150 * refactor(startup): prevent detached work from overlapping by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9175 * fix(support): open account appeals in private support by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9174 * refactor(router): own asynchronous navigation work by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9179 * fix(ios): stop Xcode's module verifier from failing CocoaPods builds by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9182 * docs(agents): point at the shared context files instead of copying them by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/8896 * docs(agents): require posting reviews to GitHub by @rabble in https://github.com/divinevideo/divine-mobile/pull/9091 * feat(camera): press and hold the nav camera button to start recording immediately by @Chardot in https://github.com/divinevideo/divine-mobile/pull/9171 * fix(account): finish deletion after the source screen closes by @rabble in https://github.com/divinevideo/divine-mobile/pull/9101 * fix(video-editor): preserve native export causes in crash reports by @rabble in https://github.com/divinevideo/divine-mobile/pull/9104 * fix(auth): keep forgot-password controls above the keyboard by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/9107 * fix(auth): stop rebuilding reactive auth providers on state changes by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/9111 * fix(auth): tell people when sign-in is rate limited by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/9114 * test(perf): measure video feed frame times on device by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/9148 * feat(observability): diagnose memory use while the app is idle by @rabble in https://github.com/divinevideo/divine-mobile/pull/9153 * refactor(notifications): own navigation and lifecycle futures by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9183 * feat(perf): measure watch history and cache delays during feed loads by @rabble in https://github.com/divinevideo/divine-mobile/pull/9157 * refactor(auth): remove invite-code onboarding by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/9113 * fix(notifications): make campaign push taps open the Following feed by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/9106 * feat(video-editor): play the muted video behind the voice-over recorder by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9170 * fix(camera): keep iOS clip audio aligned with the picture when the audio clock drifts by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9161 * fix(video-editor): stop green screen auto-detect from reverting a colour or amount set while it runs by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9209 * refactor(auth): own email verification futures by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9196 * feat(supporter): turn supporter subscriptions on for everyone by @rabble in https://github.com/divinevideo/divine-mobile/pull/9193 * test(async): make email verification tests own their futures by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9195 * test(tooling): stop pending Hive opens from hanging later tests by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9057 * fix(upload): keep disposed upload managers inert by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/9108 * feat(video-editor): add 44 text overlay fonts and show their real names by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9204 * refactor(feed): own video service futures by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9212 * fix(video-editor): hold Done while green screen is still measuring by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9207 * refactor(upload): move the upload core into its own package by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/9120 * perf(video-editor): stop a drawing with many strokes from slowing the editor by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9076 * fix(video-editor): name the native cause of a failed export and tell users when the device is out of storage by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9168 * refactor(video-editor): own screen futures by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9227 * fix(search): prevent a black screen when search opens during startup by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9215 * fix(feed): hide loop counts when metadata is unavailable by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9226 * fix(relay): retain safe NOTICE reasons in support logs by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9225 * fix(feed): keep edited videos at their original New-feed position by @rabble in https://github.com/divinevideo/divine-mobile/pull/7946 * fix(deletion): confirm cleanup without waiting for relay indexing by @rabble in https://github.com/divinevideo/divine-mobile/pull/9199 * refactor(video-editor): make canvas async work observable by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9231 * fix(notifications): preserve REST outcomes in support reports by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9230 * fix(account-deletion): give deletion recovery a single owner by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/9110 * fix(relay): preserve useful time for relay reads by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9228 * feat(push): add campaign consent and timezone by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9235 * refactor(profile): report failures from detached UI work by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9237 * fix(relay): reconnect automatically after an idle or remote-closed disconnect by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9246 * refactor(video-editor): move the two playhead clocks out of the canvas state by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9201 * refactor(share): report failures from detached share actions by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9245 * fix(video-editor): stop a cropped or rotated clip playing back stretched by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9248 * perf(feed): stop the feed stuttering while scrolling on Impeller by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9250 * fix(feed): keep inspired-by credit off the video player by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9173 * perf(feed): stop each swipe from rebuilding every feed page by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9252 * feat(profile): let creators pin up to six videos to the top of their profile by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9251 * fix(riverpod): refresh the For You and Popular feeds when the content language changes by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/9154 * docs(agents): keep offline review instructions current by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9258 * refactor(providers): report failures from background provider work by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9257 * feat(video-editor): save caption styles to reuse them in later videos by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9203 * fix(analytics): publish view events again in debug builds by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9253 * fix(feeds): avoid reloading feeds for an unchanged language by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9267 * fix(dm): stop misreading an ambiguous Keycast 403 as a recipient block by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9273 * refactor(riverpod): share service-listener lifecycle wiring by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9270 * fix(web): get the web app deploying again by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9268 * refactor(services): report failures from background service work by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9274 * ci(riverpod): prevent listeners from rebuilding their provider by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9272 * refactor(dm): surface failures from inbox background work by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9278 * fix(ci): stop oversized web bundles from merging by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9276 * fix(profile): explain pin failures caused by connection problems by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9271 * fix(video): close the loop seam on both platforms by @hm21 in https://github.com/divinevideo/divine-mobile/pull/8021 * docs(review): make agent reviews approve or request changes by @rabble in https://github.com/divinevideo/divine-mobile/pull/9236 * ci(zapstore): publish Android releases from Codemagic by @rabble in https://github.com/divinevideo/divine-mobile/pull/9238 * perf(feed): bake the feed's flat chrome glyphs instead of drawing them live by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9255 * chore(release): prepare version 1.0.23 for store validation by @rabble in https://github.com/divinevideo/divine-mobile/pull/9233 * feat(supporter): make all three supporter plans purchasable in the app by @rabble in https://github.com/divinevideo/divine-mobile/pull/9281 * fix(camera): recover recordings interrupted by backgrounding by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9262 * fix(profile): free pin slots held by videos that no longer exist by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9285 * ci(preview): build PR previews from the merge commit by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9283 * fix(video-editor): stop a saved draft growing with every edit by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9287 * fix(video-editor): let the timeline's layer strips scroll from beside a short composition by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9289 * refactor(settings): surface failures from background work by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9279 * fix(recorder): stop iOS countdown recordings from starting quiet and growing louder by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9200 * fix(security): authenticate private key export by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/9112 * feat(performance): measure deletion, startup, and playback delays by @rabble in https://github.com/divinevideo/divine-mobile/pull/9155 * fix(verify): wait for every relay before deciding a profile has no linked accounts by @mbradley in https://github.com/divinevideo/divine-mobile/pull/9293 * refactor(router): remove placeholder feed arguments and flag unsupported ones by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9294 * fix(router): keep fullscreen feeds in place when the router refreshes by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9299 * perf(ci): run the guard scripts in parallel so Mobile CI stops waiting on them by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9295 * refactor(divine_ui): remove a bottom-sheet menu variant no screen could use by @Chardot in https://github.com/divinevideo/divine-mobile/pull/8493 * fix(scripts): stop the worktree cleanup report keeping trees that are safe to delete by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9310 * test(video-events): make asynchronous cleanup deterministic by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9297 * refactor(video-editor): make async cleanup and UI work explicit by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9311 * fix(camera): stop the recorder showing a recording the camera already ended by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9300 * fix(camera): stamp native camera logs at the call site by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9308 * refactor(video): split the video publisher into focused publish steps by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9286 * test(analytics): pin staging ingest responses to the client's retry classes by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9320 * fix(e2e): scroll to the Nostr row when opening Settings by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9318 * feat(scripts): guard skeleton shimmer and repeating controllers for reduced motion by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9319 * fix(video): stop videos starting silent and freezing after one lap on Android by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9324 * refactor(video-editor): split the oversized editor and recorder files along their real owners by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9322 * feat(video-editor): save a title's look and animation to reuse it in later videos by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9323 * fix(video-editor): blend transitions between a camera clip and a library clip on Android by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9326 * perf(video): stop downloading each looping clip twice on Android by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9327 * fix(connection): feed ConnectionStatusService so isOnline reflects relay reachability by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9329 * feat(feed): make the video author the focus and drop the post date by @rabble in https://github.com/divinevideo/divine-mobile/pull/9313 * fix(bookmarks): stop the share sheet and Saved tab racing each other on the saved list by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9336 * fix(video-editor): keep the timeline steady on very short loops by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9288 * fix(router): deliver router location changes off the build phase by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9333 * fix(stop-motion): render a placeholder when a still's file is gone by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9344 * fix(feed): start playback and close the settings menu when Auto is turned on by @rabble in https://github.com/divinevideo/divine-mobile/pull/9314 * refactor(async): make list flows own their futures by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9350 * refactor(async): own video-feed action futures by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9354 * fix(playback): clarify age-gated playback failures by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9360 * refactor(async): observe video metadata action failures by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9363 * fix(async): report app invariant failures from background work by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9355 * refactor(async): observe video feed UI action failures by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9364 * docs(video): document overlay pause ownership by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9353 * fix(likes): page the Liked-by list past the first 500 people by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9362 * refactor(feed): file VideoOverlayActions detached failures under one reason by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9366 * test(async): make feed BLoC cleanup deterministic by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9367 * fix(media-cache): stop reporting a cancelled download as an app error by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9345 * fix(analytics): stop filing a failed remote signature on a view event as a code defect by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9346 * fix(nostr): make relay subscription IDs unpredictable by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/9109 * fix(likes): keep the engagement list's back arrow off an empty stack by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9361 * fix(feed): stop pending feed and video-page work from failing after the screen is closed by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9348 * fix(video-editor): bump pro_video_editor to 2.13.2 so concurrent renders stop crashing by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9349 * fix(ci): stop a TestFlight-only version from blocking the next iOS release by @rabble in https://github.com/divinevideo/divine-mobile/pull/9373 * fix(engagement): decode NIP-19 ids on the likers and reposters routes by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9370 * fix(video-routes): send a hex route id to REST lowercased by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9375 * fix(db): open the database when the iPhone is launched while locked by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9380 * docs(reposts-repository): correct the fetchEventReposters filter summary by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9382 * fix(background-uploader): stop sending upload events to Flutter engines that no longer exist by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9381 * docs(reposts-repository): name the antecedent in the e-filter summary by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9387 * ci(mobile): run the native iOS XCTests on pull requests that touch iOS code by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9388 * fix(feed): give comment-screen failures their own log route by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9397 * test(async): make saved-sounds cleanup deterministic by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9398 * fix(video-editor): stop transition previews from leaving a ~2 MB copy behind in the cache by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9377 * fix(video-editor): stop publishing a video without its sound when the sound fails to download by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9379 * docs(agents): keep shared guidance current through pointers by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9399 * test(async): make relay-set bridge cleanup deterministic by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9401 * fix(captions): keep feed captions enabled by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9402 * fix(ci): treat an ACCEPTED App Store version as taken in the iOS preflight by @rabble in https://github.com/divinevideo/divine-mobile/pull/9403 * fix(badges): show OG status from private eligibility checks by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9275 * fix(db): reclaim the storage that database recovery leaves behind by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9394 * test(async): make throttled subscription cleanup test-owned by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9408 * fix(local-stack): fail readably on a stale locally-built image pin by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9369 * fix(deep-links): open the right video or profile when a link's id contains punctuation by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9383 * test(async): await profile cache invalidation before refresh by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9412 * fix(video-player): stop iOS delivering video frames into a torn-down Flutter engine by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9384 * feat(audio): upload a standalone reusable sound and delete it again by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9391 * test(async): make modal test actions explicitly detached by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9428 * fix(sounds): show community sounds instead of a single non-audio file by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9435 * refactor(async): handle background video-detail work safely by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9440 * feat(profile): open creator analytics from the profile Loops stat by @rabble in https://github.com/divinevideo/divine-mobile/pull/9430 * fix(linkified-text): link bech32 refs a trailing character ran into by @rabble in https://github.com/divinevideo/divine-mobile/pull/9432 * fix(supporter): show progress while checkout opens by @rabble in https://github.com/divinevideo/divine-mobile/pull/9410 * feat(profile): show your bookmarks in their own tab on your profile by @Chardot in https://github.com/divinevideo/divine-mobile/pull/9406 * fix(delete): keep retryable cleanup failures delayed by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9439 * refactor(async): track search navigation and cleanup by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9444 * refactor(async): supervise sound playback cleanup by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9456 * fix(supporter): stop checkout getting stuck on "Preparing checkout…" by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9448 * fix(video-editor): stop a stalled preview render from hanging the preview for the whole session by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9376 * feat(video-editor): mix stop-motion stills and camera clips in one loop from the clip picker by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9434 * fix(ios): stop the attestation plugin pinning the Flutter engine by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/9395 * fix(observability): stop expected media failures reaching the crash reporter by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9460 * feat(audio): find community sounds by the tags they were published with by @hm21 in https://github.com/divinevideo/divine-mobile/pull/9466 * refactor(async): supervise badge loading and actions by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9457 * feat(profile): recover unavailable pinned videos by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9445 * docs(agents): keep shared safeguards current by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/9479 * feat(supporters): show membership and optional profile badges by @rabble in https://github.com/divinevideo/divine-mobile/pull/9413 **Full Changelog**: https://github.com/divinevideo/divine-mobile/compare/1.0.22...1.0.23
  • Aug 17, 2026 1.0.20
    ## What's Changed * fix(library): move clip selection into a sheet footer by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6836 * fix(a11y): make icons and tight layouts survive system font scaling by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6844 * fix(drafts): stop the library from restamping and hiding drafts by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6832 * fix(video-editor): stop speed-render thrash stalling the encoder by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6817 * test(personal-event-cache): bound provider waits on wall-clock time by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6849 * fix(notifications): stop labelling video likes "liked your comment" by @rabble in https://github.com/divinevideo/divine-mobile/pull/6805 * fix(publish): only self-label content language when the user declared one by @rabble in https://github.com/divinevideo/divine-mobile/pull/6804 * fix(nostr): bound and validate relay-list admission by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6746 * fix(engagement): resolve the author key before querying likes, votes and reposts by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6819
    More…
    * feat(video-recorder): show the remaining shot budget in stop-motion by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6842 * fix(video-metadata): keep the preview rounded and make the audio credit form readable by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6829 * test(flake): stop two suites failing on what ran before them by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6874 * fix(video-metadata): stop painting the clip cover's edits twice by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6893 * fix(video-metadata): make the post-details flow readable to screen readers by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6887 * fix(a11y): honour reduced motion in tab transitions and the recorder mode wheel by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6883 * fix(nostr): keep the relay count when a publish reaches nothing by @rabble in https://github.com/divinevideo/divine-mobile/pull/6681 * fix(sounds): let a failed audio extraction publish the video anyway by @rabble in https://github.com/divinevideo/divine-mobile/pull/6659 * fix(local-stack): resolve the local host per platform by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6840 * fix(feed): make the first tap on a stopped video play it by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6892 * build(mobile): upgrade patrol to 4.8.0 and pin patrol_cli 4.6.1 by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6925 * fix(a11y): make library and clip controls readable to screen readers by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6881 * chore(dependencies): remove cryptography_flutter override by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6923 * fix(editor): stop the publish OOM on stop-motion clips by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6947 * fix(a11y): make video editor controls readable to screen readers by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6885 * fix(feed): page the New feed on the repository's hasMore flag by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6945 * refactor(video-editor): split the canvas into focused files by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6890 * fix(feed): clear a stranded page overlay when the shell is uncovered by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6889 * fix(ios): derive extension versions from Flutter by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6929 * fix(video): restore deletion copy across surfaces by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6914 * fix(a11y): announce the branded loading indicator as busy by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6956 * fix(support): preserve portrait clip imports by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6939 * fix(support): preserve text edits on imported vines by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6938 * test(flake): wait for the encoder to actually start, not for a pumped queue by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6895 * fix(video-recorder): make recorder controls readable to screen readers by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6876 * fix(comments): show an in-flight video reply on its destination sheet by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6960 * fix(profile): remove deleted videos from profile tabs by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6942 * fix(e2e): make the Maestro smoke suite runnable again by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6948 * fix(imeta): parse positional comment and NIP-94 metadata by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6962 * fix(collabs): render only confirmed collaborators to third-party viewers by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6970 * fix(dm): label retired moderation threads and close their dead composer by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6963 * test(analytics): assert the home feed actually publishes its source detail by @rabble in https://github.com/divinevideo/divine-mobile/pull/6870 * fix(lists): dismiss editor before relay acknowledgement by @rabble in https://github.com/divinevideo/divine-mobile/pull/6861 * fix(repositories): stop an unreadable local cache from blocking relay publishes by @rabble in https://github.com/divinevideo/divine-mobile/pull/6867 * feat(analytics): instrument creator campaign funnel by @rabble in https://github.com/divinevideo/divine-mobile/pull/6871 * feat(sounds): sync saved sound library across devices by @rabble in https://github.com/divinevideo/divine-mobile/pull/6856 * feat(seen): client-side seen-video filtering across feeds by @rabble in https://github.com/divinevideo/divine-mobile/pull/6869 * docs(testing): add 4337 test debt plan by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6915 * fix(invites): drive invite status from the nostr session readiness contract by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/6981 * fix(account): clear dm_message_reactions on sign-out and Delete Account by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6991 * ci(deps): monitor dependency freshness and freeze dependency provenance by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6990 * docs(maintainability): refresh oversized-file inventory by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6936 * fix(ios): align firebase_remote_config with the firebase_core 4.4.0 release by @rabble in https://github.com/divinevideo/divine-mobile/pull/7016 * fix(profile): drop the extra vertical gap around the follower search field by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7011 * test(relay-discovery): stop the invalid-signature test degenerating by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6995 * feat(profile): sort the follower and following lists, newest first by default by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6964 * fix(for-you): rebuild the algorithm header and explainer on the design system by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6851 * test(recorder): cover capture mode with Maestro E2E by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7018 * docs(data-foundation): define storage and cache policy by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6972 * fix(likes): retract a like unliked while its publish is in flight by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7004 * fix(subtitles): report why captions are missing and let creators write them by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6943 * ci(deps): stop assigning every dependabot pr to one person by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7033 * fix(profile): explain profile badges by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6993 * fix(db-client): move schema repair into drift migration by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6976 * fix(likes): chunk the reaction REQ filters like the deletion probe by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6997 * fix(a11y): give the profile tabs and grids real accessible names by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7009 * test(recorder): cover lip-sync mode with Maestro E2E by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7043 * feat(badges): make and hand out Nostr badges without leaving the app by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7014 * fix(badges): translate the profile badge sheet into every locale by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7023 * ci(deps): bump cloudflare/wrangler-action from 3 to 4 by @dependabot[bot] in https://github.com/divinevideo/divine-mobile/pull/7006 * ci(deps): bump actions/setup-java from 4 to 5 by @dependabot[bot] in https://github.com/divinevideo/divine-mobile/pull/7008 * ci(deps): bump actions/upload-artifact from 4 to 7 by @dependabot[bot] in https://github.com/divinevideo/divine-mobile/pull/7007 * fix(feed): stop the fullscreen feed hanging on a loading placeholder when its source empties by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7034 * fix(safety): let a blocked conversation stay readable without unblocking by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7026 * test(explore): keep the popular-tab suite off the real image cache by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7054 * test(e2e): repair the search and comment smoke flows by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7039 * ci(e2e): make the service workflow run, and fix the e2e suites it covers by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7005 * build(ios): refresh the SPM lockfiles for patrol's Swift Package by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7065 * test(recorder): cover stop-motion mode with Maestro E2E by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7036 * feat(library): reach drafts from the recorder library by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7031 * test(notifications): unpin the row layout test from font load order by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7052 * fix(video-editor): stop the clip picker closing on a short drag by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7056 * fix(video-editor): make the crop editor feel smooth and on-brand by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7062 * feat(subtitles): time captions against the video instead of typed seconds by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7060 * feat(verify): link and unlink accounts without leaving the app by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7028 * fix(upload): keep the resumable session alive on a chunk 408 by @rabble in https://github.com/divinevideo/divine-mobile/pull/7050 * test(helpers): give each test process its own path_provider directories by @rabble in https://github.com/divinevideo/divine-mobile/pull/6878 * feat(trust-safety): block badge claimants by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7082 * fix(support): vary classics feed sessions by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7083 * fix(lists): refresh discover list subscriptions by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7097 * feat(feed): hide small view counts on video cards behind a flag by @rabble in https://github.com/divinevideo/divine-mobile/pull/6872 * feat(profile): hide a small loop total from profile visitors by @rabble in https://github.com/divinevideo/divine-mobile/pull/7013 * docs: add the misaligned-plugin cause to iOS SPM troubleshooting by @rabble in https://github.com/divinevideo/divine-mobile/pull/7020 * ci(supporters): pass the supporter defines through Codemagic builds by @rabble in https://github.com/divinevideo/divine-mobile/pull/6999 * refactor(settings): move FeatureFlagScreen and four siblings onto go_router by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7087 * fix(report): carry the uncollapsed report reason on the moderation DM by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6855 * fix(dm): re-derive the DM publish backstop and bound the crypto chain by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7075 * fix(bookmarks): reconcile with the relay before reading or publishing kind 10003 by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6966 * ci(mobile): run Mobile CI on merge_group events by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7058 * test(recorder): cover classic mode with Maestro E2E by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7078 * feat(video-editor): crop, rotate and flip a stop-motion frame by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7069 * fix(dm): recognize divine-web's legacy DM video-share citation by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7108 * fix(deps): declare permissions_service in the app pubspec by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7116 * fix(verify): guard kind-10011 identity writes against stale reads by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7115 * fix(perf): initialize performance monitoring in the critical startup phase by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7126 * fix(video-editor): reclaim the render a transform superseded by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7113 * feat(perf): instrument Dart-side HTTP with HttpMetric by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7131 * refactor(packages): remove Flutter SDK dependencies from repository packages by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7107 * fix(video-editor): report why a render produced no video by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7138 * fix(library): restore ink splashes on library rows by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7111 * fix(bottom-sheet): stop selection pickers closing on a short drag by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7114 * fix(video-editor): stop the sound preview ring from rewinding by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7149 * fix(video-editor): scale the sound layer's waveform against its own peak by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7144 * fix(auth): handle an undeployed resend endpoint and a double-tapped signup by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/7084 * fix(support): retry account deletion relay confirmation by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7101 * ci(architecture): ratchet service god-file growth by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6932 * fix(categories): block moderation-adjacent discovery categories by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6937 * chore(release): bump app version to 1.0.20 by @rabble in https://github.com/divinevideo/divine-mobile/pull/7110 * refactor(packages): delete the orphaned nostr_apps fork (#3347) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7154 * docs(ci): document ratchet CI placement by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7164 * fix(db): fail closed when the local database is damaged past classification by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7157 * feat(library): pinch to zoom the clips grid by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7129 * fix(library): rework the Sounds tab layout and sound actions by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7155 * feat(upload): report the nostr blurhash pass as a publish metric by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7127 * fix(video): play classic Vine originals on iOS by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7171 * feat(explore): configurable featured hashtag tab by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6858 * fix(feed): recover from a feed load the relay never answered by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7161 * fix(perf): keep developer builds out of the production Firebase Performance dataset by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7158 * fix(db): delete unreadable plaintext reset source by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7173 * fix(recorder): discard the recording session when leaving the camera by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7142 * fix(routing): route divine:///saved-videos and close the custom-scheme gate by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7105 * fix(bookmarks): show save progress while relay reconcile and publish are in flight by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7141 * fix(db): unblock db_client analyze on newer Dart stable by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7188 * fix(notifications): keep mid-sentence mentions in comment previews by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7140 * feat(invites): respect server-controlled invite availability by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/7183 * fix(feeds): hide blocked reposts and removed videos by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7176 * feat(captions): scope feed toggle to current video by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6910 * feat(notifications): open grouped engagement lists by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7190 * fix(ci): drop the supporters variable group that does not exist yet by @rabble in https://github.com/divinevideo/divine-mobile/pull/7191 * fix(privacy): sanitize public bug report diagnostics by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6909 * fix(support): align follower counts by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6911 * fix(storage): preserve notification prefs during cache recovery by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6920 * docs(video): clarify bare blob playback failure by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7185 * fix(clip-reuse): preserve multi-source clip credits by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6928 * ci: reuse dart hook downloads so merge-queue jobs skip the fetch by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/7199 * fix(bookmarks): make the share-sheet save affordance reflect the existing bookmark by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7133 * fix(l10n): stop plural arms rendering a hardcoded number by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7153 * refactor(profile): inject username and NIP-05 service endpoints by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7167 * feat(lists): publish private lists to relays with NIP-44 encrypted items by @rabble in https://github.com/divinevideo/divine-mobile/pull/6661 * test(router): stop the NIP-05 navigation test depending on test order by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7181 * fix(view-events): restore kind 22236 publishing from the durable queue by @rabble in https://github.com/divinevideo/divine-mobile/pull/7210 * feat(library): file clips into categories from a filter chip row by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7094 * test: stop two widget tests depending on test order by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7186 * fix(analytics): persist the addressable d tag on queued view events by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7182 * feat(metrics): count every playback start as view with fractional loops by @rabble in https://github.com/divinevideo/divine-mobile/pull/7217 * chore(lint): enable 18 analyzer rules and fix their violations by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7223 * fix(analytics): route missing-d-tag drops through ViewEventPublisher by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7221 * fix(video-metadata): let Save for Later work while the render runs by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7229 * fix(library): collapse library toolbar actions when the row runs out of room by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7172 * fix(perf): give each upload leg its own operation-scoped trace by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7132 * fix(library): scope bulk clip actions to the visible selection by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7215 * fix(library): tighten the trash bin row layout by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7226 * ci(pr-issue-link): reuse a PR's tracking issue instead of duplicating it by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7240 * feat(library): drag a selection across the clips grid with a long press by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7219 * fix(bookmarks): read NIP-51 private items so saving cannot leak them by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7222 * feat(l10n): translate every locale's untranslated strings by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7237 * fix(library): stop the screen flashing black when a clip is trashed by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7233 * fix(library): scroll the library empty state instead of clipping it by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7249 * chore(services): retire the remaining bare TODOs by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7258 * build(mobile): upgrade patrol to 4.9.0 and pin patrol_cli 4.7.0 by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7228 * refactor(packages): drop dm_repository's Flutter dependency and freeze the boundary by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7252 * fix(lint): enable invalid_assignment and cast the JSON decode boundaries by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7250 * fix(video-editor): keep the trim handle at the composition end grabbable by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7256 * test(settings): stop the scaffold test stranding an open Hive box by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7264 * refactor(analytics): convert the analytics package's singletons to constructor injection by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7265 * fix(safety): remove blocked accounts from the public kind-3 follow list by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7262 * chore(lint): enable eight more analyzer rules and fix their violations by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7251 * ci(e2e): make the iOS Maestro smoke gate run green on every PR by @rabble in https://github.com/divinevideo/divine-mobile/pull/7208 * fix(likes): resolve the "Liked by" list through funnelcake so edits cannot strand likers by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7261 * fix(settings): say what turning off client attribution costs by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7280 * test(widget-tests): pump a frame between scrolling and tapping by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7214 * refactor(web): migrate the bug-report downloads off deprecated dart:html by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7255 * fix(l10n): refresh stale delete-menu subtitles in 14 locales by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7270 * test(e2e): close the SemanticsHandle race that flakes the first Patrol test by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7271 * fix(perf): release feed-load trace handles when a load is torn down by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7268 * fix(sound): rebuild the sound detail screen on divine_ui and slivers by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7235 * fix(nip07): read the extension's relay list instead of skipping it by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7259 * fix(packages): stop unawaited futures escaping try/catch in four sites by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7279 * ci(packages): pin package workflows to the repo Flutter toolchain by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7309 * fix(routing): gate universal links to /profile, /hashtag, /search and /list by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7253 * refactor(config): remove legacy backend host references by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7281 * fix(dm): classify Keycast's 504 as a retryable signer timeout and re-derive the per-op RPC bound by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7282 * fix(metrics): restart same-video view sessions by @rabble in https://github.com/divinevideo/divine-mobile/pull/7231 * fix(library): keep sub-second precision in the trash row duration by @rabble in https://github.com/divinevideo/divine-mobile/pull/7313 * test(bookmarks): pin the mid-decrypt window the racing-sync test missed by @rabble in https://github.com/divinevideo/divine-mobile/pull/7315 * refactor(nostr): retire the legacy kind 30000 block list by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7283 * refactor(auth): replace the LocalKeySigner(null) placeholder with a typed keyless signer by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7287 * fix(theme): migrate the crossposting settings screen to the light palette by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7269 * fix(divine_ui): align the snackbar with its Figma spec by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7147 * test(safety): drop the stale kind-30000 assertion from the block e2e by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7349 * fix(feed): pop the adult-content prompt through the sheet's own context by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7299 * fix(media-cache): stop reporting recoverable image-cache IO failures by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7305 * test(media-cache): pin the post-open write-failure orderings by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7360 * fix(profile): keep the session-expired sheet working after the header unmounts by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7304 * fix(app-update): present the update dialog through the root navigator by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7300 * fix(providers): abandon in-flight list provider work after disposal by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7353 * fix(relay): close the WebSocket sink on idle-timeout disconnect by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7355 * fix(dm): authenticate the read-marker author before applying read cursors by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7348 * perf(dm): cut a 1:1 DM from four signer round trips to one via keycast's nip17_wrap_batch by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7288 * fix(text): sanitize malformed UTF-16 in remote content at the model boundary by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7352 * fix(uploads): resolve publish-snackbar ancestors nullably by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7363 * fix(feed): repair a silent relay while the feed load is still waiting by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7365 * fix(storage): give Hive one home path instead of reassigning it mid-startup by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7276 * fix(bloc): stop add/emit after close in work that outlives the bloc by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7356 * chore(post-publish): drop the never-configured Remote Config kill switch by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7361 * ci(preview): skip web preview build and deploy on draft PRs by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7373 * fix(observability): stop reporting expected DNS failures to Crashlytics by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7306 * fix(profile): present the session-expired sheet once instead of stacking it by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7351 * fix(avatar): match the SVG guard to the parser it protects by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7357 * fix(media-cache): cap cache filenames so long image URLs stay cacheable by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7364 * feat(settings): change the Divine-login email and password from Settings by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7368 * fix(firebase): make Android initialization idempotent by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7396 * fix(video): avoid stale derivative source after publish by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7400 * fix(analytics): downgrade non-addressable view drops by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7399 * fix(blossom): demote ProofMode header budget log by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7394 * fix(profile): cache author video lists by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7414 * fix(storage): report cache usage by category by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7415 * fix(network): remove Vine CDN DNS override by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7412 * fix(editor): keep playback gated during clip reload by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7402 * fix(providers): remove DM cleanup Riverpod cycle by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7398 * fix(video): stop preferring dead stream media by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7413 * fix(notifications): clear iOS app badge defensively by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7423 * fix(notifications): always send mark-all read by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7421 * fix(analytics): name shell route pages by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7418 * fix(dm): re-drive the parked row when a reel reply retry is tapped by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7382 * docs(library): name the real reason both icon buttons measure 48px by @rabble in https://github.com/divinevideo/divine-mobile/pull/7314 * feat(feed): hide small loop counts for everyone, not behind a dead flag by @rabble in https://github.com/divinevideo/divine-mobile/pull/7452 * feat(startup): log build provenance by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7393 * fix(c2pa): classify signer credential failures by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7395 * fix(recorder): defer overlay visibility lifecycle writes by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7401 * docs: record pre-change baseline for view and loop metrics by @rabble in https://github.com/divinevideo/divine-mobile/pull/7218 * fix(db_client): consolidate explicit index declarations into Drift schema (fixes #7040) by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7416 * feat(settings): link account portability flow by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7492 * fix(feed): track pause-aware overlays by owner by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7500 * fix(video-editor): make teardown and render cancel idempotent by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7422 * fix(support): route For You through repository by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7478 * fix(overlays): make bottom sheets owner-backed by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7503 * fix(avatars): never request verified-dead v.cdn.vine.co image URLs by @rabble in https://github.com/divinevideo/divine-mobile/pull/7466 * fix(search): rank people results by video count when follower sort is a no-op by @rabble in https://github.com/divinevideo/divine-mobile/pull/7453 * docs: record that Divine does not run release freezes by @rabble in https://github.com/divinevideo/divine-mobile/pull/7211 * fix(share): render share-sheet contacts cache-first, hydrate in background by @rabble in https://github.com/divinevideo/divine-mobile/pull/7451 * fix(notifications): close app-badge review findings from #7423 by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7447 * chore(bloc): add a shared close guard and freeze the post-close emit/add count by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7376 * docs(bookmarks): clarify reconciliation helper docs by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7445 * test(c2pa_signing_service): add test coverage and fix tech debt by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7432 * feat(swap_account): support retargeting followers, following, and profile-view routes during account switch by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7467 * ci: fail when a Codemagic variable group is undocumented by @rabble in https://github.com/divinevideo/divine-mobile/pull/7205 * ci(deps): bump actions/download-artifact from 5 to 8 by @dependabot[bot] in https://github.com/divinevideo/divine-mobile/pull/7429 * docs(metrics): the display floor is live for everyone, not feature-gated by @rabble in https://github.com/divinevideo/divine-mobile/pull/7502 * fix(network): retry Funnelcake reads and stop reporting unreachable as empty by @rabble in https://github.com/divinevideo/divine-mobile/pull/7521 * refactor(router): extract route locations into a RoutePaths leaf by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7444 * ci(deps): bump actions/checkout from 4 to 7 by @dependabot[bot] in https://github.com/divinevideo/divine-mobile/pull/7430 * ci(deps): bump gradle/actions from 4 to 6 by @dependabot[bot] in https://github.com/divinevideo/divine-mobile/pull/7431 * feat(profile): give the Divine team the profile checkmark by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7419 * fix(video-detail): stop reporting an unreachable lookup as a missing video by @rabble in https://github.com/divinevideo/divine-mobile/pull/7522 * fix(comments): enable spell check in the comment composers by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7510 * fix(analytics): gate view events on signer readiness by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7512 * feat(settings): make light mode a user-selectable setting, not a feature flag by @rabble in https://github.com/divinevideo/divine-mobile/pull/7523 * fix(share): anchor every share sheet so iPad stops rejecting it by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7519 * fix(notifications): render the feed before the mark-all write settles by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7493 * fix(video-feed-item): address three blocking issues in community warnings by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7425 * fix(search): rank by followers then video, keep follows boosted first by @rabble in https://github.com/divinevideo/divine-mobile/pull/7513 * fix(relay): Fix race condition in relay ledger loading during pre-init by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7495 * fix(zendesk): Synchronize SDK initialization with JWT identity upgrade by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7517 * fix(dm): unwind group sends on enqueue failure by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7450 * test(nostr_sdk): pin publish-denominator tracking when relay status lags the socket by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7428 * fix(follow_repository): follower count stabilization (#6764) by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7449 * fix(db): stop reporting downstream echoes of a handled DB corruption by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7518 * feat(analytics): two-phase kind-22236 view reporting (start + end) by @rabble in https://github.com/divinevideo/divine-mobile/pull/7243 * fix(dm): handle the request preview's loading and error states by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7443 * fix(auth): normalize email before Keycast auth by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7536 * fix(video-editor): bump pro_video_editor to 2.11.3 for the cancelled-export crash by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7531 * fix(support): avoid broken bare blob fallback by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7538 * fix(theming): default appearance to dark when unset by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7556 * fix(notifications): initialize local permission state by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7561 * fix(cache): clarify budget status in log exports by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7569 * fix(nostr): use raw timestamps for video replacements by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7555 * fix(profile): suppress repeated unauthorized thumbnails by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7567 * fix(notifications): mark inbox seen on visibility by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7557 * fix(analytics): name shell route surfaces by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7563 * chore(playback): lower handled media processing logs by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7562 * fix(discover): bound public list relay reads by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7564 * chore(playback): lower media-processing retry logs by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7577 * fix(notifications): show pending state for mark-all-as-read by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7581 * feat(post-publish): offer View and Share on the publish confirmation by @rabble in https://github.com/divinevideo/divine-mobile/pull/7529 * ci: route review requests with CODEOWNERS by @rabble in https://github.com/divinevideo/divine-mobile/pull/7599 * chore(agents): add opt-in guard for concurrent sessions in one worktree by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7272 * fix(bookmarks): decrypt NIP-04 private items instead of refusing them by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7589 * fix(theme): resolve brand green through accentPositive on light surfaces by @rabble in https://github.com/divinevideo/divine-mobile/pull/7590 * docs(bookmarks): say what the absence-confirmation TTL actually bounds by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7592 * fix(video): retry deep-link lookup when relays connect mid-fetch by @rabble in https://github.com/divinevideo/divine-mobile/pull/7600 * fix(nostr): distinguish zero-relay participation from an empty query result by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7594 * test(divine-ui): pin info card tone tokens by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7609 * test(divine_ui): refresh light accent assertions by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7614 * fix(auth): bound the NIP-46 callback relay handoff by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7611 * fix(bookmarks): serialize global bookmark syncs and publishes by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7598 * docs(architecture): clarify service god-file ceiling is a hard gate with no escape hatch by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7613 * test(nostr): pin that a failed auth-gated send still counts as participation by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7593 * refactor(ui): remove leftover ARB keys for deleted bookmark-set feature by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7591 * fix(bookmarks): tell the Saved tab's empty state from a failed load by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7623 * fix(analytics): handle partial creator stats failures by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7615 * test(authentication): add offline terminal-state regression test by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7570 * docs(branding): correct the claim that the icon plate is flat Brand Green by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7644 * fix(feed-tuning): stop macOS edge back-swipe from tuning by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7622 * fix(dm): Add deduplication logging to diagnose duplicate messages by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7633 * fix(support): stop expired oauth sessions leaking into key logins by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7630 * fix(comments): Resolve PR #6960 blockers for optimistic comment UI and relay echo timing by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7662 * feat(identity): show social proof instead of a truncated npub by @rabble in https://github.com/divinevideo/divine-mobile/pull/7601 * refactor(theming): tokenise video editor selected controls by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7624 * feat(storage): add a developer footprint diagnostic for unexplained disk usage by @hm21 in https://github.com/divinevideo/divine-mobile/pull/7642 * test(divine-ui): extend the a11y contract to app bar, sheets, and snackbars by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7658 * fix(bookmarks): stamp kind 10003 past the revision it replaces by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7635 * test(ui): restore golden coverage and gate it in CI by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7657 * test(video_metadata_update_service): add clip-source tag preservation test by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7645 * fix(comments): pin relay echo grace window and remove unreachable guard by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7671 * fix(dm): prevent NIP-04 cleartext leak on first message send by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7664 * fix(tools): refuse to guess when the dark-parity base has no merge base by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7667 * docs: verify caption edit revert fixes (#6474) by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7575 * fix(nostr): count an initial subscription's pre-EOSE events for pagination by @rabble in https://github.com/divinevideo/divine-mobile/pull/7681 * test(tools): hoist the duplicated git helper in the dark-parity tests by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7686 * chore(scripts): add a safe merged-branch prune report by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7669 * fix(auth): report password-reset outcomes accurately by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/7568 * test(comments): assert pending replies keep options closed by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7666 * feat(explore): disclose paid partnerships on the featured tab by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7676 * test(nostr_sdk): cover closed relay settlement shapes by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/7698 * fix(skills): stop routing divine-context PRs through a /tmp worktree by @rabble in https://github.com/divinevideo/divine-mobile/pull/7660 * feat(feed): say whether a failed feed is our outage or your network by @rabble in https://github.com/divinevideo/divine-mobile/pull/7699 * fix(profile): stop resolving fullscreen playback from a relay subscription by @rabble in https://github.com/divinevideo/divine-mobile/pull/7689 * test(l10n): register delegates on bare MaterialApp test roots and freeze the count by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7703 * refactor(profile): finish endpoint injection and fix NIP-98 URL canonicalization by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/7696 ## New Contributors * @dependabot[bot] made their first contribution in https://github.com/divinevideo/divine-mobile/pull/7006 **Full Changelog**: https://github.com/divinevideo/divine-mobile/compare/1.0.19...1.0.20
  • Jul 22, 2026 1.0.17
    Stop motion is the big one in this build. Open the camera, choose Stop Motion, and make a loop one frame at a time. You can reorder or delete frames, change how long they stay on screen, add audio and layers, save a session to Clips, and come back to it later. There's plenty more: - Clip splitting is now instant, audio waveforms appear on the timeline, and trimmed moments can be saved back to Clips. - Drafts can be duplicated, so you can take the same project in two different directions. - Long-press a shared video in DMs to save it. - Interrupted publishes can pick up where they left off, with sturdier background publishing on iOS. - Tap Home while already on Home to jump back to the top and refresh. For You should also repeat fewer videos you've just watched. - Existing sessions can open offline and recover when the connection returns.
    More…
    - Saved videos now use the refreshed Divine wordmark. We also fixed sticky camera zoom on iOS, ProofMode retry failures, age-gated media loading, Bluesky username claims, broken navigation, playback crashes, and a pile of smaller rough edges. Please hammer on Stop Motion: shoot a few frames, undo one, reorder them, change the timing, add sound, leave and come back, then publish. Tell us if anything disappears, drifts out of sync, or gets stuck. --- ## What's Changed * fix(video): bump pro_video_editor to 2.6.0 to fix clip split freeze by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6048 * fix(nostr): add signature verification policy setting by @rabble in https://github.com/divinevideo/divine-mobile/pull/5934 * docs(l10n): translate Nostr signature verification settings by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6052 * test(vgv): gate per-package merged-isolate channel leaks (#5838) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6061 * chore: remove dead support-key placeholder constant by @mbradley in https://github.com/divinevideo/divine-mobile/pull/5963 * fix(profile): offline-tolerant username save (#3161) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6063 * fix(video-editor): preserve allow_audio_reuse when editing cached videos by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6051 * chore(minor-safety): scrub the dead support-pubkey from bug-report docs by @mbradley in https://github.com/divinevideo/divine-mobile/pull/6073 * fix(audio-attribution): credit the original creator for reused audio by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6066 * test(packages): stop leaked platform singletons across merged isolates by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6060 * fix(minor-safety): point minor-review endpoints at the relay-manager host by @mbradley in https://github.com/divinevideo/divine-mobile/pull/6072 * test(vgv): gate Tier-3/Tier-4 process-globals in the merged isolate by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6059 * fix(dm): make DM message delivery durable (OK-confirm + queue-aware retry + 10050 routing) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6046 * chore: remove dead code found during #4803 icon-migration audit by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6078 * fix(dm): classify Keycast verified_minor policy-denial (403) as terminal, not retryable by @mbradley in https://github.com/divinevideo/divine-mobile/pull/6069 * style(design-system): migrate error-state and people/group icons to DivineIcon (#4803) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6077 * fix(dm): address post-merge review of #6046 (Keycast timeout, group-send cancel/dedup, retry heartbeat, relay repair) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6075 * fix(divine_video_player): prevent SIGABRT from invalid AVVideoComposition by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6079 * chore(minor-safety): replace personal-key test fixture 78a5c21b with a synthetic pubkey by @mbradley in https://github.com/divinevideo/divine-mobile/pull/6096 * refactor(divine-ui): unify DiVineAppBarIconButton and DivineIconButton by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6076 * fix(follow): drop invalid pubkeys from the contact list by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6104 * fix(likes): floor the addressable like count against the relay resolve (#6022) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6102 * fix(dm): use a bottom sheet instead of a snackbar for failed-send recovery by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6082 * fix(trust-safety): log moderation-pubkey pin divergence + ignore NIP-05 redirects (#4948) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6106 * fix(db): recover automatically from runtime SQLite corruption by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6107 * fix(categories): fall back to emoji when a category has no bundled SVG by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6131 * fix(ios): bump connectivity_plus to 7.3.0 to stop background engine crash by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6130 * fix(camera): scope iOS Now Playing session to foreground by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6110 * fix(likes): own "liked" heart un-fills on your own video after an edit by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6123 * feat(video): emit an inspired-by p-tag so the referenced creator is notifiable by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6132 * fix(nostr): guard queryEvents against a disposed client's closed pool by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6089 * feat(deep-links): open playlist links in-app via /list/:pubkey/:listId by @mbradley in https://github.com/divinevideo/divine-mobile/pull/6094 * chore: Prevent relay reconnects during Nostr startup by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/6101 * fix(video_editor): instant trim-based clip split + guard teardown races by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6134 * fix(auth): handle NIP-46 auth_url challenge as non-terminal in nostrconnect pairing by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6151 * fix(dm): create app-shell badge cubits eagerly to stop re-entrant lazy create (#6115) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6146 * feat(video_editor): draw each clip's waveform over its thumbnails by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6149 * feat(video-editor): save a trimmed clip to the clip library (#5322) by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6155 * feat(account): opt-in @divine.video username burn on account deletion (#6126) by @mbradley in https://github.com/divinevideo/divine-mobile/pull/6138 * test(integration): exception-safe ErrorWidget.builder/onError restores (#5839) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6156 * chore(release): bump app version to 1.0.17 by @rabble in https://github.com/divinevideo/divine-mobile/pull/6160 * refactor(config): remove legacy backend host references by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6159 * fix(camera): stop zoom sticking at random positions on iOS by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6064 * fix(proofmode): let users recover when C2PA signing or rendering fails by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6068 * feat: add tap to refresh on home tab by @missaustraliana in https://github.com/divinevideo/divine-mobile/pull/4834 * test(event-router): restore coverage and document unsupported routing kinds by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6164 * chore(deps): remove misplaced/unused root dependencies (#3631, #3632) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6165 * chore(deps): migrate media_kit_video to pub and harden the c2pa_flutter git pin by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6167 * chore(fonts): register OFL licenses for bundled fonts and de-duplicate font assets by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6168 * feat(account): delete-account identity + username confirmation (#6137) by @mbradley in https://github.com/divinevideo/divine-mobile/pull/6158 * fix(feed): guard ref-after-await in ClassicVinesTab._refreshClassics by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6162 * fix(upload): re-drive stuck uploads on app resume and startup by @rabble in https://github.com/divinevideo/divine-mobile/pull/6084 * docs: fix stale Linux desktop dependency documentation by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6172 * fix(feed): ignore double-tap-to-like on your own video by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6169 * fix(nostr): guard against spurious startup NostrClient rebuild and run the #2144 repair after auth restore by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6173 * chore(cache-sync): add MigrationStrategy + wipe legacy key residue by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6175 * test(upload): de-flake in-flight marker assertion when file is missing by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6193 * refactor(badges): move BadgeRepository to a repository-consistent home by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6190 * ci(testing): guard test/unit re-accretion + mirror-structure cleanup (#4337 WS-7) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6192 * fix(crash): treat MediaCacheImageProvider load failures as non-fatal by @rabble in https://github.com/divinevideo/divine-mobile/pull/6180 * test(perf): cover VideoEventService trace completion idempotency by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6191 * fix(crash): guard GoRouter extra casts against restored maps by @rabble in https://github.com/divinevideo/divine-mobile/pull/6182 * fix(profile): stop stale kind-0 events blanking the cached profile by @rabble in https://github.com/divinevideo/divine-mobile/pull/6179 * fix(blurhash): own spec-correct codec, drop unmaintained blurhash_dart by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6189 * feat(profile): read NIP-39 claims from kind 10011 and persist verification cache (#3936) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6176 * fix(bluesky): route users without a claimed handle to the claim flow (#3275) by @rabble in https://github.com/divinevideo/divine-mobile/pull/6139 * fix(ios): finish background publishes and recover routes by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6199 * feat(upload): resume interrupted publishes from the server's last offset by @rabble in https://github.com/divinevideo/divine-mobile/pull/6086 * fix(router): keep New video taps in pooled feed by @rabble in https://github.com/divinevideo/divine-mobile/pull/6204 * fix(nostr): snapshot query results before persistence by @rabble in https://github.com/divinevideo/divine-mobile/pull/6202 * docs(architecture): add a discoverable app-layering reference by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6206 * fix(video-player): stop EventChannel sends while app is backgrounded by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6220 * feat(perf): trace video generation and camera startup time by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6218 * fix(media-cache): cancel in-flight downloads when app is backgrounded by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6222 * fix(crash): downgrade all NetworkImage HTTP failures to non-fatal by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6228 * fix(video-recorder): crash-proof clip-delete Undo and finalize it on recorder exit by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6232 * fix(analytics): align creator video count with profile by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6207 * fix(comment-video): preserve video metadata from REST comments by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6208 * fix(support): ignore unknown moderation labels by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6211 * feat(drafts): add duplicate project option by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6231 * fix(video): migrate off video_player (FVP) to divine_video_player by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6225 * chore(ui): add design-system drift ratchets (#6145) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6230 * fix(feed): deprioritize recently seen For You videos by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6212 * fix(authentication): allow offline access for existing sessions by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6245 * fix(auth): read keycast login error code and nudge toward sign-in options by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6247 * feat(dm): save shared videos from messages by @rabble in https://github.com/divinevideo/divine-mobile/pull/6213 * chore(feature-flags): remove unused feature flags by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6256 * fix(video-recorder): meet 48dp min touch target on mode selector by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6258 * fix(router): make every route-error screen escapable (safePop + home button) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6264 * fix(video-feed): correct empty profile feed diagnostics by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6244 * feat(theme): add feature-flagged light appearance by @rabble in https://github.com/divinevideo/divine-mobile/pull/6216 * fix(notifications): reclassify comment-likes via payload root_event_pubkey by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6265 * fix(bluesky): refresh status after NIP-05 claim by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6270 * fix(authentication): retry degraded OAuth restore on resume by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6249 * fix(video-player): classify auth-required media errors by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6268 * test(divine-ui): UI quality contract — a11y guarantees + goldens (#6141, #6143) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6236 * feat(trust-safety): community content-warning tagging - mobile slice (#4771) by @mbradley in https://github.com/divinevideo/divine-mobile/pull/5720 * fix(moderation): parse repeated label event tags by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6279 * fix(media): send auth for age-gated thumbnails by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6267 * fix(support): anchor log-export share sheet so iPad idiom can present it by @rabble in https://github.com/divinevideo/divine-mobile/pull/6291 * fix(security): stop accepting arbitrary TLS certs on relay and Dio sockets by @rabble in https://github.com/divinevideo/divine-mobile/pull/6278 * fix(router): tolerate restored extras and safe hashtag back by @rabble in https://github.com/divinevideo/divine-mobile/pull/6277 * fix(feed): sanitize malformed UTF-16 display text by @rabble in https://github.com/divinevideo/divine-mobile/pull/6273 * fix(router): harden query route normalization by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/6272 * fix(watermark): use refreshed Divine wordmark in download watermark by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6290 * fix(feed): sanitize unpaired UTF-16 surrogates in display text by @rabble in https://github.com/divinevideo/divine-mobile/pull/6288 * fix(video): dispose VideoEventService when its provider rebuilds by @rabble in https://github.com/divinevideo/divine-mobile/pull/6292 * fix(proofmode): store C2PA manifest id under the key fromMetadata reads by @rabble in https://github.com/divinevideo/divine-mobile/pull/6289 * fix(apps): enable Android image upload in Nostr app sandbox WebView by @hm21 in https://github.com/divinevideo/divine-mobile/pull/6260 * feat(video-editor): implement the stop-motion recorder and editor by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5763 * fix(watermark): correct download watermark to geometric heart-V wordmark by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/6297 ## New Contributors * @missaustraliana made their first contribution in https://github.com/divinevideo/divine-mobile/pull/4834 **Full Changelog**: https://github.com/divinevideo/divine-mobile/compare/1.0.16...1.0.17
  • Jul 11, 2026 1.0.16
    # 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.
    More…
    **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 https://github.com/divinevideo/divine-mobile/pull/3531 * fix(images): cancel orphaned thumbnail downloads by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/4695 * feat(l10n): localize Apps/Integrations directory (#3628) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/4889 * feat(l10n): localize share-copy + clipboard confirmations (#3628 Area K subset) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/4891 * fix(feed): filter blocked/muted authors from Funnelcake REST feeds (#4782) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/4887 * feat(l10n): localize remaining hardcoded UI strings — #3628 sweep (Auth, Comments, Inbox, ProofMode, For-You, Sounds, Discovery, Misc) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/4890 * fix(ios): enable Swift Package Manager by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/4893 * ci(codemagic): publish Android builds to production by @rabble in https://github.com/divinevideo/divine-mobile/pull/4898 * fix(timeline): simplify maxDuration calculation for track by @hm21 in https://github.com/divinevideo/divine-mobile/pull/4915 * fix: explore search by opening unified search route by @hm21 in https://github.com/divinevideo/divine-mobile/pull/4901 * feat(timeline): add width parameter to TimelineTrimHandles for improved drag interaction by @hm21 in https://github.com/divinevideo/divine-mobile/pull/4907 * fix(startup): prevent entire app rebuild twice on startup by @hm21 in https://github.com/divinevideo/divine-mobile/pull/4918 * fix(router): prevent video feed teardown on background review-status refetch by @hm21 in https://github.com/divinevideo/divine-mobile/pull/4913 * chore(toolchain): upgrade Flutter 3.41.9 → 3.44.0 / Dart 3.12.0 by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/4917 * fix(notifications): reclassify misattributed video notifications as actor-anchored by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/4920 * fix(feed): content filters not reactively applied to feeds by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/4921 * feat(quick-actions): add home/lock screen camera widget by @hm21 in https://github.com/divinevideo/divine-mobile/pull/4880 * fix(categories): degrade to emoji when a category SVG asset is missing by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/4926 * fix(bluesky): correct crosspost status endpoint and response key mapping by @rabble in https://github.com/divinevideo/divine-mobile/pull/4922 * feat(feeds): send viewer language hints by @rabble in https://github.com/divinevideo/divine-mobile/pull/4909 * feat(video-editor): composite proof mode progress tracking by @hm21 in https://github.com/divinevideo/divine-mobile/pull/4810 * fix(auth): clarify returning-user sign-in and post-review route by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/4911 * fix(auth): remove local accounts from device cleanly by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/4924 * fix(test): de-flake minor-account-review under-13 support screen test by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/4949 * chore: update video-editor package to support SPM by @hm21 in https://github.com/divinevideo/divine-mobile/pull/4935 * fix(nip17): NIP-17/44/59 crypto hardening (security review for #570) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/4943 * fix(ci): handle FlutterFramework SPM deployment target by @rabble in https://github.com/divinevideo/divine-mobile/pull/4957 * refactor(videos_repository): compose author feed via getAuthorFeed (#4788) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/4931 * feat(dm): route NIP-17 DMs to kind-10050 inbox relays + harden moderation report DM (#570) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/4944 * fix(feed): preserve seeded engagement counts by @rabble in https://github.com/divinevideo/divine-mobile/pull/4904 * refactor(state): migrate profile feed to ProfileFeedCubit (#4788) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/4937 * fix(feed): paginate for you recommendations with cursors by @rabble in https://github.com/divinevideo/divine-mobile/pull/4961 * chore(ci): track iOS extension signing contract by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/4966 * fix(feed): filter blocked/muted authors on detail surfaces via shouldHideVideo (#4782) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/4970 * fix(ci): remove archive-time Crashlytics upload by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/4971 * fix(reaction): centre DM reaction emoji on Android (#4954) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/4984 * fix(video-editor): ensure speed-up feature works correctly by @hm21 in https://github.com/divinevideo/divine-mobile/pull/4978 * fix(timeline): rebase markers after clip reorder and trim by @hm21 in https://github.com/divinevideo/divine-mobile/pull/4979 * fix(dm): recover full conversation list after reinstall (#4953) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/4973 * fix(feed): retry native age-gated playback by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/4884 * feat(db): SQLCipher at-rest encryption full implementation + device-QA plan (#570) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/4981 * fix(inbox): limit notification label text to one line with ellipsis by @hm21 in https://github.com/divinevideo/divine-mobile/pull/4982 * fix(ci): harden iOS SPM target patch by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/4959 * chore(deps): trim video editor lockfile churn by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/4963 * test(nip44): make vector fixture lookup workspace-safe by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/4955 * fix(drafts): migrate legacy drafts atomically to stop disappearing drafts by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/4988 * fix(notifications): keep most-recent timestamp when consolidating follows by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/4987 * ci(architecture): ratchet sanctioned ChangeNotifiers (#4738) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/4789 * fix(profile): preserve tapped fullscreen video by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/4993 * fix(profile): backfill partial profile video loads by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/4994 * fix(language): remove ChangeNotifier from preference service by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/4995 * test(profile_feed): cover loadMore recovery and realtime ordering by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5007 * fix(timeline): rebase markers for speed, delete, duplicate, split by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5005 * fix(playback): handle HTTP 202 as transient and abort stale source fallbacks by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5000 * fix(upload): preserve uploaded thumbnail URL on success (#4997) by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5002 * fix(event-cache): queue signed events until PersonalEventCache initializes by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5001 * fix(videos_repository): split live engagement counts in author-feed hydration by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5006 * feat(moderation): engagement-list block filters + search blocklist reactivity (#948) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5014 * test(l10n): pin the content-policy disclosure invariant (#948) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5013 * feat(blocklist): read our own kind 10000 mute list (#948) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5012 * refactor(hashtag): move hashtag REST fetch into VideosRepository (#948) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5024 * feat(moderation): canTarget affordance gating + profile-search block filters (#948) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5025 * fix(deep-link): profile links use push/go/skip parity with video links by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/5023 * feat(funnelcake): log unrecognised list response shapes in _unwrapListResponse by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/5022 * fix(feed): stop replaying stale For You feed on cold start by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/5021 * fix(feed): preserve For You recommendation order on load-more by @rabble in https://github.com/divinevideo/divine-mobile/pull/5033 * fix(video-player): guard millisecond conversions against NaN/infinite AVFoundation times by @rabble in https://github.com/divinevideo/divine-mobile/pull/5034 * fix(blocklist): reset per-account state on identity change (#4969) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5031 * feat(audio): implement J-Cut audio anchoring and rebasing logic by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5032 * feat(video-editor): add reverse playback functionality for clips by @hm21 in https://github.com/divinevideo/divine-mobile/pull/4716 * fix(feed): warm next video before preload grace by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5015 * fix(notifications): refresh inbox on app resume by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5018 * fix(timeline): preserve markers in clip history writes by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5016 * fix(feed): open collaborator picker from attribution row by @rabble in https://github.com/divinevideo/divine-mobile/pull/5037 * fix(feed): keep content-warned videos paused until View Anyway is tapped by @rabble in https://github.com/divinevideo/divine-mobile/pull/5039 * fix(audio): enhance audio extraction with playback speed adjustments by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5048 * fix(lists): make curated list creation reliable and visible by @rabble in https://github.com/divinevideo/divine-mobile/pull/5040 * chore(docs): relax rebase rule — only required at publish, handoff, and on conflicts by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5049 * fix(notifications): consume authoritative FCM target fields in the push path by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/5054 * fix(comments): load video threads from v2 API by @rabble in https://github.com/divinevideo/divine-mobile/pull/5076 * fix(notifications): harden resume refresh and remove dead realtime subsystem by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/5051 * feat(profile): render website field in profile header by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5106 * fix(firebase): guard default app initialization by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5070 * feat(profile): add website field to Edit Profile screen by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5109 * fix(feed): preserve home video position by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5019 * fix(video): tombstone addressable deletes by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5030 * fix(auth): redact BYOK verifier (embeds raw nsec) in verification error log by @rabble in https://github.com/divinevideo/divine-mobile/pull/5055 * fix(feed): close check-then-act race in subscribeToVideoFeed by @rabble in https://github.com/divinevideo/divine-mobile/pull/5059 * fix(upload): track processing-poll timers so dispose() cancels them by @rabble in https://github.com/divinevideo/divine-mobile/pull/5060 * fix(publish): require relay OK before marking videos published by @rabble in https://github.com/divinevideo/divine-mobile/pull/5056 * fix(library): name imported clips before saving by @rabble in https://github.com/divinevideo/divine-mobile/pull/5061 * fix(auth): discard stale background RPC refresh after sign-out or account switch by @rabble in https://github.com/divinevideo/divine-mobile/pull/5057 * fix(notifications): decide fallback UX for unfetchable coordinate-routed push taps by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/5114 * fix(relay): validate inbound relay frames by @rabble in https://github.com/divinevideo/divine-mobile/pull/5092 * fix(router): relink AppShell transitional TODOs by @rabble in https://github.com/divinevideo/divine-mobile/pull/5094 * fix(feed): ignore stale source load results by @rabble in https://github.com/divinevideo/divine-mobile/pull/5082 * feat(analytics): track mobile surface performance by @rabble in https://github.com/divinevideo/divine-mobile/pull/5081 * fix(feed): use inclusive timestamp pagination cursor by @rabble in https://github.com/divinevideo/divine-mobile/pull/5085 * fix(comments): stop blocking thread load on relay by @rabble in https://github.com/divinevideo/divine-mobile/pull/5087 * fix(feed): retry the failed feed type after connection errors, not discovery by @rabble in https://github.com/divinevideo/divine-mobile/pull/5080 * fix(auth): retry destructive OAuth cleanup by @rabble in https://github.com/divinevideo/divine-mobile/pull/5090 * fix(blocklist): refilter fullscreen snapshot feeds on blocklist version changes by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5105 * fix(delete): clarify relay failure messages by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5118 * feat(video-editor): capture pro_video_editor native logs in UnifiedLogger by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5117 * test(nip98): relay acceptance tests against local funnelcake-api stack by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5111 * feat(camera): forward native DivineCamera diagnostics to UnifiedLogger by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5110 * fix(relay): replay pending messages from a snapshot by @rabble in https://github.com/divinevideo/divine-mobile/pull/5088 * docs: add structured bug-fix workflow guidance by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5119 * feat(video-player): forward native DivineVideoPlayer diagnostics to UnifiedLogger by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5115 * fix(auth): preserve secure storage on Android errors by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5078 * fix(deep-link): hashtag and search links use push/go/skip parity by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/5131 * fix(media-cache): bump cupertino_http to v3 to restore NSURLSession path by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5102 * fix(auth): bound Keycast requests and refresh single-flight so re-login recovers without restart by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/5132 * fix(feed): auto-refresh For You on app resume when stale by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/5129 * feat(moderation): enable contentPolicyV2 by default (#948) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5043 * refactor(video-player): consolidate iOS/macOS Swift sources into shared darwin target by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5045 * fix(feed): paginate for you recommendations by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5072 * chore(moderation): Phase 4 cleanup — remove contentPolicyV2 flag, delete dead MuteService + ContentModerationService (#5047) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5136 * fix(follow): follow button no longer reverts after tapping (#5144) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5147 * fix(upload): require thumbnail before publish by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5075 * docs(moderation): refresh stale architecture docs after Phase 4 cleanup (#5137) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5138 * test(relay): kind-34236 relay acceptance coverage against local funnelcake by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5141 * fix(profile): persist deleted video tombstones by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5135 * feat(camera): add video stabilization with per-device mode selection by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5140 * test(pipeline): full video upload + publish E2E acceptance test (#3056) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5142 * test(nip98): let the #3052 acceptance test do real HTTP by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5143 * ci(mobile): raise test concurrency to 4 + ratchet VGV tag baseline to 59 by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5150 * test(upload): untag video_publish_flow + drop dead file IO (#3137) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5154 * test(bug-report): untag bug_report_service_upload_logs (#3137) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5155 * test(video-events): untag video_event_service_deletion (#3137) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5156 * test(video-events): untag video_event_service_blocklist_sweep (#3137) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5157 * feat(image): add @visibleForTesting cache seam to VineCachedImage (#3137) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5158 * feat(video-recorder): auto lens switch with pinch zoom ruler by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5148 * test(upload): untag upload_publish_race_condition (#3137) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5153 * ci(mobile): ratchet VGV tag baseline 59 → 54 (#3137) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5160 * fix(startup): allow offline recorder launch by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5074 * fix(test): stop manual acceptance tests leaking real network into the merged suite (#3137) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5163 * test(search): pin Explore→Search transition + focus contract by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5167 * fix(blocklist): refilter curated/liked grids on broad blocklist changes by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5169 * feat(video-editor): clip crop/rotate/flip transform (digital zoom) by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5161 * docs(search): document blocked-author filtering contract by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5166 * docs(state): mark #3523 likes/comments/reposts gating as not planned by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5171 * test(vgv): de-flake merge-isolate cascade victims + resume untags (#5159) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5180 * feat(video-editor): pinch-to-zoom canvas with zoom-tracking letterbox scrim by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5189 * test(ci): gate untagged tests that leak process-global singletons (#5183) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5186 * chore(reliability): add empty-catch, service-sentinel & ARB {error} ceilings (#4336) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5190 * chore(maintainability): add production Future.delayed ceiling ratchet (#4339) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5188 * feat(video-editor): multi-select clips to merge or delete by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5193 * fix(dm): recover full conversation list after reinstall regression (#5202) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5214 * fix(search): restore back navigation from search results screen by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5196 * fix(grid): center load-more indicator below grid with branded spinner by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5206 * fix(notifications): mark notifications seen on inbox open (#4708) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5170 * fix(db): preserve the durable database dir when clearing caches (#4968) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5191 * fix(video-editor): keep selected cover and overlay fonts on saved drafts (#5181) by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5201 * fix(thumbnails): keep grid thumbnails cached during fast scroll by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5208 * fix(notifications): route inbox taps to video detail by @rabble in https://github.com/divinevideo/divine-mobile/pull/5220 * fix(video-editor): reflect audio start-trim on the timeline waveform by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5199 * fix(publish): REST-first video publish so a missing relay OK doesn't look failed by @rabble in https://github.com/divinevideo/divine-mobile/pull/5221 * fix(library): prevent draft posts from dropping editor layers by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5203 * refactor(video): replace per-caller videosStream with a ViewSource-resolved FeedRepository by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/5211 * fix(profile): restore nostr badge display by @rabble in https://github.com/divinevideo/divine-mobile/pull/5218 * fix(notifications): linkify nostr refs in comment quotes by @rabble in https://github.com/divinevideo/divine-mobile/pull/5225 * fix(notifications): parse funnelcake notification fields by @rabble in https://github.com/divinevideo/divine-mobile/pull/5222 * fix(router): accept dynamic DM route extras by @rabble in https://github.com/divinevideo/divine-mobile/pull/5227 * chore(maintainability): add file-size ceiling ratchet (#4339) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5187 * fix(profile): continue sparse liked video pagination by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5216 * fix(notifications): synthesize stable video route on metadata miss (#4730) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5228 * fix(feed): send recommendation session seed by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5175 * style(design-system): migrate clean Icons.* to DivineIcon + add raw-Icons ratchet (#4803) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5233 * chore(comments): VineTheme author-name fonts + localize empty-state test (#4632) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5235 * chore(search): remove dead VideoSearchView widget by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5165 * fix(explore): localize async error state, drop raw exception text by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5168 * fix(video-editor): restore missing custom audio in export, plus volume-arc/scroll fixes by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5232 * refactor(profile): use BrandedLoadingIndicator in profile tab loaders by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5239 * feat(feed): instant cold-start home feed from disk cache by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5238 * fix(relay): lock non-production sessions to the environment relay host by @rabble in https://github.com/divinevideo/divine-mobile/pull/5250 * feat(feed): warm adjacent feeds during foreground idle by @rabble in https://github.com/divinevideo/divine-mobile/pull/5248 * chore(feed): remove dead VideoErrorOverlay widget by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5246 * fix(feed): give the native "Verify age" button visible feedback by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5245 * fix(video-editor): show timeline audio bar for invalid composition window by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5263 * fix(router): redirect fullscreen feed to home when extra args are missing (web reload) by @rabble in https://github.com/divinevideo/divine-mobile/pull/5255 * fix(feed): loading state on the Verify age button during retry by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5266 * fix(feed): fast-fail age-gate viewer auth on a hung remote signer by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5264 * feat(env): bottom indicator line for environment and non-Divine relays by @rabble in https://github.com/divinevideo/divine-mobile/pull/5253 * fix(web): point backend at api.divine.video + remove dead deploy scripts by @rabble in https://github.com/divinevideo/divine-mobile/pull/5261 * test(startup): make initialization timing deterministic by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5275 * feat(inbox): smooth Messages/Notifications switch with shared-axis transition by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5267 * fix(startup): hold splash until the redirect leaves /welcome (#5242) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5271 * fix(profile): preserve tapped history video by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5281 * fix(categories): cache category list across app starts by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5277 * fix(publish): repair video upload publish failures by @rabble in https://github.com/divinevideo/divine-mobile/pull/5292 * fix(startup): continue after DB cipher bootstrap failure by @rabble in https://github.com/divinevideo/divine-mobile/pull/5287 * feat(profile): cache video tabs with stale-while-revalidate by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5279 * perf(profile): audit relay snapshots to fix high-video-count lag by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5282 * feat(feed): distinct "signer unreachable" message for age-gate Verify age by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5291 * fix(profile): surface accepted collabs on the own profile (#5213) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5284 * fix(router): fail open when minor-account review status errors by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/5295 * fix(db): fail closed on cipher bootstrap errors by @rabble in https://github.com/divinevideo/divine-mobile/pull/5298 * fix(upload): preserve drafts after failed publish by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5299 * feat(notifications): stale-while-revalidate inbox loading + fix cache retention by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5307 * feat(profile): cache the Videos tab with stale-while-revalidate by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5305 * feat(analytics): extract analytics package and unify event schema by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/5296 * fix(notifications): route video reply targets correctly by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5300 * fix(settings): hide blocked content filter categories by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5303 * fix(feed): keep home feed paused behind nested pushed routes by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5309 * refactor(explore): split explore_screen.dart by tab by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/5297 * fix(dm): stop reinstall from showing established chats as message requests (#5304) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5311 * fix(inbox): keep compose FAB from covering the last conversation tile by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5313 * chore: remove orphaned upload/explore/badge widgets (#4803) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5324 * style(design-system): migrate the DiscoverLists subscribe toggle to DivineIcon (#4803) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5323 * fix(library): truncate library toolbar title to a single line by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5319 * feat(apps): Android per-frame origin attestation for Nostr bridge by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5318 * fix(db): recover stale encrypted cache keys by @rabble in https://github.com/divinevideo/divine-mobile/pull/5326 * fix(db): force SQLCipher runtime on iOS by @rabble in https://github.com/divinevideo/divine-mobile/pull/5328 * fix(likes): keep liked videos from disappearing by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5330 * docs(widgets): remove stale deleted widget references by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5336 * feat(router): cross-fade tab transitions via StatefulShellRoute by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5315 * feat(db): migrate encryption to SQLite3MultipleCiphers by @rabble in https://github.com/divinevideo/divine-mobile/pull/5331 * test(vgv): reduce skip optimizer baseline by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5340 * fix(apps): harden Nostr bridge edge cases by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5339 * fix(notifications): fall back to profile on any unresolvable in-app tap by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5345 * ci(file-size): make 800-line ceiling advisory (warn, never fail CI) by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5350 * feat(video-recorder): add lip-sync camera mode by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5346 * fix(collabs): harden collaboration lifecycle edges by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5338 * fix(ios): drop stale SQLCipher link flag orphaned by the MultipleCiphers migration by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5354 * chore(l10n): remove stale badge explanation keys by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5342 * feat(camera): add single-photo capture for stop-motion by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5352 * fix(video): restore owner edit delete actions by @rabble in https://github.com/divinevideo/divine-mobile/pull/5360 * chore(macos): remove committed project.pbxproj backup files by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5356 * feat(dm): shared-reel DM reply + reaction bar (q-tag share, group reactions) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5358 * fix(camera): restore iOS flash mode build by @rabble in https://github.com/divinevideo/divine-mobile/pull/5367 * test(explore): stabilize top hashtags asset loading by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5362 * feat(subtitles): creator subtitle editing + republish to Blossom & 39307 by @rabble in https://github.com/divinevideo/divine-mobile/pull/5365 * fix(video-player): stop iOS texture frame driver on app background (build 766 crash) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5369 * fix(content-warnings): allow clearing video labels by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5376 * fix(profile): invalidate stats after video delete by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5373 * fix(dm): route followed 1:1 peers to inbox by participant count, not isGroup flag (#5374) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5387 * fix(video-player): dispose iOS players on FlutterEngine teardown (#5371) by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5390 * fix(profile): keep the settings button (log export) visible during load by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5382 * fix(lists): initialize people-list storage before watchers by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5379 * feat(dm): quoted video preview on shared-reel replies (#5388) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5392 * fix(notifications): bound inbox load + isolate revalidation bar repaint by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5380 * fix(dm): visible padded play chip on quoted reply preview by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5401 * perf(home-feed): release neighbour players and pause prefetch when backgrounded by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5394 * fix(proofmode): enrich home feed proof tags by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5378 * fix(video-editor): resolve subtitle editor route by video id by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5398 * perf(db): run SQLite on a background isolate + batch EventRouter writes by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5395 * perf(dm): batch/throttle DM ingestion + cache_sync on a background isolate (#5391) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5405 * perf(feed): reduce thermal load from video ingestion by @rabble in https://github.com/divinevideo/divine-mobile/pull/5408 * perf(feed): drop eager per-event verbose logging on video parse by @rabble in https://github.com/divinevideo/divine-mobile/pull/5410 * perf(ingestion): keep event persistence off the UI path by @rabble in https://github.com/divinevideo/divine-mobile/pull/5406 * fix(video-editor): track native renders for detached teardown by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5400 * fix(metadata): open mentioned user profiles from video text by @rabble in https://github.com/divinevideo/divine-mobile/pull/5411 * fix(trust-safety): route content reports to source relay by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5375 * docs(video-editor): explain native log warning default by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5416 * perf(dm): one long-lived decrypt isolate per history drain (#5391) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5412 * fix(verifier): open native verification in system browser by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5372 * test(dm): prove the history drain yields on the remote-signer per-event path (#5391) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5417 * feat(dm): Instagram-style combined reaction pill + who-reacted sheet by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5403 * test(perf): trace remote-signer DM backfill main-isolate cost + frames (#5413) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5423 * perf(dm): decrypt remote-signer history drain in parallel by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5426 * fix(dm): paint in-chat reaction chips optimistically (#5389) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5421 * fix(videos_repository): fall back when recommendations fail by @rabble in https://github.com/divinevideo/divine-mobile/pull/5427 * fix(profile): fetch missing profile stats by @rabble in https://github.com/divinevideo/divine-mobile/pull/5429 * perf(dm): move remote-signer gift-wrap validation off the main isolate by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5434 * fix(dm): render flying reaction on one GPU layer (#5389) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5445 * fix(dm): add DB uniqueness guard for live DM self-reactions (#5419) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5449 * fix(dm): thread real blocklist into DM reaction displays (#5418) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5453 * fix(db): honor lowercase #a tag filter in event cache query by @rabble in https://github.com/divinevideo/divine-mobile/pull/5431 * fix(video-editor): recover from stalled draft writes by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5440 * perf: cut UI-isolate CPU (theme lerp, redundant signing, feed rebuilds) by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5450 * fix(dm): stop re-decrypting reaction/deletion gift wraps every launch (#5452) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5456 * fix(video_editor): prevent text layer shrinking when adding many paint layers by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5457 * fix(divine_ui): symmetric DivineButton padding for better label overflow by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5446 * fix(blocking): publish blocks to the NIP-51 kind 10000 mute list by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/5435 * perf(subtitle): rebuild caption pill only on cue change by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5454 * fix(notifications): classify anchored comment replies by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5464 * fix(db): match local nostr tag filters exactly by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5463 * fix(feed): deduplicate addressable videos by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5465 * fix(dm): count followed-but-unreplied unread chats in the Messages badge (#4976) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5473 * fix(video-editor): restore drafts with sticker layers without crashing by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5474 * fix(divine_ui): keep wider DivineButton padding when not stretched by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5469 * fix(dm): classify message requests with the real pubkey, not the empty cold-start one (#5374) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5480 * feat(camera): add previewOptimized + lowLatency stabilization modes by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5476 * fix(auth): break /welcome login loop on silent restore failure by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/5483 * fix(notifications): enrich cached refresh failures by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5466 * feat(feed): filter unavailable videos across all surfaces by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/5482 * feat(video-editor): add clip transitions between clips by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5479 * fix(recorder): stop a stuck recording from the button and recover on stop failure by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5489 * docs: add CLAUDE.md importing AGENTS.md by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/5491 * chore(age-review): sync Greenlight parent email by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5485 * chore(release): bump app version to 1.0.16 by @rabble in https://github.com/divinevideo/divine-mobile/pull/5507 * fix(upload): retry transient Blossom auth setup failures by @rabble in https://github.com/divinevideo/divine-mobile/pull/5502 * fix(upload): retry uploads when the signer is briefly unreachable by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5504 * fix(video-player): recover frozen texture mid-clip without waiting for the loop by @rabble in https://github.com/divinevideo/divine-mobile/pull/5511 * feat(video-editor): per-layer enter/leave animations with combinable effects by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5494 * fix(video-editor): restrict clip transitions to debug builds by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5498 * fix(inbox): stabilize DM message ordering and drop dead DAO method (#4407) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5510 * fix(video-editor): release feed codecs when opening camera/editor by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5522 * fix(dm): stop conversation upsert from clobbering read state (#4977) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5506 * feat(bug-report): add runtime diagnostics to log export header by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5531 * fix(video-editor): recover from Qualcomm encoder failures on export by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5524 * feat(dm): read + publish the user's own kind-10050 DM inbox relays (#4974) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5493 * fix(video-editor): prevent overlapping clip transitions; show rendered output duration by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5508 * fix(video-recorder): smooth and extend hold-to-record drag zoom by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5533 * fix(video-editor): cross-fade thumbnail into preview on open by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5526 * fix(camera): smooth iOS preview with previewOptimized stabilization by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5520 * feat(feed): swipe left/right to directly tune your recommendations by @rabble in https://github.com/divinevideo/divine-mobile/pull/5509 * fix(camera): stop Android preview crash on torn-down texture and encoder executor by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5535 * fix(explore): warm popular classic feed before switching by @rabble in https://github.com/divinevideo/divine-mobile/pull/5513 * fix(feed): auto-retry the active video after it fails to load by @rabble in https://github.com/divinevideo/divine-mobile/pull/5514 * fix(upload): yield bandwidth to feed playback with inter-chunk backpressure by @rabble in https://github.com/divinevideo/divine-mobile/pull/5537 * fix(auth): preserve drafts when removing local account by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5519 * feat(dm): cross-device DM read-state sync via self-encrypted markers (#4977) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5543 * fix(video-editor): stop preview playhead jumping back when a transition finishes rendering by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5539 * fix(video-editor): release preview decoder before export render by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5541 * fix(feed): ignore stale Nostr enrichment by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5548 * fix(feed): preserve native video loop boundaries by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5551 * refactor(feed): extract video_feed_page widget classes by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5554 * test(player): cover native HLS auth-header transport (#4897) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5556 * refactor(video): remove orphaned videoPrewarmerProvider (#5553) by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5557 * fix(profile): recover own profile refresh by @rabble in https://github.com/divinevideo/divine-mobile/pull/5552 * fix(apps): open verifier in system browser from Apps Directory + standardize spelling by @mbradley in https://github.com/divinevideo/divine-mobile/pull/5500 * refactor(upload): delete dead UploadManager methods by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5569 * feat(feed): add Classics mode to the home feed picker by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5564 * feat(video-recorder): make the zoom ruler interactive by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5559 * chore(media-cache): surface the cause of failed media downloads by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5567 * chore(macos): ignore Xcode-generated SwiftPM lockfiles by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5572 * refactor(upload): extract PendingUploadStore from UploadManager (#4507) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5574 * feat(l10n): localize video-publish error strings (below-UI-layer) (#4892) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5565 * fix(macos): use file-based keychain for secure storage in debug by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5571 * fix(media_cache): build Cronet engine eagerly so dart:io fallback engages by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5581 * fix(video-editor): surface the real cause of draft-save failures by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5587 * fix(upload): stop PendingUploadStore save queue double-enqueuing failed uploads by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5585 * fix(search): bound NIP-50 relay query stalls by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5562 * feat(video-editor): add voice-over recorder by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5570 * refactor(upload): delete dead getUploadsByStatus query helper by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5580 * refactor(upload): extract UploadRetryPolicy + UploadProgressReporter (#4507) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5589 * fix(comments): keep just-posted comment visible while REST index lags by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5599 * refactor(upload): invert crash-reporting blocker behind a port (#4507) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5601 * fix(nostr): recover failed client initialization by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5600 * fix(nostr): guard ref after async gap in NostrService._initializeClient by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5615 * fix(comments): dismiss keyboard when the comments sheet closes by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5616 * fix(search): truncate overflowing hashtag in SearchTagChip by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5607 * fix(comments): open author profile when tapping the comment avatar by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5617 * fix(video): keep clips and drafts loading past one corrupt row by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5613 * fix(video-recorder): keep recording stop responsive across slow saves and navigation races by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5609 * fix(video-editor): bump pro_video_editor to 2.1.1 for speed-effect export by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5606 * fix(models): ignore "unverified" verification tag in hasProofMode by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5611 * test(nostr): assert disposed-ref leak explicitly in init guard tests by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5621 * fix(video-editor): guard editor capability sync and audio preview against unmount by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5628 * refactor(profile): split profile_setup_screen.dart by section (#4512) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5626 * fix(feed): prevent idle warmup contention by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5549 * fix(media-cache): ignore processing responses by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5597 * refactor(analytics): inject SurfacePerformanceTracker via Riverpod provider by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5632 * fix(video-editor): clean up draft-local audio files on draft deletion by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5633 * refactor(di): inject clean infra services via Riverpod providers by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5630 * perf(dm): adopt keycast nip17_unwrap_batch to drain remote-signer DM history in one call/page by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5627 * fix(video-editor): drop clips with deleted source files to prevent frozen preview by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5635 * fix(video): prevent overlapping feed audio by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5620 * refactor(analytics): remove dead VideoLoadingMetrics and metrics overlay by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5629 * fix(auth): allow badges oauth navigation safely by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5624 * refactor(analytics): inject ErrorAnalyticsTracker via Riverpod provider by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5631 * fix(auth): preserve NIP-46 signer callback sessions by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5622 * fix(video-editor): harden recording clip file races by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5639 * fix(moderation): wait for ready nostr session by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5596 * fix(video-editor): handle COMPOSITION_ERROR from native setClips on draft reopen by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5637 * refactor(camera): route recorder permission asks through the gate by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5644 * build(macos): split debug codesigning and hardened runtime work out of #4029 by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5643 * fix(video-editor): stop iOS ProVideoEditor callback crash on FlutterEngine teardown by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5642 * fix(video-player): bound Android feed ExoPlayer buffers to curb OOM (#3419) by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5649 * feat(profile): track original Funnelcake profile event timestamps by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5648 * feat(video-editor): localize sticker descriptions and pack names by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5651 * fix(macos): drive camera and microphone permissions through native AVFoundation by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5650 * perf(dm): debounce DM unread-count cubit to coalesce write bursts by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5652 * perf(dm): debounce conversation-list recompute to coalesce write bursts by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5655 * perf(dm): skip redundant mark-read writes on outgoing-only conversation ticks by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5658 * perf(dm): batch the per-page gift-wrap dedup probe into two IN queries by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5660 * perf(cache-sync): track running byte total and batch LRU eviction by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5662 * perf(dm): short-circuit statusFor when there are no in-flight queue rows by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5663 * chore(metaswarm): configure Divine knowledge sources by @rabble in https://github.com/divinevideo/divine-mobile/pull/5646 * fix(dm): stop reaction removal from popping the conversation screen by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5666 * perf(test): speed up mobile test startup by @rabble in https://github.com/divinevideo/divine-mobile/pull/5668 * fix(video): play and visualize imported audio in lip-sync recorder by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5685 * perf(share): make share-to-DM feel instant (offload, optimistic send, batched + shimmer contacts) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5673 * fix(share): lift the share-sheet message field above the keyboard by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5689 * refactor(auth): migrate nostrconnect failure paths to reason codes by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5684 * fix(video-player): scope Apple plugin registrar and register-time cleanup per engine by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5687 * fix(video-editor): split clips via frame-accurate splitVideo primitive by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5690 * fix(video-editor): stop doubling the split clip filename suffix by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5691 * fix(camera): bind native diagnostics sink to UI activity lifecycle by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5681 * chore(proofmode): downgrade expected missing proof logs by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5699 * fix(video-editor): reconcile orphan-only undo/redo state by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5686 * fix(relay): retry video subscriptions after relay reconnect by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5700 * fix(cache): initialize personal event cache after auth by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5701 * docs: scope code-style line-length rule to Dart only by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5679 * feat(profile): route kind 0 publish through publishEventAwaitOk for relay-confirmed saves by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5674 * fix(profile): animate avatar lightbox with a Hero route and proportional radius by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5676 * feat(profile): crop avatars and banners before upload by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5682 * fix(content-warnings): respect age-restricted playback settings by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5672 * fix(upload): preserve resumable sessions on socket drops by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5702 * fix(age-verification): stop repeated video verification by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5671 * fix(auth): handle duplicate email verification conflicts by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/5625 * fix(notifications): map kind-16 reposts when notification_type is absent by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5709 * feat(reel): instagram-style reaction float animation by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5704 * ci(hooks): mirror arb-consistency and untested-services-floor gates in pre-push by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/5706 * refactor(auth): dead-code cull + NostrKeyManager consolidation (#4741) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5716 * refactor(auth): break AuthenticationSource cycle + relocate BlockListSigner (#4741) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5717 * fix(video-editor): bump pro_image_editor to 12.11.1 for layer animation fix by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5714 * test(auth): characterization gap-fill before auth_service extraction (#4741) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5713 * feat(upload): OS-backed background uploads that survive app suspension by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5590 * feat(minor-safety): consume verified_minor + protected-minor state (#5730) by @mbradley in https://github.com/divinevideo/divine-mobile/pull/5708 * refactor(router): split app_router.dart by feature module (#4508) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/5711 * fix(video-editor): show timeline clip poster instantly on first open by @hm21 in https://github.com/divinevideo/divine-mobile/pull/5722 * refactor(auth): retire NostrKeyManager, relocate legacy-key migration (#4741) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/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**: https://github.com/divinevideo/divine-mobile/compare/1.0.15...1.0.16
  • May 24, 2026 1.0.14
    ## Release Notes Life in Loops got a bigger tune-up. This update brings more tools for making loops your own: clip speed controls, timeline volume editing, local audio imports, audio extraction from clips, and a smoother post editing flow. DMs got livelier too, with emoji reactions, lightweight markdown, better inbox previews, and sturdier message delivery. Profiles got banner uploads, verified account chips, cleaner text links, and better loading states. We also added clip trash with 30-day recovery, sharper Explore and Popular filters, better search sorting, improved notifications, smoother feed playback, stronger upload/retry handling, and fixes across comments, invites, collabs, account recovery, and video metadata.
    More…
    Short version: more creative control, better conversations, smoother feeds, fewer weird edges. Welcome Home. ## English (U.S.) - What to Test Please focus on the new creator tools and everyday app flow: - Edit a video with clip speed controls, clip volume, local audio import, and audio extraction. - Try posting after changing metadata, tags, cover frame, collaborators, or engagement settings. - Use DMs with emoji reactions, markdown, inbox previews, and message retry/recovery. - Browse Home, Explore, Popular, search results, profiles, notifications, and comments. - Try clip library sorting, deleting clips, and restoring from trash. - Check account flows: sign in, account recovery, profile edits, NIP-05 settings, and returning to the app after closing it. Please report anything that feels stuck, confusing, out of sync, loses edits, breaks playback, or shows stale counts/bad navigation.
  • May 8, 2026 1.0.12
    What's new in 1.0.12 Fresh - Comments are back. Reply to loops, get pinged when someone replies to yours, tap the notification and land right where the conversation is. - The audio picker now searches, remembers your saved sounds, and lets you reuse anyone's track in your own loop. Two new bundled jams in the mix: Wednesday My Dudes and State Highway. - Your divine.video handle finally shows up the way you'd expect: @you, no domain dragging behind it.
    More…
    - Deep-link straight into any Explore tab -- /explore/tab/<name> -- for when you want to share exactly what you're seeing. - Filipino joins the language list. Mabuhay. - Recording keeps your screen awake so the timer doesn't bail on you mid-take. - DMs queue up locally now -- type, send, walk into a tunnel, message still goes out. Sharper - Bigger tap targets across the bottom nav and video gestures. Less fighting your thumbs. - Home and fullscreen overlays got a polish pass; the Report sheet now actually tells you what each option means. - Pull-to-refresh on the home feed works again. The New tab refreshes fresh, and Popular Now sorts the way it says on the tin. - View counts and loops on the New feed and your profile match Funnelcake -- the numbers you see are the numbers we count. - Looping uses native Apple playback now, so the seam at the end is basically invisible. - "Divine-hosted only" filter starts on by default. Less slop reaching your eyeballs out of the gate. Squashed - Notifications: "liked your comment" and "replied to your comment" taps go to the right place; the Follow Back button stops disappearing on you; mark-all-read rolls back if the server has a bad moment. - Mentions in comments resolve faster -- no more spinner-on-a-name. - Edited videos now count likes across every version. Your reactions add up the way they should. - Verified NIP-05 handles survive a profile edit. Collaborator-tagged videos stop crashing your own profile feed. - Black video preview? Gone. Fullscreen engagement stats? Back. - Square videos sit where they belong, under the fullscreen header. - Nostr links in messages render as readable links instead of alphabet soup. - Settings deletion confirmation accepts lowercase. We were being dramatic. - Invite codes show the dash hint after the 4th character -- no more guessing. - Videos that won't download evict their bad cache and retry once you bounce Settings. Quietly looking out for you - iOS hardens the in-app Nostr bridge with per-frame origin checks. - Logs no longer keep deep-link query strings or Blossom auth headers. Your secrets stay yours. - Android tightens its network security config. Loop on.
  • Apr 30, 2026 1.0.10
    ## What's Changed * fix(notifications): port consolidated unread badge logic to NotificationFeedBloc by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/3498 * docs(notifications): note loading-state contract on relayNotificationUnreadCount by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/3499 * fix(router): stop normalizing /invites away to /home by @rabble in https://github.com/divinevideo/divine-mobile/pull/3496 * feat(reports): add NIP-32 l/L tags to restore app-level report categorization by @mbradley in https://github.com/divinevideo/divine-mobile/pull/3492 * feat(video_recorder): implement long press functionality for classic-recording by @hm21 in https://github.com/divinevideo/divine-mobile/pull/3459 * fix(social): emit optimistic like + repost counts before publish by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/3430 * feat(popular): switch Popular tab to sort=watching by @rabble in https://github.com/divinevideo/divine-mobile/pull/3502 * fix(video_editor): adjust stripe dimensions in outside area painter by @hm21 in https://github.com/divinevideo/divine-mobile/pull/3478 * fix(social): track downvotes in LikesRepository; drop voteInProgressCommentId by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/3433
    More…
    * fix(video_editor): correct seek position handling by @hm21 in https://github.com/divinevideo/divine-mobile/pull/3463 * feat(time_formatter): add epoch-second DateTime extensions by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/3505 * fix(profile): include reservedUsernames in ProfileEditorState equality by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/3507 * fix(profile): keep deleteCachedProfile in-memory indexes consistent by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/3508 * fix(video_player): improve seek handling and preroll functionality by @hm21 in https://github.com/divinevideo/divine-mobile/pull/3466 * fix(router): stop double-decoding hashtag/search path params (#3413) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/3509 * perf(profile_feed): cache videoEventService reference on the merge hot path by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/3510 * perf(video-editor): improve the general video-editor performance by @hm21 in https://github.com/divinevideo/divine-mobile/pull/3473 * fix(models): restrict VideoEvent.toJson to persisted data fields by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/3514 * fix(social): bind feed-item BlocProvider to repo identity (#3503) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/3522 * docs(rules): codify Riverpod-into-BlocProvider bridge rule by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/3533 * chore(video_interactions): remove dead VideoInteractionsState.error field by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/3535 * fix(profile): kind 0 publish on no-relays fails fast with generic error by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/3528 * fix(funnelcake): tolerate {data,pagination} envelope from list endpoints by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/3529 * fix(profile): preserve loop metrics when merging profile videos by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/3546 * fix(explore): load newest videos in new feed by @rabble in https://github.com/divinevideo/divine-mobile/pull/3564 * feat(notifications): redesign list, refresh tabs, and refactor placeholder avatar by @Chardot in https://github.com/divinevideo/divine-mobile/pull/3548 * refactor(providers): de-dup bootstrap kind:10002 callback closures by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/3511 * fix(collabs): drop sender-side Accept/Ignore + NIP-04 duplicate (#3559) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/3566 * fix(dm): post-#3566 collab invite follow-ups (#3661 #3662 #3663) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/3672 * fix(profile): prevent that the layout shift when stats loading by @hm21 in https://github.com/divinevideo/divine-mobile/pull/3673 * fix(clip-library): update border-radius in masonry grid for video clips by @hm21 in https://github.com/divinevideo/divine-mobile/pull/3668 * fix(publish): cap relay-pool fan-out to unblock collab invites by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/3683 * fix: pass serverUrl to createGetAuthHeader in background cache queue by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/3693 * fix(download): save original video using file paths by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/3695 * refactor(publish): derive outer publish timeout from per-relay fan-out (#3688) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/3689 * fix(collabs): emit lowercase collaborator marker on video p-tags by @mbradley in https://github.com/divinevideo/divine-mobile/pull/3686 * fix(explore): restore refresh recovery for empty feeds by @rabble in https://github.com/divinevideo/divine-mobile/pull/3701 * chore(analyzer): resolve a minor analyzer sort issue by @hm21 in https://github.com/divinevideo/divine-mobile/pull/3678 * fix(perf): close profile feed traces from cache by @rabble in https://github.com/divinevideo/divine-mobile/pull/3681 * fix(feed): hydrate home feed loop counts by @rabble in https://github.com/divinevideo/divine-mobile/pull/3568 * chore(zapstore): point metadata at 1.0.9 by @rabble in https://github.com/divinevideo/divine-mobile/pull/3670 * feat(share-sheet): add classic Vine clip import by @rabble in https://github.com/divinevideo/divine-mobile/pull/3448 * fix(video-thumbnail): add blurhash support for loading placeholders by @hm21 in https://github.com/divinevideo/divine-mobile/pull/3684 * feat(video-editor): add the option to add stickers to the video by @hm21 in https://github.com/divinevideo/divine-mobile/pull/3666 * fix(settings): drop progress snackbar blocking dev-mode tap unlock by @rabble in https://github.com/divinevideo/divine-mobile/pull/3519 * ci(ios): add QA PR build slots by @rabble in https://github.com/divinevideo/divine-mobile/pull/3440 * fix(ci): skip iOS QA Codemagic trigger without credentials by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/3721 * revert(ci): add QA PR build slots by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/3719 * chore(release): bump app version to 1.0.10 by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/3723 * test(video-editor): cover sticker export round-trip by @hm21 in https://github.com/divinevideo/divine-mobile/pull/3727 * fix(video-info-sheet): guard VideoRepostersCubit emit after close by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/3735 * test(blurhash): cover thrown-exception fallback path in BlurhashService by @hm21 in https://github.com/divinevideo/divine-mobile/pull/3726 **Full Changelog**: https://github.com/divinevideo/divine-mobile/compare/1.0.9...1.0.10
  • Apr 2, 2026 1.0.8
    # 1.0.8 — Tighter loops, fewer weird edges Big week on Divine. We’ve been tightening the app up so it feels smoother, clearer, and more fun to use. Less friction. Less weirdness. More room for the good stuff. ## What’s new - **Auto-advance is here** if you want to keep the loops rolling. - **Captions moved into More Info** and your setting now sticks across videos.
    More…
    - **Blocked accounts should stay out of your way** across comments, notifications, and search. ## What feels better - **Watching on web, especially in fullscreen, should be a lot less flaky.** - **Videos that used to get stuck on bad loading states should open more cleanly now.** - **Loop counts and profile video counts should look a lot more trustworthy.** - **Tapping names and profile links in comments works again.** - **A bunch of sharp little bugs across feeds, profiles, navigation, and video playback got cleaned up too.** ## Help Us Test If you’ve got a few minutes, we’d especially love help with: - **Watching videos on web** from Home, Search, and Explore - **Fullscreen swiping on web** - **Turning captions on and off from More Info** and checking that the setting sticks - **Trying auto-advance in the feed** - **Blocking and unblocking someone**, then checking comments, notifications, and search - **Opening profiles and checking video counts**, especially on older videos - **Tapping creator names and profile links in comments** - **Any video that used to get stuck on loading or error states** Thanks for helping us tune this thing up. We’re building a better corner of the internet together. **No slop. All human.**
  • Mar 21, 2026 1.0.7
    Since 1.0.6, Divine has become faster, clearer, and much more ready for prime time. We focused this release on making the app easier to trust, easier to navigate, and more fun to use. Feeds load faster. Playback is steadier. Account switching, sign-in, and invite flows are in better shape. Settings are cleaner. Reporting, moderation, legal, and support surfaces are easier to find. The camera, editor, and sharing flows also got a long list of quality fixes. What stands out in 1.0.7: - Faster, steadier watching: quicker startup, stronger feed caching, smoother scrolling, better playback recovery, fewer frozen or black frames, cached Explore/Profile refresh behavior, and safer handling for transcoded video fallbacks. - Cleaner onboarding and account flows: improved invite-gated entry, better session-expired behavior, safer account switching, stronger login reliability, and clearer paths for review and support. - Better settings and review-facing UX: Settings now split cleanly into dedicated sub-screens for Support Center, Content Preferences, Moderation Controls, Nostr Settings, and Legal. - Stronger safety and support: more visible content reporting, moderation label improvements, trusted-moderator filters, flagged-content warnings, Zendesk support hardening, and clearer account deletion/data deletion flows.
    More…
    - More capable creation tools: camera permission UX improvements, editor stability fixes, audio tools, Freesound integration, better gallery handling, clip/draft filtering by user, and a pile of rendering and crash fixes. - Better social and messaging flows: message requests, DM reliability improvements, profile/feed refresh fixes, follower-count accuracy, easier sharing, and stronger notifications behavior. - Platform and launch polish: branding cleanup, iOS/Android crash fixes, CI and hook hardening, Zapstore/release improvements, and a lot of under-the-hood work to make shipping safer. The bigger theme is simple: less friction, more confidence, and more room to play. Divine keeps pushing toward a human-made video app that feels alive, weird, and actually enjoyable to use. No slop. All human. ## What's Changed * fix(playback): add watchdog to auto-resume from native player pauses by @rabble in https://github.com/divinevideo/divine-mobile/pull/2060 * fix(android): prevent Zendesk AppCompat crash in support screens by @rabble in https://github.com/divinevideo/divine-mobile/pull/2058 * fix(notifications): harden generic fallback copy by @rabble in https://github.com/divinevideo/divine-mobile/pull/2056 * feat(share): add download actions to the share sheet by @rabble in https://github.com/divinevideo/divine-mobile/pull/2065 * chore(release): remove the Zapstore arm64 APK match filter by @rabble in https://github.com/divinevideo/divine-mobile/pull/2066 * fix(explore): reduce popular feed reload burst by @rabble in https://github.com/divinevideo/divine-mobile/pull/2062 * fix(android): prevent app_device_integrity detach crash by @rabble in https://github.com/divinevideo/divine-mobile/pull/2057 * fix: smoother full screen video scrolling by @JohnWeidner in https://github.com/divinevideo/divine-mobile/pull/2055 * docs: add PR CI guardrails for agents by @rabble in https://github.com/divinevideo/divine-mobile/pull/2068 * docs: add brand guidelines reference docs by @rabble in https://github.com/divinevideo/divine-mobile/pull/2067 * fix(feed): stop deferred callbacks from reading disposed refs by @rabble in https://github.com/divinevideo/divine-mobile/pull/2063 * fix(feed): apply REST moderation labels to content preferences by @rabble in https://github.com/divinevideo/divine-mobile/pull/2064 * docs: refresh agent guidance docs by @rabble in https://github.com/divinevideo/divine-mobile/pull/2070 * fix(ci): disable macos signing in codemagic build by @rabble in https://github.com/divinevideo/divine-mobile/pull/2075 * perf(startup): reduce Funnelcake probe timeout to 3 seconds by @rabble in https://github.com/divinevideo/divine-mobile/pull/2073 * fix: home buttons consistency with other video feeds by @JohnWeidner in https://github.com/divinevideo/divine-mobile/pull/2072 * fix(ui): align avatar component with Figma design by @rabble in https://github.com/divinevideo/divine-mobile/pull/2069 * feat: Migrate all screens to DiVineAppBar by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/2061 * perf(startup): skip Funnelcake probe for known Divine relays by @rabble in https://github.com/divinevideo/divine-mobile/pull/2074 * fix(video): prioritize current feed playback over preloads by @rabble in https://github.com/divinevideo/divine-mobile/pull/2071 * perf(startup): serve cached home feed instantly on cold start by @rabble in https://github.com/divinevideo/divine-mobile/pull/2076 * fix(ci): inline macos signing override for codemagic by @rabble in https://github.com/divinevideo/divine-mobile/pull/2082 * fix(feed): make followRepository non-nullable and skip duplicate API call by @omartinma in https://github.com/divinevideo/divine-mobile/pull/2015 * fix(video-editor): correctly initialize the camera and align color picker with design system by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2083 * fix(upload-manager): improve cleanup of completed and failed uploads by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2085 * fix: include info-level diagnostics in Claude Code analyzer hook by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/2087 * fix(appbar): enable back button and fix padding in Creator Analytics by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2086 * refactor: replace Hive profile caches with Drift DAOs by @Josh-Sanford in https://github.com/divinevideo/divine-mobile/pull/1881 * feat: add watch queries to ProfileRepository and ProfileStatsDao by @Josh-Sanford in https://github.com/divinevideo/divine-mobile/pull/1883 * feat: wire MyProfileBloc into main profile screen by @Josh-Sanford in https://github.com/divinevideo/divine-mobile/pull/1894 * refactor: remove unused profileStatsAsync code by @Josh-Sanford in https://github.com/divinevideo/divine-mobile/pull/1895 * fix(video): revert #2055/#2071 and add fast-path reuse to fix swipe-back freeze by @omartinma in https://github.com/divinevideo/divine-mobile/pull/2089 * chore: update pro_image_editor version by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2051 * fix: show loading spinner instead of empty flash on search by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/2096 * fix(divine_ui): auto-grow multiline text fields by @rabble in https://github.com/divinevideo/divine-mobile/pull/2098 * fix: use locale-aware date formatting in notifications by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/2095 * fix: adjust padding in various screens to account for bottom view insets by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2090 * chore(repo): enforce codegen verification in git hooks by @rabble in https://github.com/divinevideo/divine-mobile/pull/2101 * feat: use Zendesk for reserved username requests with re-check support by @rabble in https://github.com/divinevideo/divine-mobile/pull/2099 * feat: allow editing content labels in Edit Video by @rabble-claw in https://github.com/divinevideo/divine-mobile/pull/2103 * feat(mobile): add divine-hosted-only video filter by @rabble in https://github.com/divinevideo/divine-mobile/pull/2100 * fix: hide AI-generated labeled videos in feed filtering (with CI fixes) by @rabble in https://github.com/divinevideo/divine-mobile/pull/2104 * fix(overlay-visibility): update overlay state management for video playback retention by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2088 * fix: session expired banner navigates to login instead of bouncing home by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/2059 * perf(ui): fix ProofModeBadgeRow rebuilding 30+ times/sec by @rabble in https://github.com/divinevideo/divine-mobile/pull/2106 * fix(video): prefer direct MP4 over HLS for faster loading by @rabble in https://github.com/divinevideo/divine-mobile/pull/2105 * refactor: retire UserProfileService — migrate to Drift-backed ProfileRepository by @Josh-Sanford in https://github.com/divinevideo/divine-mobile/pull/1903 * feat: E2E integration test infrastructure with Patrol and Docker stack by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/1928 * fix: local_up task fails when e2e-seed container exits by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/2116 * fix(reports): comply with NIP-56 tag structure for content reports by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/2109 * fix: parse username check code field to distinguish reserved from taken by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/2108 * chore: update pic for readme by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/2122 * fix: use local asset for README hero image by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/2124 * fix(profile): verify NIP-05 before copying subdomain URL by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/2123 * chore: Remove E2E CI workflow by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/2125 * fix(feed): restore 6.3s pooled fullscreen loop limit by @rabble-claw in https://github.com/divinevideo/divine-mobile/pull/2119 * fix(ui): avoid proofmode wording when no verification exists by @rabble-claw in https://github.com/divinevideo/divine-mobile/pull/2120 * feat: add figma-designer skill for design-to-code workflow by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/2126 * ci(mobile): add Cloudflare PR previews by @rabble in https://github.com/divinevideo/divine-mobile/pull/2128 * feat: use Funnelcake moderation labels in mobile feeds by @rabble in https://github.com/divinevideo/divine-mobile/pull/2134 * chore: run `dart fix --apply` which resolve various analysis issues in integration tests by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2141 * fix(video): remove automatic gallery save during recording by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2140 * fix(feed): prevent playback resume when overlay is open during false home report by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2138 * feat(dm): add NIP-17 DM data layer, repository, and business logic by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/2118 * fix(video): reduce blur by adjusting filterQuality for video playback by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2147 * chore(divine_ui): remove leftover time_formatter dependency by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/2149 * refactor: Migrate curation consumers to Funnelcake by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/2145 * feat(zendesk): JWT-authenticated support with structured forms and pre-auth hardening by @mbradley in https://github.com/divinevideo/divine-mobile/pull/1294 * perf: in-memory cache my followers data for instant profile loads by @omartinma in https://github.com/divinevideo/divine-mobile/pull/2157 * fix: display authoritative follower count instead of relay-capped list length by @omartinma in https://github.com/divinevideo/divine-mobile/pull/2155 * fix(profile): use single isOwnProfile flag for followers stat by @omartinma in https://github.com/divinevideo/divine-mobile/pull/2150 * feat: filter clips and drafts by user by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2148 * chore(hooks): add merge-conflict check to pre-push hook by @rabble in https://github.com/divinevideo/divine-mobile/pull/2158 * chore: fix CI analyze issue by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2167 * fix(profile): sort videos newest-first on initial Nostr load by @omartinma in https://github.com/divinevideo/divine-mobile/pull/2170 * fix: improve snackbar handling and gallery save logic in video metadata bottom bar by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2166 * feat: add ghost frame feature for video clips with overlay option by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2171 * fix(profile): adjust padding for video grid to account for safe area by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2172 * feat(moderation): send DM to moderation team after content report by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/2112 * feat(dm): share video via NIP-17 encrypted DM by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/2111 * refactor: Use VineTheme across the app by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/2179 * fix: reserve space for action button counts to prevent layout jump by @omartinma in https://github.com/divinevideo/divine-mobile/pull/2176 * fix(search): preserve results when switching tabs (#2093) by @nikitawvi in https://github.com/divinevideo/divine-mobile/pull/2168 * fix(feed): separate ML moderation labels from author self-labels (#2142) by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/2143 * fix(web): prevent dart:io crashes and enable video playback by @rabble in https://github.com/divinevideo/divine-mobile/pull/2132 * fix(playback): unify center play pause control by @rabble in https://github.com/divinevideo/divine-mobile/pull/2183 * feat(video-editor): update the text-editor to the newest design by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2178 * fix(web): restore divine-mobile browser playback by @rabble in https://github.com/divinevideo/divine-mobile/pull/2127 * feat(video_metadata): redesign the metadata screen by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2181 * fix: remove c2pa selfsign by @n8fr8 in https://github.com/divinevideo/divine-mobile/pull/2161 * ci(mobile): add mergeability check by @rabble in https://github.com/divinevideo/divine-mobile/pull/2159 * fix(gallery): recheck permission after save prompt by @rabble in https://github.com/divinevideo/divine-mobile/pull/2188 * feat(comments): bootstrap comments from rest by @rabble in https://github.com/divinevideo/divine-mobile/pull/2186 * feat: gate onboarding behind invite codes by @rabble in https://github.com/divinevideo/divine-mobile/pull/2021 * fix(tests): mock isRegistered in EmailVerificationCubit tests by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2195 * fix(profile): resolve issue that profile loads infinity by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2196 * chore(claude): add uniform spacing guidelines for Row/Column layouts by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2194 * fix: Home video audio resumes when navigating back from Search by @omartinma in https://github.com/divinevideo/divine-mobile/pull/2207 * feat(dm): add inbox tab with paginated conversation list by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/2189 * fix(navigation): update routing to support conversation detail from inbox by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2215 * fix(drafts): preserve autosaved drafts during clear operations by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2220 * fix: detect hashtags when # is inserted before existing word by @rabble in https://github.com/divinevideo/divine-mobile/pull/2225 * refactor: drop waitlist-only onboarding mode by @rabble in https://github.com/divinevideo/divine-mobile/pull/2191 * feat: improve background uploader by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2223 * feat(feed): gate flagged content behind warning overlay by @rabble in https://github.com/divinevideo/divine-mobile/pull/2226 * perf(feed): batch-fetch creator profiles in VideoFeedBloc by @omartinma in https://github.com/divinevideo/divine-mobile/pull/2199 * fix(zendesk): set SDK identity at login so content reports create tickets by @mbradley in https://github.com/divinevideo/divine-mobile/pull/2227 * refactor: Migrate social consumers to Funnelcake by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/2216 * docs(github): add model boundary audit issue template by @rabble in https://github.com/divinevideo/divine-mobile/pull/2229 * test(e2e): add delete video lifecycle test reproducing #2163 by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/2210 * fix(notifications): resolve comment targets to parent videos by @rabble in https://github.com/divinevideo/divine-mobile/pull/2230 * feat(filters): trust followed moderators for content warnings by @rabble in https://github.com/divinevideo/divine-mobile/pull/2232 * fix(subtitles): retry pending Blossom subtitle fetches by @rabble in https://github.com/divinevideo/divine-mobile/pull/2231 * docs: update Claude rules based on PR review feedback by @omartinma in https://github.com/divinevideo/divine-mobile/pull/2235 * chore(ci): add integration_test to format and analyze checks by @omartinma in https://github.com/divinevideo/divine-mobile/pull/2238 * fix(upload): resolve issue that uploads fail when added collaborators by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2243 * feat(local_stack): integrate divine-blossom local mode into e2e stack by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/2180 * fix: address various minor issues in video interaction components by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2246 * feat(c2pa): add CAWG training-mining assertion to protect content from AI by @rabble in https://github.com/divinevideo/divine-mobile/pull/2239 * fix(profile): refresh stale profile feeds on navigation by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/2240 * fix(brand): standardize app name as "Divine" across brand guidelines by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/2273 * feat(e2e): replace invite stub with real divine-invite-darshan service by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/2251 * fix(brand): capitalize app display name to "Divine" on iOS and Android by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/2278 * feat(slider): implement custom DivineSlider component with themed track and thumb by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2248 * feat(video-editor): move the clip-editor into the video-editor by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2113 * fix: update text fonts and improve text editor focus handling by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2271 * feat(gallery): implement gallery permission bottom sheet for improved error handling by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2224 * feat(video-editor): implement the audio adjust bottom-sheet by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2253 * refactor: Migrate creator consumers to Funnelcake by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/2280 * fix: resume videos that get paused due to B-frames on the home by @omartinma in https://github.com/divinevideo/divine-mobile/pull/2283 * fix(e2e): update tests for inbox tab rename and recording timing by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/2263 * feat(e2e): add network-throttled perf test harness for feed TTFF by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/2266 * feat(dm): add message requests inbox with classification and preview by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/2219 * fix(dm): clear DM database on account switch to prevent data leakage by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/2289 * fix(video-player): prevent texture bleeding by managing active state visibility by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2288 * feat(seed): preload classic viner profiles and avatars by @rabble in https://github.com/divinevideo/divine-mobile/pull/2274 * feat(explore): keep cached feeds visible during refresh by @rabble in https://github.com/divinevideo/divine-mobile/pull/2275 * feat(profile): keep cached profile data visible during refresh by @rabble in https://github.com/divinevideo/divine-mobile/pull/2276 * fix(theme): resolve inconsistent typography by removing custom font size overrides in VineTheme by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2252 * fix(video-editor): reset isProcessing state when finalRenderedClip already exists during video rendering by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2290 * fix(video-editor): resolve incorrect clipping from square videos by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2293 * refactor(models): add UserProfile.fromFunnelcake() factory constructor by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/2294 * refactor: Delete AnalyticsApiService completely by @untreu2 in https://github.com/divinevideo/divine-mobile/pull/2298 * fix(dm): add NIP-04 interop with dual-send for guaranteed delivery by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/2295 * refactor(dm): replace Riverpod providers with RequestPreviewCubit by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/2291 * feat(inbox): swap tab order and default to Notifications by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/2296 * fix(video-player): prevent green frame on Android surface recreation by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/2297 * fix(video): use transcoded variants and prioritize current video playback by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/2262 * ci: add pre-push hook for local CI checks by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/2301 * fix(share): resolve ShareSheetBloc provider not found on Find People tap by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/2304 * chore(release): bump version to 1.0.7+497 by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/2305 * refactor(divine-ui): replace hardcoded icon paths with DivineIconName.assetPath by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2307 * fix(theme): add text selection theme customization for improved UX by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2308 * feat(settings): split monolith into sub-screens with account header by @omartinma in https://github.com/divinevideo/divine-mobile/pull/2311 * fix(feed): reset page position on mode switch to restore overlay by @omartinma in https://github.com/divinevideo/divine-mobile/pull/2314 * fix(video-editor): handle short clip merge, preview, and time display by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2316 * feat: in-memory feed cache for instant mode switching by @omartinma in https://github.com/divinevideo/divine-mobile/pull/2318 * feat(video): add video playback format selector to Developer Options by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/2320 * feat(web): bypass invite gate in GH preview builds by @rabble in https://github.com/divinevideo/divine-mobile/pull/2338 * fix(video-editor): prevent app crashes when drawing extensively by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2342 * feat(bottom_sheet): add VineBottomSheetPrompt component by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2341 * refactor: remove Popular from home feed, rename FeedMode.home to following by @omartinma in https://github.com/divinevideo/divine-mobile/pull/2344 * feat(tv_static_effect): add animated TV static noise effect with GLSL shader by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2345 * fix: resolve moderation pubkey via NIP-05 instead of hardcoded value by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/2321 * refactor(video-recorder): replace custom bottom sheets with VineBottomSheetPrompt by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2351 * feat(camera): redesign camera permission flow by @hm21 in https://github.com/divinevideo/divine-mobile/pull/2347 * refactor: inject SharedPreferences into ModerationLabelService via constructor by @realmeylisdev in https://github.com/divinevideo/divine-mobile/pull/2349 * feat: add Freesound audio library with CC attribution by @rabble in https://github.com/divinevideo/divine-mobile/pull/2328 * fix(auth): sync PRIMARY key slot on account switch by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/2356 * ci: add git hooks check and align analyze with CI by @dcadenas in https://github.com/divinevideo/divine-mobile/pull/2358 * ci: auto-create tracking issue for PRs without linked issues by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/2359 * fix(video): add HLS fallback when MP4 quality variant fails by @rabble in https://github.com/divinevideo/divine-mobile/pull/2370 * fix(ci): add enable_spm to android-build, fix hook path resolution by @NotThatKindOfDrLiz in https://github.com/divinevideo/divine-mobile/pull/2364 ## New Contributors * @nikitawvi made their first contribution in https://github.com/divinevideo/divine-mobile/pull/2168 **Full Changelog**: https://github.com/divinevideo/divine-mobile/compare/1.0.6...1.0.7
  • Mar 8, 2026 1.0.6
    Since 1.0.5, Divine has become a much stronger playground for human creativity and connection. We’ve made the app faster, steadier, and more expressive across the board. Feed loading is dramatically quicker. Playback is smoother. Search is sharper. Profiles, comments, badges, sharing, and notifications all got real attention. The camera, editor, and library also took a big step forward, with better audio tools, stronger draft handling, cleaner clip workflows, and fewer weird edge-case failures. What’s new since 1.0.5: - A faster, more stable feed: quicker home load, fewer black flashes and freezes, fewer phantom pauses, better subtitle support, cleaner overlays, safer pooled playback, and fixes for tricky Divine-hosted video URLs. - Better discovery: a rebuilt home experience, a persistent For You mode, curated lists in feed logic, a new Categories tab in Explore, faster search behavior, and better hashtag reliability. - Stronger identity and sign-in flows: multi-account support, better deep-link and email verification handling, session recovery improvements, external NIP-05 support, NIP-49 account import, and fixes so verified identity is shown more honestly. - More capable creation tools: upgraded camera and video editor flows, custom audio rendering, audio editor support, countdown sound, auto lens switching, stronger clip deletion and drag interactions, better waveform feedback, improved gallery saving, and a redesigned drafts/clips library backed by more durable local storage.
    More…
    - Better community features: real-time comments, profile comments tab, cross-device sync for likes and reposts, block-user support, clearer content warnings, stronger moderation lookups, and improved Human Made / AI badge handling. - Better sharing and social actions: a cleaner unified share flow, restored download actions, better user search in sharing, smarter follow handling, and notification badge fixes. - Platform and release improvements: macOS support, experimental Linux support, better Zapstore and release automation, improved Crashlytics symbol uploads, iOS crash fixes, Android background-work fixes, and build stability work. The bigger theme is simple: more agency, less friction, and more room to play. Divine is being shaped into a place for real people, real weirdness, and real creative ownership. No slop. No doom-scroll tax. Just a better space to make, share, and connect.
  • Feb 21, 2026 1.0.5 Release page →
    ## What's New in 1.0.5 (Build 496 — Feb 23, 2026) ### Video Playback Fixes - **Phantom pause eliminated**: Videos no longer freeze/stutter when swiping between them. Preloaded videos stay buffered (muted) instead of being paused, avoiding expensive rebuffer stalls on mobile hardware decoders (#1723) - **No more dual audio**: Fixed bug where previous video's audio kept playing after swiping to next video (#1641) - **Black flash removed**: Eliminated black flash between thumbnail placeholder and first video frame (#1642) - **Disposed player crash fixed**: Prevented crash when Video widget accesses a player that was already disposed (#1643) - **Pooled player for Home tab**: Home feed now uses shared pooled_video_player for consistent playback across all feeds (#1668) - **Audio bleed fix**: No more hearing audio from videos that shouldn't be playing (#1683) - **Correct video orientation**: Fixed fullscreen feed orientation handling (#1710)
    More…
    ### View Event Tracking (Kind 22236) - **Decentralized analytics**: Publishes ephemeral Kind 22236 Nostr view events for creator analytics and recommendations - **Granular traffic sources**: Tracks home, discovery (new/classic/foryou/popular), profile, share, search sources - **Loop count tracking**: Includes loop count in view events for engagement metrics - **Self-view filtering**: Skips publishing view events for creator's own videos (#1705) ### Upload & Publishing Safety - **Local file path leak fixed**: Prevented local iOS device paths from being published in Nostr event imeta tags. Now constructs canonical Blossom URLs client-side per BUD-01 spec (#1722) - **URL validation**: All video/image/audio URLs validated as HTTP(S) before publishing or persisting - **Blossom server default fix**: Custom server toggle now correctly applies default when disabled (#1729) ### Relay & Network Improvements - **Relay discovery**: Added relay.damus.io as 3rd indexer, skip empty cached results, clear cache on logout - **Follower/following counts**: Direct indexer relay fallback for accurate counts (MAX-of-sources strategy) - **Remote signer (NIP-46)**: Parallelized relay connections, NIP-46 compatible relay list, callback URL support - **Android NIP-46 reconnection**: Reconnects relay WebSocket connections on app resume and divine:// callback after signer approval (#1713) - **Blossom simplification**: Removed BlossmServerDiscoveryService, direct WebSocket via RelayBase ### Auth & Identity - **Password-manager autofill hints** for login/signup (#1666) - **Auth screen redesign** with divine_ui design system (#1645) - **Silent key loss prevention**: Secure storage errors no longer silently lose keys (#1748) - **Email verification deep link fix**: Calls verifyEmail directly from deep link listener (#1726) - **Login screen scroll fix**: Users can no longer scroll past the sign-in button (#1743) ### Home & Feed - **New home screen UI** with auto-refresh (#1650, #1745) - **Reactive following list** in bloc (#1655) - **Notification badge on all tabs**, not just profile (#1627) ### Search & Discovery - **Hashtag search fix** (#1509) - **Like and search flow fixes** (#1747) ### UI & Navigation - **Pool player in profile grids** (#1669) - **Safe area fix** for video actions on edge-to-edge Android (#1673) - **Back navigation** for video editing routes (#1676) - **Badge display fix**: Videos show correct badge like "fully-verified" (#1687) - **Repost/Like preview mode**: Action buttons respect preview mode (#1725) ### Other Bug Fixes - Fix metascreen video-preview broken (#1697) - Fix unlike video and login with user/pwd (#1689) - Fix bunker auth flow, auth pre-fetch cycle, relay stats (#1677) - Fix NIP-98 spec compliance for URL, payload, and freshness (#1606) - Fix repost count cache to prevent stale counts after unrepost (#1582) - Diverse fixes in page and bloc (#1665) --- *APK built Feb 23, 2026 (build 496)*