Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
667 commits
Select commit Hold shift + click to select a range
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
35d04de
fix(editor): keep a word a cut runs through when editing the other pi…
richiemcilroy Oct 2, 2026
f1a298e
fix(web): let a caption request replace a stale worker session it needs
richiemcilroy Oct 2, 2026
859197c
test(editor): replay the pause redraw racing a config change, and sam…
richiemcilroy Oct 2, 2026
3c5c62c
feat(export): export captions whenever they are on, without a separat…
richiemcilroy Oct 5, 2026
22c6e49
fix(web): fall back to crypto random bytes for the share analytics se…
richiemcilroy Oct 5, 2026
0beabf1
fix(web): match storage hosts by domain rather than substring
richiemcilroy Oct 5, 2026
d0cd725
fix(media-server): strip DASH manifest comments until none remain
richiemcilroy Oct 5, 2026
5d0a428
fix(desktop): export captions with the editor's caption switch now th…
richiemcilroy Oct 5, 2026
4a1c407
chore(desktop-gpui): drop the export with subtitles toggle
richiemcilroy Oct 5, 2026
592d344
perf(web): load Sentry after the page, queueing errors from before it…
richiemcilroy Oct 5, 2026
695cd50
perf(web): load the TanStack devtools only in development
richiemcilroy Oct 5, 2026
2e01d5b
perf(web): keep the Effect runtime and idle screens off the editor pa…
richiemcilroy Oct 5, 2026
cfa9830
perf(editor): size media reads to the measured connection and hold wa…
richiemcilroy Oct 5, 2026
00ee544
perf(editor): preload the renderer wasm alongside the entry script
richiemcilroy Oct 5, 2026
d5fd8ee
feat(editor): answer Play at once and explain a slow load while video…
richiemcilroy Oct 5, 2026
1966573
fix(editor): keep the web preview on the editor's edits when a slower…
richiemcilroy Oct 5, 2026
162a5c7
Merge main into feature/web-editor-desktop-parity
richiemcilroy Oct 5, 2026
bbaa0b0
fix(editor): check a waveform byte grant before calling it
richiemcilroy Oct 5, 2026
077a09c
fix(web): replay navigations from before Sentry loads
richiemcilroy Oct 5, 2026
98abecf
fix(editor): fall back to a plain read when a waveform range read fai…
richiemcilroy Oct 5, 2026
e715194
fix(editor): seed the web preview's project config from a save when i…
richiemcilroy Oct 5, 2026
ff60fd2
style(web): format the client Sentry test
richiemcilroy Oct 5, 2026
9d5e155
fix(recorder): keep part uploads going on slow uplinks instead of abo…
richiemcilroy Oct 5, 2026
0efa63e
perf(editor): let a loading paused frame give way to Play and read ah…
richiemcilroy Oct 5, 2026
303a133
perf(editor): read a recording's tail only as far as its last fragmen…
richiemcilroy Oct 5, 2026
a7cec28
fix(editor): forget a loading-screen Play press when its editor attem…
richiemcilroy Oct 5, 2026
e85673e
feat(editor): rate the connection from the editor's own media reads
richiemcilroy Oct 5, 2026
6bbca86
feat(editor): centre the loading status over the preview and explain …
richiemcilroy Oct 5, 2026
e2091a3
fix(editor): retry a save that failed offline once the browser is bac…
richiemcilroy Oct 5, 2026
148060d
feat(web): show connection quality in the editor bar in place of Dash…
richiemcilroy Oct 5, 2026
09482dd
feat(web): make the editor bar's share link a share page toggle on ph…
richiemcilroy Oct 5, 2026
46d0a2d
feat(web): show a loading status while the editor's code downloads
richiemcilroy Oct 5, 2026
191e522
perf(editor): drop the loading status backdrop blur and keep its spin…
richiemcilroy Oct 5, 2026
1c9d4e1
feat(editor): replay touch drags, pinches and two-finger scrolls on t…
richiemcilroy Oct 5, 2026
c563826
feat(editor): stack the web editor below 1024px with settings in a sh…
richiemcilroy Oct 5, 2026
adb0bde
fix(editor): stack the export page on phones and tablets
richiemcilroy Oct 5, 2026
b3162db
fix(editor): show a paused frame as loading only once the preview has…
richiemcilroy Oct 5, 2026
e3691c5
feat(web): save on an editor worker when the render farm can't, and n…
richiemcilroy Oct 5, 2026
26eef18
refactor(web): remove the browser save chunk stream, its routes and i…
richiemcilroy Oct 5, 2026
fd207ce
feat(editor): centre the loading status over the preview and lay out …
richiemcilroy Oct 5, 2026
08aa9be
fix(web): say our servers are busy instead of naming the render farm …
richiemcilroy Oct 5, 2026
7a69b87
fix(recorder): retry a part that stops while others move, judged agai…
richiemcilroy Oct 5, 2026
b7b9d46
fix(web): wait for a busy editor pool only as long as Save does when …
richiemcilroy Oct 5, 2026
e22cacb
style(web): format the worker Save session call
richiemcilroy Oct 5, 2026
5fdea02
chore(editor): keep the earliest perf events and drop comments that r…
richiemcilroy Oct 5, 2026
53379b0
fix(editor): give a frame a fresh decoder when the last one is still …
richiemcilroy Oct 5, 2026
e1b2a25
fix(editor): reopen a segment's settings when it's tapped again on a …
richiemcilroy Oct 5, 2026
23a7410
chore(editor): drop comments that restate the responsive layout code
richiemcilroy Oct 5, 2026
8eef6f8
fix(editor): retry a timed out first preview frame and keep playing o…
richiemcilroy Oct 5, 2026
79959d7
chore(editor): drop comments that restate the preview tools and phone…
richiemcilroy Oct 5, 2026
b43c777
perf(recorder): give camera tracks a camera-shaped bitrate and trim s…
richiemcilroy Oct 5, 2026
63050d4
feat(web): give the share page header a title row over the video with…
richiemcilroy Oct 5, 2026
feff32f
feat(media-server): render, upload and report a Save from the editor …
richiemcilroy Oct 5, 2026
a270216
feat(web): publish Saves the editor worker renders on the server, lik…
richiemcilroy Oct 5, 2026
490a331
fix(web): stack the share view toggle above the reactions bar until t…
richiemcilroy Oct 5, 2026
86cca70
perf(recorder): keep more bits for full-frame and VP8 camera recordings
richiemcilroy Oct 5, 2026
3f19550
test(media-server): measure the replay preview only once its backing …
richiemcilroy Oct 5, 2026
0cb66bf
fix(editor): size fragment search windows to the recording's fragment…
richiemcilroy Oct 5, 2026
06036a8
fix(editor): start the connection indicator at checking and judge it …
richiemcilroy Oct 5, 2026
bc867dd
perf(editor): stop a fragment search once every frame waiting on it h…
richiemcilroy Oct 5, 2026
67b588c
fix(web): show only the back arrow in the editor bar on phones
richiemcilroy Oct 5, 2026
e2c22e3
fix(editor): retry a project save that can't reach Cap and say so pla…
richiemcilroy Oct 5, 2026
a74466e
fix(editor): show Saved on open when the share link already shows the…
richiemcilroy Oct 5, 2026
ac6662c
fix(editor): keep the latest perf events once the log is full
richiemcilroy Oct 5, 2026
adf49bc
fix(media-server): close a worker session at once and let its Save fi…
richiemcilroy Oct 5, 2026
ccec958
fix(web): withdraw only the worker Save a failed start recorded
richiemcilroy Oct 5, 2026
723b7f1
fix(editor): call Save saved on open only when a render of the stored…
richiemcilroy Oct 5, 2026
969ca1e
fix(editor): show one loading status on the web loading screen and cl…
richiemcilroy Oct 5, 2026
fda8f39
chore(editor): drop the comment that restates the shadow defaults
richiemcilroy Oct 5, 2026
8275f38
fix(editor): clear the loading card once frames flow and show one loa…
richiemcilroy Oct 5, 2026
2a8f776
perf(editor): drop the blur over a recording's unprepared timeline range
richiemcilroy Oct 5, 2026
8c3624a
fix(editor): drop a late camera frame once the playhead has moved and…
richiemcilroy Oct 5, 2026
781622e
fix(editor): let a fragment search finish after its frame moves on, w…
richiemcilroy Oct 5, 2026
788149c
perf(editor): draw a paused frame's screen at once and redraw when it…
richiemcilroy Oct 5, 2026
cba4715
chore(editor): drop comments that restate the quiet loading timeline
richiemcilroy Oct 5, 2026
67281ce
fix(media-server): wait for Saves still publishing on shutdown and al…
richiemcilroy Oct 5, 2026
b184a3b
chore(web): drop a comment that narrates the worker Save test
richiemcilroy Oct 5, 2026
9a6dd4f
perf(editor): stop a fragment search shortly after every caller has g…
richiemcilroy Oct 5, 2026
3dcceb9
feat(web): let Pro owners set a Cap's link preview title, description…
richiemcilroy Oct 5, 2026
fb7c3a8
fix(web): scroll the link preview dialog as one page on phones
richiemcilroy Oct 5, 2026
0ed95a7
chore(media-server): drop a comment that restates the pending close wait
richiemcilroy Oct 5, 2026
862fc33
feat(web): clamp share titles to a fixed height, label the Manage but…
richiemcilroy Oct 5, 2026
240eb08
feat(web): pause a Cap's custom link preview while its owner has no P…
richiemcilroy Oct 5, 2026
87b908f
fix(editor): report a camera that fails after its frame was drawn wit…
richiemcilroy Oct 5, 2026
c7dd84b
feat(web): open the link preview dialog from the share page's Manage …
richiemcilroy Oct 5, 2026
cd917d1
chore(editor): drop a comment that narrates clearing the selection
richiemcilroy Oct 6, 2026
9fe298d
fix(web): only delete a link preview image that no saved preview stil…
richiemcilroy Oct 6, 2026
1240d74
fix(web): serve link preview images through HttpApi at a URL that mov…
richiemcilroy Oct 6, 2026
1be2ba3
chore(web): drop comments that narrate the link preview dialog
richiemcilroy Oct 6, 2026
c6b584a
test(web): leave through the connection indicator's dashboard link in…
richiemcilroy Oct 6, 2026
d5324d2
fix(web): let Cmd and Ctrl shortcuts like reload through the share pl…
richiemcilroy Oct 7, 2026
549c5af
fix(editor): never cancel browser shortcuts like reload while the web…
richiemcilroy Oct 7, 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