Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
391 commits
Select commit Hold shift + click to select a range
96d61cf
docs: drop the _harvest staging directory
EtienneLescot Jul 26, 2026
6a945b1
ci: run CI on feat/ai-edition, and gate the docs tree
EtienneLescot Jul 26, 2026
3c7dc90
fix(test): make two platform-dependent tests pass off Windows, and cl…
EtienneLescot Jul 26, 2026
67daf3e
fix(inspector): stop the collapse button swallowing every pane's Help…
EtienneLescot Jul 26, 2026
36eb4b2
test(e2e): retarget the editor specs at the v4 shell
EtienneLescot Jul 26, 2026
cf0241a
refactor(exporter): delete the web MP4 pipeline the native path replaced
EtienneLescot Jul 26, 2026
695c8a5
chore: drop the two superseded POCs and their spike residue
EtienneLescot Jul 26, 2026
da1b9cf
docs: drop consumed one-shot plans and a stale tracked worktree handoff
EtienneLescot Jul 26, 2026
0448194
chore(deps): drop seven unused dependencies and a ghost CI cache
EtienneLescot Jul 26, 2026
6e34584
fix(export): remove the hardcoded fixture path from the shipped addon
EtienneLescot Jul 26, 2026
3889af8
docs: repoint the export and preview docs at what survives the deletion
EtienneLescot Jul 26, 2026
80b1791
refactor(math): one clamp instead of sixteen
EtienneLescot Jul 26, 2026
4fa65d9
refactor: crypto.randomUUID over the uuid dep, and one MSVC bootstrap
EtienneLescot Jul 26, 2026
9e5dcb9
refactor(format): one timecode module instead of six copies
EtienneLescot Jul 26, 2026
ba19296
refactor: reuse the gradient parser, and spread the settings patch
EtienneLescot Jul 26, 2026
3f6fe1d
fix: restore the two guards the dedup dropped, and keep gradients gra…
EtienneLescot Jul 26, 2026
00a3f20
chore: tighten the dedup's loose ends
EtienneLescot Jul 26, 2026
a09ddd0
refactor(schema): drop the four document fields nothing ever read
EtienneLescot Jul 26, 2026
b47d698
refactor(llm): one provider stack, and a real Copilot token swap
EtienneLescot Jul 26, 2026
a084f2b
refactor(store): drop seven timeline actions with no callers
EtienneLescot Jul 26, 2026
f7d0768
fix(llm): finish the reroute — Codex account header, one model per run
EtienneLescot Jul 26, 2026
d27bdd1
chore(schema): finish the four-field removal the fixtures missed
EtienneLescot Jul 26, 2026
19ae62e
refactor(editor): drop the write-only showTrimWaveform setting
EtienneLescot Jul 26, 2026
f243982
fix(compositor): resolve scene assets outside the asar, so themes and…
EtienneLescot Jul 26, 2026
5c31bb6
fix(zoom): feather the tilted plane's edge at radius 0, so a 3D zoom …
EtienneLescot Jul 26, 2026
c44e978
fix(background): accept a blank MIME type by extension, and say so wh…
EtienneLescot Jul 26, 2026
65e75bb
fix(compositor): bypass Electron's asar-transparent fs when probing f…
EtienneLescot Jul 27, 2026
e6b96d3
fix(cursor): pivot custom cursors on their hotspot, and give the nati…
EtienneLescot Jul 27, 2026
51e804d
fix(cursor): put the cursor on the tilted plane instead of floating i…
EtienneLescot Jul 27, 2026
f609964
fix(stt): re-anchor whisper's word boundaries on the audio, so transc…
EtienneLescot Jul 27, 2026
6334f7e
fix(transport): remove non-functional loop and fullscreen buttons
EtienneLescot Jul 27, 2026
2154e90
fix(llm): drop the two providers that shipped borrowed vendor credent…
EtienneLescot Jul 27, 2026
5936e5f
fix(ipc): one document service, a protocol allowlist, and a loopback-…
EtienneLescot Jul 27, 2026
35462ee
ci(release): run CI on release branches, and stage the STT binaries i…
EtienneLescot Jul 27, 2026
e46877e
ci: make the test typecheck a ratchet instead of a permanent red X
EtienneLescot Jul 27, 2026
90ffd1d
fix(topbar): hide left side panel toggle in Media and Rec modes
EtienneLescot Jul 27, 2026
d57e6e5
feat(titlebar): seamless window titlebar on Windows, macOS and Linux
EtienneLescot Jul 27, 2026
279c1e5
build(win): fail the pack on a stale compositor addon, and split poc-…
EtienneLescot Jul 27, 2026
c32ff7f
docs(website): rewrite the feature docs against the v4 shell
EtienneLescot Jul 27, 2026
4d74f2a
docs(roadmap): reconcile the roadmap with what actually shipped
EtienneLescot Jul 27, 2026
34ddd1a
docs(architecture): repoint the LLM provider doc at the transport tha…
EtienneLescot Jul 27, 2026
f2ab698
chore(i18n): drop two dead string blocks and the phantom Add Blur sho…
EtienneLescot Jul 27, 2026
5482c84
docs(perf): lead with the D3D11 result instead of burying it under th…
EtienneLescot Jul 27, 2026
0381bdc
docs(perf): record an admissible C0..C8 run, and the cursor fixture's…
EtienneLescot Jul 27, 2026
7d5255f
fix(i18n): translate the captions pane in the 11 locales that fell ba…
EtienneLescot Jul 27, 2026
28ac926
feat(chat): add welcome view when no LM provider is connected
EtienneLescot Jul 27, 2026
ee16b42
fix(chat): show welcome when active provider is selected but disconne…
EtienneLescot Jul 27, 2026
e436ab3
fix(chat): keep the welcome view honest about loading, history and de…
EtienneLescot Jul 27, 2026
48a7a97
fix(timeline): let the chat confirm Auto-enhance, instead of the time…
EtienneLescot Jul 27, 2026
8ee935f
refactor(chat): trim the welcome card to what it actually needs
EtienneLescot Jul 27, 2026
46d662b
feat(export): pick the video encoder from the host's hardware, with a…
EtienneLescot Jul 27, 2026
d8b901b
fix(export): make the encoder choice forceable, and the fallback MP4 …
EtienneLescot Jul 27, 2026
610b93e
ci(release): restrict the 1.8.0 build to Windows
EtienneLescot Jul 27, 2026
a596854
chore(release): bump to 1.8.0-rc.1 [skip ci]
github-actions[bot] Jul 27, 2026
baf617c
fix(build): vendor the ffmpeg SDK so CI can build the compositor addon
EtienneLescot Jul 27, 2026
f08766a
chore(release): bump to 1.8.0-rc.2 [skip ci]
EtienneLescot Jul 27, 2026
fb0aba4
chore(release): bump to 1.8.0-rc.3 [skip ci]
github-actions[bot] Jul 27, 2026
043448a
fix(stt): stop linking OpenSSL, and load-check the staged binary
EtienneLescot Jul 27, 2026
93ba9c7
chore(release): bump to 1.8.0-rc.4 [skip ci]
github-actions[bot] Jul 27, 2026
ddb59d5
fix(ai-edition): floor Anthropic-wire maxTokens at 16k for unknown mo…
EtienneLescot Jul 28, 2026
381e210
fix(topbar): project rename in the v4 header (#180)
EtienneLescot Jul 28, 2026
1a505ad
chore: remove + skip button in the chat panel
EtienneLescot Jul 28, 2026
62a8fac
chore: drop the now-unused aiEdition.runTimelineOperation IPC plumbing
EtienneLescot Jul 28, 2026
c4568ba
refactor: extract useSequentialTimelineOps hook from NewEditorShell
EtienneLescot Jul 28, 2026
da99426
fix(ci): make useSequentialTimelineOps.test pass tsconfig.test.json, …
EtienneLescot Jul 28, 2026
7a35fb4
feat(chat): stream reasoning trace into the chat panel
EtienneLescot Jul 28, 2026
cd32355
fix(export): keep the caption background plate through the native bridge
EtienneLescot Jul 28, 2026
feea7e5
fix(compositor): stop the colour parser panicking on non-ASCII, and f…
EtienneLescot Jul 28, 2026
77dfc8a
fix(preview): stop drawing captions twice in the preview
EtienneLescot Jul 28, 2026
ef8b0ff
docs(captions): fold the two render paths into the one that survived
EtienneLescot Jul 28, 2026
ae6c5bb
fix(compositor): let zooms overflow the preview padding
EtienneLescot Jul 28, 2026
ade8969
fix(compositor): don't let the screen shadow/roundness follow the zoo…
EtienneLescot Jul 28, 2026
d8bf3c9
fix(compositor): make the zoom-frame growth continuous instead of bi…
EtienneLescot Jul 28, 2026
9df5137
fix(compositor): split the zoom between the box and the source cut
EtienneLescot Jul 28, 2026
4135938
fix(compositor): hand the whole zoom to the box, not a share of it
EtienneLescot Jul 28, 2026
184352b
chore(cleanup): remove dead exports, scripts, and an always-true feat…
EtienneLescot Jul 28, 2026
d872c0a
docs: drop references to the scripts this PR deletes
EtienneLescot Jul 28, 2026
593be5e
perf: make platformUtils synchronous via preload
EtienneLescot Jul 28, 2026
1bc24ad
fix(platform): read platform from preload, not the renderer's absent …
EtienneLescot Jul 28, 2026
1bbbc00
test(platform): guard the renderer/browser platform read
EtienneLescot Jul 28, 2026
9a95802
chore(cleanup): replace hand-rolled i18n loader with i18next
EtienneLescot Jul 28, 2026
8e0a626
fix(i18n): drop the dead module-scope localStorage read, restore key-…
EtienneLescot Jul 28, 2026
8ef266a
refactor: drop legacy single-session default chat path
EtienneLescot Jul 28, 2026
3bd2d30
chore(contracts): drop the three orphaned chat request arms
EtienneLescot Jul 28, 2026
43bed4f
chore(cleanup): move pure-math out of components/video-editor/videoPl…
EtienneLescot Jul 28, 2026
59df354
refactor: shrink YAGNI signatures
EtienneLescot Jul 28, 2026
63fe45e
refactor(speed): reuse clampPlaybackSpeed, narrow the parser signature
EtienneLescot Jul 28, 2026
e756499
refactor: drop legacy 'native' AspectRatio via v6 schema migration
EtienneLescot Jul 28, 2026
2672971
fix(schema): migrate 'native' using CROPPED dims, and unbreak the mai…
EtienneLescot Jul 28, 2026
71a4e2c
fix(schema): never force-bake 'native' before the source is probed
EtienneLescot Jul 29, 2026
83b9aa1
refactor: schema region consolidation + playback cap + deep-agent fold
EtienneLescot Jul 28, 2026
ef7c78f
fix(docs,speed): repoint folded doc link, correct the cap comment
EtienneLescot Jul 28, 2026
7e482e4
revert(speed): restore the 100x playback cap
EtienneLescot Jul 28, 2026
73c7d63
perf: hoist v3/v4/v5 schema migrations to load-time
EtienneLescot Jul 28, 2026
0fbd4af
fix(schema): keep the migration composer out of the aliased module graph
EtienneLescot Jul 28, 2026
4ef05da
feat(export): add native GIF export pipeline (slice 1, behind flag)
EtienneLescot Jul 28, 2026
2020854
fix(gif): one trailer per file, clean up a failed export, revert lock…
EtienneLescot Jul 28, 2026
974aaf7
refactor(export): drive GIF from the video exporter's own frame walk
EtienneLescot Jul 28, 2026
9bb49b6
feat(export): route GIF through the native exporter, delete the pixi …
EtienneLescot Jul 28, 2026
5bd02bd
chore(pixi): remove pixi.js — the last consumers were already dead code
EtienneLescot Jul 29, 2026
f468bd1
perf(timeline): stop the playhead from re-rendering the whole editor …
EtienneLescot Jul 29, 2026
eb017f4
perf(preview): chemin rapide de seek — ne plus jeter l'état du décode…
EtienneLescot Jul 29, 2026
2df1439
fix(preview): le <video> ne dicte plus la position de la timeline à l…
EtienneLescot Jul 29, 2026
be0b354
perf(preview): livrer la frame sans la copier
EtienneLescot Jul 29, 2026
1c55dac
chore(perf): sonde de fluidité de l'UI, segmentée par état
EtienneLescot Jul 30, 2026
f402385
perf(timeline): ne plus re-rendre la timeline à chaque événement sour…
EtienneLescot Jul 30, 2026
8cd3b76
Revert "perf(timeline): ne plus re-rendre la timeline à chaque événem…
EtienneLescot Jul 30, 2026
cd42158
chore(perf): la sonde sépare les mesures d'avant et d'après un franch…
EtienneLescot Jul 30, 2026
ba89a08
perf(preview): ne plus rouvrir les décodeurs quand seul le segment ch…
EtienneLescot Jul 30, 2026
cc738a5
fix(preview): vider le cache de SRV quand un jeu de décodeurs est fermé
EtienneLescot Jul 30, 2026
3f5bb85
fix(preview): repli sûr quand le repositionnement échoue, et ne plus …
EtienneLescot Jul 30, 2026
c3f4073
chore(perf): la sonde distingue le scrub timeline du scrub barre de p…
EtienneLescot Jul 30, 2026
90a0ea1
perf(transport): coalescer le drag de la barre de progression en rAF
EtienneLescot Jul 30, 2026
2832264
perf(transport): écrire le curseur de la barre directement dans le DO…
EtienneLescot Jul 30, 2026
8c7f359
feat(compositor): fail legibly when D3D11 init fails, instead of fall…
EtienneLescot Jul 27, 2026
efce9d2
docs(compositor): correct the WGC rationale -- capture is not mandatory
EtienneLescot Jul 27, 2026
fe53daa
feat(compositor): add a CPU backend -- WARP render + software decode,…
EtienneLescot Jul 27, 2026
ee557f9
feat(compositor): select the CPU backend automatically, and tell the …
EtienneLescot Jul 27, 2026
0ae372b
feat(compositor): let the CPU backend reach the export encoder
EtienneLescot Jul 27, 2026
9c13179
fix(compositor): CPU backend reach on the GIF-refactored pipeline
EtienneLescot Jul 29, 2026
21b432f
feat(compositor): scaffold macOS Metal+VideoToolbox port
EtienneLescot Jul 28, 2026
32a5291
feat(compositor): mac_frames.rs — software decode → NV12 → CVPixelBuf…
EtienneLescot Jul 28, 2026
aac2b4b
feat(compositor): add d3d_macos, text_macos, wrapper_macos — backend …
EtienneLescot Jul 28, 2026
a7a9d4a
feat(compositor): compositor_macos — Compositor skeleton, CVMetalText…
EtienneLescot Jul 28, 2026
b90ad29
feat(compositor): shaders.metal — MSL port of all 9 shader entry points
EtienneLescot Jul 28, 2026
7603e6a
feat(compositor): pipeline_macos — VideoToolbox hwaccel decode + dual…
EtienneLescot Jul 28, 2026
989940f
fix(compositor/build.rs): discover macOS SDK via xcrun on macOS
EtienneLescot Jul 28, 2026
1897f33
fix(ci): indent the build: job so the macOS job parses
EtienneLescot Jul 28, 2026
6935ee4
feat(compositor): compositor_macos engine — render targets, MSL pipel…
EtienneLescot Jul 28, 2026
768de20
feat(compositor): pipeline_macos::Decoder — seek / next / cur_time_se…
EtienneLescot Jul 28, 2026
8dbf92e
feat(compositor): pipeline_macos::VideoEncoder — h264_videotoolbox + …
EtienneLescot Jul 28, 2026
ae8f6a3
feat(compositor): pipeline_macos::run_composited_multi — multi-clip e…
EtienneLescot Jul 28, 2026
16ebbde
feat(compositor): text_metal — CoreText/CoreGraphics text rasterizer
EtienneLescot Jul 28, 2026
c2a19c3
fix(compositor): dedup `pub mod live` and `pub mod pipeline` in lib.rs
EtienneLescot Jul 29, 2026
9bfab8d
fix(compositor/build.rs): reach the macOS ffmpeg and libclang at all
EtienneLescot Jul 29, 2026
3590ad3
fix(compositor): AVERROR(EAGAIN) is -35 on macOS, not -11
EtienneLescot Jul 29, 2026
4c691a8
refactor(compositor): move the timeline walk out of the Windows pipeline
EtienneLescot Jul 29, 2026
e312387
fix(compositor): port shaders.metal to MSL that actually compiles
EtienneLescot Jul 29, 2026
e17419c
feat(compositor): make the Metal engine produce a frame
EtienneLescot Jul 29, 2026
9f5f5c8
fix(compositor): rewrite text_macos.rs on the CoreText C API
EtienneLescot Jul 29, 2026
0c2ce82
fix(app): open the HUD without waiting for the microphone prompt
EtienneLescot Jul 29, 2026
afebff1
fix(compositor-view): actually find the addon, unpackaged and packaged
EtienneLescot Jul 29, 2026
0e1eed7
build(mac): add the macOS compositor addon build script
EtienneLescot Jul 29, 2026
70ea29a
ci(macos): run the compositor tests, not just a type-check
EtienneLescot Jul 29, 2026
7309a27
fix(build,test): unblock tsc, and stop assuming an x64 host
EtienneLescot Jul 29, 2026
5cfa32f
docs(compositor): repoint the module map at the per-platform files
EtienneLescot Jul 29, 2026
07ce6d9
ci(windows): cargo check the compositor on every PR
EtienneLescot Jul 29, 2026
b8643c0
refactor(compositor): move the pure geometry into frame_geometry
EtienneLescot Jul 29, 2026
a9809fd
refactor(compositor): one LayerCB, one LiveParams, for both backends
EtienneLescot Jul 29, 2026
76a2054
refactor(compositor): compose_frame's geometry becomes plan_frame
EtienneLescot Jul 29, 2026
1c37e48
fix(build/mac): install the addon by rename, not by overwriting it
EtienneLescot Jul 29, 2026
992ea16
fix(compositor): three MSL modes that were mis-ported from HLSL
EtienneLescot Jul 29, 2026
cc79db4
feat(compositor): draw the layers on Metal, not just the video
EtienneLescot Jul 29, 2026
a4da5d0
feat(compositor): render the cursor on Metal, trail included
EtienneLescot Jul 29, 2026
ac7d0b9
feat(compositor): wire the dual-Kawase background blur on Metal
EtienneLescot Jul 29, 2026
6bcbf16
fix(compositor): the shadow fix landed in dead code, and two more div…
EtienneLescot Jul 29, 2026
ceea62c
feat(compositor): render the 3D tilt on Metal — and unbreak modes 8, …
EtienneLescot Jul 29, 2026
323a45b
fix(compositor): the three annotation modes were each a different shader
EtienneLescot Jul 29, 2026
d530470
feat(compositor): draw annotations on Metal, and call the CoreText ra…
EtienneLescot Jul 29, 2026
ccd84f6
feat(compositor): macOS export encodes — first MP4 out of the Metal e…
EtienneLescot Jul 29, 2026
7765f4e
test(compositor): pin the iso-render claim to a number
EtienneLescot Jul 29, 2026
ca373ee
feat(compositor): mux audio into the macOS export
EtienneLescot Jul 29, 2026
0cd1609
fix(compositor): the annotation blur sampled mip 0 and so blurred not…
EtienneLescot Jul 29, 2026
029cd6b
fix(compositor): text annotations were rendered upside down
EtienneLescot Jul 29, 2026
e1456c8
perf(compositor): 2.4x on macOS export — VideoToolbox was the slow path
EtienneLescot Jul 29, 2026
fcc86c8
perf(compositor): render NV12 straight into the encoder's CVPixelBuffer
EtienneLescot Jul 29, 2026
1589042
build(mac): ship the ffmpeg dylibs, and vendor them LGPL by construction
EtienneLescot Jul 29, 2026
10e043e
fix(compositor): mac was missing clear_srv_cache after the rebase ont…
EtienneLescot Jul 30, 2026
d1dc427
perf(preview): pool de décodeurs — plus de réouverture au franchissem…
EtienneLescot Jul 30, 2026
a8ddf4c
fix(preview): seek_to retombe sur un seek complet quand le décode-ava…
EtienneLescot Jul 30, 2026
cb0ac6d
fix(preview): supprimer l'overlay « Loading preview… » qui recouvrait…
EtienneLescot Jul 30, 2026
cc78180
fix(stt): make the macOS whisper helper actually shippable, and repor…
EtienneLescot Jul 30, 2026
c5c6ed5
fix(stt): resolve the model cache from the app's userData name, not "…
EtienneLescot Jul 30, 2026
5cf97cd
fix(i18n): transcription does not run in the browser
EtienneLescot Jul 30, 2026
ad8fef3
fix(macos): don't content-protect windows on macOS 26 — it makes them…
EtienneLescot Jul 30, 2026
e00d689
test(stt): split the word-timing assertions, and stop failing on raw …
EtienneLescot Jul 30, 2026
458b4b5
build(macos): strip the build-machine path from the shipped composito…
EtienneLescot Jul 30, 2026
6348791
build(macos): package the compositor addon, and refuse an incomplete …
EtienneLescot Jul 30, 2026
81e0597
fix(ci): re-piner le build ffmpeg BtbN, dont la release a été purgée
EtienneLescot Jul 30, 2026
333c6c3
fix(compositor): les blocs de texte se centrent dans leur boîte, et l…
EtienneLescot Jul 30, 2026
81839f0
fix(compositor): annotations et sous-titres ne suivent plus le zoom
EtienneLescot Jul 30, 2026
7e41974
feat(timeline): playhead and ruler reworked to the reference design
EtienneLescot Jul 30, 2026
bf8bb40
chore(i18n): drop three timeline strings nothing references any more
EtienneLescot Jul 30, 2026
f2bddc1
fix(topbar): stop the header re-flowing on every state change
EtienneLescot Jul 30, 2026
0732bc9
fix(gif): l'encodeur LZW grossissait ses codes un cran trop tôt
EtienneLescot Jul 31, 2026
90783ee
fix(shim): un abonnement manquant faisait planter tout l'éditeur en m…
EtienneLescot Jul 31, 2026
33c811c
fix(preview): un asset orphelin vidait tout le preview
EtienneLescot Jul 31, 2026
d9b1ed3
test(e2e): repointer la spec d'export sur le dialogue v4, et isoler l…
EtienneLescot Jul 31, 2026
567d8e7
docs(testing): couvrir la surface v1.8.0 dans le checklist e2e manuel
EtienneLescot Jul 31, 2026
6ffc6b5
fix(stt): make the Linux whisper helper relocatable
EtienneLescot Jul 31, 2026
dd5cc8f
Revert "fix(stt): make the Linux whisper helper relocatable"
EtienneLescot Jul 31, 2026
efe5acc
fix(recording): le helper macOS muxait deux pistes audio, dont une se…
EtienneLescot Jul 31, 2026
16b40a1
feat(compositor): re-express the Linux port on the v1.8.0 cross-backe…
EtienneLescot Jul 30, 2026
bbf61ad
feat(compositor): draw text annotations in compositor_linux (WGSL mod…
EtienneLescot Jul 30, 2026
9c0ee77
feat(compositor): draw the webcam PiP in compositor_linux compose_frame
EtienneLescot Jul 30, 2026
4edee0e
feat(compositor): background blur (dual-Kawase) in compositor_linux
EtienneLescot Jul 30, 2026
8015424
feat(compositor): themed cursor sprite (mode 7) in compositor_linux
EtienneLescot Jul 30, 2026
70f9edc
feat(compositor): Linux video export (WP6) — software encode + MP4 mux
EtienneLescot Jul 30, 2026
459808c
feat(compositor): mux AAC audio in Linux export (WP6)
EtienneLescot Jul 30, 2026
db9ceb5
feat(compositor): image background (WGSL mode 6 wallpaper) in composi…
EtienneLescot Jul 30, 2026
428a277
fix(hud): -0 out of Math.round crashed the main process on Wayland
EtienneLescot Jul 30, 2026
2bc9d70
fix(hud): the drag region sat on the window root, not the grab handle
EtienneLescot Jul 30, 2026
24a2423
build(vite): stop watching the vendored ffmpeg tree
EtienneLescot Jul 30, 2026
3485ee3
style(compositor): repair the mojibake and CRLF in the Linux sources
EtienneLescot Jul 30, 2026
a40469e
fix(compositor): indexing the array twice made naga emit invalid SPIR-V
EtienneLescot Jul 30, 2026
d645a8b
build(linux): build the native compositor addon
EtienneLescot Jul 30, 2026
8b3fa1e
fix(compositor): the addon bound to Chromium's ffmpeg, not ours
EtienneLescot Jul 30, 2026
00b3166
Revert "fix(compositor): the addon bound to Chromium's ffmpeg, not ours"
EtienneLescot Jul 30, 2026
464acb8
fix(compositor): rename the ffmpeg symbols so Chromium's cannot win
EtienneLescot Jul 30, 2026
eb5e23e
perf(compositor): stop re-seeking the decoder for every sequential frame
EtienneLescot Jul 31, 2026
e345b3c
perf(compositor): the readback zero-filled 8 MB it overwrote a line l…
EtienneLescot Jul 31, 2026
b673986
fix(compositor): rewind and scan when the file has no seek index
EtienneLescot Jul 31, 2026
5c7a9b8
feat(cursor): capture real cursor telemetry on Wayland via the Screen…
EtienneLescot Jul 31, 2026
df96d85
fix(compositor): the webcam froze because the seek flag was 4, not 1
EtienneLescot Jul 31, 2026
e247240
perf(compositor): pipeline the export readback instead of stalling on it
EtienneLescot Jul 31, 2026
ac0e710
fix(recording): remux Linux captures so they carry a real Duration
EtienneLescot Jul 31, 2026
b722359
docs(hud): record why the cursor-mode toggle is Windows/macOS only
EtienneLescot Jul 31, 2026
d07b8e9
feat(capture): give the Linux helper a hardware H.264 encoder
EtienneLescot Jul 31, 2026
8143f30
feat(capture): the Linux helper now records video, not just the cursor
EtienneLescot Jul 31, 2026
4d49f67
feat(capture): record system audio and the microphone alongside the v…
EtienneLescot Jul 31, 2026
ef71c97
feat(recording): route Linux capture through the native helper
EtienneLescot Jul 31, 2026
fafd046
fix(preview): stop leaking a decoded frame per scrub step
EtienneLescot Jul 31, 2026
d8d4e66
fix(annotations): make Linux text annotations legible
EtienneLescot Jul 31, 2026
8aec0e1
fix(compositor): cover-crop and mirror the Linux webcam, drop the dea…
EtienneLescot Jul 31, 2026
e1b200b
feat(compositor): draw the screen and camera shadows on Linux
EtienneLescot Jul 31, 2026
b19b527
feat(compositor): tilted 3D zoom on Linux (shader modes 8, 12 and 13)
EtienneLescot Jul 31, 2026
9a7ca53
wip: motion blur (agent output, pre-merge)
EtienneLescot Jul 31, 2026
bd0531a
test(compositor): pin the Linux webcam circle mask, and fix two tests…
EtienneLescot Jul 31, 2026
94af57a
fix(annotations): centre Linux text vertically in its box
EtienneLescot Jul 31, 2026
b5f07d4
fix(stt): stop compiling the shipped whisper helper for the build mac…
EtienneLescot Jul 31, 2026
2f6c472
ci(stt): stop tripling the whisper libraries in the uploaded artifact
EtienneLescot Jul 31, 2026
66c1c70
fix(editor): push every native param on load, not just the open panel's
EtienneLescot Jul 31, 2026
e1123e1
fix(capture): record the microphone the user picked, in one mixed track
EtienneLescot Jul 31, 2026
91b3849
fix(capture): log which node each audio source was linked to
EtienneLescot Jul 31, 2026
c9f4f96
feat(annotations): start a new text annotation with localised text
EtienneLescot Jul 31, 2026
75686f1
fix(editor): stop losing the camera to a fractional offset
EtienneLescot Jul 31, 2026
1f8dd3a
feat(annotations): draw arrows, blur/mosaic masks and images on Linux
EtienneLescot Jul 31, 2026
dc5e07c
fix(ci): repair the three checks the rebase onto v1.8.0 broke
EtienneLescot Jul 31, 2026
0e53709
fix(agent): le bac à sable de deepagents fabriquait une preuve d'absence
EtienneLescot Jul 31, 2026
b1714a4
feat(agent): donner au modèle la trajectoire du curseur, pas le verdi…
EtienneLescot Jul 31, 2026
7e6439a
feat(timeline): le wizard IA ne fait plus que les coupes
EtienneLescot Jul 31, 2026
1ef4aa1
test(workbench): un banc headless pour mesurer l'agent d'édition
EtienneLescot Jul 31, 2026
2bdcc60
test(e2e): repointer les deux dernières assertions Windows sur le dia…
EtienneLescot Jul 31, 2026
0c5024d
perf(agent): réduire la trajectoire curseur en keyframes, et desserre…
EtienneLescot Jul 31, 2026
cd58743
fix(timeline): lever l'ambiguïté quand deux clips partagent le même m…
EtienneLescot Jul 31, 2026
4e53ce3
docs(readme): AI editing, transcript features, and Linux's native cap…
EtienneLescot Aug 1, 2026
84a58de
docs(readme): give the two screenshots the same width
EtienneLescot Aug 1, 2026
c3a6c00
docs(readme): refresh the second screenshot
EtienneLescot Aug 1, 2026
02fe7d8
docs(readme): re-take the second screenshot in 16:9
EtienneLescot Aug 1, 2026
2200c7c
fix(ci): vider l'arriéré de types des tests et fermer le cliquet
EtienneLescot Aug 1, 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
  •  
  •  
  •  
31 changes: 31 additions & 0 deletions .claude/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"version": "0.0.1",
"configurations": [
{
"name": "vite-dev",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--", "--port", "5199", "--strictPort"],
"port": 5199,
"env": { "NO_ELECTRON": "1" }
},
{
"name": "desktop-dev",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--", "--port", "5201", "--strictPort"],
"port": 5201,
"env": { "NO_ELECTRON": "1" }
},
{
"name": "v4preview",
"runtimeExecutable": "node",
"runtimeArgs": ["node_modules/vite/bin/vite.js", "--config", "vite.v4preview.config.ts"],
"port": 5207
},
{
"name": "docs",
"runtimeExecutable": "npm",
"runtimeArgs": ["--prefix", "website", "run", "serve", "--", "--port", "3111"],
"port": 3111
}
]
}
9 changes: 9 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# The compositor is developed across Windows, macOS and Linux. Without this, a
# checkout on Windows can reintroduce CRLF and the shader sources drift from the
# `end_of_line = lf` / `charset = utf-8` that .editorconfig already mandates —
# which is how blur.wgsl, layer.wgsl and linux_decode.rs ended up with CRLF and
# double-encoded French comments in the first place.
*.wgsl text eol=lf
*.rs text eol=lf
*.ts text eol=lf
*.tsx text eol=lf
220 changes: 220 additions & 0 deletions .github/workflows/build-whisper-stt.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,220 @@
name: Build whisper-stt binaries

# Builds the whisper.cpp-based `whisper-stt-server` helper for each desktop
# platform and uploads the binary + ggml backend sidecars as GitHub artifacts
# so `build.yml` can bundle them into installers.
#
# Triggered:
# * manually via workflow_dispatch (release-blocking binary refresh)
# * automatically when the helper, build script, or this workflow changes
#
# ponytail: one binary per platform is enough because whisper.cpp selects the
# right backend at runtime (Metal on Apple Silicon, Vulkan on Windows/Linux,
# CPU fallback when no GPU/driver is available). A CUDA variant is supported
# by the build script but is not built by default; Vulkan already accelerates
# NVIDIA cards.

on:
workflow_dispatch:
inputs:
enable_cuda:
description: "Also build a CUDA variant when the host has an nvcc toolchain"
required: false
default: "false"
type: choice
options:
- "true"
- "false"
push:
paths:
- "scripts/build-whisper-stt.sh"
- "electron/native/whisper-stt/**"
- ".github/workflows/build-whisper-stt.yml"

permissions:
contents: read

jobs:
build:
name: ${{ matrix.label }}
strategy:
fail-fast: false
matrix:
include:
- os: macos-latest
arch: arm64
# Matches `os_arch_tag()` in scripts/build-whisper-stt.sh — this is
# the directory name the build script actually stages into
# (electron/native/bin/<tag>/), NOT `${{ matrix.os }}-${{ matrix.arch }}`.
tag: darwin-arm64
label: macOS arm64 (Metal)
vulkan: false
- os: macos-15-intel
arch: x64
tag: darwin-x64
label: macOS x64 (CPU)
vulkan: false
- os: ubuntu-latest
arch: x64
tag: linux-x64
label: Linux x64 (Vulkan + CPU fallback)
vulkan: true
- os: windows-latest
arch: x64
tag: win32-x64
label: Windows x64 (Vulkan + CPU fallback)
vulkan: true
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: ./.github/actions/setup

- name: Install Ninja (Linux)
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt-get update
sudo apt-get install -y ninja-build build-essential

- name: Install Ninja (macOS)
if: startsWith(matrix.os, 'macos')
run: brew install ninja

- name: Setup MSVC (Windows)
if: matrix.os == 'windows-latest'
uses: ilammy/msvc-dev-cmd@v1
with:
arch: x64

- name: Install Vulkan SDK
if: matrix.vulkan
# ponytail: humbletim/setup-vulkan-sdk builds Glslang from source via
# CMake ExternalProject, which fails ("ENABLE_OPT set but SPIR-V
# tools not found") because Glslang's build needs a sibling
# SPIRV-Tools checkout it doesn't fetch on its own — reproduced on
# both the Linux and Windows legs. jakoch/install-vulkan-sdk-action
# downloads LunarG's official prebuilt SDK (glslc included, no
# compilation), which is both more reliable and much faster.
uses: jakoch/install-vulkan-sdk-action@v1
with:
vulkan_version: 1.4.304.1
install_runtime: false
cache: true

- name: Put glslc on PATH
if: matrix.vulkan
shell: bash
# Belt-and-braces: the action exports VULKAN_SDK but its own PATH
# handling isn't documented in enough detail to rely on for a tool
# (glslc) the ggml Vulkan backend's CMake configure step needs to find.
run: |
set -euo pipefail
for cand in "${VULKAN_SDK}/Bin" "${VULKAN_SDK}/bin"; do
if [[ -d "${cand}" ]]; then
echo "${cand}" >> "$GITHUB_PATH"
fi
done

- name: Install SPIRV-Headers (Windows only)
if: matrix.os == 'windows-latest'
shell: bash
# ponytail: ggml-vulkan's CMakeLists does
# `find_package(SPIRV-Headers CONFIG REQUIRED)`. The Linux LunarG SDK
# tarball bundles that CMake config alongside the SDK, so the Linux
# leg resolves it for free; the Windows installer .exe (as fetched by
# jakoch/install-vulkan-sdk-action) does not ship it at all, so
# find_package fails with "Could not find a package configuration
# file". vcpkg (preinstalled on GitHub's windows-latest image) ships
# a spirv-headers port that provides the missing config; point
# CMAKE_PREFIX_PATH at its install dir so ggml's own
# `if (DEFINED ENV{VULKAN_SDK}) list(APPEND CMAKE_PREFIX_PATH ...)`
# logic has a second, working prefix to fall back to.
run: |
set -euo pipefail
VCPKG_ROOT_DIR="$(dirname "$(command -v vcpkg)")"
"${VCPKG_ROOT_DIR}/vcpkg" install spirv-headers:x64-windows
echo "CMAKE_PREFIX_PATH=${VCPKG_ROOT_DIR}/installed/x64-windows" >> "$GITHUB_ENV"

- name: Cache whisper.cpp build tree
uses: actions/cache@v4
with:
# Matches scripts/build-whisper-stt.sh's own BUILD_ROOT default for
# each OS (short `C:/wstbuild` on Windows to dodge the vulkan-shaders-gen
# MAX_PATH issue; `.cache/whisper-stt-build` elsewhere) — cache the
# FetchContent checkout + object files directly, no env override needed.
path: ${{ runner.os == 'Windows' && 'C:/wstbuild' || '.cache/whisper-stt-build' }}
# Keyed on the pinned WHISPER_REF/backend flags in CMakeLists.txt so a
# bump there invalidates the cache instead of silently reusing a stale
# FetchContent checkout; falls back to the newest cache for the same
# platform + runner image on a miss so incremental compilation still
# helps. The runner image version ($ImageOS/$ImageVersion) is part of
# the key AND the restore-keys prefix because CMake bakes absolute
# toolchain paths (e.g. the Xcode SDK's libz.tbd) into the cached build
# tree — when GitHub rolls the image's Xcode/SDK, those paths vanish and
# a restored tree fails with "No rule to make target …libz.tbd". Scoping
# the cache to the image version auto-busts it on every toolchain roll.
key: whisper-stt-build-${{ matrix.tag }}-${{ env.ImageOS }}-${{ env.ImageVersion }}-${{ hashFiles('electron/native/whisper-stt/CMakeLists.txt') }}
restore-keys: |
whisper-stt-build-${{ matrix.tag }}-${{ env.ImageOS }}-${{ env.ImageVersion }}-

- name: Run whisper-stt build script
env:
ENABLE_CUDA: ${{ github.event.inputs.enable_cuda || 'false' }}
run: bash scripts/build-whisper-stt.sh

- name: Stage binaries for upload
shell: bash
run: |
set -euo pipefail
BAG="whisper-stt-${{ matrix.tag }}"
mkdir -p "$BAG"
# Copy the whole per-platform directory: the helper executable plus
# every ggml backend sidecar/library it needs at runtime.
#
# -a, because build-whisper-stt.sh stages a symlink farm on Linux and
# macOS (libggml-vulkan.so -> .so.0 -> .so.0.15.1) and plain cp follows
# every link named on the command line, expanding each into a full copy
# of the payload. libggml-vulkan.so.0.15.1 alone is 60 MB, so the bag
# carried it three times: measured 188 MB instead of 63 MB, and the
# uploaded tarball 59 MB instead of 20 MB (gzip's 32 KiB window cannot
# dedupe copies that far apart). `dir/.` rather than `dir/*` so the copy
# does not depend on the shell's glob skipping dotfiles.
#
# tar preserves the links from here on (no -h below), so this shrinks
# the artifact and the CI download. It does NOT change the installers:
# scripts/stage-whisper-stt.sh:65 is a second plain `cp` that re-expands
# the farm before electron-builder ever sees it. Making that one -a too
# would cut ~131 MB from every package (electron-builder recreates
# symlinks, and squashfs/AppImage stores them natively — both verified),
# but deb/pacman go through fpm, whose behaviour here is unverified, so
# that step needs a real package inspection rather than a guess.
cp -av "electron/native/bin/${{ matrix.tag }}/." "$BAG/"
tar -czf "${BAG}.tar.gz" "$BAG"
echo "Staged ${BAG}.tar.gz"

- name: Upload binaries
uses: actions/upload-artifact@v4
with:
name: whisper-stt-${{ matrix.tag }}
path: whisper-stt-${{ matrix.tag }}.tar.gz
if-no-files-found: error
# build.yml now stages these into the installers
# (scripts/stage-whisper-stt.sh), so an expired artifact fails a
# release build. 90 days instead of 30 to make that rarer.
retention-days: 90

- name: Workflow summary
if: always()
# Explicit shell: the bash `{ ... } >> file` grouping syntax below is
# not valid PowerShell, which is the default `run:` shell on Windows
# runners — this step silently failed on Windows without this.
shell: bash
run: |
{
echo "## whisper-stt build"
echo ""
echo "- Matrix: \`${{ matrix.label }}\`"
echo "- Result: ${{ job.status }}"
} >> "$GITHUB_STEP_SUMMARY"
Loading
Loading