Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
387 commits
Select commit Hold shift + click to select a range
61ab01a
docs: the cursor pipeline and its diagnostics
EtienneLescot Jul 26, 2026
eeedab1
docs: add npm run docs:check, and complete the preview chain in the o…
EtienneLescot Jul 26, 2026
1cd0c29
docs(architecture): transcription through to rendered captions
EtienneLescot Jul 26, 2026
1c8feb5
docs(testing): one manual E2E checklist against the v4 shell
EtienneLescot Jul 26, 2026
4466e54
docs: drop the _harvest staging directory
EtienneLescot Jul 26, 2026
c190a39
ci: run CI on feat/ai-edition, and gate the docs tree
EtienneLescot Jul 26, 2026
1ef32ff
fix(test): make two platform-dependent tests pass off Windows, and cl…
EtienneLescot Jul 26, 2026
1f6f193
fix(inspector): stop the collapse button swallowing every pane's Help…
EtienneLescot Jul 26, 2026
3fcbdca
test(e2e): retarget the editor specs at the v4 shell
EtienneLescot Jul 26, 2026
9d6e7e1
refactor(exporter): delete the web MP4 pipeline the native path replaced
EtienneLescot Jul 26, 2026
f69a89a
chore: drop the two superseded POCs and their spike residue
EtienneLescot Jul 26, 2026
4e06815
docs: drop consumed one-shot plans and a stale tracked worktree handoff
EtienneLescot Jul 26, 2026
980d96b
chore(deps): drop seven unused dependencies and a ghost CI cache
EtienneLescot Jul 26, 2026
eef1b0f
fix(export): remove the hardcoded fixture path from the shipped addon
EtienneLescot Jul 26, 2026
6649646
docs: repoint the export and preview docs at what survives the deletion
EtienneLescot Jul 26, 2026
71c99a4
refactor(math): one clamp instead of sixteen
EtienneLescot Jul 26, 2026
3566798
refactor: crypto.randomUUID over the uuid dep, and one MSVC bootstrap
EtienneLescot Jul 26, 2026
fc13624
refactor(format): one timecode module instead of six copies
EtienneLescot Jul 26, 2026
dfa6d1e
refactor: reuse the gradient parser, and spread the settings patch
EtienneLescot Jul 26, 2026
7bf0731
fix: restore the two guards the dedup dropped, and keep gradients gra…
EtienneLescot Jul 26, 2026
51126bc
chore: tighten the dedup's loose ends
EtienneLescot Jul 26, 2026
8a3eaaf
refactor(schema): drop the four document fields nothing ever read
EtienneLescot Jul 26, 2026
97d1c53
refactor(llm): one provider stack, and a real Copilot token swap
EtienneLescot Jul 26, 2026
41caa27
refactor(store): drop seven timeline actions with no callers
EtienneLescot Jul 26, 2026
60acafe
fix(llm): finish the reroute — Codex account header, one model per run
EtienneLescot Jul 26, 2026
a2070a0
chore(schema): finish the four-field removal the fixtures missed
EtienneLescot Jul 26, 2026
36e3966
refactor(editor): drop the write-only showTrimWaveform setting
EtienneLescot Jul 26, 2026
aecc236
fix(compositor): resolve scene assets outside the asar, so themes and…
EtienneLescot Jul 26, 2026
67a51e1
fix(zoom): feather the tilted plane's edge at radius 0, so a 3D zoom …
EtienneLescot Jul 26, 2026
f7a020d
fix(background): accept a blank MIME type by extension, and say so wh…
EtienneLescot Jul 26, 2026
e0c06ce
fix(compositor): bypass Electron's asar-transparent fs when probing f…
EtienneLescot Jul 27, 2026
ec81c6d
fix(cursor): pivot custom cursors on their hotspot, and give the nati…
EtienneLescot Jul 27, 2026
21e4713
fix(cursor): put the cursor on the tilted plane instead of floating i…
EtienneLescot Jul 27, 2026
1dc867a
fix(stt): re-anchor whisper's word boundaries on the audio, so transc…
EtienneLescot Jul 27, 2026
eb8bd0b
fix(transport): remove non-functional loop and fullscreen buttons
EtienneLescot Jul 27, 2026
9db8bdc
fix(llm): drop the two providers that shipped borrowed vendor credent…
EtienneLescot Jul 27, 2026
b8e0d4f
fix(ipc): one document service, a protocol allowlist, and a loopback-…
EtienneLescot Jul 27, 2026
ff683c7
ci(release): run CI on release branches, and stage the STT binaries i…
EtienneLescot Jul 27, 2026
18a9696
ci: make the test typecheck a ratchet instead of a permanent red X
EtienneLescot Jul 27, 2026
51754cc
fix(topbar): hide left side panel toggle in Media and Rec modes
EtienneLescot Jul 27, 2026
c28981b
feat(titlebar): seamless window titlebar on Windows, macOS and Linux
EtienneLescot Jul 27, 2026
5b48a33
build(win): fail the pack on a stale compositor addon, and split poc-…
EtienneLescot Jul 27, 2026
4bae44e
docs(website): rewrite the feature docs against the v4 shell
EtienneLescot Jul 27, 2026
f6ad8a7
docs(roadmap): reconcile the roadmap with what actually shipped
EtienneLescot Jul 27, 2026
6d989f2
docs(architecture): repoint the LLM provider doc at the transport tha…
EtienneLescot Jul 27, 2026
96766b8
chore(i18n): drop two dead string blocks and the phantom Add Blur sho…
EtienneLescot Jul 27, 2026
7596cd8
docs(perf): lead with the D3D11 result instead of burying it under th…
EtienneLescot Jul 27, 2026
264251f
docs(perf): record an admissible C0..C8 run, and the cursor fixture's…
EtienneLescot Jul 27, 2026
23de945
fix(i18n): translate the captions pane in the 11 locales that fell ba…
EtienneLescot Jul 27, 2026
8f009c4
feat(chat): add welcome view when no LM provider is connected
EtienneLescot Jul 27, 2026
2cf98a0
fix(chat): show welcome when active provider is selected but disconne…
EtienneLescot Jul 27, 2026
25297d9
fix(chat): keep the welcome view honest about loading, history and de…
EtienneLescot Jul 27, 2026
a183712
fix(timeline): let the chat confirm Auto-enhance, instead of the time…
EtienneLescot Jul 27, 2026
4ef7abc
refactor(chat): trim the welcome card to what it actually needs
EtienneLescot Jul 27, 2026
1d28c72
feat(export): pick the video encoder from the host's hardware, with a…
EtienneLescot Jul 27, 2026
1b9f66a
fix(export): make the encoder choice forceable, and the fallback MP4 …
EtienneLescot Jul 27, 2026
f1523d5
ci(release): restrict the 1.8.0 build to Windows
EtienneLescot Jul 27, 2026
f6e90b3
chore(release): bump to 1.8.0-rc.1 [skip ci]
github-actions[bot] Jul 27, 2026
bce2477
fix(build): vendor the ffmpeg SDK so CI can build the compositor addon
EtienneLescot Jul 27, 2026
46e0cb8
chore(release): bump to 1.8.0-rc.2 [skip ci]
EtienneLescot Jul 27, 2026
60f53c3
chore(release): bump to 1.8.0-rc.3 [skip ci]
github-actions[bot] Jul 27, 2026
9e586bd
fix(stt): stop linking OpenSSL, and load-check the staged binary
EtienneLescot Jul 27, 2026
2535d3e
chore(release): bump to 1.8.0-rc.4 [skip ci]
github-actions[bot] Jul 27, 2026
912512d
fix(ai-edition): floor Anthropic-wire maxTokens at 16k for unknown mo…
EtienneLescot Jul 28, 2026
cc97851
fix(topbar): project rename in the v4 header (#180)
EtienneLescot Jul 28, 2026
617900d
chore: remove + skip button in the chat panel
EtienneLescot Jul 28, 2026
6185855
chore: drop the now-unused aiEdition.runTimelineOperation IPC plumbing
EtienneLescot Jul 28, 2026
861fe21
refactor: extract useSequentialTimelineOps hook from NewEditorShell
EtienneLescot Jul 28, 2026
a42cdf8
fix(ci): make useSequentialTimelineOps.test pass tsconfig.test.json, …
EtienneLescot Jul 28, 2026
915f54d
feat(chat): stream reasoning trace into the chat panel
EtienneLescot Jul 28, 2026
bb2324a
fix(export): keep the caption background plate through the native bridge
EtienneLescot Jul 28, 2026
8194640
fix(compositor): stop the colour parser panicking on non-ASCII, and f…
EtienneLescot Jul 28, 2026
1d96164
fix(preview): stop drawing captions twice in the preview
EtienneLescot Jul 28, 2026
7b6d949
docs(captions): fold the two render paths into the one that survived
EtienneLescot Jul 28, 2026
c2efc9e
fix(compositor): let zooms overflow the preview padding
EtienneLescot Jul 28, 2026
38a84e8
fix(compositor): don't let the screen shadow/roundness follow the zoo…
EtienneLescot Jul 28, 2026
5ea5c15
fix(compositor): make the zoom-frame growth continuous instead of bi…
EtienneLescot Jul 28, 2026
aca155d
fix(compositor): split the zoom between the box and the source cut
EtienneLescot Jul 28, 2026
0ca264b
fix(compositor): hand the whole zoom to the box, not a share of it
EtienneLescot Jul 28, 2026
9475edd
chore(cleanup): remove dead exports, scripts, and an always-true feat…
EtienneLescot Jul 28, 2026
2627597
docs: drop references to the scripts this PR deletes
EtienneLescot Jul 28, 2026
a014ea3
perf: make platformUtils synchronous via preload
EtienneLescot Jul 28, 2026
d69228e
fix(platform): read platform from preload, not the renderer's absent …
EtienneLescot Jul 28, 2026
ec31099
test(platform): guard the renderer/browser platform read
EtienneLescot Jul 28, 2026
b8b787c
chore(cleanup): replace hand-rolled i18n loader with i18next
EtienneLescot Jul 28, 2026
0795d28
fix(i18n): drop the dead module-scope localStorage read, restore key-…
EtienneLescot Jul 28, 2026
a6b58fc
refactor: drop legacy single-session default chat path
EtienneLescot Jul 28, 2026
136cfa3
chore(contracts): drop the three orphaned chat request arms
EtienneLescot Jul 28, 2026
9c6ac4e
chore(cleanup): move pure-math out of components/video-editor/videoPl…
EtienneLescot Jul 28, 2026
1b80c0d
refactor: shrink YAGNI signatures
EtienneLescot Jul 28, 2026
de452dd
refactor(speed): reuse clampPlaybackSpeed, narrow the parser signature
EtienneLescot Jul 28, 2026
1525ea8
refactor: drop legacy 'native' AspectRatio via v6 schema migration
EtienneLescot Jul 28, 2026
00baccd
fix(schema): migrate 'native' using CROPPED dims, and unbreak the mai…
EtienneLescot Jul 28, 2026
741d0e8
fix(schema): never force-bake 'native' before the source is probed
EtienneLescot Jul 29, 2026
40df7cc
refactor: schema region consolidation + playback cap + deep-agent fold
EtienneLescot Jul 28, 2026
f92ca8d
fix(docs,speed): repoint folded doc link, correct the cap comment
EtienneLescot Jul 28, 2026
f3cfa76
revert(speed): restore the 100x playback cap
EtienneLescot Jul 28, 2026
3b301f9
perf: hoist v3/v4/v5 schema migrations to load-time
EtienneLescot Jul 28, 2026
8f5fb83
fix(schema): keep the migration composer out of the aliased module graph
EtienneLescot Jul 28, 2026
cc346e0
feat(export): add native GIF export pipeline (slice 1, behind flag)
EtienneLescot Jul 28, 2026
e14d930
fix(gif): one trailer per file, clean up a failed export, revert lock…
EtienneLescot Jul 28, 2026
e84f513
refactor(export): drive GIF from the video exporter's own frame walk
EtienneLescot Jul 28, 2026
d4dc9cc
feat(export): route GIF through the native exporter, delete the pixi …
EtienneLescot Jul 28, 2026
7cc8017
chore(pixi): remove pixi.js — the last consumers were already dead code
EtienneLescot Jul 29, 2026
645a0d3
perf(timeline): stop the playhead from re-rendering the whole editor …
EtienneLescot Jul 29, 2026
b322df4
perf(preview): chemin rapide de seek — ne plus jeter l'état du décode…
EtienneLescot Jul 29, 2026
8d48b53
fix(preview): le <video> ne dicte plus la position de la timeline à l…
EtienneLescot Jul 29, 2026
4582a84
perf(preview): livrer la frame sans la copier
EtienneLescot Jul 29, 2026
661e18b
chore(perf): sonde de fluidité de l'UI, segmentée par état
EtienneLescot Jul 30, 2026
d4a4e0c
perf(timeline): ne plus re-rendre la timeline à chaque événement sour…
EtienneLescot Jul 30, 2026
6fe7ef8
Revert "perf(timeline): ne plus re-rendre la timeline à chaque événem…
EtienneLescot Jul 30, 2026
3037942
chore(perf): la sonde sépare les mesures d'avant et d'après un franch…
EtienneLescot Jul 30, 2026
a2041ad
perf(preview): ne plus rouvrir les décodeurs quand seul le segment ch…
EtienneLescot Jul 30, 2026
4f8f585
fix(preview): vider le cache de SRV quand un jeu de décodeurs est fermé
EtienneLescot Jul 30, 2026
827d97d
fix(preview): repli sûr quand le repositionnement échoue, et ne plus …
EtienneLescot Jul 30, 2026
843fbc1
chore(perf): la sonde distingue le scrub timeline du scrub barre de p…
EtienneLescot Jul 30, 2026
7b9ad3a
perf(transport): coalescer le drag de la barre de progression en rAF
EtienneLescot Jul 30, 2026
d82223d
perf(transport): écrire le curseur de la barre directement dans le DO…
EtienneLescot Jul 30, 2026
cdca43f
feat(compositor): fail legibly when D3D11 init fails, instead of fall…
EtienneLescot Jul 27, 2026
ba884a3
docs(compositor): correct the WGC rationale -- capture is not mandatory
EtienneLescot Jul 27, 2026
fe1c1a0
feat(compositor): add a CPU backend -- WARP render + software decode,…
EtienneLescot Jul 27, 2026
98edcc8
feat(compositor): select the CPU backend automatically, and tell the …
EtienneLescot Jul 27, 2026
31524bb
feat(compositor): let the CPU backend reach the export encoder
EtienneLescot Jul 27, 2026
7f724b9
fix(compositor): CPU backend reach on the GIF-refactored pipeline
EtienneLescot Jul 29, 2026
1d6a138
feat(compositor): scaffold macOS Metal+VideoToolbox port
EtienneLescot Jul 28, 2026
d92e8e9
feat(compositor): mac_frames.rs — software decode → NV12 → CVPixelBuf…
EtienneLescot Jul 28, 2026
32935da
feat(compositor): add d3d_macos, text_macos, wrapper_macos — backend …
EtienneLescot Jul 28, 2026
4dec9ba
feat(compositor): compositor_macos — Compositor skeleton, CVMetalText…
EtienneLescot Jul 28, 2026
77b7567
feat(compositor): shaders.metal — MSL port of all 9 shader entry points
EtienneLescot Jul 28, 2026
c8fe965
feat(compositor): pipeline_macos — VideoToolbox hwaccel decode + dual…
EtienneLescot Jul 28, 2026
f1725cf
fix(compositor/build.rs): discover macOS SDK via xcrun on macOS
EtienneLescot Jul 28, 2026
ab2e1ea
fix(ci): indent the build: job so the macOS job parses
EtienneLescot Jul 28, 2026
d2fffec
feat(compositor): compositor_macos engine — render targets, MSL pipel…
EtienneLescot Jul 28, 2026
7830f54
feat(compositor): pipeline_macos::Decoder — seek / next / cur_time_se…
EtienneLescot Jul 28, 2026
eb984b2
feat(compositor): pipeline_macos::VideoEncoder — h264_videotoolbox + …
EtienneLescot Jul 28, 2026
ba431ab
feat(compositor): pipeline_macos::run_composited_multi — multi-clip e…
EtienneLescot Jul 28, 2026
ff34c70
feat(compositor): text_metal — CoreText/CoreGraphics text rasterizer
EtienneLescot Jul 28, 2026
834dc3d
fix(compositor): dedup `pub mod live` and `pub mod pipeline` in lib.rs
EtienneLescot Jul 29, 2026
2aa5c1f
fix(compositor/build.rs): reach the macOS ffmpeg and libclang at all
EtienneLescot Jul 29, 2026
dd9aa79
fix(compositor): AVERROR(EAGAIN) is -35 on macOS, not -11
EtienneLescot Jul 29, 2026
0efc44c
refactor(compositor): move the timeline walk out of the Windows pipeline
EtienneLescot Jul 29, 2026
e4ba0b6
fix(compositor): port shaders.metal to MSL that actually compiles
EtienneLescot Jul 29, 2026
e425214
feat(compositor): make the Metal engine produce a frame
EtienneLescot Jul 29, 2026
d1b5e66
fix(compositor): rewrite text_macos.rs on the CoreText C API
EtienneLescot Jul 29, 2026
204689e
fix(app): open the HUD without waiting for the microphone prompt
EtienneLescot Jul 29, 2026
e1774fe
fix(compositor-view): actually find the addon, unpackaged and packaged
EtienneLescot Jul 29, 2026
18d3ea8
build(mac): add the macOS compositor addon build script
EtienneLescot Jul 29, 2026
840d22f
ci(macos): run the compositor tests, not just a type-check
EtienneLescot Jul 29, 2026
9dda4c7
fix(build,test): unblock tsc, and stop assuming an x64 host
EtienneLescot Jul 29, 2026
6ef9b19
docs(compositor): repoint the module map at the per-platform files
EtienneLescot Jul 29, 2026
7396534
ci(windows): cargo check the compositor on every PR
EtienneLescot Jul 29, 2026
4d5de11
refactor(compositor): move the pure geometry into frame_geometry
EtienneLescot Jul 29, 2026
3847402
refactor(compositor): one LayerCB, one LiveParams, for both backends
EtienneLescot Jul 29, 2026
bdb2c23
refactor(compositor): compose_frame's geometry becomes plan_frame
EtienneLescot Jul 29, 2026
a009f0c
fix(build/mac): install the addon by rename, not by overwriting it
EtienneLescot Jul 29, 2026
7662182
fix(compositor): three MSL modes that were mis-ported from HLSL
EtienneLescot Jul 29, 2026
df31335
feat(compositor): draw the layers on Metal, not just the video
EtienneLescot Jul 29, 2026
8960a3f
feat(compositor): render the cursor on Metal, trail included
EtienneLescot Jul 29, 2026
68bb019
feat(compositor): wire the dual-Kawase background blur on Metal
EtienneLescot Jul 29, 2026
576eae6
fix(compositor): the shadow fix landed in dead code, and two more div…
EtienneLescot Jul 29, 2026
21a082e
feat(compositor): render the 3D tilt on Metal — and unbreak modes 8, …
EtienneLescot Jul 29, 2026
08a39ac
fix(compositor): the three annotation modes were each a different shader
EtienneLescot Jul 29, 2026
1fb71cb
feat(compositor): draw annotations on Metal, and call the CoreText ra…
EtienneLescot Jul 29, 2026
77cbe2f
feat(compositor): macOS export encodes — first MP4 out of the Metal e…
EtienneLescot Jul 29, 2026
268363b
test(compositor): pin the iso-render claim to a number
EtienneLescot Jul 29, 2026
ee887f3
feat(compositor): mux audio into the macOS export
EtienneLescot Jul 29, 2026
a319167
fix(compositor): the annotation blur sampled mip 0 and so blurred not…
EtienneLescot Jul 29, 2026
8280ab6
fix(compositor): text annotations were rendered upside down
EtienneLescot Jul 29, 2026
bc7a772
perf(compositor): 2.4x on macOS export — VideoToolbox was the slow path
EtienneLescot Jul 29, 2026
2a03e2f
perf(compositor): render NV12 straight into the encoder's CVPixelBuffer
EtienneLescot Jul 29, 2026
0f4dea5
build(mac): ship the ffmpeg dylibs, and vendor them LGPL by construction
EtienneLescot Jul 29, 2026
b8f7183
fix(compositor): mac was missing clear_srv_cache after the rebase ont…
EtienneLescot Jul 30, 2026
e8e957c
perf(preview): pool de décodeurs — plus de réouverture au franchissem…
EtienneLescot Jul 30, 2026
21dd3bb
fix(preview): seek_to retombe sur un seek complet quand le décode-ava…
EtienneLescot Jul 30, 2026
ef1edfe
fix(preview): supprimer l'overlay « Loading preview… » qui recouvrait…
EtienneLescot Jul 30, 2026
51673be
fix(stt): make the macOS whisper helper actually shippable, and repor…
EtienneLescot Jul 30, 2026
82ef90a
fix(stt): resolve the model cache from the app's userData name, not "…
EtienneLescot Jul 30, 2026
eb148be
fix(i18n): transcription does not run in the browser
EtienneLescot Jul 30, 2026
c091195
fix(macos): don't content-protect windows on macOS 26 — it makes them…
EtienneLescot Jul 30, 2026
a84eb3d
test(stt): split the word-timing assertions, and stop failing on raw …
EtienneLescot Jul 30, 2026
92279c0
build(macos): strip the build-machine path from the shipped composito…
EtienneLescot Jul 30, 2026
7e3cdce
build(macos): package the compositor addon, and refuse an incomplete …
EtienneLescot Jul 30, 2026
3c18b37
fix(ci): re-piner le build ffmpeg BtbN, dont la release a été purgée
EtienneLescot Jul 30, 2026
4947a9d
fix(compositor): les blocs de texte se centrent dans leur boîte, et l…
EtienneLescot Jul 30, 2026
be3ae1a
fix(compositor): annotations et sous-titres ne suivent plus le zoom
EtienneLescot Jul 30, 2026
8b485bf
feat(timeline): playhead and ruler reworked to the reference design
EtienneLescot Jul 30, 2026
2e16886
chore(i18n): drop three timeline strings nothing references any more
EtienneLescot Jul 30, 2026
73a3a34
fix(topbar): stop the header re-flowing on every state change
EtienneLescot Jul 30, 2026
b0bf0b0
fix(gif): l'encodeur LZW grossissait ses codes un cran trop tôt
EtienneLescot Jul 31, 2026
d29b3f2
fix(shim): un abonnement manquant faisait planter tout l'éditeur en m…
EtienneLescot Jul 31, 2026
991ee56
fix(preview): un asset orphelin vidait tout le preview
EtienneLescot Jul 31, 2026
7b9a734
test(e2e): repointer la spec d'export sur le dialogue v4, et isoler l…
EtienneLescot Jul 31, 2026
e703aea
docs(testing): couvrir la surface v1.8.0 dans le checklist e2e manuel
EtienneLescot Jul 31, 2026
2e3757a
fix(stt): make the Linux whisper helper relocatable
EtienneLescot Jul 31, 2026
e5591ac
Revert "fix(stt): make the Linux whisper helper relocatable"
EtienneLescot Jul 31, 2026
91741a4
fix(recording): le helper macOS muxait deux pistes audio, dont une se…
EtienneLescot Jul 31, 2026
7c50b9d
feat(compositor): re-express the Linux port on the v1.8.0 cross-backe…
EtienneLescot Jul 30, 2026
19d6d30
feat(compositor): draw text annotations in compositor_linux (WGSL mod…
EtienneLescot Jul 30, 2026
b0e524e
feat(compositor): draw the webcam PiP in compositor_linux compose_frame
EtienneLescot Jul 30, 2026
8bd6a65
feat(compositor): background blur (dual-Kawase) in compositor_linux
EtienneLescot Jul 30, 2026
76e4155
feat(compositor): themed cursor sprite (mode 7) in compositor_linux
EtienneLescot Jul 30, 2026
574c59f
feat(compositor): Linux video export (WP6) — software encode + MP4 mux
EtienneLescot Jul 30, 2026
03741a8
feat(compositor): mux AAC audio in Linux export (WP6)
EtienneLescot Jul 30, 2026
5567ea4
feat(compositor): image background (WGSL mode 6 wallpaper) in composi…
EtienneLescot Jul 30, 2026
0b8b760
fix(hud): -0 out of Math.round crashed the main process on Wayland
EtienneLescot Jul 30, 2026
6e3dc7b
fix(hud): the drag region sat on the window root, not the grab handle
EtienneLescot Jul 30, 2026
189a676
build(vite): stop watching the vendored ffmpeg tree
EtienneLescot Jul 30, 2026
6de556b
style(compositor): repair the mojibake and CRLF in the Linux sources
EtienneLescot Jul 30, 2026
74f216f
fix(compositor): indexing the array twice made naga emit invalid SPIR-V
EtienneLescot Jul 30, 2026
0971360
build(linux): build the native compositor addon
EtienneLescot Jul 30, 2026
c1daa8a
fix(compositor): the addon bound to Chromium's ffmpeg, not ours
EtienneLescot Jul 30, 2026
9256768
Revert "fix(compositor): the addon bound to Chromium's ffmpeg, not ours"
EtienneLescot Jul 30, 2026
9e3faf6
fix(compositor): rename the ffmpeg symbols so Chromium's cannot win
EtienneLescot Jul 30, 2026
218001e
perf(compositor): stop re-seeking the decoder for every sequential frame
EtienneLescot Jul 31, 2026
dbbdcc3
perf(compositor): the readback zero-filled 8 MB it overwrote a line l…
EtienneLescot Jul 31, 2026
f909410
fix(compositor): rewind and scan when the file has no seek index
EtienneLescot Jul 31, 2026
4ffa5e0
feat(cursor): capture real cursor telemetry on Wayland via the Screen…
EtienneLescot Jul 31, 2026
5f0f9cb
fix(compositor): the webcam froze because the seek flag was 4, not 1
EtienneLescot Jul 31, 2026
b3b5bb6
perf(compositor): pipeline the export readback instead of stalling on it
EtienneLescot Jul 31, 2026
845bd9f
fix(recording): remux Linux captures so they carry a real Duration
EtienneLescot Jul 31, 2026
8cdb40d
docs(hud): record why the cursor-mode toggle is Windows/macOS only
EtienneLescot Jul 31, 2026
00ef863
feat(capture): give the Linux helper a hardware H.264 encoder
EtienneLescot Jul 31, 2026
4eff0e0
feat(capture): the Linux helper now records video, not just the cursor
EtienneLescot Jul 31, 2026
ec7f142
feat(capture): record system audio and the microphone alongside the v…
EtienneLescot Jul 31, 2026
efb4b4c
feat(recording): route Linux capture through the native helper
EtienneLescot Jul 31, 2026
3067acf
fix(preview): stop leaking a decoded frame per scrub step
EtienneLescot Jul 31, 2026
f2ca42a
fix(annotations): make Linux text annotations legible
EtienneLescot Jul 31, 2026
9d83fe2
fix(compositor): cover-crop and mirror the Linux webcam, drop the dea…
EtienneLescot Jul 31, 2026
28dc54a
feat(compositor): draw the screen and camera shadows on Linux
EtienneLescot Jul 31, 2026
6ce4802
feat(compositor): tilted 3D zoom on Linux (shader modes 8, 12 and 13)
EtienneLescot Jul 31, 2026
2a2cc28
wip: motion blur (agent output, pre-merge)
EtienneLescot Jul 31, 2026
8e31be6
test(compositor): pin the Linux webcam circle mask, and fix two tests…
EtienneLescot Jul 31, 2026
e7ae509
fix(annotations): centre Linux text vertically in its box
EtienneLescot Jul 31, 2026
94108e8
fix(stt): stop compiling the shipped whisper helper for the build mac…
EtienneLescot Jul 31, 2026
1cec7eb
ci(stt): stop tripling the whisper libraries in the uploaded artifact
EtienneLescot Jul 31, 2026
82d6800
fix(editor): push every native param on load, not just the open panel's
EtienneLescot Jul 31, 2026
238e66f
fix(capture): record the microphone the user picked, in one mixed track
EtienneLescot Jul 31, 2026
f3996cd
fix(capture): log which node each audio source was linked to
EtienneLescot Jul 31, 2026
4f4d43d
feat(annotations): start a new text annotation with localised text
EtienneLescot Jul 31, 2026
be82bc4
fix(editor): stop losing the camera to a fractional offset
EtienneLescot Jul 31, 2026
5307f5a
feat(annotations): draw arrows, blur/mosaic masks and images on Linux
EtienneLescot Jul 31, 2026
2c73397
fix(ci): repair the three checks the rebase onto v1.8.0 broke
EtienneLescot Jul 31, 2026
51ec914
fix(agent): le bac à sable de deepagents fabriquait une preuve d'absence
EtienneLescot Jul 31, 2026
4b3774f
feat(agent): donner au modèle la trajectoire du curseur, pas le verdi…
EtienneLescot Jul 31, 2026
5d66f8c
feat(timeline): le wizard IA ne fait plus que les coupes
EtienneLescot Jul 31, 2026
95e31c0
test(workbench): un banc headless pour mesurer l'agent d'édition
EtienneLescot Jul 31, 2026
b3914c3
test(e2e): repointer les deux dernières assertions Windows sur le dia…
EtienneLescot Jul 31, 2026
eee6a9a
perf(agent): réduire la trajectoire curseur en keyframes, et desserre…
EtienneLescot Jul 31, 2026
ea354cd
docs(agent): pistes d'amélioration mesurées, à traiter plus tard
EtienneLescot Jul 31, 2026
0d2dbcb
docs(agent): corriger le diagnostic du timeout, et recommander les ap…
EtienneLescot Jul 31, 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