OpenScreen is a lightweight screen recording application designed to help users create clean product demos and guided walkthroughs. It focuses on essential features, offering a simple and accessible alternative for capturing and presenting on-screen activity without unnecessary complexity.
The software is free to use for both personal and commercial purposes, with an open-source model that allows users to modify and distribute it as needed.
Features
- Record your whole screen or specific apps
- Add automatic zooms or manual zooms (customizable depth levels)
- Customize the duration and position of zooms however you please
- Record microphone audio and system audio capture
- Trim segments of the video timeline
- Add annotations (text, arrows, images)
- Crop video recordings to hide parts
- Export in multiple aspect ratios (1:1, 16:9, 9:16, 4:5, 4:3)
- Choose between wallpapers, solid colors, gradients or your own picture for your background
- Customize border radius and video padding
- Motion blur and exponential easing for smoother pan and zoom effects
- Customize speed at different segments
- Save edits as projects (persisted)
- Import custom Google Fonts for annotation texts
- Configurable keyboard shortcuts
- Multiple export resolution options
What's New
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.
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.
Other Changes
- 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

