Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
9bc8f8a
feat(compositor): re-express the Linux port on the v1.8.0 cross-backe…
EtienneLescot Jul 30, 2026
611d5c2
feat(compositor): draw text annotations in compositor_linux (WGSL mod…
EtienneLescot Jul 30, 2026
16f2ea1
feat(compositor): draw the webcam PiP in compositor_linux compose_frame
EtienneLescot Jul 30, 2026
ebd2ca2
feat(compositor): background blur (dual-Kawase) in compositor_linux
EtienneLescot Jul 30, 2026
8639d00
feat(compositor): themed cursor sprite (mode 7) in compositor_linux
EtienneLescot Jul 30, 2026
a5fd6eb
feat(compositor): Linux video export (WP6) — software encode + MP4 mux
EtienneLescot Jul 30, 2026
aa8d310
feat(compositor): mux AAC audio in Linux export (WP6)
EtienneLescot Jul 30, 2026
a433d7b
feat(compositor): image background (WGSL mode 6 wallpaper) in composi…
EtienneLescot Jul 30, 2026
3d5c038
fix(hud): -0 out of Math.round crashed the main process on Wayland
EtienneLescot Jul 30, 2026
8c939a9
fix(hud): the drag region sat on the window root, not the grab handle
EtienneLescot Jul 30, 2026
3c8a3db
build(vite): stop watching the vendored ffmpeg tree
EtienneLescot Jul 30, 2026
3620c64
style(compositor): repair the mojibake and CRLF in the Linux sources
EtienneLescot Jul 30, 2026
f885443
fix(compositor): indexing the array twice made naga emit invalid SPIR-V
EtienneLescot Jul 30, 2026
4a7fb6a
build(linux): build the native compositor addon
EtienneLescot Jul 30, 2026
c0a3e72
fix(compositor): the addon bound to Chromium's ffmpeg, not ours
EtienneLescot Jul 30, 2026
d15bb3f
Revert "fix(compositor): the addon bound to Chromium's ffmpeg, not ours"
EtienneLescot Jul 30, 2026
cca8ebd
fix(compositor): rename the ffmpeg symbols so Chromium's cannot win
EtienneLescot Jul 30, 2026
55dbb31
perf(compositor): stop re-seeking the decoder for every sequential frame
EtienneLescot Jul 31, 2026
5106c01
perf(compositor): the readback zero-filled 8 MB it overwrote a line l…
EtienneLescot Jul 31, 2026
7fac7f2
fix(compositor): rewind and scan when the file has no seek index
EtienneLescot Jul 31, 2026
fb8aea8
feat(cursor): capture real cursor telemetry on Wayland via the Screen…
EtienneLescot Jul 31, 2026
5fa7613
fix(compositor): the webcam froze because the seek flag was 4, not 1
EtienneLescot Jul 31, 2026
a58d4fa
perf(compositor): pipeline the export readback instead of stalling on it
EtienneLescot Jul 31, 2026
ae1d905
fix(recording): remux Linux captures so they carry a real Duration
EtienneLescot Jul 31, 2026
219b772
docs(hud): record why the cursor-mode toggle is Windows/macOS only
EtienneLescot Jul 31, 2026
70313ca
feat(capture): give the Linux helper a hardware H.264 encoder
EtienneLescot Jul 31, 2026
b2facc3
feat(capture): the Linux helper now records video, not just the cursor
EtienneLescot Jul 31, 2026
98d42d5
feat(capture): record system audio and the microphone alongside the v…
EtienneLescot Jul 31, 2026
83b50e1
feat(recording): route Linux capture through the native helper
EtienneLescot Jul 31, 2026
419554f
fix(preview): stop leaking a decoded frame per scrub step
EtienneLescot Jul 31, 2026
796411f
fix(annotations): make Linux text annotations legible
EtienneLescot Jul 31, 2026
9294656
fix(compositor): cover-crop and mirror the Linux webcam, drop the dea…
EtienneLescot Jul 31, 2026
6cfbfaa
feat(compositor): draw the screen and camera shadows on Linux
EtienneLescot Jul 31, 2026
e6bcd79
feat(compositor): tilted 3D zoom on Linux (shader modes 8, 12 and 13)
EtienneLescot Jul 31, 2026
ac79c90
wip: motion blur (agent output, pre-merge)
EtienneLescot Jul 31, 2026
d276439
test(compositor): pin the Linux webcam circle mask, and fix two tests…
EtienneLescot Jul 31, 2026
846ff23
fix(annotations): centre Linux text vertically in its box
EtienneLescot Jul 31, 2026
86579ef
fix(stt): stop compiling the shipped whisper helper for the build mac…
EtienneLescot Jul 31, 2026
fd45999
ci(stt): stop tripling the whisper libraries in the uploaded artifact
EtienneLescot Jul 31, 2026
8079d32
fix(editor): push every native param on load, not just the open panel's
EtienneLescot Jul 31, 2026
641bd7d
fix(capture): record the microphone the user picked, in one mixed track
EtienneLescot Jul 31, 2026
2b0b8e3
fix(capture): log which node each audio source was linked to
EtienneLescot Jul 31, 2026
6a8be58
feat(annotations): start a new text annotation with localised text
EtienneLescot Jul 31, 2026
bb3b4f1
fix(editor): stop losing the camera to a fractional offset
EtienneLescot Jul 31, 2026
1085fb0
feat(annotations): draw arrows, blur/mosaic masks and images on Linux
EtienneLescot Jul 31, 2026
3907810
fix(ci): repair the three checks the rebase onto v1.8.0 broke
EtienneLescot Jul 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
20 changes: 19 additions & 1 deletion .github/workflows/build-whisper-stt.yml
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,25 @@ jobs:
mkdir -p "$BAG"
# Copy the whole per-platform directory: the helper executable plus
# every ggml backend sidecar/library it needs at runtime.
cp -v "electron/native/bin/${{ matrix.tag }}"/* "$BAG/"
#
# -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"

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ jobs:
- name: Typecheck tests against a baseline
shell: bash
env:
BASELINE: 71
BASELINE: 66
run: |
set -uo pipefail
COUNT=$(npx tsc -p tsconfig.test.json --noEmit 2>&1 | grep -c 'error TS' || true)
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ dist-ssr
/electron/native/screencapturekit/.build/
/electron/native/screencapturekit/.swiftpm/
/electron/native/bin/
/electron/native/pipewire-capture/build/
/electron/native/pipewire-capture/target/

# Native macOS generated files
DerivedData/
Expand Down
23 changes: 20 additions & 3 deletions THIRD-PARTY-NOTICES.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,28 @@ distributed by their own registries, not redistributed inside our binaries.
- The speech model (`ggml-*.bin`) is **not** bundled — it is downloaded into the
user's data directory on first use by `electron/stt/modelManager.ts`.

## PipeWire — headers (Linux only)

- **Components**: header sources under
`electron/native/pipewire-capture/vendor/pipewire-1.0.5/include/`, compiled
into `openscreen-pipewire-helper` (the Linux cursor/capture helper) under
`resources/electron/native/bin/linux-*/`.
- **License**: **MIT** — <https://gitlab.freedesktop.org/pipewire/pipewire>.
Every vendored file keeps its upstream `SPDX-License-Identifier: MIT` header,
and the project's licence text is copied alongside them as `COPYING`.
- **Upstream**: PipeWire release 1.0.5. Only the header subset the helper
includes was vendored; `vendor/README.md` records exactly what was copied and
how to reproduce the selection.
- **No PipeWire binary is redistributed.** The helper resolves
`libpipewire-0.3.so.0` with `dlopen` at runtime, from the user's own system,
so nothing of PipeWire's ships inside our installers beyond the compiled
result of its headers (inline functions and struct layouts).

## OpenScreen native helpers

`wgc-capture` (Windows Graphics Capture), the ScreenCaptureKit helper (macOS)
and the D3D11 compositor addon are part of this repository and are covered by
[LICENSE](LICENSE).
`wgc-capture` (Windows Graphics Capture), the ScreenCaptureKit helper (macOS),
the PipeWire helper (Linux) and the compositor addon are part of this repository
and are covered by [LICENSE](LICENSE).

---

Expand Down
3 changes: 3 additions & 0 deletions crates/.gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# build
/target
# `cargo test` lancé DEPUIS crates/compositor/ y crée son propre target/, et les tests
# compose_linux y écrivent leurs PPM de preuve. Même nature que /target ci-dessus.
/compositor/target

# dépendance téléchargée : build ffmpeg LGPL-shared BtbN (~160 Mo, voir README)
/thirdparty
Expand Down
Loading
Loading