OpenScreen

OpenScreen·OpenScreen.OpenScreen

Desktop screen recorder with built-in editor

OpenScreen turns a raw screen recording into a finished product demo or walkthrough. Record a window or the whole screen with microphone and system audio, then edit on a timeline: automatic or manual zooms that follow the cursor, wallpapers and backgrounds, a webcam overlay, motion blur, crop, trim and speed control, and text, arrow or image annotations. Captions are transcribed on-device with no upload and remain editable, and an optional AI assistant applies edits you describe in chat using your own API key. Export to MP4 or GIF, rendered and encoded on the GPU with an automatic CPU fallback. Free for personal and commercial use, with nothing behind a paywall.

winget install --id OpenScreen.OpenScreen --exact --source winget

Latest 1.10.0·August 24, 2026

Release Notes

What's Changed

  • fix(notes): keep the note stylesheet in the production bundle by @EtienneLescot in #270
  • chore(release): sync the v1.9.0 RC fixes into main by @EtienneLescot in #275
  • feat(editor): turn on roundness, shadow and motion blur by default by @EtienneLescot in #273
  • fix(cursor): make the Windows cursor sampler DPI-aware by @EtienneLescot in #278
  • fix(hud): stop being born click-through, wait for the renderer to ask by @EtienneLescot in #269
  • fix(media): watch the background path refresh instead of firing it into the void by @EtienneLescot in #255
  • fix(agent): stop cutting the transcript at the 800th word by @EtienneLescot in #256
  • fix(ci): scope RC release notes to the previous RC by @EtienneLescot in #267
  • test(media): inject the failed registry write instead of chmod-ing the temp dir by @EtienneLescot in #280
  • feat(agent): add addTrims and addZooms, so a cut stops costing a round trip by @EtienneLescot in #258
  • perf(test): run Vitest in node by default, and fix the workflow guidance around it by @EtienneLescot in #281
  • fix(ai): stop compacting the chat on a context window we never measured by @EtienneLescot in #286
  • chore(release): release v1.9.0 into main by @EtienneLescot in #288
  • fix(ci): re-pin ffmpeg on a month-end BtbN build by @EtienneLescot in #295
  • fix(ci): harden the AUR publish pipeline and repair its distribution CI by @EtienneLescot in #297
  • fix(release): publish before syncing main, and stop racing the merge by @EtienneLescot in #296
  • ci(linux): guard the native payload, declare patchelf, drop the dead zsync glob by @EtienneLescot in #298
  • fix(appx): ship branded Store tiles instead of electron-builder's placeholders by @EtienneLescot in #294
  • fix(win): ship the compositor addon beside its ffmpeg DLLs by @EtienneLescot in #303
  • fix(linux): give the capture helper's ffmpeg libraries their own directory name by @EtienneLescot in #300
  • fix(linux): negotiate DMA-BUF so capture works on niri and other wlroots compositors by @EtienneLescot in #299
  • ci(release): make the Discord announcement dispatchable on its own by @EtienneLescot in #289
  • test(ci): cover the missing-tag path under STRICT by @EtienneLescot in #314
  • fix(release): bump package-lock.json alongside package.json by @EtienneLescot in #290
  • ci: bump pinned GitHub Actions to their Node 24 majors by @EtienneLescot in #97
  • fix(linux): make the Linux build work on arm64 by @zebster-cmd in #293
  • feat: add Fedora RPM packaging support by @Mundo-Dev0ps in #101
  • ci(docs): bump the SHA-pinned Pages actions to their Node 24 majors by @EtienneLescot in #316
  • docs(ci): correct the include-hidden-files rationale in docs.yml by @EtienneLescot in #318
  • fix(linux): give the compositor's build.rs its own freestanding-header fallback by @EtienneLescot in #315
  • fix(linux): recover the DMA-BUF plane size the producer leaves at zero by @EtienneLescot in #319
  • test(media): stop the media-links temp-dir cleanup failing its own race by @EtienneLescot in #320
  • fix(linux): stop the packages needing a glibc newer than the target distro by @EtienneLescot in #322
  • fix(win): stop depending on the Visual C++ Redistributable by @EtienneLescot in #321
  • fix(linux): declare the libraries the packages need, and prove it on a clean machine by @EtienneLescot in #325
  • fix(linux): bundle libgomp in the AppImage, the one format that cannot declare it by @EtienneLescot in #326
  • ci(store): submit the appx to the Microsoft Store from the release build by @EtienneLescot in #311
  • fix(linux): declare xdg-desktop-portal and name its backend; ci(winget): stop skipping in silence by @EtienneLescot in #329
  • docs(dist): make the Microsoft Store the recommended Windows route by @EtienneLescot in #285
  • fix(win): ship the OpenMP runtime the ggml backends actually import by @EtienneLescot in #330
  • fix(wgc): GPU DXGI encode path for Windows capture, with a fallback at every step by @EtienneLescot in #305
  • fix(win): pace the capture loop to a deadline instead of sleeping a full period by @EtienneLescot in #331
  • feat(wgc): report which GPU capture landed on, and let the tool test audio by @EtienneLescot in #332
  • fix(ci): start release notes from a tag that exists by @EtienneLescot in #333
  • fix(wgc): make the GPU encode path opt-in until it earns the default by @EtienneLescot in #337
  • fix(recording): write fragmented MP4 so a killed helper keeps its file by @EtienneLescot in #338
  • fix(wgc): report adapter LUIDs, because the descriptions can be identical by @EtienneLescot in #342
  • ci(packaging): make the dormant Homebrew cask job visible, and add the AppStream metadata Flathub needs by @EtienneLescot in #340
  • ci(flatpak): spike how far Flathub actually is by @EtienneLescot in #347
  • docs(agents): add development principles, slim release flow, correct branch contract by @EtienneLescot in #96
  • fix(waveform): stop re-decoding audio-less recordings, and unify "no camera" (#348) by @EtienneLescot in #349
  • fix(wgc): make the Windows recorder DPI-aware and stop guessing its monitor by @EtienneLescot in #351
  • feat(build): let a developer package on a distro newer than the floor by @EtienneLescot in #360
  • fix(compositor): say when a declared camera is unreadable by @EtienneLescot in #357
  • fix(recording): open the recording a failed stop left playable by @EtienneLescot in #363
  • fix(editor): import a recording once, so reopening keeps the project you saved by @EtienneLescot in #366
  • feat(editor): delete a project from the Open project dialog by @EtienneLescot in #367
  • docs(e2e): correct the computer-use testing guidance, HUD to helpers by @EtienneLescot in #361
  • docs(testing): log the 1.9.5-rc.2 regression pass by @EtienneLescot in #369
  • docs(testing): "the machine is at 100%" is not a reason to skip DPI by @EtienneLescot in #372
  • docs(testing): batch the computer-use grants so the operator can leave by @EtienneLescot in #373
  • docs(testing): log the macOS 1.9.5-rc.1 pass — fragmenting is active, but a clean stop cannot prove it by @EtienneLescot in #374
  • fix(recording): stop macOS fragments carrying an offset the box cannot hold by @EtienneLescot in #375
  • chore(release): set main to 1.9.5 by @EtienneLescot in #378
  • fix(store): give msstore a project to publish, not just a package by @EtienneLescot in #379
  • ci(store): add a retry path for Store submission that rebuilds nothing by @EtienneLescot in #380
  • fix(store): the option is --inputDirectory, and it takes a directory by @EtienneLescot in #381
  • feat(update): add manual release checking by @arhxam in #313
  • feat(update): in-place updates on Windows, macOS and Linux by @EtienneLescot in #358
  • ci(aur): say which key AUR refused, instead of just that it refused one by @EtienneLescot in #382
  • docs: stop telling macOS users to strip the quarantine flag by @EtienneLescot in #383
  • fix(hud): give click-through a way out that Windows cannot revoke by @EtienneLescot in #388
  • docs(agents): the HUD lift is a cursor poll now, not a WH_MOUSE_LL hook by @EtienneLescot in #389
  • feat(website): rebuild the landing page around a live editor by @EtienneLescot in #391
  • chore(release): set main to 1.9.6 by @EtienneLescot in #393
  • fix(store): pin msstore-cli, whose v0.4.0 cancels every upload instantly by @EtienneLescot in #394
  • fix(recording): the camera that was chosen is the camera that gets recorded by @EtienneLescot in #403
  • fix(recording): carry the microphone's name, not just its id by @EtienneLescot in #404
  • fix(recording): advance the audio timeline on the clock, not on the data by @EtienneLescot in #406
  • fix(recording): stop a camera name from matching a different camera by @EtienneLescot in #405
  • fix(preview): stop the scrub seek storm that emptied the editor by @EtienneLescot in #400
  • fix(workbench): one tool roster, pinned in CI, instead of three hand-written ones by @EtienneLescot in #401
  • fix(compositor): anchor Linux annotations on the un-zoomed screen rect by @EtienneLescot in #398
  • fix(editor): restore spacing between slider labels and values by @tebuevd in #384
  • fix(layout): show no-webcam for camera-less projects by @arhxam in #310
  • fix(ai): report compacted model context by @arhxam in #312
  • fix(timeline): preserve partially anchored regions by @arhxam in #307
  • fix(editor): surface failed timeline saves by @arhxam in #308
  • fix(ai): prevent stale agent edit overwrites by @arhxam in #309
  • fix(ai): restore the agent rollback a dead catch had silenced by @EtienneLescot in #408
  • fix(captions): place subtitles against the output frame, and let the offsets reach its edges by @EtienneLescot in #399
  • feat(editor): add webcam crop, output gain, and Add to timeline by @vitaligusatinsky in #344
  • fix(captions): recover from a failed GPU start, and stop the helper on quit by @vitaligusatinsky in #345
  • fix(recording): advance the macOS audio timeline on the clock, not on the data by @EtienneLescot in #410
  • fix(editor): lay the camera box out from the camera, not from a guess by @EtienneLescot in #411
  • feat(stt): surface transcription timing and backend, drop the dead --cuda variant by @EtienneLescot in #409
  • fix(editor): keep the webcam pan when the zoom passes through 100% by @EtienneLescot in #413
  • test(e2e): drop the two stale checklist tests, clean their leftovers by @EtienneLescot in #417
  • test(recording): measure the Linux audio timeline instead of trusting it by @EtienneLescot in #415
  • fix(hud): keep the click-through mirror, its guard test, and its docs honest by @EtienneLescot in #416
  • feat(app): give the app an About box and a reachable update check by @EtienneLescot in #414
  • test(app): pin the copyright the bundle and the About box share by @EtienneLescot in #421
  • feat(nix): package the compositor, verify the build in CI, and bound two CLI hangs by @EtienneLescot in #419
  • fix(recording): size the capture buffer from the filter, not the display mode by @EtienneLescot in #423

Installer type: nullsoft

x64A04BD276C3679B4F1F8D406C9B9A58715F569BA35180FF9E13AFA244787A3C3F

Details

Homepage
https://github.com/getopenscreen/openscreen
License
MIT
Publisher
OpenScreen
Support
https://github.com/getopenscreen/openscreen/issues
Copyright
Copyright (c) 2025 Siddharth Vaddem
Moniker
openscreen

Tags

screen-recorderscreen-recordingscreencastvideo-editor

Older versions (2)

1.9.6
x640666D34F34DC0AD09B2E72040ACAD543368F95A0AA878AFE1864428E22EF4616
1.9.2
x64C6E6D74F18D9756A35C987839EFFAFB5AC110C33A2777C90EBEE7792C481A43C