Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
575 commits
Select commit Hold shift + click to select a range
27cf7f6
fix(media-server): detect MP4 and MOV inputs by their format class
richiemcilroy Sep 28, 2026
2b92e58
chore(web): drop comments that restate the editor bar
richiemcilroy Sep 28, 2026
e601016
feat(web): the share link tab offers a link to the current moment, li…
richiemcilroy Sep 28, 2026
d77274b
feat(web): report a Save rendering in the owner's browser as rendering
richiemcilroy Sep 28, 2026
af06d68
feat(web): the editor reports a browser Save's progress while it rend…
richiemcilroy Sep 28, 2026
6428188
feat(web): share page and Cap card show a browser Save rendering and …
richiemcilroy Sep 28, 2026
a622390
feat(web): open the share page beside a Save rendering in the tab ins…
richiemcilroy Sep 28, 2026
6c0dac0
feat(web): the share page publishes a new recording when nothing else…
richiemcilroy Sep 28, 2026
e7a9ea3
feat(web): a back to dashboard link on the share page for signed-in v…
richiemcilroy Sep 28, 2026
053e5d5
fix(web): send a browser Save's progress reports in order
richiemcilroy Sep 28, 2026
e70acd4
feat(editor): Presets with a one-click default that new web recording…
richiemcilroy Sep 28, 2026
a8e9b8c
fix(editor): let the recording title use the header's width
richiemcilroy Sep 28, 2026
15beaef
fix(web): save editor preferences for accounts whose preferences are …
richiemcilroy Sep 28, 2026
7f68665
feat(web): recorder opens the share link, keeps a dimmed camera and c…
richiemcilroy Sep 28, 2026
ec49986
refactor(web): drop the editor's arrival-from-recorder handling
richiemcilroy Sep 28, 2026
9e1180e
feat(media-server): make a thumbnail and preview GIF from a published…
richiemcilroy Sep 28, 2026
ead3a16
fix(web): remake the thumbnail and preview GIF when a render replaces…
richiemcilroy Sep 28, 2026
32d743e
fix(media-server): take a processing slot for preview assets
richiemcilroy Sep 28, 2026
892f116
fix(web): only retry a preview refresh while the media server is busy
richiemcilroy Sep 28, 2026
106ef75
fix(web): mark a browser Save finished and judge its freshness on the…
richiemcilroy Sep 28, 2026
e681ccb
fix(web): keep the recording publish alive through share page refreshes
richiemcilroy Sep 28, 2026
ce844d4
fix(web): recorder's share link keeps the publish and a restart promp…
richiemcilroy Sep 28, 2026
e69db90
fix(web): keep the editor bar light on the always-light share page
richiemcilroy Sep 28, 2026
391aa00
feat(web): recorder offers a screen beside the camera and explains ho…
richiemcilroy Sep 28, 2026
0270f2a
feat(web): show the hidden camera preview anyway, like the screen pre…
richiemcilroy Sep 28, 2026
22e4b7a
fix(web): light editor bar in the editor, an Editor tab icon and Edit…
richiemcilroy Sep 28, 2026
fdddafb
fix(web): a shown camera preview hides again for the next take
richiemcilroy Sep 28, 2026
b35ad32
feat(web): serve a Save rendering in the browser as an HLS stream
richiemcilroy Sep 28, 2026
35867d3
feat(web): take a browser Save's chunks as it renders and clear them …
richiemcilroy Sep 28, 2026
69d63d9
feat(web): report a browser Save playable once two chunks are up
richiemcilroy Sep 28, 2026
b95d3d6
feat(editor): stream a browser Save's fragments while it renders
richiemcilroy Sep 28, 2026
0f5ac68
feat(web): upload a browser Save's chunks from the editor as they render
richiemcilroy Sep 28, 2026
5a965e9
fix(web): serve only the current Save's chunks
richiemcilroy Sep 28, 2026
6dbefd7
fix(web): take down a browser Save's chunks when it doesn't publish o…
richiemcilroy Sep 28, 2026
d67f5a4
chore: drop comments that restate the Save chunk code
richiemcilroy Sep 28, 2026
e8d520b
fix(web): keep serving the last published Save's chunks while another…
richiemcilroy Sep 28, 2026
278638a
fix(web): only clear browser Save chunks an hour after they were uplo…
richiemcilroy Sep 28, 2026
085be0e
fix(web): mark the Save that finished as published, not whichever is …
richiemcilroy Sep 28, 2026
8b4582b
fix(web): finish only the Save named, in the same update that checks it
richiemcilroy Sep 28, 2026
6d57af8
perf(web): read a recording's duration from its last fragment instead…
richiemcilroy Sep 28, 2026
98f5560
chore(editor): add opt-in timing for editor load stages and frames
richiemcilroy Sep 28, 2026
6e12994
perf(editor): hand decoded frames straight to the renderer and decode…
richiemcilroy Sep 28, 2026
c9187a7
perf(editor): decode clip thumbnails from the open recording and cach…
richiemcilroy Sep 28, 2026
472a155
perf(editor): stream waveform audio once instead of refetching ranges
richiemcilroy Sep 28, 2026
84ec513
fix(editor): fail an export that runs out of storage instead of trunc…
richiemcilroy Sep 28, 2026
a37d3f4
perf(editor): decode export audio in blocks as it mixes instead of wh…
richiemcilroy Sep 28, 2026
a1a0dfa
perf(editor): build Save chunks from the encoders' packets instead of…
richiemcilroy Sep 28, 2026
43b602d
perf(web): upload browser Save chunks in parallel and list them in order
richiemcilroy Sep 28, 2026
29443f6
fix(editor): let Safari's encoder emit each frame so browser exports …
richiemcilroy Sep 28, 2026
ac367a0
fix(web): measure a fragmented recording's end before trusting its de…
richiemcilroy Sep 28, 2026
fc90742
fix(web): list every uploaded chunk before a published browser Save f…
richiemcilroy Sep 28, 2026
5536446
fix(editor): show hours in timecodes for recordings an hour or longer
richiemcilroy Sep 29, 2026
e5c610b
feat(editor): open long recordings in full and zoom the timeline by f…
richiemcilroy Sep 29, 2026
2098175
perf(editor): draw tiny timeline segments as runs and skip per-segmen…
richiemcilroy Sep 29, 2026
49de4a9
perf(editor): update only the transcript words entering or leaving th…
richiemcilroy Sep 29, 2026
9aa9e94
perf(editor): binary search the active caption during playback
richiemcilroy Sep 29, 2026
db975b3
feat(editor): zoom in on a run of compact segments when it's pressed
richiemcilroy Sep 29, 2026
7df2952
chore(editor): drop comments that restate the caption lookups
richiemcilroy Sep 29, 2026
f2f779b
perf(editor): move the timeline playhead only when it visibly moves a…
richiemcilroy Sep 29, 2026
55120d5
perf(web): let the editor share its reads with the duration probe and…
richiemcilroy Sep 29, 2026
e1a48a7
perf(editor): read recordings through one shared ranged reader and se…
richiemcilroy Sep 29, 2026
6dcf64f
perf(editor): stop sliders observing the whole document and memo the …
richiemcilroy Sep 29, 2026
291b42a
fix(editor): fetch an export's sources fresh instead of reusing the e…
richiemcilroy Sep 29, 2026
9fb5c4c
fix(editor): dispose idle decoded inputs when the editor is torn down
richiemcilroy Sep 29, 2026
fbd5ec5
chore(editor): drop comments that restate source renewal, teardown an…
richiemcilroy Sep 29, 2026
500096b
fix(rendering): keep zoom blur centered on the zoom target
richiemcilroy Sep 29, 2026
cd4743b
fix(editor): default zooms to manual without recorded cursor data
richiemcilroy Sep 29, 2026
58a5486
test(extension): drop comment restating the error status assertion
richiemcilroy Sep 29, 2026
5049c61
feat(web): report the published video revision from render status
richiemcilroy Sep 29, 2026
90a2e56
fix(web): show the latest Save on an open share page
richiemcilroy Sep 29, 2026
6891487
feat(web): announce published Saves to open share pages
richiemcilroy Sep 29, 2026
ee7368d
fix(web): report the new revision when render status publishes a farm…
richiemcilroy Sep 29, 2026
c2e200c
fix(web): watch for Saves on every share page a web editor Save can r…
richiemcilroy Sep 29, 2026
423ceb9
feat(web): let an editor source carry an import's own audio
richiemcilroy Sep 29, 2026
9c7a898
feat(web): register a browser-readable import upload as its editor so…
richiemcilroy Sep 29, 2026
ab7139d
feat(web): open dashboard imports in the editor as soon as they upload
richiemcilroy Sep 29, 2026
26850b1
refactor(web): check the import container by format class
richiemcilroy Sep 29, 2026
c18e1d7
fix(editor): read whole probe windows when locating far fragments
richiemcilroy Sep 29, 2026
fa97c42
perf(editor): skip redrawing repeated source frames during playback
richiemcilroy Sep 29, 2026
822d1fd
fix(editor): show the error screen when the preview can't start
richiemcilroy Sep 29, 2026
2309610
fix(web): drop the studio mode icon from the recorder's start button
richiemcilroy Sep 29, 2026
045b34f
feat(web): add a microphone-only recorder
richiemcilroy Sep 29, 2026
4a6da59
feat(web): offer microphone-only recording and confirm camera-only takes
richiemcilroy Sep 29, 2026
7621a96
fix(web): remember whether camera-only takes should add the screen
richiemcilroy Sep 29, 2026
1837111
fix(web): stop microphone takes at the shareable length and drop fail…
richiemcilroy Sep 29, 2026
663151e
perf(editor): read only the audio when building a video's waveform
richiemcilroy Sep 29, 2026
f8efb78
perf(editor): refresh the playing time readout at 10 Hz
richiemcilroy Sep 29, 2026
5f885f1
perf(editor): move the playhead on its own layer
richiemcilroy Sep 29, 2026
21ab294
chore(web): drop comments that restate recorder declarations
richiemcilroy Sep 29, 2026
5c8a828
perf(editor): let the compositor move the playhead during playback
richiemcilroy Sep 29, 2026
afa6f88
perf(media-server): interleave share video audio in one second runs
richiemcilroy Sep 29, 2026
125d917
perf(editor): rebuild the preview style only when active style segmen…
richiemcilroy Sep 29, 2026
9e08389
perf(editor): recompute the preview size only when its dimensions change
richiemcilroy Sep 29, 2026
c5f4933
perf(editor): redraw the clip waveform in steps while the timeline fo…
richiemcilroy Sep 29, 2026
003931a
perf(editor): skip unchanged audio element writes each frame
richiemcilroy Sep 29, 2026
351f2a0
perf(editor): cache parsed source URLs for frame reads
richiemcilroy Sep 29, 2026
c44130f
fix(web): stop the share page upload tracker re-rendering in a loop
richiemcilroy Sep 29, 2026
65543aa
fix(web): send upload progress from the committed render and test the…
richiemcilroy Sep 29, 2026
c228108
chore(editor): drop a comment restating the clip thumbnail lookup
richiemcilroy Sep 29, 2026
ece7b25
Merge origin/main into feature/web-editor-desktop-parity
richiemcilroy Sep 29, 2026
9d44d95
perf(editor): lay out the following timeline in steps and shift it be…
richiemcilroy Sep 29, 2026
2e1a3f6
perf(web): keep the Effect runtime out of the shareable link limit ov…
richiemcilroy Sep 29, 2026
d6d94bd
perf(web): load the render view and hls.js only while a Save renders
richiemcilroy Sep 29, 2026
ff7081c
perf(web): start share playback on Cap's own storage without a probe …
richiemcilroy Sep 29, 2026
5e7c38e
fix(web): keep relative times from breaking share page hydration
richiemcilroy Sep 29, 2026
6f23c87
perf(editor): feed the browser export's encoder directly instead of t…
richiemcilroy Sep 29, 2026
f6a33c5
chore(web): quote the tab audio option without escapes
richiemcilroy Sep 29, 2026
f30eea3
fix(media-server): give WebM validation as long as a transcode of it …
richiemcilroy Sep 29, 2026
2634000
perf(editor): reuse the browser renderer's texture limit and present …
richiemcilroy Sep 29, 2026
011c2c8
chore(editor): drop a comment restating the present bind group cache
richiemcilroy Sep 29, 2026
5fa49e3
perf(web): load the embed's HLS player and upload tracker only when n…
richiemcilroy Sep 29, 2026
76a0bbc
perf(web): prefetch the dashboard from share pages on hover instead o…
richiemcilroy Sep 29, 2026
529d105
fix(web): seek a lazily loaded HLS embed to its start time
richiemcilroy Sep 29, 2026
201aa83
chore(web): drop comments restating the hover prefetch prop
richiemcilroy Sep 29, 2026
52d0b5d
chore: exclude generated export renderer bindings from Biome
richiemcilroy Sep 29, 2026
9f538c8
fix(web): log camera upload failures when finalizing a paired recording
richiemcilroy Sep 29, 2026
6e3249d
test(web): expect streaming MP4 and multipart uploads in the paired r…
richiemcilroy Sep 29, 2026
75ca44d
test(extension): match recording uploads to the browser's streaming M…
richiemcilroy Sep 29, 2026
9e9026d
fix(editor): keep EXIF-rotated and oversized backgrounds on the nativ…
richiemcilroy Sep 29, 2026
c6b305a
fix(editor): send the export worker a plain copy of the project config
richiemcilroy Sep 29, 2026
e70ee03
fix(editor): hide the loading skeleton from assistive tech during the…
richiemcilroy Sep 29, 2026
1ac5c0c
test(editor): follow decoded frames and preview sizing in the composi…
richiemcilroy Sep 29, 2026
f9a73a9
test(media-server): follow the web editor's Download header and rende…
richiemcilroy Sep 29, 2026
623f10d
test(media-server): detect Firefox VideoFrame rendering through textu…
richiemcilroy Sep 29, 2026
f70e792
test(media-server): record folder import alerts in the page instead o…
richiemcilroy Sep 29, 2026
c654182
fix(recorder): recover unwritten spool chunks when the backup store n…
richiemcilroy Sep 29, 2026
a479fad
fix(web): keep a take when its final backup write fails and fall back…
richiemcilroy Sep 29, 2026
a934f94
test(web): replay paired capture on a persistent profile and cover an…
richiemcilroy Sep 29, 2026
95376ea
fix(web): keep transcript words when the stored duration is shorter t…
richiemcilroy Sep 29, 2026
fc91b04
fix(web): say no speech was detected instead of no audio track
richiemcilroy Sep 29, 2026
f88d81a
fix(web): keep locale dates in the editor recordings list out of hydr…
richiemcilroy Sep 29, 2026
0377a4b
fix(web): retry preview assets when the media server lacks the route yet
richiemcilroy Sep 29, 2026
799af8f
fix(web): stop requesting a preview GIF that a new render has not mad…
richiemcilroy Sep 29, 2026
aa39572
fix(editor): show caption generation errors in the captions panel
richiemcilroy Sep 29, 2026
54e022f
feat(editor): say when an export renders on Cap's servers
richiemcilroy Sep 29, 2026
1a5cdb8
fix(editor): keep the default timeline and unchanged pauses out of un…
richiemcilroy Sep 29, 2026
274eda0
fix(editor): clamp the playhead and hover time when the timeline gets…
richiemcilroy Sep 29, 2026
70ac3d2
fix(editor): draw the web zoom preview from a decoded frame and back …
richiemcilroy Sep 29, 2026
3ba9e7b
fix(editor): size the Quarter preview below Half on small canvases
richiemcilroy Sep 29, 2026
d728a78
fix(web): check a share tab for updates the first time it returns aft…
richiemcilroy Sep 29, 2026
9817729
fix(web): keep relative cap dates out of hydration checks
richiemcilroy Sep 29, 2026
ba9c700
fix(media-server): make editor session capacity configurable and recl…
richiemcilroy Sep 29, 2026
dcf1df6
fix(web): show when editor servers are busy and preview on a worker w…
richiemcilroy Sep 29, 2026
761301c
test(media-server): keep a background export alive by polling it with…
richiemcilroy Sep 29, 2026
5b89292
fix(web): drop the one-off recording publish flag as soon as the shar…
richiemcilroy Sep 29, 2026
8884c0a
fix(web): fall back to the uploaded video when a render ends without …
richiemcilroy Sep 29, 2026
eebad95
fix(web): back off render status polling and stop after an hour
richiemcilroy Sep 29, 2026
1835d56
fix(media-server): install from the workspace root so the editor bund…
richiemcilroy Sep 29, 2026
1a85334
fix(web): keep polling a render that is still running after an hour
richiemcilroy Sep 29, 2026
fc70b53
fix(editor): show zoom preview unavailable instead of a stale frame
richiemcilroy Sep 29, 2026
b55b094
fix(editor): lock browser export files and remove the ones no tab sti…
richiemcilroy Sep 29, 2026
7a0dd5a
fix(editor): decode Chrome export frames in software so colours match…
richiemcilroy Sep 30, 2026
2040994
fix(web): stop treating a render as running once its status stops ans…
richiemcilroy Sep 30, 2026
978371d
fix(editor): remove day-old export files when Web Locks are unavailable
richiemcilroy Sep 30, 2026
e138394
perf(editor): step the preview down after a couple of very slow frames
richiemcilroy Sep 30, 2026
5005472
perf(rendering): scissor browser card draws and skip the motion blur …
richiemcilroy Sep 30, 2026
3736f95
fix(editor): undo Chrome's display gamma on hardware-decoded preview …
richiemcilroy Sep 30, 2026
4aa1937
refactor(editor): expose the timeline a recording without one opens with
richiemcilroy Sep 30, 2026
f36a51e
refactor(export): move web editor preparation into the export library
richiemcilroy Sep 30, 2026
c058242
feat(render-farm): prepare web recordings in the render engine
richiemcilroy Sep 30, 2026
8ecf5c3
feat(web): start farm renders without an editor worker when the farm …
richiemcilroy Sep 30, 2026
b6ba5ca
perf(editor): feed waveform audio packets straight to the decoder
richiemcilroy Sep 30, 2026
17e8736
fix(web): ask the farm to fill session defaults only for never-edited…
richiemcilroy Sep 30, 2026
30d66e1
fix(render-farm): render saved projects as saved when preparing
richiemcilroy Sep 30, 2026
c14e191
perf(editor): size the preview once at open instead of after layout s…
richiemcilroy Sep 30, 2026
8ecdec9
perf(editor): wait for layout before the first web preview frame and …
richiemcilroy Sep 30, 2026
1724438
fix(web): keep checking an unreachable render rarely instead of givin…
richiemcilroy Sep 30, 2026
80f2450
fix(rendering): split the scissor guard so clippy accepts it
richiemcilroy Sep 30, 2026
18c46b5
fix(editor): match the preview box during resize and step down on ren…
richiemcilroy Sep 30, 2026
ef9da12
fix(editor): mount the preview without waiting for colour calibration
richiemcilroy Sep 30, 2026
f0b5a69
fix(render-farm): publish exports without padding and keep decoder re…
richiemcilroy Sep 30, 2026
ecc6b1c
feat(render-farm): prepare web recordings on the farm and download so…
richiemcilroy Sep 30, 2026
9901683
fix(render-farm): rewrite browser WebM in process instead of calling …
richiemcilroy Sep 30, 2026
75b2c5f
chore(web): drop render farm helper comments that restate the code
richiemcilroy Sep 30, 2026
60eaeee
feat(rendering): convert browser NV12 planes to RGBA with an exact BT…
richiemcilroy Sep 30, 2026
eb6547c
perf(editor): feed Safari preview frames to the renderer as NV12 planes
richiemcilroy Sep 30, 2026
469e246
docs(render-farm): drop test and helper comments that restate the code
richiemcilroy Sep 30, 2026
8dc3f26
fix(render-farm): join prepared file keys with slashes on every OS
richiemcilroy Sep 30, 2026
7d6dbf8
fix(web): prepare on a worker when the farm lacks a library track the…
richiemcilroy Sep 30, 2026
5585f84
fix(render-farm): count landed source ranges as transcode progress
richiemcilroy Sep 30, 2026
ad76ae4
Merge origin/main into feature/web-editor-desktop-parity
richiemcilroy Sep 30, 2026
df2a321
feat(render-farm): run cursor reconstruction jobs
richiemcilroy Sep 30, 2026
cc88b6a
feat(web): replace a browser recording's cursor from a farm reconstru…
richiemcilroy Sep 30, 2026
46dae24
feat(editor): add an experimental cursor replacement toggle on web
richiemcilroy Sep 30, 2026
02b1b6a
fix(render-farm): keep a cursor task alive while its bundle downloads
richiemcilroy Sep 30, 2026
53502fd
fix(web): expire abandoned cursor runs and start one at a time
richiemcilroy Sep 30, 2026
e1ff3f2
fix(editor): reload onto the cursor sources whenever they change
richiemcilroy Sep 30, 2026
44f18b9
fix(web): store cursor reconstructions in the render folder the farm …
richiemcilroy Sep 30, 2026
5875dc0
fix(editor): only hold back a repeated cursor reload toward the same …
richiemcilroy Sep 30, 2026
d6fdf1d
fix(render-farm): refuse a chunk whose stash upload failed
richiemcilroy Sep 30, 2026
05beb51
fix(render-farm): keep a cursor task alive while it uploads its outputs
richiemcilroy Sep 30, 2026
67b78a9
fix(web): tie cursor runs to their exact display and the farm's own s…
richiemcilroy Sep 30, 2026
6bff342
fix(editor): leave frames tagged with other matrices to the browser's…
richiemcilroy Sep 30, 2026
f46016d
fix(render-farm): fail a cursor transfer that outlasts its limit
richiemcilroy Sep 30, 2026
21bba36
fix(web): let a cursor run for a replaced display be started again
richiemcilroy Sep 30, 2026
8734183
fix(web): keep cursor runs recorded before source identity working
richiemcilroy Sep 30, 2026
f2d9f58
feat(render-farm): let an S3 upload be cancelled
richiemcilroy Sep 30, 2026
6003035
fix(render-farm): cancel a cursor upload past its limit before failin…
richiemcilroy Sep 30, 2026
37a86cd
fix(web): start a cursor run only for the display the request read
richiemcilroy Sep 30, 2026
9dcbbcc
fix(render-farm): give multipart upload cleanup its own deadline
richiemcilroy Sep 30, 2026
a908da4
test(render-farm): time out a hanging multipart cleanup
richiemcilroy Sep 30, 2026
921a45f
chore(editor): drop comments that narrate the code below them
richiemcilroy Sep 30, 2026
78b4cf5
fix(editor): apply the colour correction between frames and expose wh…
richiemcilroy Sep 30, 2026
c7bb034
test(editor): wait for the colour check before comparing compositor f…
richiemcilroy Sep 30, 2026
56bc723
test(media-server): report editor state when browser-only playback ne…
richiemcilroy Sep 30, 2026
c8a4b8b
test(media-server): bound the playback failure diagnostics so the fai…
richiemcilroy Sep 30, 2026
1a3ce9d
perf(editor): read further ahead only while scrubbing
richiemcilroy Sep 30, 2026
730429c
perf(editor): show key frames while scrubbing and the exact frame onc…
richiemcilroy Sep 30, 2026
a7e0554
chore(editor): drop comments that restate the scrub thresholds
richiemcilroy Sep 30, 2026
ed3e329
feat(render-farm): index fragmented MP4 recordings from their fragmen…
richiemcilroy Sep 30, 2026
7a591b3
perf(render-farm): render remuxable recordings in place instead of tr…
richiemcilroy Sep 30, 2026
ed64288
perf(editor): cap mediabunny read-ahead so it stops evicting the next…
richiemcilroy Sep 30, 2026
ec6cae7
fix(editor): name the skip to start button
richiemcilroy Sep 30, 2026
60a63b9
test(media-server): start the full-quality playback check from the be…
richiemcilroy Sep 30, 2026
6a41cb3
fix(render-farm): only dispatch prefixed tasks to workers that can re…
richiemcilroy Sep 30, 2026
2f4da86
perf(web): start recording renders from the upload request instead of…
richiemcilroy Oct 1, 2026
b51a28f
perf(web): poll a render the page is showing every second, faster onc…
richiemcilroy Oct 1, 2026
8e6d92a
fix(web): keep the recording render start helpers out of the workflow…
richiemcilroy Oct 1, 2026
10c2584
perf(editor): read signed media ranges without Chrome's one-request-p…
richiemcilroy Oct 1, 2026
9f8db6d
perf(editor): resume playback at the preview resolution the last play…
richiemcilroy Oct 1, 2026
cf7d366
fix(web): pass the video id to render start logs as an argument, not …
richiemcilroy Oct 1, 2026
b52e379
chore: drop comments that restate the render start helpers and segmen…
richiemcilroy Oct 1, 2026
513a483
refactor(editor): use a kebab-case filename for the web cursor replac…
richiemcilroy Oct 1, 2026
20b8ab1
fix(render-farm): count a worker as able to serve a task only if disp…
richiemcilroy Oct 1, 2026
5cf7247
perf(web): look up the studio video and edits alongside the sign-in c…
richiemcilroy Oct 1, 2026
45ce544
perf(editor): open WebM audio with small reads instead of video-sized…
richiemcilroy Oct 1, 2026
278a96d
fix(render-farm): decode only each audio section's window when a trac…
richiemcilroy Oct 1, 2026
4a93fa7
perf(render-farm): free a render slot while its finished chunk waits …
richiemcilroy Oct 1, 2026
8122ead
fix(editor): read further back for a WebM seek point when the last cl…
richiemcilroy Oct 1, 2026
6de407d
chore(editor): keep only the why in the playback scale comments
richiemcilroy Oct 1, 2026
ec8b834
fix(editor): wait for a loaded video's frame by readiness, not a load…
richiemcilroy Oct 1, 2026
8043a7d
chore(editor): drop the WebM fixture file's header comment
richiemcilroy Oct 1, 2026
84da68d
chore(editor): remove the web cursor replacement toggle for now
richiemcilroy Oct 1, 2026
522d5fd
chore(editor): hide the keyboard tab and track in the web editor
richiemcilroy Oct 1, 2026
a17647d
fix(web): play a video that is still rendering in the share player, n…
richiemcilroy Oct 1, 2026
cbfec85
feat(rendering): interpolate chroma when converting browser NV12 plan…
richiemcilroy Oct 2, 2026
3630e0e
perf(editor): export from NV12 planes in Safari with five second keyf…
richiemcilroy Oct 2, 2026
98ca273
fix(web): serve a browser Save's playlist as a variant so playback re…
richiemcilroy Oct 2, 2026
da2fedc
fix(editor): count a web recording's pointer input as recorded cursor…
richiemcilroy Oct 2, 2026
145283a
fix(editor): keep BT.601 retagged frames off the Safari export's NV12…
richiemcilroy Oct 2, 2026
f4962c0
fix(editor): stay ready once the first frame has shown while the prev…
richiemcilroy Oct 2, 2026
de15bc7
feat(editor): add a focus mode that gives the web preview and timelin…
richiemcilroy Oct 2, 2026
c330429
fix(editor): leave focus mode when asked to mid-transition
richiemcilroy Oct 2, 2026
ccb76d1
chore(editor): drop comments that describe focus mode
richiemcilroy Oct 2, 2026
9019a75
fix(web): generate web editor captions from the share transcript with…
richiemcilroy Oct 2, 2026
02d6012
fix(editor): carry a caption edit from the timeline onto its source c…
richiemcilroy Oct 2, 2026
ae1f78a
fix(editor): burn captions into a browser Save only when export with …
richiemcilroy Oct 2, 2026
3f2a11d
chore(editor): drop comments that restate the browser export entry po…
richiemcilroy Oct 2, 2026
4a51b57
fix(editor): rewrite only the edited piece of a caption a cut split
richiemcilroy Oct 2, 2026
7363476
fix(web): take a worker session when web captions come to need one mi…
richiemcilroy Oct 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
164 changes: 164 additions & 0 deletions .github/workflows/docker-build-editor-worker.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
name: Docker Build Editor Worker

on:
pull_request:
paths:
- "apps/media-server/**"
- "apps/web/lib/editor-caption-access.ts"
- "apps/web/lib/editor-caption-transport.ts"
- "apps/web/lib/editor-recording-title.ts"
- "apps/desktop/src/assets/music/**"
- "apps/desktop/src-tauri/assets/backgrounds/**"
- "crates/**"
- "packages/editor-cap-bundle/**"
- "packages/editor-solid-web/**"
- "vendor/**"
- "Cargo.toml"
- "Cargo.lock"
- "package.json"
- "bun.lock"
- "bunfig.toml"
- ".github/workflows/docker-build-editor-worker.yml"
push:
branches:
- main
paths:
- "apps/media-server/**"
- "apps/web/lib/editor-caption-access.ts"
- "apps/web/lib/editor-caption-transport.ts"
- "apps/web/lib/editor-recording-title.ts"
- "apps/desktop/src/assets/music/**"
- "apps/desktop/src-tauri/assets/backgrounds/**"
- "crates/**"
- "packages/editor-cap-bundle/**"
- "packages/editor-solid-web/**"
- "vendor/**"
- "Cargo.toml"
- "Cargo.lock"
- "package.json"
- "bun.lock"
- "bunfig.toml"
- ".github/workflows/docker-build-editor-worker.yml"

permissions: {}

jobs:
build:
name: Build and test editor worker (${{ matrix.platform }})
runs-on: ${{ matrix.runner }}
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
include:
- platform: amd64
runner: ubuntu-24.04
- platform: arm64
runner: ubuntu-24.04-arm
permissions:
contents: read
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262
with:
persist-credentials: false
- name: Set up Docker Buildx v3.12.0
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f
- name: Build editor worker image with Docker v6.19.2
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8
with:
context: .
Comment thread
richiemcilroy marked this conversation as resolved.
file: apps/media-server/Dockerfile.editor
platforms: linux/${{ matrix.platform }}
load: true
tags: cap-editor-worker:verification
cache-from: type=gha,scope=editor-worker-${{ matrix.platform }}
cache-to: type=gha,mode=max,scope=editor-worker-${{ matrix.platform }}
- name: Check native worker readiness
run: |
docker run --rm --network none \
-e CAP_WEB_EDITOR_PUBLIC_ORIGIN=http://127.0.0.1:3457 \
-e MEDIA_SERVER_WEBHOOK_SECRET=test \
--entrypoint bun cap-editor-worker:verification \
-e 'import app from "./src/editor-worker-app.ts"; const response = await app.request("/health"); if (!response.ok) process.exit(1)'
- name: Exercise paired native editor routes
run: |
docker run --rm --network none --cpus 4 --memory 4g \
-e MEDIA_SERVER_WEBHOOK_SECRET=test \
--entrypoint bun cap-editor-worker:verification test \
src/__tests__/editor-worker-app.test.ts \
src/__tests__/lib/editor-assets.test.ts \
src/__tests__/lib/editor-clip-thumbnails.test.ts \
src/__tests__/lib/editor-config-paths.test.ts \
src/__tests__/lib/editor-image-assets.test.ts \
src/__tests__/lib/editor-security.test.ts \
src/__tests__/lib/editor-wallpapers.test.ts \
src/__tests__/routes/editor-clips.test.ts \
src/__tests__/routes/editor.test.ts
- name: Verify editor subprocess credential isolation
run: |
docker run --rm --network none \
-e MEDIA_SERVER_WEBHOOK_SECRET=test \
-e AWS_SECRET_ACCESS_KEY=test \
--entrypoint bun cap-editor-worker:verification \
src/__tests__/lib/editor-process-env-replay.ts
- name: Verify cursor-only MOV export
run: |
docker run --rm --network none --cpus 4 --memory 4g \
--entrypoint bun cap-editor-worker:verification \
src/__tests__/routes/editor-cursor-mov-replay.ts
- name: Replay browser-only Studio and worker exports
if: matrix.platform == 'amd64'
run: |
docker run --rm --cpus 4 --memory 8g --ipc host \
-v "${{ github.workspace }}:/source" \
-w /source/apps/media-server \
cap-editor-worker:verification \
bash -e -u -o pipefail -c '
cd /source
bun install --frozen-lockfile
bunx playwright install --with-deps chromium webkit firefox
apt-get install -y --no-install-recommends xauth
bun run --filter @cap/editor-solid-web build
cd /source/apps/media-server
export CAP_EDITOR_UI_PARITY_ARTIFACT_DIR=/source/cap-editor-parity-artifacts
run_browser_only_studio() {
case "$CAP_EDITOR_UI_BROWSER" in
firefox|webkit) CAP_EDITOR_UI_HEADED=1 xvfb-run -a bun src/__tests__/routes/editor-solid-browser-only-replay.ts ;;
*) bun src/__tests__/routes/editor-solid-browser-only-replay.ts ;;
esac
}
run_worker_studio() {
case "$CAP_EDITOR_UI_BROWSER" in
firefox|webkit) CAP_EDITOR_UI_HEADED=1 xvfb-run -a bun run test:native-editor-ui ;;
*) bun run test:native-editor-ui ;;
esac
}
browser_replay_failed=0
for browser in chromium firefox webkit; do
if ! CAP_EDITOR_UI_PARITY_ARTIFACT_DIR=/source/cap-editor-parity-artifacts CAP_EDITOR_UI_BROWSER="$browser" run_browser_only_studio; then
browser_replay_failed=1
fi
done
for browser in chromium webkit firefox; do
for pro in 0 1; do
CAP_EDITOR_UI_SHARE_REPLAY=1 CAP_EDITOR_UI_BROWSER="$browser" CAP_EDITOR_UI_PRO_CAPTIONS="$pro" run_worker_studio
done
done
for repeat in 2 3; do
printf "WebKit Free replay %s\n" "$repeat"
CAP_EDITOR_UI_SHARE_REPLAY=1 CAP_EDITOR_UI_BROWSER=webkit CAP_EDITOR_UI_PRO_CAPTIONS=0 run_worker_studio
done
CAP_EDITOR_UI_CURSOR_MOV=1 CAP_EDITOR_UI_BROWSER=chromium CAP_EDITOR_UI_PRO_CAPTIONS=0 run_worker_studio
CAP_EDITOR_UI_CURSOR_MOV=1 CAP_EDITOR_UI_BROWSER=webkit CAP_EDITOR_UI_PRO_CAPTIONS=1 run_worker_studio
CAP_EDITOR_UI_CANVAS_FALLBACK=1 CAP_EDITOR_UI_BROWSER=chromium CAP_EDITOR_UI_PRO_CAPTIONS=0 run_worker_studio
CAP_EDITOR_UI_CANVAS_FALLBACK=1 CAP_EDITOR_UI_BROWSER=webkit CAP_EDITOR_UI_PRO_CAPTIONS=1 run_worker_studio
bun src/__tests__/routes/editor-presets-browser-replay.ts
if [ "$browser_replay_failed" -ne 0 ]; then exit 1; fi
'
- name: Upload Studio parity diagnostics
if: failure() && matrix.platform == 'amd64'
uses: actions/upload-artifact@v4
with:
name: web-studio-parity-diagnostics
path: cap-editor-parity-artifacts
if-no-files-found: ignore
Loading
Loading