Skip to content

v2.2.0

Choose a tag to compare

@EtienneLescot EtienneLescot released this 02 Nov 20:25

OpenScreen 2.2 brings layout changes to the timeline, separate tracks for overlapping annotations, and an update button that puts you in control of installation. This release also improves recording, playback, audio timing and export across Windows, macOS and Linux.

✨ Highlights

Change the layout throughout your video

The new Layouts track lets you switch between picture-in-picture, side-by-side, top/bottom, camera-only and screen-only arrangements as your video plays. Place a change at the playhead, move its boundary to adjust the timing, and let the screen and camera transition smoothly into their next positions.

Layout edits support undo/redo and the AI/MCP tools. Existing Full Camera sections migrate to camera-only layouts while preserving their original easing. #1404

Keep overlapping annotations easy to edit

Annotations that overlap now have their own timeline rows. You can select, move, resize or delete each annotation, even when their timing is identical. Drag vertically to change the stacking order, or horizontally to change when an annotation appears; timing and layer changes undo together. #1243

Overlapping annotations remain accessible on separate timeline tracks

Stop an AI edit and keep the work already done

The chat composer now has a Stop control for a running agent turn. Completed edits and the partial reply are retained, and you can continue with another message. A whole turn produces one undo step, including turns that make many edits. #1368

Export the audio you need

The CLI and MCP tools can now export the full project mix or one imported audio track to WAV or M4A, preserving its placement, trims, gain, fades and speed changes. Useful for taking narration into another audio editor or reusing a finished mix. #1383

openscreen export project.openscreen -o mix.m4a
openscreen export project.openscreen -o narration.wav --track <audioId>

Custom shader effects also gain footage(p): access to the recording at its source resolution, so a loupe or close-up can retain detail that has been scaled down in the composed picture. #1396

Update when you are ready

Self-updating builds check and download new versions in the background, then show a blue update button in the recording bar and editor. Installation starts on your click; an ordinary quit keeps the current version. MCP-only sessions can tell you that a newer release is available and direct you to the app. #1425

On Windows, declining the administrator prompt now keeps OpenScreen open and usable. Accepting it completes the update and restarts the app. Store and Nix installations continue to use their package manager. #1463

🛠 Fixes and improvements

Recording, webcam and cursor

  • Windows screen capture: added a DXGI Desktop Duplication fallback, including recovery, adapter selection, rotation, resizing and correctly sized cursors. #1254
  • macOS webcam: restored continuous webcam recordings and kept VP8 for recordings at 1080p or below. #1297
  • macOS screen picker: reset Apple's picker for each request and ignore stale or unrequested selections. #1370
  • macOS audio: start system-audio capture after the microphone and handle blocked sample queues without treating a temporary stall as a silent source or keeping a dead source alive. #1374, #1412, #1414
  • Cursor placement: align macOS pointer samples with captured content and selected-window bounds; preserve visibility when capture bounds are rebased. #1306
  • Cursor motion: land the flat cursor on clicks more accurately, reduce default smoothing, and handle short gaps between a click hold and the next movement. Changes
  • Linux: start KDE window captures on their first frame, bound window-crop waits by elapsed time, and ignore a second Record press while the portal picker is open. #1351, #1353, #1413
  • Linux cursor/webcam: keep cursor telemetry aligned across pauses, fall back to metadata cursors when embedded cursors are unavailable, and attach the webcam using the stored cursor mode. #1275, #1363
  • Linux configuration: preserve user-supplied Wayland feature flags and support Mesa's RADV_EXPERIMENTAL Vulkan encode path. Changes, #1349

Editing, playback and audio timing

  • Restart playback from the beginning after reaching the end, preserve play/pause intent, and isolate seeks between different sources. #1400
  • Record voiceovers against the uncut source timeline so they remain aligned through trimmed sections. #1236
  • Play imported audio continuously across its timeline region so speed changes keep it on the correct clock; stop a voiceover piece where the next one begins. #1355, #1362
  • Preserve timeline sizing when annotation tracks reach the panel's height limit. #1243
  • Preserve zoom framing and rounded camera corners across layout transitions, including migrated Full Camera sections. #1404
  • Offer 3D Orbit only when the recording has cursor data. #1399
  • Accept custom speed values with a trailing x or ×, such as 1.5x and 1.25×. Changes
  • Accept the suggested system language with Enter and improve Japanese tooltips. Language prompt, #1375

Preview, video colour and export

  • Correct macOS rendering of 10-bit HEVC/iPhone footage and full-range VideoToolbox frames; choose the colour-conversion matrix from each frame, with correct 10-bit bounds. #1408, colour follow-up
  • Tag exported MP4s with their colour matrix, primaries, transfer function and range. #1460
  • Export clips from mostly static recordings using the container duration and hold their available screen frame when the clip begins later. Preserve first-frame holds for offset sources. Static-recording fixes, frame hold
  • Detect unreadable screen/camera starts, large video gaps and empty output; keep recovery bounded to normal video tails and inspect only the requested clips. #1377, #1379
  • Validate a staged MP4 before replacing the destination, and show localized validation errors. Destination validation, #1387
  • Improve macOS 8-bit H.264 preview decoding and shared-texture reuse. #1384, #1373
  • Improve Linux VA-API export compatibility, restricting the extra VPP copy to Intel iHD; configure VA-API driver paths in Nix packages. #1200, #1367

Captions, agents and integrations

  • Read Whisper model paths as UTF-8 on Windows and download transcription models through Chromium's network stack. #1407, #1332
  • Allow MCP addZoom calls to supply customScale without depth; report recording-start failure when the requested camera cannot be opened. #1356, #1371
  • Package the OpenScreen demo workflow for Claude Code and Codex, with installation guides for Claude Code, Codex and ChatGPT. Plugin and setup guide
  • Find Microsoft Store installations when setting up the plugin, provide an openscreen execution alias for Store packages, and guide users when the installed app lacks the required MCP tools. #1354
  • Correct active-install counting for MCP-only sessions and publish clearer documentation about AI-provider data and exported-media sharing. Usage-count fix, Privacy policy

Updates and packaging

  • Keep Windows interactive when elevation is declined; prevent overlapping update attempts and recheck recording/editor readiness before handing control to the installer. #1463
  • Simplify the supported machine-wide Windows update path to the administrator prompt; retain the installer wizard when install scope is ambiguous or cannot be established. #1439
  • Include the correct updater configuration in macOS bundles, including object-form and platform-specific publish settings. macOS updater fix
  • Let manual checks from release candidates discover newer candidates. Changes
  • Improve release-version synchronization, Nix hash handling, Intel Mac test coverage and resilience to transient Apple stapling/validation failures. The complete maintenance, test and documentation history is included below.

Issues completed for v2.2.0

The closed v2.2.0 milestone contains these 14 user reports and tracking issues:

Area Completed issues
Layouts and AI editing Multiple camera layouts in one video #1392 · Stop a running AI turn #1260
Windows recording and captions Display capture when WGC initialization fails #1247 · Transcription under non-ASCII profile paths #1405
macOS recording Presenter Overlay interrupting the camera #1378 · Microphone waiting for a system sound #1173 · Pointer offset #1130
Editing Voiceover timing through trims #1195 · 3D Orbit availability in later projects #1397 · Custom speed with a × suffix #1441
Updates Keep the app usable after declining UAC #1461 · Avoid the full wizard for machine-wide updates #1437 · Discover newer RCs from a manual check #1447
Release QA Recording, editing, export and reopen tracking #1431, completed within the agreed targeted scope described below

Compatibility

  • The Layouts track replaces the Full Camera lane. Existing sections migrate with their camera envelopes and easing; saved projects use project schema v9.
  • Automation can use addLayoutChange, setLayoutPreset and moveLayoutBoundary. Legacy camera executors remain compatibility aliases.
  • After a Windows update, OpenScreen returns to the recording bar (HUD). Saved projects remain available through Open Studio.
  • These notes describe the promoted RC5 source. Recording/edit/export/persistence smoke checks ran on Windows, Apple Silicon macOS and Ubuntu; Windows UAC refusal and acceptance were verified on the final candidate. Validation used a targeted scope with documented gaps.

Known issue

  • Legacy v2 project exports through the CLI: some 3D-cursor, click-effect, webcam and master audio-gain settings can fall back to their defaults when loading the older { version, media, editor } format. This has been reported on v2.2.0 and remains open; the issue includes a comparison with a document-format project. #1467

Other open reports and feature requests remain tracked in GitHub issues.

Download

Platform Packages
Windows x64 installer · ARM64 installer
macOS Apple Silicon · Intel
Linux AppImage · DEB · RPM · Pacman

OpenScreen is free and open source. Thanks to everyone who contributed code, translations, bug reports and release testing.


Complete changelog

Compare all changes from v2.1.2 to v2.2.0.

Every commit in the release range (192 entries)

This chronological source history includes fixes, features, tests, documentation, packaging, release bookkeeping and intermediate implementation steps. Release branches also carry forward changes previously shipped in 2.1.x; the highlights above describe the resulting changes from v2.1.2.

  • fix(preview): advance the camera while a screen frame is held — f85f66251
  • fix(timeline): copy a whole pill, not the fragment clicked — bb754945c
  • docs(testing): compare 2.0.0 and main performance on Windows — e92a7527d
  • docs(testing): add the 60 Hz pass to the 2.0.0 against main comparison — 88be6faac
  • docs(testing): bisect the startup slowdown, retract the editor-open one — 30b268726
  • docs(testing): say which bisection runs overlapped another session's A/B — 4a3062d7b
  • docs(testing): the 60 Hz steps back come from slot reuse, not from main — 298422327
  • fix(perf-ab): address the review of the bench scripts — 9f9dd6b7c
  • fix(compositor): read the macOS preview back through Managed textures on Intel Macs — 7c9b215cb
  • ci: run the compositor tests on an Intel Mac runner — d530c2e5d
  • docs(testing): log the targeted Windows pass of v2.1.0-rc.2 build run 38868631147 — a9384dcc3
  • docs(testing): note the perf bench ran during the rc.2 smoothness measure — 0efceb9f5
  • fix(preview): give a shared frame's slot back 40 ms after Chromium lets go — c5d3dcde2
  • fix(preview): eight ring slots, and a slow display's two frames as the hold floor — 099d54027
  • test(compositor): the stale-ready test holds every slot but the last, whatever the ring size — 0bbc8cc4e
  • docs(testing): log the Windows diff pass of v2.1.0-rc.3 build run 38878886935 — b57864005
  • fix(ai): rewind a chat message from the view it was sent in — 57b746d86
  • fix(ai): point an open rewind confirmation at the stored message id — 405852bde
  • docs(testing): log the Linux pass of v2.1.0-rc.3 — f37cbbbb8
  • docs(testing): log the macOS pass of v2.1.0-rc.3 — bb4660b11
  • fix(compositor): no Full Camera trail on a clip's first frame when its start is inexact in f32 — bbbf8da2c
  • docs(testing): log the Windows rewind check of v2.1.0-rc.4 build run 38948496658 — 763cfedc3
  • fix(preview): restart the playback clock at the requested time on a held frame — a3a632be9
  • fix(preview): recompose a paused frame at the time it was shown at — 13631421c
  • docs(testing): log the Windows pass of v2.1.0-rc.5 build run 39003658928 — e76ff2c82
  • docs(testing): log the macOS pass of v2.1.0-rc.5 — baf12faca
  • docs(testing): log the Linux pass of v2.1.0-rc.5 — f2b4edc2f
  • fix(export): no Full Camera trail at a cut whose chunk start rounds up — a90ae5fb3
  • test(timeline): assert a cut-edge piece bound equals the cut in f32 — abe64d566
  • docs(blog): Off-Menu video editing, the agent writes the functions the editor lacks — ccefc92c1
  • docs(blog): describe both figures in their alt text — 2b8314813
  • docs(testing): log the Windows pass of v2.1.0-rc.6 build run 39010637863 — bcb1f8525
  • docs(testing): name where the rc.6 version was read — eaf427c62
  • docs(testing): log the macOS pass of v2.1.0-rc.6 — 50febd022
  • docs(testing): log the Linux pass of v2.1.0-rc.6 — a16c7826e
  • build(store): give the MSIX an openscreen execution alias — 5ea72a298
  • docs: register the MCP server with a placeholder executable, not the macOS path — 095332269
  • docs(website): align the site with OpenScreen 2.1.0 — d65bfecd5
  • docs(website): list the transcription models and the legacy font fetch, not annotation fonts — 2505ab7a8
  • chore(release): release v2.1.0 into main — e4039ae50
  • fix(compositor): tilt the whole card under a filled format — 58fdafe13
  • docs(testing): log the Windows and Linux pass of the filled-card tilt fix — 6adba77f4
  • docs(testing): log the macOS and Linux GPU pass of the filled-card tilt fix — d5d7523de
  • fix(compositor): keep blur masks and motion blur right on a tilted filled card — 124f62247
  • feat(website): a home page section for coding agents — 422a5cc79
  • fix(website): no Copy error without a clipboard, and announce Copied — 6cdafcbb3
  • chore(release): release v2.1.1 into main — 3a8bc5ca2
  • docs(testing): log the v2.1.1-rc.1 pass on Windows, macOS and Linux — 1d729ca90
  • docs(website): name the product category in the homepage H1 — bfaa716b0
  • docs(website): keep the slogan as headline, category as h1 kicker — fdeb4372e
  • chore: add glama.json so the org can claim its Glama MCP listing — 9991ca7d0
  • ci(release): sync only the version into main at promote — 7d3747e98
  • ci(release): never set main back, and say the sync is incomplete — 91a8b8ca3
  • feat(website): offer the Windows ARM64 installer on /download/ — 476aeb827
  • fix(cursor): land the flat cursor on each click, and smooth less by default — 836d06967
  • fix(cursor): share a short gap between a click's hold and the next approach — d79ff7d86
  • feat: package the openscreen-demo skill as a Claude Code plugin — b0c0dfac8
  • docs(plugin): say when the exported video leaves the machine — 88b65f374
  • feat(plugin): add the app icon for the Claude directory listing — 3fef4630a
  • docs(website): publish a privacy policy — 9be4686c2
  • docs(website): say in the privacy policy's opening that AI features send project data — e2cbe899d
  • feat(plugin): add the Codex manifest for OpenAI's plugin directory — 2c2336018
  • docs: put the one-sentence demo prompt first in the README and the home hero — fc1ffeb81
  • docs: make the demo prompt work in any coding agent — bdeb38ab6
  • docs: keep the badge's paste instruction on screen for 4 s — 269c34c00
  • docs: say AI agent, not coding agent, around the demo prompt — 4f02aa342
  • docs: send the badge's no-clipboard fallback to the docs that show its prompt — e9c5ed99f
  • fix: count installs driven through openscreen mcp as active — 095955b92
  • docs: say openscreen mcp sends the daily count on the privacy page — 432e8364c
  • docs: log the v2.1.2-rc.1 MCP smoke on Windows, macOS and Linux — f345e391d
  • chore(release): release v2.1.2 into main — 532ee6c6a
  • ci(release): read stdin without readFileSync(0) in the promote scripts — 00f332b62
  • docs(website): add an "Edit videos with Claude" feature page — 721a860b1
  • docs(website): use the agent-neutral skill install on the Claude page — a8eebd9de
  • fix(linux): start a KDE window recording on its first frame — 6cd855aa6
  • fix(capture-linux): support RADV_EXPERIMENTAL for Mesa 24.1+ Vulkan encode — 3620cf806
  • docs(ai-editing): install the OpenScreen plugin in Claude Code, Codex and ChatGPT — 07c332c1c
  • docs(ai-editing): add the marketplace before installing the plugin in Claude Code — 399fc948c
  • fix(linux): compact cursor telemetry across pauses — 3957984ee
  • fix(stt): download models through Chromium's network stack — 3c9bd5db0
  • fix(mcp): let addZoom take customScale without depth — 1e9171096
  • fix(plugin): find a Store install and hand over when the MCP tools are missing — d8bf2d813
  • docs: prevent incorrect assumptions about CI coverage — 3066a50ce
  • docs: distinguish capture core tests from helper builds — 7e2dc0267
  • docs: point contributors to the native GIF export path — f8d89a6f8
  • fix(linux): copy the export dmabuf through scale_vaapi before h264_vaapi — 3278fb44e
  • fix(linux): take the VPP copy only on Intel iHD — 1eba1d97b
  • docs(effects): recipe for lifting real UI blocks out of the recording — e522e3e8f
  • docs(effects): convert rects for screen and window takes, require an editable cursor — 3a51ffd56
  • fix(linux): fall back to metadata cursor when the portal lacks embedded — cf47b2df6
  • fix(linux): attach the webcam with the cursor mode main stored — b664d491c
  • fix(export): stop a voiceover piece where the next one starts — 0b8b4065c
  • fix(cli): fail a camera take when the camera cannot be opened — 8c19db83a
  • fix(audio): play a track once across its pill, so speed regions keep it on the clock — f34971a8a
  • fix(nix): configure VA-API driver paths for hardware acceleration — 58cee528c
  • feat: add stacked timeline tracks for annotations — 633c6a9e6
  • fix: preserve timeline base height when resizing capped tracks — 264975d8f
  • fix(i18n): polish Japanese tooltips — f63ffb1c6
  • fix(preview): rotate shared-texture slots so a just-released one is rewritten last — 645622827
  • fix(export): reject unreadable camera clips and empty output — 3b4863147
  • fix(export): bound clip-start recovery to normal video tails — c9b723ae0
  • docs: record desktop export follow-up and timing limits — 035375743
  • fix(export): validate staged MP4 before replacing destination — 1efff3da5
  • fix(export): stop frame inspection before unrequested clips — 79c3aa244
  • fix(export): reject clip starts across large video gaps — 1f38eddd3
  • fix(export): preserve first-frame hold for offset sources — f09670cbb
  • fix(audio): start the macOS system-audio tap after the microphone — da6496e41
  • feat: add Stop control for agent turns — 6d1f6bcb1
  • fix: preserve one undo step per agent turn — 7632d5c93
  • fix: update agent undo docs and keep Stop tooltip accessible — d8e573da3
  • feat(mcp): export a project's audio, or one track alone, to WAV or M4A — 7921b6de2
  • fix(cli): clean up an audio export's render without --out, and name the track id audioId takes — 729a91727
  • test(export): clean temporary outputs on assertion failure — d68bb2032
  • docs(test): describe temporary directory ownership and cleanup — d433e7ce8
  • fix(mac): reset Apple's picker before each presentation and ignore unrequested picks — fed3a4574
  • perf(preview): decode 8-bit H.264 in software on macOS — 6388ae77f
  • fix: localize native export validation errors — 6e09c9d18
  • fix(editor): record voiceovers against the uncut timeline (#1195) — 2159f42ca
  • feat(effects): footage() reads the recording at its own resolution — c85e3c776
  • fix(editor): offer 3D Orbit only with a recorded cursor — 007714507
  • fix: align macOS mouse pointer with captured content — e6ec9c2ed
  • fix: rebase cursor samples on capture bounds, use window bounds for picked windows — 14c0b4793
  • fix: recompute cursor visibility when rebasing on capture bounds — 5bb1b3fb5
  • fix(linux): bound the window crop wait by time, not by frame count — 0abf010c0
  • docs: simplify the roadmap around planned work — 9dac6f953
  • docs: remove resolved work from the roadmap — 27d9be27b
  • feat: add timeline layout changes with smooth transitions — 46bcb0c9d
  • fix: address timeline layout review feedback — 164cc1563
  • test: verify shared layout contracts over MCP — 3bd8f6414
  • fix: guard layout edits outside clip passages — 51d607078
  • docs: clarify removed modifier identifiers — d14249970
  • fix: preserve layout zoom framing and camera roundness — 06bd7f2e7
  • fix: keep macOS webcam recordings continuous with VP8 — 93a1e2bd4
  • fix: keep VP8 for macOS webcams at 1080p or below — b9f9d853f
  • fix(audio): don't read a blocked sample queue as silent sources on macOS — daf23f7a5
  • fix(linux): ignore a second record press while the portal picker is up — 1b861830c
  • test: assert the prepared recording id reaches the start request — 243ac2782
  • fix(audio): keep a sluggish queue from holding a dead source inside the grace — 549f13da0
  • fix(audio): credit all but one ticker period of a queue stall — d12d0071c
  • fix(captions): read whisper-stt paths as UTF-8 on Windows — 079ee05ce
  • fix(editor): restart playback from the timeline beginning when ended — 4f064c5b1
  • fix(editor): preserve playback intent and isolate cross-source seeks — b87772477
  • fix(win): add a DXGI Desktop Duplication fallback for screen capture — db6c9bfcf
  • fix(win): harden the DXGI fallback (reacquire, adapter, cursor, rotation, resize) — e7cc7f474
  • fix(win): draw the DXGI cursor at its real size — 1b8d3f527
  • fix(compositor): read 10-bit VideoToolbox frames as 16-bit planes on macOS — c8914fbd0
  • fix(compositor): convert full-range VideoToolbox frames with full-range BT.709 on macOS — 76894bc66
  • docs: fix the documented ffmpeg command in the HEVC test — 9e7faac97
  • test(compositor): check the P010 and full-range views without a media file — 5d82a0cb2
  • feat(update): check in the background, show an update button, install on quit — 4c10aab08
  • feat(mcp): tell the agent when a newer OpenScreen is out — 201d52950
  • docs(testing): an end-to-end pass for updating in place — d9d2b5d94
  • refactor(update): one update flow, installed only by a click — fa728ae66
  • fix(update): address review on the update button and the MCP notice — 520a5f091
  • test(mcp): check openscreen mcp forwards the update notice — af4280322
  • test(mcp): a Store install gets no update notice — c79554efa
  • test(mcp): use the real channel rule, and a stale cache in the Store case — 1ee4043f3
  • ci: install Rust before the macOS compositor build in build.yml — 09ed9a231
  • ci: retry stapling the macOS DMG when Apple drops the connection — 8c45bcf42
  • ci: don't sleep after the last staple attempt — f3db06877
  • chore(release): bump to 2.2.0-rc.1 [skip ci] — d9baa3f96
  • ci: retry validating the stapled macOS DMG when Apple drops the connection — e4b50518e
  • fix(mac): write app-update.yml into the .app so it can update itself — cc96d234c
  • fix(mac): accept an object-form publish config in afterPack — 4fbca3d6f
  • fix(mac): prefer mac.publish when writing app-update.yml — c6f69f2bf
  • test(mac): pin the first mac.publish entry — b201ad214
  • fix(updater): install Windows updates silently so only UAC shows — b24f721f2
  • fix(updater): keep the wizard when a per-user and a per-machine install coexist — e040cb0c9
  • fix(updater): keep the wizard when reg cannot answer, and test the dual-install handoff — 5dc8a1850
  • chore(release): bump to 2.2.0-rc.2 [skip ci] — c8e4598a2
  • fix(compositor): pick the YCbCr matrix per frame on macOS — 2bdee374f
  • fix(compositor): leave BT.2020 CL on the default path, convert 10-bit samples with 10-bit bounds — c80e64802
  • fix(export): bound a clip by the container duration, not a one-frame video stream — 953a9d6a0
  • fix(export): hold the only screen frame when a clip starts after it — 54017faad
  • fix(hud): accept the system language prompt on Enter — decaee747
  • fix(speed): accept a trailing × or x in the custom speed field — f35c5b802
  • fix(updates): let a release candidate's manual check see newer RCs — 9a66b0e56
  • fix(compositor): share one wgpu device across the Linux unit tests — c924db313
  • fix(linux): keep the user's --enable/--disable-features on Wayland — 4ba1b33e3
  • chore(release): bump to 2.2.0-rc.3 [skip ci] — b8b807f4d
  • fix(export): tag the MP4's colour matrix, primaries, transfer and range — 504a45166
  • chore(release): bump to 2.2.0-rc.4 [skip ci] — ab00a373f
  • fix(updater): retain the app when Windows elevation is declined — 1cc923d76
  • fix(updater): wait for the PowerShell elevation result — ee0893b74
  • fix(updater): await the bundled elevation helper — 15f5f7f3a
  • fix(updater): serialize elevation and block new takes — 531fa0700
  • fix(updater): recheck readiness and reserve browser starts — 957dd00f0
  • fix(updater): complete recording startup and failure guards — 1f2baf0ec
  • fix(updater): confirm missing registry keys before silent install — 8a7fb0887
  • fix(updater): allow larger registry enumeration output — 1e1bd86fb
  • chore(release): bump to 2.2.0-rc.5 [skip ci] — cf9fa7f5b
  • chore(release): bump to 2.2.0 [skip ci] — 0cc291725