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.
- 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 #6048
- fix(nostr): add signature verification policy setting by @rabble in #5934
- docs(l10n): translate Nostr signature verification settings by @NotThatKindOfDrLiz in #6052
- test(vgv): gate per-package merged-isolate channel leaks (#5838) by @realmeylisdev in #6061
- chore: remove dead support-key placeholder constant by @mbradley in #5963
- fix(profile): offline-tolerant username save (#3161) by @realmeylisdev in #6063
- fix(video-editor): preserve allow_audio_reuse when editing cached videos by @hm21 in #6051
- chore(minor-safety): scrub the dead support-pubkey from bug-report docs by @mbradley in #6073
- fix(audio-attribution): credit the original creator for reused audio by @hm21 in #6066
- test(packages): stop leaked platform singletons across merged isolates by @realmeylisdev in #6060
- fix(minor-safety): point minor-review endpoints at the relay-manager host by @mbradley in #6072
- test(vgv): gate Tier-3/Tier-4 process-globals in the merged isolate by @realmeylisdev in #6059
- fix(dm): make DM message delivery durable (OK-confirm + queue-aware retry + 10050 routing) by @realmeylisdev in #6046
- chore: remove dead code found during #4803 icon-migration audit by @realmeylisdev in #6078
- fix(dm): classify Keycast verified_minor policy-denial (403) as terminal, not retryable by @mbradley in #6069
- style(design-system): migrate error-state and people/group icons to DivineIcon (#4803) by @realmeylisdev in #6077
- fix(dm): address post-merge review of #6046 (Keycast timeout, group-send cancel/dedup, retry heartbeat, relay repair) by @realmeylisdev in #6075
- fix(divine_video_player): prevent SIGABRT from invalid AVVideoComposition by @hm21 in #6079
- chore(minor-safety): replace personal-key test fixture 78a5c21b with a synthetic pubkey by @mbradley in #6096
- refactor(divine-ui): unify DiVineAppBarIconButton and DivineIconButton by @realmeylisdev in #6076
- fix(follow): drop invalid pubkeys from the contact list by @hm21 in #6104
- fix(likes): floor the addressable like count against the relay resolve (#6022) by @realmeylisdev in #6102
- fix(dm): use a bottom sheet instead of a snackbar for failed-send recovery by @realmeylisdev in #6082
- fix(trust-safety): log moderation-pubkey pin divergence + ignore NIP-05 redirects (#4948) by @realmeylisdev in #6106
- fix(db): recover automatically from runtime SQLite corruption by @hm21 in #6107
- fix(categories): fall back to emoji when a category has no bundled SVG by @hm21 in #6131
- fix(ios): bump connectivity_plus to 7.3.0 to stop background engine crash by @hm21 in #6130
- fix(camera): scope iOS Now Playing session to foreground by @hm21 in #6110
- fix(likes): own "liked" heart un-fills on your own video after an edit by @realmeylisdev in #6123
- feat(video): emit an inspired-by p-tag so the referenced creator is notifiable by @realmeylisdev in #6132
- fix(nostr): guard queryEvents against a disposed client's closed pool by @realmeylisdev in #6089
- feat(deep-links): open playlist links in-app via /list/:pubkey/:listId by @mbradley in #6094
- chore: Prevent relay reconnects during Nostr startup by @dcadenas in #6101
- fix(video_editor): instant trim-based clip split + guard teardown races by @hm21 in #6134
- fix(auth): handle NIP-46 auth_url challenge as non-terminal in nostrconnect pairing by @realmeylisdev in #6151
- fix(dm): create app-shell badge cubits eagerly to stop re-entrant lazy create (#6115) by @realmeylisdev in #6146
- feat(video_editor): draw each clip's waveform over its thumbnails by @hm21 in #6149
- feat(video-editor): save a trimmed clip to the clip library (#5322) by @hm21 in #6155
- feat(account): opt-in @divine.video username burn on account deletion (#6126) by @mbradley in #6138
- test(integration): exception-safe ErrorWidget.builder/onError restores (#5839) by @realmeylisdev in #6156
- chore(release): bump app version to 1.0.17 by @rabble in #6160
- refactor(config): remove legacy backend host references by @realmeylisdev in #6159
- fix(camera): stop zoom sticking at random positions on iOS by @hm21 in #6064
- fix(proofmode): let users recover when C2PA signing or rendering fails by @hm21 in #6068
- feat: add tap to refresh on home tab by @missaustraliana in #4834
- test(event-router): restore coverage and document unsupported routing kinds by @realmeylisdev in #6164
- chore(deps): remove misplaced/unused root dependencies (#3631, #3632) by @realmeylisdev in #6165
- chore(deps): migrate media_kit_video to pub and harden the c2pa_flutter git pin by @realmeylisdev in #6167
- chore(fonts): register OFL licenses for bundled fonts and de-duplicate font assets by @realmeylisdev in #6168
- feat(account): delete-account identity + username confirmation (#6137) by @mbradley in #6158
- fix(feed): guard ref-after-await in ClassicVinesTab._refreshClassics by @realmeylisdev in #6162
- fix(upload): re-drive stuck uploads on app resume and startup by @rabble in #6084
- docs: fix stale Linux desktop dependency documentation by @realmeylisdev in #6172
- fix(feed): ignore double-tap-to-like on your own video by @hm21 in #6169
- fix(nostr): guard against spurious startup NostrClient rebuild and run the #2144 repair after auth restore by @realmeylisdev in #6173
- chore(cache-sync): add MigrationStrategy + wipe legacy key residue by @realmeylisdev in #6175
- test(upload): de-flake in-flight marker assertion when file is missing by @realmeylisdev in #6193
- refactor(badges): move BadgeRepository to a repository-consistent home by @realmeylisdev in #6190
- ci(testing): guard test/unit re-accretion + mirror-structure cleanup (#4337 WS-7) by @realmeylisdev in #6192
- fix(crash): treat MediaCacheImageProvider load failures as non-fatal by @rabble in #6180
- test(perf): cover VideoEventService trace completion idempotency by @realmeylisdev in #6191
- fix(crash): guard GoRouter extra casts against restored maps by @rabble in #6182
- fix(profile): stop stale kind-0 events blanking the cached profile by @rabble in #6179
- fix(blurhash): own spec-correct codec, drop unmaintained blurhash_dart by @hm21 in #6189
- feat(profile): read NIP-39 claims from kind 10011 and persist verification cache (#3936) by @realmeylisdev in #6176
- fix(bluesky): route users without a claimed handle to the claim flow (#3275) by @rabble in #6139
- fix(ios): finish background publishes and recover routes by @NotThatKindOfDrLiz in #6199
- feat(upload): resume interrupted publishes from the server's last offset by @rabble in #6086
- fix(router): keep New video taps in pooled feed by @rabble in #6204
- fix(nostr): snapshot query results before persistence by @rabble in #6202
- docs(architecture): add a discoverable app-layering reference by @realmeylisdev in #6206
- fix(video-player): stop EventChannel sends while app is backgrounded by @hm21 in #6220
- feat(perf): trace video generation and camera startup time by @hm21 in #6218
- fix(media-cache): cancel in-flight downloads when app is backgrounded by @hm21 in #6222
- fix(crash): downgrade all NetworkImage HTTP failures to non-fatal by @hm21 in #6228
- fix(video-recorder): crash-proof clip-delete Undo and finalize it on recorder exit by @hm21 in #6232
- fix(analytics): align creator video count with profile by @NotThatKindOfDrLiz in #6207
- fix(comment-video): preserve video metadata from REST comments by @NotThatKindOfDrLiz in #6208
- fix(support): ignore unknown moderation labels by @NotThatKindOfDrLiz in #6211
- feat(drafts): add duplicate project option by @hm21 in #6231
- fix(video): migrate off video_player (FVP) to divine_video_player by @hm21 in #6225
- chore(ui): add design-system drift ratchets (#6145) by @realmeylisdev in #6230
- fix(feed): deprioritize recently seen For You videos by @NotThatKindOfDrLiz in #6212
- fix(authentication): allow offline access for existing sessions by @NotThatKindOfDrLiz in #6245
- fix(auth): read keycast login error code and nudge toward sign-in options by @realmeylisdev in #6247
- feat(dm): save shared videos from messages by @rabble in #6213
- chore(feature-flags): remove unused feature flags by @hm21 in #6256
- fix(video-recorder): meet 48dp min touch target on mode selector by @hm21 in #6258
- fix(router): make every route-error screen escapable (safePop + home button) by @realmeylisdev in #6264
- fix(video-feed): correct empty profile feed diagnostics by @NotThatKindOfDrLiz in #6244
- feat(theme): add feature-flagged light appearance by @rabble in #6216
- fix(notifications): reclassify comment-likes via payload root_event_pubkey by @realmeylisdev in #6265
- fix(bluesky): refresh status after NIP-05 claim by @NotThatKindOfDrLiz in #6270
- fix(authentication): retry degraded OAuth restore on resume by @NotThatKindOfDrLiz in #6249
- fix(video-player): classify auth-required media errors by @NotThatKindOfDrLiz in #6268
- test(divine-ui): UI quality contract — a11y guarantees + goldens (#6141, #6143) by @realmeylisdev in #6236
- feat(trust-safety): community content-warning tagging - mobile slice (#4771) by @mbradley in #5720
- fix(moderation): parse repeated label event tags by @NotThatKindOfDrLiz in #6279
- fix(media): send auth for age-gated thumbnails by @NotThatKindOfDrLiz in #6267
- fix(support): anchor log-export share sheet so iPad idiom can present it by @rabble in #6291
- fix(security): stop accepting arbitrary TLS certs on relay and Dio sockets by @rabble in #6278
- fix(router): tolerate restored extras and safe hashtag back by @rabble in #6277
- fix(feed): sanitize malformed UTF-16 display text by @rabble in #6273
- fix(router): harden query route normalization by @NotThatKindOfDrLiz in #6272
- fix(watermark): use refreshed Divine wordmark in download watermark by @realmeylisdev in #6290
- fix(feed): sanitize unpaired UTF-16 surrogates in display text by @rabble in #6288
- fix(video): dispose VideoEventService when its provider rebuilds by @rabble in #6292
- fix(proofmode): store C2PA manifest id under the key fromMetadata reads by @rabble in #6289
- fix(apps): enable Android image upload in Nostr app sandbox WebView by @hm21 in #6260
- feat(video-editor): implement the stop-motion recorder and editor by @hm21 in #5763
- fix(watermark): correct download watermark to geometric heart-V wordmark by @realmeylisdev in #6297
New Contributors
- @missaustraliana made their first contribution in #4834
Full Changelog: 1.0.16...1.0.17