Repository navigation
v2.1.0-rc.1
Pre-release
Pre-release
Changes since v2.0.0
- feat(website): show a live demo in the hero
- fix(website): smooth docking and align the responsive preview
- fix(website): keep framing aligned during pane transitions
- style(website): give the timeline tool palette more room
- feat(website): announce v2 above the new homepage promise
- fix(website): announce that OpenScreen v2 is here
- fix(website): stabilize preview resizing and timeline spacing
- style(website): announce v2 with a compact hero badge
- style(website): remove the clipped preview glow
- style(website): cap the editor and footage width
- fix(website): retain larger footage at its natural ratio
- style(website): give the homepage introduction more room
- feat(website): detect the platform for direct downloads
- perf(website): serve responsive wallpapers from Cloudflare R2
- style(website): update the demo headline and translations
- docs(testing): log the v2.0.0-rc.15 computer-use e2e pass
- docs(testing): link the rc.15 defects to their issues
- docs: add missing third-party notices
- docs: limit the Recordly notice to the code taken from it
- docs: drop the upstream link from the Recordly notice
- fix(preview): hold the webcam's last frame when a clip is entered past its end
- fix(record): keep the Camera row off when no camera can be opened
- fix(record): run one camera check for a double click
- ci: start release notes at the previous stable tag, by SemVer
- fix(editor): keep Edit clip's Apply in view and its edit through a backdrop click
- fix(timeline): copy anchored modifiers onto a duplicated clip
- fix(editor): close top-bar menus on a click on the empty bar
- fix: close menus on Escape and hand focus back to their trigger
- fix(transcript): keep a skipped word's restore control beside it
- fix(transcript): let Ctrl/Cmd+Z in the transcript undo a cut
- fix(editor): draw the Edit clip menu above the timeline
- fix(ui): open a tooltip on keyboard focus, not on any focus
- fix(export): stop an MP4 export between frames, publish only a finished file
- fix(export): enable Cancel during an MP4 export (#1014)
- docs: describe MP4 export cancellation and its manual check
- fix(audio): keep each take on its own clips through a clip edit (#1011)
- fix(audio): relabel a joined clip's takes without re-cutting them (#1011)
- fix(timeline): keep a dragged region whole when it repels (#1008)
- fix(timeline): keep a boundary piece that rounds to a whole millisecond
- fix(hud): keep the HUD's size while it is dragged at fractional scaling (#1004)
- fix(hud): refuse an empty size from the renderer
- fix(preview): stop the free-run at the end of the programme (#997)
- fix(preview): hold the last clip's own last frame, not the first one its cut removed
- test(preview): check the view played up to the last clip's end
- fix(timeline): edit one region of a merged pill, not the whole pill (#1017)
- fix(timeline): keep a 1 ms overlap in one edit group; refresh the consumer table's line refs
- feat(mcp): checkpoints to revert a whole agent turn in one step
- docs(mcp): list restoreCheckpoint among the destructive tools
- fix(transcript): refuse every native edit the block does not handle (#1038)
- fix(hud): arrow-key navigation in the language menu (#1015)
- fix(ai-edition): fan speed and Full Camera regions out to both halves of an insertion (#1037)
- fix(chat): close the reasoning menu and model quick-pick on Escape (#1039)
- fix: leave Escape to the rewind confirmation over the model quick-pick
- fix(record): never record a microphone the OS does not list (#995)
- fix(record): let a second click during the microphone check take the first back
- fix(record): drop a pending microphone turn-on once the take starts
- fix(mac): count the HUD timer from the helper's first frame (#901)
- docs(stt): record why transcript cuts are not snapped to quiet points (#1023)
- feat(timeline): measure zoom transition windows on the timeline (#1028)
- feat(ai-edition): tell the agent and MCP clients where zoom transitions are (#1028)
- fix(ai-edition): measure a trim without clipId on every clip of its asset; say speed scales the move both ways
- fix(windows): keep the screen video on the clock when the writer misses ticks (#945)
- fix(windows): give the screen and webcam clocks one origin per tick
- fix(gif): build the same palette for the same frame (#952)
- perf(gif): prune the nearest-colour search on a red-sorted palette (#952)
- perf(gif): map and LZW-encode frames on a worker pool (#952)
- docs(perf): record where GIF export time went (#952)
- fix(gif): bound frames submitted but not yet written
- feat(timeline): draw each zoom's move-in and move-out as trails (#1028)
- fix(editor): name the inspector's icon controls in the shared tooltip
- chore: bump nix package to v2.0.0
- feat(timeline): show and report the pan between chained zooms (#1028)
- feat(stt): pass a prompt field to whisper as its initial prompt
- feat(transcription): per-project names and terms for Whisper
- test: declare the names and terms save in the write audit
- fix(stt): frame the names and terms as a glossary prompt
- fix(media): save the terms on the latest document, regenerate after the save
- fix(media): regenerate only after the terms saved
- fix(preview): stop Chromium decoding a soundless recording's picture
- fix(preview): end a wall-clock element whose duration arrives late
- ci(nix): build PRs that touch the PipeWire and whisper sources, and assert the libEGL rpath
- feat(timeline): flag zoom moves a clip junction cuts (#1028)
- fix(compositor): keep Full Camera full across a trim inside it
- fix(capture): enumerate screens and windows in separate calls on X11
- ci(nix): require every sources attempt to report a display
- ci(release): refresh the Nix npm hash in the version-bump commit
- ci(release): run the hash refresh from the dispatched ref
- fix: #966
- docs(macos): say a picker capture leaves out every OpenScreen window
- fix(agent): preserve recorded cursor visibility
- docs(agent): name visible:false in the getCursorTrack tool description
- fix(macos): say when a restart discarded the take and drop the empty file a failed start leaves
- fix(i18n): translate the failed-restart toast
- test(macos): cover the empty-file cleanup after a failed start
- fix(i18n): polish Simplified Chinese tooltips
- fix(i18n): keep control names in zh-CN icon tooltips
- docs(i18n): match zh-CN docs to the renamed app labels
- fix(linux): respect an explicit Ozone display backend
- refactor(linux): share the Wayland session check with source enumeration
- fix(stt): preserve media-clock audio offsets
- feat(cursor): add Glass Lens, a glass cursor that refracts the picture in 2D and 3D
- test(cursor): count Glass Lens in the theme picker, and document glass cursors
- docs(cursor): add the compositor's Glass Lens renders
- docs(perf): record the shader and background-cache fixes on a Mac mini M1
- fix(nix): use wrapped Electron in dev shell
- fix(nix): point the dev shell at bin/ on every system
- test(compositor): share the D3D11 render-test harness
- test(compositor): silence the unused re-export in the shared harness
- build: ship the third-party licence texts in the installers
- fix(build): read a crate's license-file and fail when cargo cannot list the crates
- fix(linux): retry PipeWire capture with shared memory
- fix(linux): only fail video sessions on early stream errors
- fix(linux): fail cursor-only sessions on errors before streaming
- fix(cli): let the Linux portal select recording sources
- fix(cli): log that the portal picks the source and --display/--window do not apply
- feat(linux): add standard AppImage update metadata
- feat(workbench): keep versioned measurements and offline replay
- fix(workbench): bind the replay sample to its standalone source
- fix(workbench): reject transport failures and keep compare weights honest
- fix(workbench): keep compare identity request-bound
- fix(workbench): hash the request contract once for compare identity
- fix(workbench): share the judge budget and hash transport once
- fix(workbench): bind retry evidence, fingerprints, and Chat model identity
- test(workbench): regenerate the transport-bound scripted control
- fix(workbench): keep pre-round retry failures in attempt evidence
- test(workbench): retie the scripted control to the retry-evidence fix
- fix(workbench): adopt only the retained attempt cassette
- test(workbench): retie the scripted control to the retained-attempt fix
- fix(workbench): score undecided repetitions and compare fractional trials correctly
- fix(workbench): attribute judge evidence correctly
- fix(workbench): scan decoded Responses requests before adoption
- test(workbench): regenerate the scripted control on the final source tree
- fix(workbench): inspect response evidence before adoption
- fix(workbench): validate fingerprints and judge evidence
- perf(workbench): capture the judge source identity once per invocation
- docs(workbench): say the scripted control only replays on its own source tree
- docs(ai-edition): note maxRetries only reaches the OpenAI-compatible model
- feat(ai): persist Agent chat sessions per project
- fix(ai): queue chat history writes off the main thread
- docs(ai): describe persisted Agent chat sessions
- fix(ai): keep a deleted project's chat out of the cache until its file is gone
- fix(linux): remove libfuse2 dependency from AppImage runtime
- fix(recording): refuse to start a take on a nearly full disk
- feat(recording): let the recordings folder be changed
- feat(editor): choose the recordings folder in Record mode
- fix(recording): keep earlier takes reachable after a folder change
- feat(cursor): play a click sound on every recorded click
- click sound: answer the two review findings
- click sound: drop stopped hits, and preview only what the edit plays
- click sound: scope the preview's cues to the clip on screen
- click sound: test the preview against the clip it is crossing
- fix(export): drop an export the dialog closed while the click sound was read
- fix(cursor): find the click samples in installers and mute them with the cursor
- docs: credit the click sounds in the notices' current format
- fix(cursor): stop the click volume where the export limiter does
- fix(cursor): stage the click samples once when two callers ask together
- feat: remove selected filler words by transcript ID
- fix(agent): preserve zoom transition warnings in filler cuts
- feat(agent): generalize filler removal into removeWords
- fix(recording): say when a Restart lost the take on Windows and Linux too
- fix(audio): decode every audio stream on the media clock for peaks and STT
- fix(stt): kill the audio stream probe when extraction is aborted
- test(compositor): measure the Glass Lens refraction as an edge shift
- feat(mcp): let MCP clients read and edit every project, not only the open one
- fix(mcp): compare the whole project file before saving an MCP edit to it
- fix(mcp): make closed-project edits atomic and undoable
- fix(mcp): count the open-file dialog's read of a project file
- fix(mcp): read a named project before asking the editor about it
- docs(mcp): describe the read-first routing and the open-file dialog gap
- fix(macos): record without the microphone when macOS lists no audio input
- test(compositor): fix two local-only D3D11 render tests
- fix(editor): never save back a project's own file from the open dialog
- fix(nix): ship every public asset, cursors included, by pointing public/ at dist/
- feat(build): add pure Windows helper arch-resolution module
- feat(build): make Windows WGC helper build arch-aware (x64/arm64, native+cross)
- feat(build): add build:win:arm64 and build:native:win:arm64 scripts
- build: include arch in Windows installer filename to avoid x64/arm64 collision
- ci: build Windows x64 and arm64 installers via matrix
- docs: document Windows arm64 native helper build and installer
- fix(build): wipe WGC build dir on target-arch change to prevent stale-compiler wrong-arch binaries
- ci: fetch win32-arm64 sharp prebuilt for arm64 packaging (non-fatal)
- fix(build): check the Windows native payload for the target arch
- feat(build): build the D3D11 compositor addon for the target arch
- feat(build): stage the Visual C++ runtime for the target arch
- build(deps): electron-builder 26.16.1 — fixes the arm64 NSIS installer
- fix(stt): fall back to the x64 whisper helper on Windows on ARM
- fix(test): run the WGC smoke tests against the host's own helper
- feat(build): build the whisper helper natively for Windows on ARM
- fix(build): refuse --arch without a value instead of building for the host
- fix(build): keep argument boundaries in the whisper VS environment wrapper
- ci: build the Windows arm64 installer natively and publish one update feed for both arches
- build(nix): update npmDepsHash for the electron-builder bump
- style: apply Biome formatting to the Windows helper scripts
- fix(build): ship the x64 OpenMP runtime with the arm64 installer's whisper fallback
- fix(wgc): build the BGRA to NV12 converter without SSE2 on ARM64
- fix(build): check every shipped Windows binary's architecture, and refuse a partial x64 whisper fallback
- fix(build): generate the third-party licences in build:win:arm64
- ci: drop the caption-assets cache, nothing in the Windows job fills it
- fix(website): keep the Windows download on the x64 installer
- docs: describe the per-arch Windows installers and CI artifacts
- feat(edit-clip): scrub the clip to frame the crop
- fix(edit-clip): seek the preview to the playhead once metadata loads
- docs: recommend udev rule for Wayland mouse click capture (#1084)
- Update installation.md with udev rule clarification
- docs: Use 'getfacl /dev/input/event*' instead of 'getfacl /dev/input/by-id/mouse' #copilot
- docs(i18n): carry the udev rule for Wayland clicks into every locale
- fix(pipewire-capture): name the udev rule in the click-capture warning
- docs: say keystrokes are ignored, not unread, by Wayland click capture
- docs(i18n): carry the click-capture scope wording into every locale
- docs: promise the udev rule keeps the keyboard out, not every key code
- docs(i18n): carry the keyboard wording into every locale
- docs: recommend the udev rule wherever Wayland clicks are mentioned
- docs(i18n): carry the udev rule recommendation into every locale
- docs: add a security policy pointing to private vulnerability reporting
- docs: adopt the Contributor Covenant 2.1 code of conduct
- docs: use the project address for conduct reports and pin support to the latest stable release
- docs(faq): explain why a quit-on-close utility can quit OpenScreen on macOS
- docs(readme): point macOS users whose OpenScreen quits to the FAQ entry
- docs: add the Product Hunt launch badge to the README and the homepage
- docs(website): show the Product Hunt badge next to the download button
- docs(website): match the Product Hunt badge to the download button height, light theme
- docs: document the Windows 10 workaround for an unclickable recording bar
- docs(website): translate the Windows 10 recording-bar FAQ entry
- fix: skip the HUD's content protection on Windows before 11 22H2
- docs: unset the protection flag before the Windows capture-exclusion check
- fix(website): let links to our own repo send the referrer, so GitHub credits the site
- feat(mcp): openscreen mcp, the editing tools plus record, export and frames on stdio
- feat(mcp): setPointerTrack, so a take driven by a script gets a cursor and its zooms
- docs: the openscreen-demo skill, and how to let an agent make the whole video
- fix(mcp): fail a crashed runner instead of hanging, and close finished runners
- fix(mcp): claim a take before stopping it, and apply pointer tracks one at a time
- fix(ai-edition): text like the editor's, sets that land where asked, and a format tool
- feat(mcp): getFrames reads a project's export at ruler seconds
- fix(mcp): read an export through the document it rendered
- fix(mcp): keep an export record only when it matches its video
- feat(ai-edition): let the agent set a zoom's 3D camera
- docs: a pull request video recipe in the openscreen-demo skill
- docs: show the #5 Product of the Day rank on the site and in the README
- docs: one line to paste into Claude Code, and a skill that sets OpenScreen up
- docs(skill): the macOS Accessibility permission that click zooms need
- fix(website): point /discord at a permanent invite
- add contributing for mac
- fix(windows): preserve non-integer resampling continuity across packets
- fix(recording): pick a webcam mode by frame rate before size
- fix(recording): ask the webcam reader for the selected mode's frame rate
- fix(homebrew): use symbol format for macOS dependency
- fix(linux): give up when no first frame follows the portal picker
- docs(testing): cover what landed since v2.0.0 in the e2e checklist, and run macOS unattended
- docs(testing): run Apple's picker checks before the Screen Recording grant
- fix(recording): let a webcam's MJPEG mode win when it is faster or sharper
- fix(macos): resolve microphones Chromium labels with a transport suffix
- fix(cursor): play click sounds for every clip of a recording
- fix(windows): repeat the owed screen slots so a loaded writer catches up
- fix(windows): keep a change skipped on a past slot pending for the live one
- fix(hud): place toasts above the bar and let their close button take the click
- fix(agent): fit a text annotation to its words in the shipped fonts, and refit it on a format change
- fix(agent): state what a text too wide at the minimum size does
- fix(agent): fall back to the estimate when a font's advances cannot be read
- fix(audio): hold the export's true peak under -1 dBTP
- fix(audio): re-check the true peak after the limiter's gain
- docs(testing): log the macOS e2e pass on v2.1.0 build 38252812147
- docs(testing): log the macOS re-run of the merged fixes on build 38309126813
- fix(export): put the whole timeline on one frame grid
- fix(recording): keep the Windows screen video on the audio's clock
- fix(recording): stamp a legacy-path tick after its frame wait, and skip it while paused
- fix(mcp): refuse stdio edits to a project open in the app's editor
- fix(mcp): let only the editor that set the open-project marker clear it
- fix(cli): give each CLI run its own Chromium session data
- fix(cli): key CLI session folders by run, and judge a pid only in its own namespace
- fix(mcp): say that minimized and hidden windows are not listed
- fix(mcp): name the other desktops and full-screen apps in the hidden-window note
- docs(mcp): stop promising a zoom on each recorded click
- docs(mcp): say clicks share a zoom only when they are close on screen too
- fix(timeline): stop a region dragged into an identical one flush against it
- fix(ai-edition): refuse a set that runs into a look-alike region
- fix(chat): format every message time where it is drawn
- fix(chat): show a stored time that is no date as stored
- fix(editor): open the highlighted project on Enter in the Open project dialog
- fix(hud): put the bar back where it was dropped once a popover closes
- docs(testing): log the v2.1.0 Windows e2e pass on build run 38252812147
- docs(website): Discord as a pill beside GitHub in the header
- fix(website): grow the editor captions' slot for longer translations
- refactor(mcp): one source for MCP text, setPointerTrack through the runner
- fix(mcp): report a failed sidecar write as a partial edit, document checkpoint eviction
- docs(mcp): restoreCheckpoint has its own refusal while MCP edits is off
- docs(testing): log the Windows re-run of the merged fixes on build run 38370716184
- feat(mcp): forward openscreen mcp document calls to the running app
- fix(mcp): let the app's answers carry documents above 10 MiB, document checkpoints not crossing over
- docs(mcp): a lost createCheckpoint answer makes no local checkpoint
- feat(mcp): serve the media tools from the in-app server
- docs(mcp): one tool surface on both transports
- fix(mcp): leave the user's recording settings as they were when an in-app take fails or the app quits
- feat(agent): region tools set and read every zoom, annotation and audio setting
- docs: region tools reach arrows, blurs, zoom settings and audio fades
- feat(mcp): setEditorSettings and a settings block in getCurrentDocument
- docs(mcp): document setEditorSettings and the settings read
- fix(mcp): offer auto only while the timeline holds one composition, keep the current format writable
- fix(mcp): refuse a camera crop and pan that place the framing in two spots
- feat(mcp): rename a project, import and remove its media, create one
- docs(mcp): the project and media tools, and why deleting a project is not one
- fix(mcp): let the editor read an imported .oga, keep a created project's id when its checkpoint fails, check an existing video for private content
- feat(mcp): export with the Export dialog's options, record the webcam and the system cursor
- docs(mcp): the export and record options, on the site and in the skill
- fix(cli): refuse --quality and --fps on a GIF export, as exportVideo does
- fix(mcp): createProject links no webcam to a video from elsewhere
- fix(mcp): say when device names need a permission, refuse GIF flags on an MP4
- refactor(timeline): share the editor's insert-clip and crop writes as pure mutators
- feat(mcp): insertClip, duplicateClip, addAutoZooms and per-clip crop
- docs(mcp): describe the clip tools, and stop promising to split a clip
- fix(mcp): name the duplicated clip by id, and give every asset on a file its cursor read
- fix(timeline): apply a clip's range and crop in one pass
- feat(mcp): transcribe an asset over MCP with the on-device Whisper
- feat(mcp): read, style and translate the captions through the agent tools
- feat(cli): openscreen captions writes a transcript and turns captions on
- docs: captions, translation and transcription over MCP and in the CLI
- docs(website): carry the captions and transcription changes into the translations
- fix(mcp): caption a transcript only the legacy mirror holds, say transcribe waits for a same-language run
- fix(mcp): read the project again when a waiting transcription starts
- fix(mcp): run no Whisper for a project deleted while its transcription waited
- docs(skill): record a narrated take with microphone: true
- docs(mcp): say the captions live in getCaptions, not in the settings block
- test(workbench): out-of-scope-styling asks for colour grading, which no tool reaches
- fix(cli): captions writes nothing over a project saved while it transcribed
- test(mcp): delete the project only once the waiting transcription has found it
- fix(cli): captions writes beside the project and renames it over, after the check
- fix(cli): captions replaces the real project file and keeps its permissions
- fix(cli): captions creates its temp file exclusively
- docs: a source dropped on the clip row is appended, there is no split-and-insert dialog
- docs: say the clip row takes a video source; a dropped audio file goes on the audio lane
- fix(mcp): send no quality with a GIF export
- fix(windows): keep the recording bar always on top after a popover or dialog closes
- fix(windows): put the bar back on top when the source picker closes
- fix(export): a GIF that plays once carries no loop block
- docs(testing): log the Windows MCP pass on main build run 38538195250
- docs(testing): log the Windows MCP re-run on main build run 38564622152
- fix(mcp): route every take start and stop through one recording-state setter
- docs(testing): log the Windows pass of the in-app MCP server
- ci(website): deploy the site to Cloudflare Workers instead of GitHub Pages
- fix(website): format the wrangler configs, redirect www straight to https, refresh README notes
- docs(testing): log a headless Linux pass under WSL on build run 38564622152
- docs(testing): log the macOS e2e pass on main build run 38581408372
- fix(linux): ship the shared ffmpeg CLI so native transcription can run
- docs(testing): log the macOS retest of the in-app MCP recording on build run 38598557320
- fix(mcp): let getFrames read a GIF export
- fix(cli): open the app when macOS hands a launch to a running CLI process
- fix(cli): drop activates that come right after a GUI launch
- fix(macos): record the whole system audio mix in a window take
- fix(macos): keep a window take going when its audio stream cannot be set up
- fix(stt): drop the renderer audio-decode fallback and say ffmpeg is missing
- docs(stt): describe the transcription request as path-first
- test: wait for the held export to start instead of sleeping 20 ms
- docs(testing): log the macOS retest of #1214, #1215 and #1216 on build run 38615516865
- fix(mcp): record the window an in-app take names, even where Apple's picker owns sources
- fix(cli): hide the Dock icon again after opening the GUI from a CLI run
- fix(macos): log each step of Apple's picker flow and any lost process
- docs(testing): log the macOS retest of #1232 and #1233 on build run 38627769728
- docs: spec agent-written shader effects
- feat(compositor): shader effects contract v1 and the Windows pass
- feat(effects): shader effects in the document, and the agent tools
- feat(compositor): the Linux pass of shader effects
- feat(effects): the recording's surface in the effect contract
- fix(effects): address the review of the shader effects integration
- ci: run CI on integration branches
- feat(compositor): the macOS shader effects pass (Metal)
- feat(compositor): the macOS effect inputs carry the footage plane
- feat(compositor): the Metal pass keeps what the scene shows, and maps the footage plane
- fix(compositor): a hidden cursor still hands effects its pointer and clicks
- feat(effects): check an effect's code off the main thread, and price the tiers on an M1
- test(compositor): the Windows test frame carries its size
- feat(effects): getFrames renders from the document when no export is current
- refactor(effects): one effect at a time, no lanes
- feat(effects): the Effects lane and the effect inspector
- docs(website): the Custom effects page
- fix(effects): getFrames names a frame it could not render, and the review's doc fixes
- fix(effects): CodeRabbit's second pass on the integration PR
- docs(testing): log the macOS pass on release/v2.1.0 build 38370716184
- docs(testing): drop the look-alike zoom merge from the defects, note the release head moved
- docs(testing): record the mcp launch issue as #1214, fixed after this build
- fix(cli): give a CLI run no application menu
- feat(website): measure audience and download clicks with cookieless PostHog
- feat(website): tag Microsoft Store links with a website campaign ID
- feat(website): the OpenScreen PostHog project token
- fix(website): count only OpenScreen release assets on github.com as downloads
- feat: count active installs with one anonymous daily ping
- feat: the OpenScreen PostHog project token for the usage ping
- fix: CI=false no longer silences the usage ping; the FAQ names the per-event random ID
- fix(cli): set the empty menu before macOS launches the CLI run
- fix(cli): replace the bare Quit menu with an empty one once ready
- docs(testing): log the Windows retest of v2.1.0 build run 38714540858
Full Changelog: v2.0.0...v2.1.0-rc.1