Skip to content

v2.0.0: Beautiful demos on the first take

Latest

Choose a tag to compare

@EtienneLescot EtienneLescot released this 03 Oct 15:39

⬇ Windows (Microsoft Store)  ·  ⬇ Windows (.exe)  ·  ⬇ macOS (Apple Silicon)  ·  ⬇ macOS (Intel)  ·  ⬇ Linux (AppImage)

The Microsoft Store version is signed and updates through the Store. Also .deb, .rpm and .pacman. Homebrew, WinGet, Nix and the AUR follow automatically. Already on 1.x? The app offers the update on its own.

Editing a recording in OpenScreen 2.0

Beautiful demos on the first take

OpenScreen 2.0 is built on one promise: your demo looks good without touching anything, and touching the settings can't make it ugly.

We audited 1.x against that rule and it failed most of it: a cursor four times the size of the system arrow, a shadow nobody could see, a vertical export that filled a fifth of the frame. 2.0 fixes all of that, ships a new editor, and adds automatic zooms planned from your clicks. It is still free for everyone, personal and commercial, with nothing behind a paywall.

The story of how it came together: Making of v2: a demo is never ugly.

Highlights

Record, stop, and it's already edited

  • Zooms planned from your clicks. Stop a take and the editor opens with zooms already placed on the moments you clicked, planned as shots rather than one zoom per click.
  • Record from the editor. A Record mode sits next to Edit, with auto-zoom after recording and Hide desktop icons one click away.
  • New projects start from your look. The wallpaper, padding, cursor and camera of your last project carry over.

Good defaults, bounded settings

  • A cursor the size of a cursor, half its old default, and a shadow you can actually see.
  • Every value has a floor, a ceiling and a reset, whoever sets it: the panel, a preset, the AI agent or a hand-edited project file.
  • What you see is what you export. Text renders in the font you picked (five open-licensed families are embedded), and gradients use every colour stop.

Auto format

  • The frame shapes itself around your composition, and Auto is the default for new projects.
  • A 16:9 take in a 9:16 export fills the frame with a window that follows your cursor, instead of a small strip in the middle.

A new editor

  • One click per choice. Format, frame style, zoom level, 3D camera, cursor style and caption font are rows of buttons, not dropdowns.
  • A timeline you read by colour, with a navigator that shows what it navigates, a smoother waveform and a Clear timeline button.
  • Names instead of numbers. A shadow is None, Light, Medium or Strong.

3D that looks intentional

  • 3D Orbit, a camera that moves with your zooms, follows the same focus mode as a flat zoom, and never rolls.
  • Five original cursor themes, each with a sculpted 3D version: Prism Glow (ray-traced as a glass crystal), Pop Coral, Pixel Candy, Studio Ink and Star Sprout.
  • Click impact as a cursor setting, for every camera.

Camera

  • Captured at the camera's real resolution and frame rate.
  • Frame the webcam by dragging it, and zoom it from its corners.
  • Square by default (or Original to keep its proportions), a larger default size, and up to 60% of the frame.

Sound that's ready to post

  • Voice normalised to -16 LUFS with a soft limiter instead of a hard clip.
  • Music beds start at -18 dB with one-second fades, and duck under your voice.

Transcripts that line up

  • On-device transcription now skips silence first (Silero VAD) and re-times every word on the audio, so a cut made from the transcript lands where the word was spoken.

Export

  • One settings panel with four destinations: Web / YouTube, Social, Studio and README GIF. Codec details live under Advanced.
  • The bitrate you pay for: 1.x exported at 8 Mb/s whatever the frame rate; 2.0 exports 1080p60 at 18.7 Mb/s. GIFs are dithered.

macOS

  • Apple's system picker to choose what to record on macOS 15.2 and later.
  • System audio recorded from a Core Audio tap.
  • One permissions window on first run, and notifications kept out of your recordings.

For automation

  • The AI agent's tools over a local MCP server, so your own agent can edit a project the way the built-in assistant does.
  • The CLI still records, edits and exports headlessly, with NDJSON output.

Upgrading from 1.x

  • Your projects open as they are. New projects use the new defaults; existing ones keep their settings.
  • The 17 third-party cursor packs are gone, because their terms don't allow redistribution. The five original themes replace them.
  • Exports are always H.264. The codec picker is gone.
  • The .openscreen project format and the CLI can still change between releases.

Thank you

To everyone who reported a bug, tested a release candidate or sent a pull request: 2.0 is better because of you. If a default still makes your demo worse, that is exactly the bug this release is about. Tell us on Discord or in an issue.

If OpenScreen saves you time, a star on the repo helps others find it.


What's Changed

  • fix(macos): decode 24-bit integer microphone audio by @EtienneLescot in #710
  • fix(macos): keep the Dock icon, Cmd+Tab and the menu bar by @EtienneLescot in #713
  • chore(release): release v1.12.1 into main by @EtienneLescot in #715
  • chore(release): release v1.12.2 into main by @EtienneLescot in #718
  • fix(macos): accept 8-bit integer PCM microphone input by @EtienneLescot in #717
  • chore: bump nix package to v1.12.2 by @EtienneLescot in #720
  • chore: name @My-Denia code owner for Windows capture by @EtienneLescot in #721
  • fix(export): wait for GIF cancel to finish native cleanup by @My-Denia in #651
  • fix(capture-linux): latch capture-started so an early first frame is not lost by @askalf in #708
  • feat(auto-zoom): place suggestions on recorded clicks by @My-Denia in #706
  • feat(stt): add cross-platform Silero VAD pre-pass via whisper.cpp by @CyberSparkx in #639
  • perf(build): optimize package payload, deduplicate assets, and prune locales by @atharva9167j in #617
  • feat(macos): first-run permissions window by @EtienneLescot in #735
  • fix(macos): stop HUD dialogs painting a grey rectangle over the desktop by @EtienneLescot in #733
  • feat(macos): pick sources in Apple's system picker on macOS 15.2+ by @EtienneLescot in #737
  • fix(gif): accumulate fractional frame delays so GIF playback matches its fps by @EtienneLescot in #748
  • fix(shortcuts): show ⌘ for fixed undo/redo rows on macOS by @EtienneLescot in #749
  • docs(inspector): stop listing the retired frame-stepping hint as rewired by @EtienneLescot in #751
  • chore: normalize electron/native/README.md to LF by @EtienneLescot in #752
  • fix: attach file dialogs to their window so the export save panel cannot get lost by @EtienneLescot in #750
  • fix: headless export honors editor cursor tuning keys and cropRegion from v2 projects by @jfkconstruct in #719
  • fix(audio): allow imported audio tracks below -12 dB by @apodacaduron in #666
  • docs: e2e results for v1.13.0-rc.4 (macOS) by @EtienneLescot in #741
  • docs: e2e results for v1.13.0-rc.6 (macOS) by @EtienneLescot in #753
  • chore(release): release v1.13.0 into main by @EtienneLescot in #755
  • chore: bump nix package to v1.13.0 by @EtienneLescot in #756
  • ci(aur): verify sources the way a user's makepkg resolves them by @EtienneLescot in #759
  • fix: restore public/ copies of demo.gif and preview images for hotlinks by @EtienneLescot in #754
  • ci(winget): name the missing token scope before komac's CreateRef fails by @EtienneLescot in #758
  • feat(export): ask for a star once, after the first export by @EtienneLescot in #762
  • ci: put one star line at the head of stable release notes by @EtienneLescot in #763
  • ci: unpin the macOS compositor runner from macos-14 by @EtienneLescot in #764
  • feat(website): offer a star once a download has started by @EtienneLescot in #760
  • fix(transcript): load projects whose transcript ends before it starts by @EtienneLescot in #768
  • fix(zoom): pace transitions by zoom level and keep them at screen speed by @EtienneLescot in #765
  • fix(windows): keep the render endpoint busy during mic-only recordings (#724) by @abduznik in #726
  • feat(ui): soften the interface without changing its layout by @EtienneLescot in #767
  • feat(compositor): continuous corners on every rounded shape by @EtienneLescot in #776
  • fix(preview): no background fringe around the card's rounded corners by @EtienneLescot in #779
  • feat(format): add Auto, the default format that fits the composition by @EtienneLescot in #777
  • docs(roadmap): review the roadmap at v1.13.0 by @EtienneLescot in #781
  • docs: AGENTS.md no longer describes Pixi.js as the renderer by @EtienneLescot in #780
  • feat(inspector): buttons for fixed choices, free rows, drag-to-frame webcam by @EtienneLescot in #769
  • feat(editor): a shorter top bar, and a first run that offers to record by @EtienneLescot in #770
  • feat(timeline): a softer clip card, a smooth waveform and a readable navigator by @EtienneLescot in #774
  • feat(editor): camera roundness slider and anchored positions by @EtienneLescot in #771
  • fix(website): lift the smooth waveform into the recreation data by @EtienneLescot in #783
  • feat(inspector): pick the zoom level from a row of buttons or a free field by @My-Denia in #694
  • feat(editor): inline background, grab handles and a wider inspector by @EtienneLescot in #775
  • fix(compositor): mask the screen with its slot in block layouts by @EtienneLescot in #785
  • feat(format): offer Auto only for a timeline of one composition by @EtienneLescot in #784
  • feat(cursor): option to always render the arrow cursor by @EtienneLescot in #773
  • feat(editor): new default wallpaper, first in the picker by @EtienneLescot in #782
  • fix(timeline): keep queued zoom levels through span and focus saves by @EtienneLescot in #789
  • fix: fill rounded background color swatch by @EtienneLescot in #790
  • fix(cli): carry the recording frame through v2 project exports by @EtienneLescot in #813
  • fix(compositor): let the screen's edges follow the motion blur by @EtienneLescot in #794
  • fix(cli): export projects saved by the editor by @EtienneLescot in #815
  • refactor(cursor): drop the always-true click effects gate by @EtienneLescot in #788
  • fix(ai-edition): let chat message text be selected and copied by @My-Denia in #787
  • fix(ai-edition): copy chat messages via main-process clipboard on Windows by @My-Denia in #786
  • ci(nix): retain Xvfb diagnostics for capture probes by @My-Denia in #707
  • perf(compositor): compile the Windows shaders at build time by @EtienneLescot in #818
  • fix(compositor): draw the webcam on Linux during a Full Camera hold by @EtienneLescot in #869
  • feat: a demo is never ugly (audit integration) by @EtienneLescot in #814
  • feat(cursor): raise the default cursor size by @EtienneLescot in #881
  • fix(editor): make the output format part of a style preset again by @EtienneLescot in #882
  • feat(export): one settings panel in the export dialog by @EtienneLescot in #883
  • fix(camera): shrink to 70% in a zoom, whatever its depth by @EtienneLescot in #885
  • fix: prevent duplicate frames at trimmed speed boundaries by @EtienneLescot in #888
  • feat(cursor): set the default cursor size at the marked position by @EtienneLescot in #889
  • fix: handle macOS capture permission failures by @EtienneLescot in #886
  • feat(recording): capture the webcam at its real resolution and frame rate by @christian-wr in #875
  • feat(export): always export H.264 and drop the codec picker by @EtienneLescot in #890
  • feat(cursor): remodel the 3D cursors after the new reference sheet by @EtienneLescot in #899
  • docs(testing): cover webcam capture quality in the manual e2e checklist by @EtienneLescot in #906
  • fix(editor): hide the cursor settings when a take has no cursor data by @EtienneLescot in #904
  • fix(compositor): copy the decoder surface before sampling it by @christian-wr in #895
  • fix(recording): remember the display picked in Apple's picker across a relaunch by @EtienneLescot in #905
  • feat(cursor): render Prism Glow as a glass crystal in 3D by @EtienneLescot in #900
  • feat(timeline): add a Clear timeline button by @EtienneLescot in #903
  • fix(capture): include menus and popups in Windows window recordings by @EtienneLescot in #907
  • fix(recording): keep the remembered display out of the Record-mode source row by @EtienneLescot in #908
  • fix(annotations): masks and their gimbals follow the footage, arrows get a tight gimbal by @EtienneLescot in #909
  • fix(editor): let the audio element free-run instead of re-seeking it every frame by @christian-wr in #898
  • feat(hud): rewrite the recording bar tooltips by @EtienneLescot in #912
  • feat(editor): drop the tooltips that repeat their label by @EtienneLescot in #914
  • feat(editor): rewrite the editor tooltips by @EtienneLescot in #915
  • fix(stt): keep transcript words on the audio's clock when the VAD cuts silence by @EtienneLescot in #917
  • feat: expose the AI agent's tools over a local MCP server by @davidjayana in #893
  • refactor(stt): drop the unreachable /vad endpoint and stt:vad IPC by @EtienneLescot in #919
  • fix(release): stage the whisper helper built from the release's own sources by @EtienneLescot in #928
  • fix(editor): keep the preview's boosted audio from clipping at the speakers by @EtienneLescot in #918
  • fix(macos): size the video bitrate from the actual capture, not the 4K ceiling by @EtienneLescot in #930
  • fix(linux): convert and tag the PipeWire helper's video as BT.709 by @EtienneLescot in #932
  • fix(windows): stop the audio mixer from punching holes in a continuous voice by @EtienneLescot in #916
  • fix(macos): pin the keyframe interval to 1 s and count dropped video frames by @EtienneLescot in #938
  • perf(windows): raise the capture helpers' timer resolution and use MMCSS by @EtienneLescot in #927
  • fix: keep the display awake while a recording runs by @EtienneLescot in #939
  • fix(linux): keep the capture clock ticking while cursor messages flow by @EtienneLescot in #940
  • perf(windows): skip the webcam frame copy when its sequence has not changed by @EtienneLescot in #941
  • fix(windows): end the audio track where the video ends by @EtienneLescot in #946
  • fix(windows): encode H.264 High with the BT.709 colour the compositor expects by @EtienneLescot in #929
  • fix(stt): start each transcript word at the end of the token before it by @EtienneLescot in #950
  • fix(linux): write fragmented MP4 so a killed helper keeps its take by @EtienneLescot in #949
  • perf(windows): repeat the last frame instead of reading back an unchanged screen by @EtienneLescot in #931
  • fix(macos): capture and tag the screen track as BT.709 studio range by @EtienneLescot in #947
  • feat(stt): align words with character-level DTW by @EtienneLescot in #955
  • feat(stt): re-time whisper's words on a CTC forced aligner by @EtienneLescot in #954
  • fix(hud): keep the bar in place across a vertical↔horizontal flip by @EtienneLescot in #953
  • fix(release): read every helper build when staging, and say why one is rejected by @EtienneLescot in #956
  • docs(e2e): log the v2.0.0-rc.1 and rc.6 Windows passes by @EtienneLescot in #957
  • feat(camera): square camera by default, "Original" keeps the camera's own proportions by @EtienneLescot in #958
  • fix(stt): keep a sentence's last word in the stretch it closes by @EtienneLescot in #959
  • fix(main): quit when the hidden countdown overlay is the last window left by @EtienneLescot in #963
  • docs(testing): log the v2.0.0-rc.8 e2e pass and fix the export peak check by @EtienneLescot in #962
  • fix(preview): hand out no native view while the view for a new source is created by @EtienneLescot in #964
  • fix(editor): keep wordmark menu rows on one line in long locales by @EtienneLescot in #970
  • fix(macos): keep the HUD out of takes after the editor round trip by @EtienneLescot in #971
  • fix(timeline): show the bound shortcut in the empty-lane hints by @EtienneLescot in #974
  • fix(hud): keep camEnabled off when no camera can be opened by @EtienneLescot in #972
  • fix(stt): show a readable message when transcription cannot read the audio by @EtienneLescot in #973
  • perf(preview): stop decoding pictures the hidden media elements never show by @EtienneLescot in #976
  • perf(preview): hand composed frames to the canvas as shared GPU textures by @EtienneLescot in #975
  • fix(preview): stop re-seeking the native view at every cut and in speed regions by @EtienneLescot in #977
  • fix(preview): keep the right clip when scrubbing into the end of a clip by @EtienneLescot in #979
  • feat(website): demo loops on the homepage and feature pages, lazily loaded from R2 by @EtienneLescot in #978
  • feat(website): track the demo loops, declare them as videos, keep them out of the page load by @EtienneLescot in #980
  • docs(readme): show the current editor in the demo GIF by @EtienneLescot in #981
  • fix(compositor): restore the export speed lost to the 3D models in the layer shader by @EtienneLescot in #982
  • perf(compositor): bring the background cache and the trail scissor to Windows and macOS by @EtienneLescot in #983
  • docs: record the Windows A/B of the layer-shader fix by @EtienneLescot in #986
  • docs(testing): log the v2.0.0-rc.13 computer-use e2e pass by @EtienneLescot in #988
  • feat: larger default camera, 60% cap, scissors on the trim tool by @EtienneLescot in #992
  • docs(testing): log the macOS RC e2e passes from v1.10.0-rc.3 to v2.0.0-rc.13 by @EtienneLescot in #991
  • perf(preview): stop decoding the stand-in camera when a clip has none by @EtienneLescot in #993

New Contributors

Full Changelog: v1.13.0...v2.0.0