Video Player Improvements #993
Conversation
Videos in chat get a custom inline player (glass play/scrub/volume controls, no native UI) and a fullscreen review overlay with timecoded comments, frame.io-style. Inline player: - Custom glass control pill (play/pause, scrubber, time, volume); slide-only animation so backdrop blur never flattens mid-transition - object-cover so the tile never letterboxes; seek queue serialized against the browser's seek pipeline so slow scrubbing shows frames Review overlay (portal, shadcn neutral dark theme): - Ambient glow behind the video (downscaled frames -> blur, radially masked); rounded clip wrapper that hugs the actual frame - Timeline with comment markers, hover scrub preview, thin playhead - Comments panel embeds the standard MessageComposer (mentions, attachments, drafts) with threaded replies and amber timecode chips; optional "comment at current frame" toggle; collapsible panel - Panel hidden entirely when commenting is unavailable (thread videos) - Composer mount deferred past first paint (~16ms open) Stability: video review context flows through React context with per-message memoized values so timeline re-renders no longer remount the <video> (was the cause of stuttering playback, lost positions, and the comment box eating keystrokes). Uploads: spinner replaced with a progress bar driven by byte-level events streamed from the Rust upload path (zero-copy Bytes chunks). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c09355b894
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| const openReviewKeys = new Set<string>(); | ||
| const reviewPlaybackPositions = new Map<string, number>(); |
There was a problem hiding this comment.
Reset video review caches on workspace switch
AGENTS.md’s Workspace Switching section says any new module-level cache holding workspace-scoped data must be wired into resetWorkspaceState(). These module-level sets/maps persist across React remounts, but no clear/reset function is added to desktop/src/features/workspaces/useWorkspaceInit.ts, so after switching workspaces without a page reload an old video’s open-review state or playback position can be reused if the new workspace has the same review key/URL, and the maps also retain stale workspace entries indefinitely. Please export a reset helper here and call it from resetWorkspaceState().
Useful? React with 👍 / 👎.
Resolve conflicts after the Buzz rename and welcome-channel layout changes while preserving the video review/upload progress implementation. Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co> Signed-off-by: Wes <wesbillman@users.noreply.github.com>
5135f58 to
fe802e7
Compare
Co-authored-by: npub1mprnacetjua2xx3p5eddmhxyk6wv929ymm5py8kd2xfxurxahspqqlgyta <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co> Signed-off-by: npub1mprnacetjua2xx3p5eddmhxyk6wv929ymm5py8kd2xfxurxahspqqlgyta <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co> * origin/main: (35 commits) feat(huddle): sentence-at-a-time voice-mode guidelines for lower TTS latency (#996) Shard desktop Playwright CI jobs (#992) chore(release): release version 0.3.18 (#995) Video Player Improvements (#993) Improve first-run welcome setup (#970) fix(release): use legacy updater key secret (#991) Replace built-in personas with Fizz (#987) docs(buzz-acp): rewrite Communication Patterns for mention accuracy and threading clarity (#982) chore(justfile): build git-credential-nostr in dev and staging recipes (#980) Fix Buzz command migration for saved agents (#979) fix(desktop): resolve effective model and prompt from persona in display path (#972) docs: clean up remaining Buzz references (#977) chore(release): release version 0.3.17 (#976) fix(onboarding): skip onboarding when relay already has a profile (#973) docs: finish Buzz rename cleanup (#974) fix(desktop): let channel members bypass mention agent gate (#965) Rename desktop app to Buzz (#960) feat(desktop): open profile panel from MembersSidebar rows (#962) feat(desktop): per-event notification sounds and alert controls (#968) fix(desktop): make header chrome zoom-correct and tidy split-pane (#941) ... # Conflicts: # crates/buzz-agent/README.md # crates/buzz-agent/src/config.rs
…session-new * origin/main: fix(huddle): Pocket TTS quality overhaul — reference parity + cross-message pipelining (#997) Add manual ACP session rotation command (#932) fix(desktop): heal stale persona_team_dir paths in release builds (#1003) ci(docker): publish public ghcr.io/block/buzz image (native multi-arch) (#986) fix(buzz-agent): cap tool-result text at 50 KiB with middle elision (#952) feat(huddle): sentence-at-a-time voice-mode guidelines for lower TTS latency (#996) Shard desktop Playwright CI jobs (#992) chore(release): release version 0.3.18 (#995) Video Player Improvements (#993) Improve first-run welcome setup (#970) fix(release): use legacy updater key secret (#991) Co-authored-by: Will Pfleger <pfleger.will@gmail.com> Signed-off-by: Will Pfleger <pfleger.will@gmail.com> # Conflicts: # crates/buzz-acp/src/lib.rs # crates/buzz-agent/src/config.rs
…tate * origin/main: Add relay disconnect UX: friendly errors, reconnect, cached identity (#1004) feat(agents): add active turn indicators to Agents Menu (#1005) ci: add fork guards to docker, release, and auto-tag workflows (#1007) docs(nip-rs): add optional thread read context scheme (#1006) fix(huddle): Pocket TTS quality overhaul — reference parity + cross-message pipelining (#997) Add manual ACP session rotation command (#932) fix(desktop): heal stale persona_team_dir paths in release builds (#1003) ci(docker): publish public ghcr.io/block/buzz image (native multi-arch) (#986) fix(buzz-agent): cap tool-result text at 50 KiB with middle elision (#952) feat(huddle): sentence-at-a-time voice-mode guidelines for lower TTS latency (#996) Shard desktop Playwright CI jobs (#992) chore(release): release version 0.3.18 (#995) Video Player Improvements (#993) Improve first-run welcome setup (#970) fix(release): use legacy updater key secret (#991) Replace built-in personas with Fizz (#987)
What
Videos in chat now have a custom inline player and a fullscreen review overlay with timecoded comments
Inline player — glass control pill (play/pause, scrubber, time, volume), no native browser UI.
object-coverso tiles never letterbox. Seeks are serialized against the browser's seek pipeline so slow scrubbing shows the frame under the pointer.Review overlay — portaled dialog (shadcn neutral dark theme) with:
MessageComposer(mentions, attachments, drafts) with threaded replies, amber timecode chips, and a "comment at current frame" toggle; panel is collapsible and hidden entirely when commenting is unavailable (e.g. thread videos)Stability fix — video review context flows through React context with per-message memoized values, so timeline re-renders no longer remount the
<video>. That remount was the root cause of stuttering playback, lost positions, and the comment box dropping keystrokes.Uploads — attachment spinner replaced with a progress bar driven by byte-level
media-upload-progressevents streamed from the Rust upload path (zero-copyByteschunks).Verification
video-attachment.spec.tscovers inline controls, review timeline/markers, comment + reply flows, the frame-stamp toggle, panel collapse, and a regression test that a live message mid-typing doesn't wipe the comment draft🤖 Generated with Claude Code