Skip to content

v1.8.0

Latest

Choose a tag to compare

@EtienneLescot EtienneLescot released this 04 Aug 03:18

1.8.0 is two things: an optional AI editing layer, and a native rendering engine that takes export from ~8 fps to ~126 fps on the reference machine. Everything else follows from those. It ships on Windows, macOS and Linux.

🤖 The AI Edition — opt-in, off by default

A Descript-style editing layer that sits beside the recorder without changing it. If you never enable it, nothing downloads and no model is contacted.

  • On-device transcription — whisper.cpp with DTW word timestamps, running locally. Nothing is uploaded; it works offline.
  • Transcript-driven editing — edit video like a document. Select words, delete, and the span is cut from playback and export, through a skip-range model with per-asset regeneration.
  • Captions as a derived layer — cues are a live view of the transcript, not generated text you then maintain. Restyle or regroup with no regeneration step.
  • Edit by chat — a deepagents runtime with per-message rewind and manual compaction. The agent applies real, undoable timeline operations; Ctrl/Cmd + Z covers them exactly like manual edits.
  • Bring your own LLM key — provider and reasoning parity, model discovery, SSE streaming, context compaction. Keys live in your OS credential store, and requests go straight from your machine to the provider.

⚡ One native engine — and export an order of magnitude faster

The live preview and MP4 export now run on the same Rust compositor, replacing the browser-based pipeline 1.7.0 shipped:

demux → hardware decode → GPU composite → RGB→NV12 → hardware encode → MP4 mux

Every stage stays GPU-resident — there is no CPU readback between any two of them.

Export path fps @ 1080p60, full effects
Native compositor — 1.8.0 ~126
Browser pipeline — what 1.7.0 shipped ~8

Measured end to end — demux, decode, composite, encode and mux inside a single timed window — on an AMD Ryzen 5 7520U with integrated Radeon graphics, deliberately chosen as the weak case. The effect set is not a reduced one: animated layout, zooms, rounded corners, SDF masks and drop shadows, dual-Kawase background blur, per-velocity motion blur, and a custom cursor with click bounce. Absolute fps drifts with this passive iGPU's thermal state, and the multiple will differ on your machine and your project; the order of magnitude does not.

Two changes compound to get there, and the second only became findable because of the first. The old Canvas2D compositor was rebuilt to cache by what invalidates a cache rather than by layer — worth roughly 2×, with byte-identical output, SSIM 1.000000 across all 1418 frames. That made the real bottleneck legible: the encoder was never the wall. On the same export, compositing was 79 % of the time and encoding 4.5 % — so the compositor is what got replaced.

Preview and export consume the same SceneDescription the app builds, so the frame you see in the editor is the frame the export writes — there is no second renderer that can drift.

Around that engine, export gained: an encoder picked from the host's hardware with a software fallback, multi-asset timelines through a segment loop, timeline speed applied per sub-segment, output sized from every clip's cropped footprint, and real native progress reported to the UI.

🖥️ Three backends behind one scene contract

Windows — Direct3D 11 and HLSL. The original backend: D3D11VA decode, HLSL composite, hardware encode.

macOS — Metal and VideoToolbox. All nine shader entry points ported to MSL, plus a CoreText/CoreGraphics text rasterizer. Layers, annotations, the cursor and its trail, the 3D tilt zoom and the dual-Kawase background blur are all drawn on Metal. VideoToolbox hardware decode and encode (h264_videotoolbox, with libopenh264 as fallback), multi-clip export, and audio muxed into the output.

Linux — WGSL. compositor_linux carries the background blur, image and wallpaper backgrounds, the webcam PiP, screen and camera shadows, the themed cursor sprite, tilted 3D zoom, and text annotations — plus arrows, blur/mosaic masks and images. Video export is software H.264 encode with MP4 mux and AAC audio.

A CPU backend for machines with no usable GPU. Software render and decode, selected automatically and surfaced in the UI so you know which path you are on. It reaches the export encoder like any other backend. D3D11 now fails legibly instead of silently degrading to WARP.

⚡ macOS export, 2.4× faster

Profiling the first working Metal export found the cost somewhere unexpected: 74 % of the wall time was decode, while the compositor itself ran at 0.2 ms/frame.

Measured on a 1920×1080@60 Constrained Baseline capture, decode only:

Decoder 240 frames fps
VideoToolbox (hardware) 1.11 s 215
libavcodec (software) 0.08 s 3000

The hardware decoder pays a fixed per-frame latency and allocates a CVPixelBuffer/IOSurface for each frame, while a Baseline profile decodes in a few hundred microseconds across cores that — unlike the decode block — are plural. End to end on the export that is 76 fps against 182 — 2.4× — even though the software path additionally pays swscale and a full memcpy into the IOSurface every frame.

So the decoder is now chosen by profile rather than by flipping a default: Baseline and Constrained Baseline (what OpenScreen's own capture produces, and what Chrome's MediaRecorder emits) decode in software; High, 10-bit, HEVC and 4K, where the arbitration reverses, keep VideoToolbox. OPENSCREEN_MAC_DECODE=software|videotoolbox overrides.

Two per-frame pipeline stalls went with it — compose_frame and render_nv12 each committed and immediately waited, draining the GPU before the CPU had anything to do — along with a full-resolution RGBA mirror blit the export never reads.

🎥 Native capture on Linux

Recording routes through the native helper: real video capture with a hardware H.264 encoder, system audio and microphone captured alongside it, and real cursor telemetry on Wayland via the ScreenCast portal. Linux captures are remuxed so they carry a real duration.

🎞️ Native GIF export

GIF is routed through the native exporter and the old pixi.js path is deleted — one rendering path for every output format.

⚡ Preview and timeline responsiveness

  • Preview — a decoder pool, so scrubbing across a clip boundary no longer reopens decoders; a fast seek path that stops discarding decoder state; frames delivered without a copy; and a decoded-frame leak per scrub step fixed.
  • Timeline — no more re-rendering the whole editor on every playhead frame, or the timeline on every mouse event during a scrub. Progress-bar drags coalesce into rAF.
  • Schema migrations hoisted to load time.

✂️ OpenScreen Editor v4

Rebuilt around Media / Edit / Rec, and now the only editor — the pre-v4 shell is gone.

  • Multi-clip timeline — clips, lanes, viewport, snapping guides and a redesigned ruler.
  • .openscreen project files — non-destructive, so every edit stays re-editable.
  • Per-clip crop with exact ratios, real audio waveforms, a free speed field beyond 3x, gradients, the File menu and Full Camera.
  • Screen and camera welded into one contain-fitted block, so the camera keeps its frame.
  • The playhead and ruler reworked to the reference design, project rename in the v4 header, and a header that stops re-flowing on every state change.

And the rest

  • Annotations — arrows, blur/mosaic masks, images and text, rendered in the native compositor so preview and export agree, and created or edited straight from the inspector.
  • Zoom — 3D rotation presets, a global auto-focus toggle, steadier eases, and zoom focus that can follow the cursor.
  • Chat and agent — the reasoning trace streams into the chat panel, the model receives the actual cursor trajectory instead of a detector's verdict, and the AI timeline wizard is scoped to cuts only.
  • Microsoft Store (MSIX) packaging.
  • Geist — the typeface the design system always specified — the transparent brand mark, and a seamless window titlebar.
  • A Docusaurus documentation site, deployed to GitHub Pages.

Downloads

Asset For
Openscreen.Setup.1.8.0.exe Windows
Openscreen-macOS-Apple-Silicon-1.8.0.dmg macOS — Apple Silicon (M1, M2, M3, M4)
Openscreen-macOS-Intel-1.8.0.dmg macOS — Intel
Openscreen-Linux-1.8.0.AppImage Linux — portable, any distribution
Openscreen-Linux-1.8.0.deb Linux — Debian, Ubuntu
Openscreen-Linux-1.8.0.pacman Linux — Arch, Manjaro

Not sure which Mac you have? menu → About This MacChip. "Apple M1/M2/M3/M4" means Apple Silicon; "Intel Core" means Intel. The Intel build does launch on Apple Silicon, but it runs under Rosetta 2 — the compositor, the encoder and the transcription engine all get translated, and the app becomes slow enough to be unusable. Take the arm64 one.

Upgrade notes

  • Project files migrate to schema v6 on open. The legacy native aspect ratio is migrated using cropped dimensions.
  • The macOS builds are not signed or notarized. Gatekeeper will refuse the first launch: right-click the app → OpenOpen, or clear the quarantine flag with xattr -d com.apple.quarantine /Applications/Openscreen.app.
  • ChatGPT and GitHub Copilot are no longer available as LLM providers. Reaching a user's subscription meant shipping GitHub's and OpenAI's own client IDs against endpoints reserved for first-party clients. They will come back on the vendors' sanctioned surfaces — the Copilot SDK, and codex app-server. Anthropic, OpenAI, Google, Mistral, OpenRouter, MiniMax and any OpenAI-compatible endpoint are unaffected.

Known gaps

  • Linux MP4 export is software-encoded — correct output, but slower than the hardware paths on Windows and macOS.
  • macOS and Linux rendering is new in this release. Please report anything that looks wrong against the platform you saw it on.
All merged pull requests
  • fix(zoom): auto-placed zoom regions follow the cursor for their whole span by @EtienneLescot in #118
  • fix(wgc): stop holding the frame mutex across blocking WriteSample calls by @EtienneLescot in #119
  • fix(recording): round window-capture dimensions up to even for WGC by @EtienneLescot in #122
  • fix(timeline): decouple playhead from ancestor re-renders so it tracks playback by @EtienneLescot in #120
  • fix(recording): bound the video-writer frame wait as a hang safety net by @EtienneLescot in #123
  • fix(export): mix all source audio tracks so the mic isn't dropped by @barnaclebarnes in #109
  • docs(testing): add an RC end-to-end computer-use checklist by @EtienneLescot in #126
  • fix(editor): fix annotation placeholder text and post-reload duration cap by @EtienneLescot in #127
  • fix(overlay): stop the HUD drag from drifting away from the cursor by @EtienneLescot in #125
  • chore(release): release v1.7.0 into main by @EtienneLescot in #134
  • chore: temp workflow to fire the missed v1.7.0 Discord announce by @EtienneLescot in #137
  • chore: remove one-off Discord-announce workflow by @EtienneLescot in #138
  • feat(release): add Microsoft Store (MSIX) packaging by @EtienneLescot in #142
  • docs: rebuild the technical documentation as architecture reference, not project history by @EtienneLescot in #165
  • test(e2e): retarget the editor specs at the v4 shell by @EtienneLescot in #166
  • chore: delete dead code (PR 1/3) — -29,458 lines by @EtienneLescot in #167
  • refactor: reuse over reinvention (PR 2/3) by @EtienneLescot in #168
  • refactor: collapse the duplicate stacks (PR 3/3) by @EtienneLescot in #169
  • fix: three post-rebuild regressions — asar asset paths, tilt feather at radius 0, blank-MIME uploads by @EtienneLescot in #170
  • fix(compositor): PR #170's asset-path fix was a no-op in the packaged app — bypass asar-transparent fs by @EtienneLescot in #171
  • fix(stt): re-anchor whisper's word boundaries on the audio, so transcript trims cut where the words are by @EtienneLescot in #172
  • fix(release): the blockers and hardening from the 1.8.0 review by @EtienneLescot in #174
  • feat(chat): add welcome view when no LM provider is connected by @EtienneLescot in #175
  • feat(export): pick the video encoder from the host's hardware, with a libx264 fallback by @EtienneLescot in #161

New Contributors

Full Changelog: v1.7.0...v1.8.0