Description
The Cap video player includes a captions/subtitles UI toggle, but on self-hosted deployments clicking it appears to have no effect. The captions VTT file is correctly:
- Generated by the transcription workflow
- Stored in S3 (
transcription.vtt next to result.mp4)
- Loaded into the DOM as a
<track kind="captions" src="blob:..."> element
However, the track's mode stays at "hidden" regardless of UI interaction.
Verified working manually
Setting the mode via JavaScript makes captions render correctly:
document.querySelector('video').textTracks[1].mode = 'showing';
This confirms the VTT file, cue parsing, and renderer are all working — only the UI toggle's binding to the track's mode is broken.
Reproduction
- Self-host Cap, record a video with audio
- Wait for transcription to complete (
transcriptionStatus = 'COMPLETE' in DB)
- Open the share page, click the captions toggle in the player
- Observe: captions don't appear;
track.mode remains "hidden"
Environment
Possibly related: Cap uses Vidstack player which has its own captions handling — the toggle button likely sets internal player state but doesn't propagate to HTMLTrackElement.mode.
Description
The Cap video player includes a captions/subtitles UI toggle, but on self-hosted deployments clicking it appears to have no effect. The captions VTT file is correctly:
transcription.vttnext toresult.mp4)<track kind="captions" src="blob:...">elementHowever, the track's
modestays at"hidden"regardless of UI interaction.Verified working manually
Setting the mode via JavaScript makes captions render correctly:
This confirms the VTT file, cue parsing, and renderer are all working — only the UI toggle's binding to the track's mode is broken.
Reproduction
transcriptionStatus = 'COMPLETE'in DB)track.moderemains"hidden"Environment
main(commit ~52b0acc85 / Apr 2026)/embed/and/.well-known/(per Self-hosted Cap Web doesn't support embeds #906/PR #906 Fix video embedding. #1415)Possibly related: Cap uses Vidstack player which has its own captions handling — the toggle button likely sets internal player state but doesn't propagate to
HTMLTrackElement.mode.