<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>OpenScreen development journal</title>
        <link>https://getopenscreen.com/blog/</link>
        <description>What I have shipped since picking OpenScreen up in June 2026, and what broke along the way.</description>
        <lastBuildDate>Sun, 27 Sep 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Making of v2: a demo is never ugly]]></title>
            <link>https://getopenscreen.com/blog/2026/09/27/making-of-v2-a-demo-is-never-ugly/</link>
            <guid>https://getopenscreen.com/blog/2026/09/27/making-of-v2-a-demo-is-never-ugly/</guid>
            <pubDate>Sun, 27 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How OpenScreen v2 came together. One rule, an audit against it, twenty-one pull requests merged into one branch, and a round of UI work that removed more than it added.]]></description>
            <content:encoded><![CDATA[<p>v2 started from one sentence rather than a feature list: a demo looks good without touching anything, and touching the settings can't make it ugly. That is the promise the best commercial recorders make, and on September 24 I audited OpenScreen against it.</p>
<p>The result was two rules kept out of ten, and thirty findings. The fixes are gathered in one branch, <a href="https://github.com/getopenscreen/openscreen/pull/814" target="_blank" rel="noopener noreferrer" class="">#814</a>, which is what v2 will be.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-audit">The audit<a href="https://getopenscreen.com/blog/2026/09/27/making-of-v2-a-demo-is-never-ugly/#the-audit" class="hash-link" aria-label="Direct link to The audit" title="Direct link to The audit" translate="no">​</a></h2>
<p>Ten rules, each written as something a user should be able to rely on. Defaults that look good. Every value bounded, with a way back to its default. A format change or a cut that breaks nothing. What you see in the preview is what you export.</p>
<p>Measured on the build of that day, the defaults failed first:</p>
<ul>
<li class=""><strong>The default cursor</strong> was 82 px tall in a 1080p export, about four times the system arrow, and it could be pushed to 272 px.</li>
<li class=""><strong>The default shadow</strong> drew at 9% opacity, which on most wallpapers means no shadow at all.</li>
<li class=""><strong>A 16:9 recording exported as 9:16</strong> filled 20% of the frame.</li>
</ul>
<p>None of those is a bug in the usual sense. Each one is a setting that works as written and makes the video worse.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="twenty-one-pull-requests-one-branch">Twenty-one pull requests, one branch<a href="https://getopenscreen.com/blog/2026/09/27/making-of-v2-a-demo-is-never-ugly/#twenty-one-pull-requests-one-branch" class="hash-link" aria-label="Direct link to Twenty-one pull requests, one branch" title="Direct link to Twenty-one pull requests, one branch" translate="no">​</a></h2>
<p>The findings split into six workstreams, and each became a pull request against a shared integration branch instead of <code>main</code>. They touch the same panels and the same compositor, and landing them one by one would have meant a week of broken intermediate states on <code>main</code>. Merged into one branch in dependency order, they can be tested together and land together.</p>
<p><strong>Defaults.</strong> The cursor is half its old size, 41 px in 1080p. The shadow is at 27% opacity. New projects start from the look of your last one.</p>
<p><strong>Bounds in the model.</strong> One table clamps every appearance value, whoever writes it: the panel, the AI agent, a preset or a hand-edited project file. Every slider has a reset.</p>
<p><strong>The render tells the truth.</strong> Two findings were the kind you only see by measuring. Every text font exported as Segoe UI, pixel for pixel, because the picker offered fonts the app never shipped; five open-licensed families are embedded now. Gradients used only their first and last colour stops, so a red, green and blue gradient drew purple at its midpoint where green belonged.</p>
<p><strong>Export.</strong> The bitrate the app computed never reached the encoder, so every export ran at 8 Mb/s whatever the frame rate. It is 18.7 Mb/s at 1080p60 now. GIFs are dithered, and the dialog offers four destinations (Web / YouTube, Social, Studio, README GIF) with the codec details folded under Advanced.</p>
<p><strong>Audio.</strong> Voice is normalised to −16 LUFS with a soft limiter instead of a hard clip, and music ducks under it.</p>
<p><strong>Framing.</strong> A 16:9 take in a 9:16 export now fills 64% of the frame, in a window that follows the cursor. Zooms are capped at twice the source's own resolution, so a deep zoom no longer magnifies blur. Silence cuts keep 70 ms of breath on each side, so a cut doesn't clip the start of a word.</p>
<p>One thing went the other way. The 17 third-party cursor packs are gone: their terms don't allow redistribution. Five original themes replace them.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="then-the-interface">Then the interface<a href="https://getopenscreen.com/blog/2026/09/27/making-of-v2-a-demo-is-never-ugly/#then-the-interface" class="hash-link" aria-label="Direct link to Then the interface" title="Direct link to Then the interface" translate="no">​</a></h2>
<p>With the rules holding, the panels were the next thing to make ugly by accident. The branch this post was written on carries about a hundred and twenty more commits, and most of them delete something.</p>
<p><strong>One click per choice.</strong> The selects and dropdowns in the right panel became rows of buttons, so every option is visible and picking one is a single click: format, frame style, the zoom's 3D camera, focus mode, cursor style, caption language and font. Only the fifteen translation targets stay a list.</p>
<p><strong>Names instead of numbers.</strong> A shadow is None, Light, Medium or Strong. Click bounce is None, Light or Strong. A slider stays where the amount is the point (padding, background blur, cursor size), and a slider with no unit shows no number.</p>
<p><strong>No explanations under settings.</strong> If the label needs a sentence to be understood, the label is wrong. An option that does nothing in the current context is hidden instead of greyed out with its reason.</p>
<p><strong>Fewer controls.</strong> The Fit button rewrote four settings without naming any, and padding at 0 already does its job, so it's gone. The seek bar under the transport repeated the ruler right below it, so that went too.</p>
<p><strong>A timeline you read by colour.</strong> The recording is the main object on the timeline, so it wears the brand's green. Zoom pills are blue, so the most common effect never reads as the clip under it. Every block is a solid card with dark text, because mint can't carry white: 2.3:1 contrast with white text, 8.2:1 with dark ink.</p>
<p>The walkthrough on the <a class="" href="https://getopenscreen.com/">home page</a> and this site's docs were redrawn to match.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-3d-camera">The 3D camera<a href="https://getopenscreen.com/blog/2026/09/27/making-of-v2-a-demo-is-never-ugly/#the-3d-camera" class="hash-link" aria-label="Direct link to The 3D camera" title="Direct link to The 3D camera" translate="no">​</a></h2>
<p>The 3D work followed the same rule. A camera that rolls during a zoom looks broken rather than cinematic, so a moving camera never rolls now. The fixed angles went through three versions in a day before landing back on the v1.13.0 angle, checked against a real v1.13.0 export rather than from memory. The follow camera became <strong>3D Orbit</strong>, which obeys the zoom's focus mode like the flat zoom does. The 3D cursor dives onto each click in depth, and the click impact that used to live on the zoom is a cursor setting for every camera.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="before-v2-ships">Before v2 ships<a href="https://getopenscreen.com/blog/2026/09/27/making-of-v2-a-demo-is-never-ugly/#before-v2-ships" class="hash-link" aria-label="Direct link to Before v2 ships" title="Direct link to Before v2 ships" translate="no">​</a></h2>
<p><a href="https://github.com/getopenscreen/openscreen/pull/814" target="_blank" rel="noopener noreferrer" class="">#814</a> is open, and green except for one compositor test on Linux and macOS that checks the 3D cursor's footprint. After that, it needs a manual pass on real Windows and macOS machines, then the usual release candidates.</p>
<p>It is still not production-grade, and rough edges are expected. If a default still makes your demo worse, that is exactly the bug this release is about: <a href="https://getopenscreen.com/discord/" target="_blank" rel="noopener noreferrer" class="">Discord</a> or an issue, either works.</p>]]></content:encoded>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[An export benchmark built to be hard to fake]]></title>
            <link>https://getopenscreen.com/blog/2026/09/09/an-export-benchmark-hard-to-fake/</link>
            <guid>https://getopenscreen.com/blog/2026/09/09/an-export-benchmark-hard-to-fake/</guid>
            <pubDate>Wed, 09 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[An open, reproducible screen recorder export benchmark. Same clip, same edit, each result divided by ffmpeg on the same machine and verified in pixels.]]></description>
            <content:encoded><![CDATA[<p>Every screen recorder claims a fast export. None of them says fast compared to what.</p>
<p>So the comparison is public now: <a href="https://etiennelescot.github.io/screen-recorder-benchmark/" target="_blank" rel="noopener noreferrer" class="">screen-recorder-benchmark</a>. Same clip, same edit, same machine, across the desktop apps built to turn a recording into a finished demo. OpenScreen is one of the tools in it, alongside Cap, FocuSee, Recordly and Screen Studio, and the standings are whatever the submissions say.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-current-standings">The current standings (lower is better)<a href="https://getopenscreen.com/blog/2026/09/09/an-export-benchmark-hard-to-fake/#the-current-standings" class="hash-link" aria-label="Direct link to The current standings (lower is better)" title="Direct link to The current standings (lower is better)" translate="no">​</a></h2>
<div class="panel_INAy"><p class="fallback_Ho1S">Loading the current standings…</p></div>
<p>Read the ratio, not seconds. Each figure is an export divided by what a plain ffmpeg transcode of the same clip needed on the same machine, measured minutes earlier. A tool at 1.5× did 50% more work than a bare re-encode, on whatever hardware you have. Seconds only ever compare a machine to itself.</p>
<p>The scenario is a finished demo rather than a transcode: a sampled wallpaper, padding, rounded corners, a drop shadow, three animated zooms, motion blur, a cursor redrawn from telemetry, a webcam inset with mask and shadow, and the recording's audio, all pinned to 1920x1080 at 60 fps in H.264. How the <a class="" href="https://getopenscreen.com/download/">current OpenScreen release</a> renders that is in the <a class="" href="https://getopenscreen.com/docs/export/">export docs</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="four-decisions-that-make-it-hard-to-fake">Four decisions that make it hard to fake<a href="https://getopenscreen.com/blog/2026/09/09/an-export-benchmark-hard-to-fake/#four-decisions-that-make-it-hard-to-fake" class="hash-link" aria-label="Direct link to Four decisions that make it hard to fake" title="Direct link to Four decisions that make it hard to fake" translate="no">​</a></h2>
<p><strong>ffmpeg is the 1x, and it is not a competitor.</strong> The reference is re-measured on your machine, under your load, immediately before each tool runs. Nothing is normalised against a number I recorded once on a laptop I own.</p>
<p><strong>No tool is required in a submission.</strong> Tools are nodes, every pair measured together on one machine is an edge, and the ranking is recovered by least squares across the whole graph. Two people who never measured the same app still contribute to the same ordering, as long as the submissions overlap somewhere.</p>
<p><strong>The verifier decides what happened, not the app.</strong> Every export is re-probed before it counts: resolution, frame rate, codec and duration against the target, then wallpaper, padding, corner radius, zooms, cursor and camera checked in the pixels, then audio by loudness, because a silent track passes any check that only asks whether audio exists. A tool reports what it configured. The verifier reports what came out, and the verifier wins.</p>
<p><strong>The disagreement is published above the ranking.</strong> Where one pair of tools was measured on more than one machine, the two ratios can differ by more than the gap the ranking puts between them, and that spread is printed at the top of the page rather than in a footnote. A single global order is not yet what this data supports, and the page says so before it shows you one.</p>
<p>Roster membership follows what a tool is for, not whether I managed to automate it. An app I cannot drive is an empty cell, and an empty cell is a result.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-a-machine">Add a machine<a href="https://getopenscreen.com/blog/2026/09/09/an-export-benchmark-hard-to-fake/#add-a-machine" class="hash-link" aria-label="Direct link to Add a machine" title="Direct link to Add a machine" translate="no">​</a></h2>
<p>The hardware coverage is thin, and it shows in the spread above. A run needs any two tools and takes one command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">node bench.mjs run --bundle commons-upload --apps &lt;two or more tools&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">node bench.mjs submit --run &lt;runId&gt; --as "your name" &gt; submissions/&lt;platform&gt;/&lt;chip&gt;-&lt;date&gt;.json</span><br></div></code></pre></div></div>
<p>Open a pull request. CI validates it against the schema and regenerates the site, so the table on this page moves as soon as it merges. The footage comes from permanent Wikimedia URLs with a hash, so two machines can prove they measured the same thing. It is MIT, and the results page is the repo's own output: <a href="https://github.com/EtienneLescot/screen-recorder-benchmark" target="_blank" rel="noopener noreferrer" class="">EtienneLescot/screen-recorder-benchmark</a>.</p>
<p>Building it this way meant accepting the answer before knowing it, on every machine anyone adds. A benchmark whose author always wins is a marketing page.</p>]]></content:encoded>
            <category>benchmark</category>
            <category>performance</category>
        </item>
        <item>
            <title><![CDATA[Crash-safe recordings, and an app you can install]]></title>
            <link>https://getopenscreen.com/blog/2026/08/24/store-and-crash-safe-recordings/</link>
            <guid>https://getopenscreen.com/blog/2026/08/24/store-and-crash-safe-recordings/</guid>
            <pubDate>Mon, 24 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[By v1.10.0, OpenScreen was in the Microsoft Store and on Fedora, and Windows and macOS capture wrote fragmented MP4, so a crash leaves a playable file.]]></description>
            <content:encoded><![CDATA[<p>Two things in this stretch matter more than the version numbers. Capture on Windows and macOS now writes fragmented MP4, so a recorder that dies halfway through leaves you a playable file instead of a corrupt one. And the app finally installs the way people on each platform expect it to.</p>
<p>That is <a href="https://github.com/getopenscreen/openscreen/releases/tag/v1.10.0" target="_blank" rel="noopener noreferrer" class="">v1.10.0</a>, August 24. Before it, v1.9.0 through v1.9.6 in under two weeks.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="losing-a-recording-used-to-be-possible">Losing a recording used to be possible<a href="https://getopenscreen.com/blog/2026/08/24/store-and-crash-safe-recordings/#losing-a-recording-used-to-be-possible" class="hash-link" aria-label="Direct link to Losing a recording used to be possible" title="Direct link to Losing a recording used to be possible" translate="no">​</a></h2>
<p>A screen recorder that can lose the take is not a screen recorder. The old capture path wrote a single MP4 whose index is finalised at the end, so a helper crash, a forced quit or a dead battery left a file no player could open. The recording had happened. It was just unreadable.</p>
<p>Capture on Windows and macOS writes fragmented MP4 now. The file is valid at every fragment boundary, so whatever was captured before the process died is still there and still plays. Linux still writes a plain MP4, so a crash there can still cost the file.</p>
<p>The same release stopped two other ways to lose work. The native webcam stream writes to disk while it records, so killing a recording can't take the camera track with it, and the Windows capture helper stopped hanging on stop, which used to require killing the process and losing the file.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-you-can-install-it-now">Where you can install it now<a href="https://getopenscreen.com/blog/2026/08/24/store-and-crash-safe-recordings/#where-you-can-install-it-now" class="hash-link" aria-label="Direct link to Where you can install it now" title="Direct link to Where you can install it now" translate="no">​</a></h2>
<p>Most of v1.10.0 was packaging. Distribution is where free desktop software quietly fails: the build works, and nobody can get it.</p>
<p><strong>Windows.</strong> The appx goes to the Microsoft Store from the release build, with branded tiles. That is the route I'd recommend on Windows now, and the <a class="" href="https://getopenscreen.com/docs/installation/">installation docs</a> walk through it. winget stopped skipping silently. There is no Visual C++ Redistributable dependency any more, and the OpenMP runtime the transcription backends actually import is bundled, so transcription works on a clean machine.</p>
<p><strong>Linux.</strong> Fedora RPM (<a href="https://github.com/getopenscreen/openscreen/pull/101" target="_blank" rel="noopener noreferrer" class="">@Mundo-Dev0ps</a>), a source build that completes on ARM64 machines (<a href="https://github.com/getopenscreen/openscreen/pull/293" target="_blank" rel="noopener noreferrer" class="">@zebster-cmd</a>), and DMA-BUF negotiation so capture works on niri and other wlroots compositors, which had no working screen recorder from this project at all. Packages now respect the glibc floor of the distros they claim to target, declared and proven on a clean machine, and AppStream metadata is in place for Flathub. The released packages, all x64, are on the <a class="" href="https://getopenscreen.com/download/">download page</a>.</p>
<p><strong>macOS.</strong> The Homebrew cask job now reports that it published nothing, instead of passing silently.</p>
<p>Capture is also DPI-aware and stops guessing which monitor you meant, and there is a GPU DXGI encode path behind a flag, opt-in until it earns the default.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="v190-three-weeks-earlier">v1.9.0, three weeks earlier<a href="https://getopenscreen.com/blog/2026/08/24/store-and-crash-safe-recordings/#v190-three-weeks-earlier" class="hash-link" aria-label="Direct link to v1.9.0, three weeks earlier" title="Direct link to v1.9.0, three weeks earlier" translate="no">​</a></h2>
<p>v1.9.0 shipped August 5, the day after v1.8.0 was promoted. That is a backed-up queue rather than speed: the 1.8.0 RC window ran through nine candidates while <code>main</code> kept moving. The frozen release branch is the only reason the two didn't tangle.</p>
<p>Two features in it:</p>
<ul>
<li class="">Teleprompter mode in the notes window. Your script scrolls next to the capture, mirrored so it reads right in a webcam (<a href="https://github.com/getopenscreen/openscreen/pull/152" target="_blank" rel="noopener noreferrer" class="">@My-Denia</a>).</li>
<li class="">A CLI with <code>record</code>, <code>export</code> and <code>info</code>, driving the same engine the app does, which makes OpenScreen usable from a script (<a href="https://github.com/getopenscreen/openscreen/pull/176" target="_blank" rel="noopener noreferrer" class="">@PeterTakahashi</a>). Recording still needs a real desktop session, as the <a class="" href="https://getopenscreen.com/docs/cli/">CLI docs</a> explain.</li>
</ul>
<p>It also removed a PID-file instance lock that could permanently brick startup, notarized macOS RCs like stable builds, and made the AppX package declare all 13 locales instead of one.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-changed-in-the-patch-releases">What changed in the patch releases<a href="https://getopenscreen.com/blog/2026/08/24/store-and-crash-safe-recordings/#what-changed-in-the-patch-releases" class="hash-link" aria-label="Direct link to What changed in the patch releases" title="Direct link to What changed in the patch releases" translate="no">​</a></h2>
<p>v1.9.1, v1.9.2, v1.9.5 and v1.9.6 went out over ten days. 1.9.3 and 1.9.4 never left RC and their fixes rolled forward.</p>
<p>Roundness, shadow and motion blur are on by default now, which is the look most people were assembling by hand on every project. The Windows cursor sampler became DPI-aware. The chat agent learned <code>addTrims</code> and <code>addZooms</code>, so asking it for a cut stopped costing a round trip through a slower path.</p>
<p>Every release's regression pass is written up in the repo's testing docs, including the ones that caught a candidate breaking something. This site was rebuilt in the same window, and gained its light theme.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="on-main-right-now">On <code>main</code> right now<a href="https://getopenscreen.com/blog/2026/08/24/store-and-crash-safe-recordings/#on-main-right-now" class="hash-link" aria-label="Direct link to on-main-right-now" title="Direct link to on-main-right-now" translate="no">​</a></h2>
<p>Webcam background effects have landed on all three compositor backends. Blur or replace what is behind you, including an AI cutout that doesn't need a green screen. The transcription helper reports its real timing and which compute backend it used, so "how long will this take" has an answer instead of a progress bar with no scale.</p>
<p>Still open: hardware encode on Linux, and measurements on discrete GPUs and QSV. It is still not production-grade, so rough edges are expected and bug reports are welcome.</p>
<p>Three months, ten releases. <a href="https://getopenscreen.com/discord/" target="_blank" rel="noopener noreferrer" class="">Discord</a> is open if you want to argue with any of it.</p>]]></content:encoded>
            <category>release</category>
            <category>distribution</category>
        </item>
        <item>
            <title><![CDATA[v1.8.0, local whisper and a Rust compositor]]></title>
            <link>https://getopenscreen.com/blog/2026/08/04/local-whisper-and-a-rust-compositor/</link>
            <guid>https://getopenscreen.com/blog/2026/08/04/local-whisper-and-a-rust-compositor/</guid>
            <pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Export went from about 8 fps to about 126 fps on one laptop. Plus an opt-in AI layer: Whisper runs locally, chat goes to the LLM provider you connect.]]></description>
            <content:encoded><![CDATA[<p>Exporting a 1080p60 project with full effects used to run at about 8 fps. The same project now exports at about 126 fps on the same laptop. The bottleneck was never the encoder, which is the part of this worth writing down.</p>
<p><a href="https://github.com/getopenscreen/openscreen/releases/tag/v1.8.0" target="_blank" rel="noopener noreferrer" class="">v1.8.0</a> shipped that on August 4, alongside an optional AI editing layer. It transcribes on your own machine, and chat edits go to the LLM provider you connect.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-ai-layer">The AI layer<a href="https://getopenscreen.com/blog/2026/08/04/local-whisper-and-a-rust-compositor/#the-ai-layer" class="hash-link" aria-label="Direct link to The AI layer" title="Direct link to The AI layer" translate="no">​</a></h2>
<p>It is off by default. If you never turn it on, nothing downloads, no model is contacted, and you have exactly the 1.7.0 feature set. That was in the roadmap from week one and I don't intend to change it.</p>
<p>Turn it on and you get four things.</p>
<p><strong>Transcription on your machine.</strong> Whisper via whisper.cpp, with Metal on Apple Silicon, Vulkan on Windows and Linux, CPU everywhere else. DTW word timestamps. Nothing is uploaded, and after a one-time model download it works offline.</p>
<p><strong>Editing through the transcript.</strong> Select words, delete them, the span is cut from playback and export. Word boundaries get re-anchored against the audio so the cut lands where the word actually starts.</p>
<p><strong>Captions derived from the transcript</strong>, instead of generated once and then maintained by hand. Restyle or regroup them with no regeneration step. Translation into 15 languages if you want it, through the LLM provider you connect for chat. The <a class="" href="https://getopenscreen.com/docs/captions/">captions docs</a> cover styling and translation.</p>
<p><strong>Editing by chat.</strong> Describe an edit in plain language and an agent applies real timeline operations: cuts, zooms, speed ramps, annotations, camera framing. <code>Ctrl/Cmd + Z</code> undoes an agent edit the same way it undoes yours, with per-message rewind.</p>
<p>The chat uses your own LLM key. Anthropic, OpenAI, Google, Mistral, OpenRouter, MiniMax, or anything OpenAI-compatible. Keys are stored encrypted through your OS's credential protection, and requests go from your machine straight to the provider. There is no OpenScreen server in the middle, because there is no OpenScreen server. Setup is in the <a class="" href="https://getopenscreen.com/docs/ai-editing/">AI editing docs</a>.</p>
<p>1.8.0 also <em>removed</em> the ChatGPT and GitHub Copilot sign-in options the pre-fork codebase had. Using someone's existing subscription there meant shipping GitHub's and OpenAI's own client IDs against endpoints they reserve for their own clients, from inside a signed installer. I didn't want to be in that position. If those vendors open a sanctioned surface, the integrations come back.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-compositor">The compositor<a href="https://getopenscreen.com/blog/2026/08/04/local-whisper-and-a-rust-compositor/#the-compositor" class="hash-link" aria-label="Direct link to The compositor" title="Direct link to The compositor" translate="no">​</a></h2>
<p>Export at 1080p60 with full effects ran at roughly 8 fps. The same project now runs at roughly 126 fps on the same laptop, an AMD Ryzen 5 7520U with its passive integrated Radeon. That machine is deliberately weak. Your number will be different. The order of magnitude is the point.</p>
<p>It is one GPU-resident chain with no CPU readback between stages:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">demux -&gt; hardware decode -&gt; GPU composite -&gt; RGB to NV12 -&gt; hardware encode -&gt; MP4 mux</span><br></div></code></pre></div></div>
<p>I didn't set out to rewrite it. I first rebuilt the Canvas2D compositor to cache by what invalidates a cache instead of by layer. That was worth about 2x, and I verified it byte-identical (SSIM 1.000000 across all 1418 frames of the reference export). What it really did was make the profile readable: compositing was 79% of the time, encoding was 4.5%. The bottleneck was the compositor, running on the CPU inside a browser.</p>
<p>Preview and export now both consume the same <code>SceneDescription</code> the app builds, so there is no second renderer to drift. The frame in the editor is the frame that gets written.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="three-backends">Three backends<a href="https://getopenscreen.com/blog/2026/08/04/local-whisper-and-a-rust-compositor/#three-backends" class="hash-link" aria-label="Direct link to Three backends" title="Direct link to Three backends" translate="no">​</a></h2>
<table><thead><tr><th>Backend</th><th>Stack</th></tr></thead><tbody><tr><td>Windows</td><td>Direct3D 11, HLSL, D3D11VA decode, hardware encode</td></tr><tr><td>macOS</td><td>Metal (all nine shader entry points ported to MSL), VideoToolbox decode/encode, CoreText text rasterizer</td></tr><tr><td>Linux</td><td>wgpu/WGSL, software H.264 encode, MP4 mux with AAC audio</td></tr></tbody></table>
<p>There is a CPU backend too, software render and decode, picked automatically when there is no usable GPU. The UI tells you when you are on it, so a slow export has a visible reason.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-macos-decode-detour">The macOS decode detour<a href="https://getopenscreen.com/blog/2026/08/04/local-whisper-and-a-rust-compositor/#the-macos-decode-detour" class="hash-link" aria-label="Direct link to The macOS decode detour" title="Direct link to The macOS decode detour" translate="no">​</a></h3>
<p>Profiling the first working Metal export showed 74% of wall time in decode. The compositor was at 0.2 ms/frame. The hardware decoder pays a fixed per-frame latency, and OpenScreen's own capture writes Constrained Baseline H.264, which software decodes in a few hundred microseconds.</p>
<p>So the decoder is picked by profile now. Baseline goes to software, which came out 2.4x faster end-to-end on the test export (182 fps against 76). High, HEVC and 4K go to VideoToolbox, where the arbitration flips the other way.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="still-open">Still open<a href="https://getopenscreen.com/blog/2026/08/04/local-whisper-and-a-rust-compositor/#still-open" class="hash-link" aria-label="Direct link to Still open" title="Direct link to Still open" translate="no">​</a></h2>
<p>Hardware encode on Linux. It is correct today and slower for being software. And every number above comes from one weak laptop, so discrete GPUs and Intel QSV still need real measurements. Update, September 2026: since v1.11.0, H.264 export on Linux uses VAAPI when the driver and GPU support it, and falls back to software otherwise. H.265 on Linux is still software. The <a class="" href="https://getopenscreen.com/docs/export/">export docs</a> cover the render path, and the <a class="" href="https://getopenscreen.com/download/">download page</a> has the current release.</p>
<p>Next: v1.9.0 through v1.9.6 in twelve days, and v1.10.0.</p>]]></content:encoded>
            <category>release</category>
            <category>ai</category>
            <category>performance</category>
        </item>
        <item>
            <title><![CDATA[v1.7.0 was mostly written by people I'd never met]]></title>
            <link>https://getopenscreen.com/blog/2026/07/19/eight-first-time-contributors/</link>
            <guid>https://getopenscreen.com/blog/2026/07/19/eight-first-time-contributors/</guid>
            <pubDate>Sun, 19 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Eight first-time contributors shipped most of v1.7.0, including memory-safe long recordings. v1.6.0 built the release process that made merging safe.]]></description>
            <content:encoded><![CDATA[<p>Two releases in the first month, <a href="https://github.com/getopenscreen/openscreen/releases/tag/v1.6.0" target="_blank" rel="noopener noreferrer" class="">v1.6.0</a> on July 4 and <a href="https://github.com/getopenscreen/openscreen/releases/tag/v1.7.0" target="_blank" rel="noopener noreferrer" class="">v1.7.0</a> on July 19. The second one is the one worth writing about. Eight people who had never touched the project shipped most of it, and several of those changes fix things that had been broken since before the archive.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="v160-so-that-merging-is-safe">v1.6.0, so that merging is safe<a href="https://getopenscreen.com/blog/2026/07/19/eight-first-time-contributors/#v160-so-that-merging-is-safe" class="hash-link" aria-label="Direct link to v1.6.0, so that merging is safe" title="Direct link to v1.6.0, so that merging is safe" translate="no">​</a></h2>
<p>The fork inherited a codebase with no release candidate process. Merging a stranger's PR into a project with no RC step means the first person to find the regression is a user, so this came first: RC tags, a promote workflow, release notes generated from the PR history.</p>
<p>The Windows Graphics Capture helper, the native code that does the actual recording on Windows, got per-step stop timing and a diagnostic tool. "Recording fails on stop" is not a fixable bug report when all you know is that it failed, and it was the most common one.</p>
<p>The Linux HUD got its drag handle back. The overlay's pointer-events handling made the bar unmovable there, which nobody had noticed because nobody on the original team ran Linux.</p>
<p>Three PRs from outside landed in this one: the macOS cursor offset in single-window capture (<a href="https://github.com/getopenscreen/openscreen/pull/22" target="_blank" rel="noopener noreferrer" class="">@giulio333</a>), copy/paste for timeline region attributes (<a href="https://github.com/getopenscreen/openscreen/pull/33" target="_blank" rel="noopener noreferrer" class="">@446f6e6e79</a>), and a CI refactor (<a href="https://github.com/getopenscreen/openscreen/pull/40" target="_blank" rel="noopener noreferrer" class="">@psychosomat</a>).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-release-branch-rule">The release branch rule<a href="https://getopenscreen.com/blog/2026/07/19/eight-first-time-contributors/#the-release-branch-rule" class="hash-link" aria-label="Direct link to The release branch rule" title="Direct link to The release branch rule" translate="no">​</a></h3>
<p>If you maintain something with a promote step, this is the part to steal. One release branch per stable version, cut at the RC, frozen until promote. Only cherry-picked bugfixes land on it, and anything merged to <code>main</code> after the cut ships in the next cycle.</p>
<p>I wrote that rule after the promote workflow tagged the tip of <code>main</code> instead of the RC snapshot people had tested. The release went out containing commits nobody had signed off on, and I replayed it. The rule is in the repo docs now and every release since has followed it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="v170">v1.7.0<a href="https://getopenscreen.com/blog/2026/07/19/eight-first-time-contributors/#v170" class="hash-link" aria-label="Direct link to v1.7.0" title="Direct link to v1.7.0" translate="no">​</a></h2>
<p>Eight first-time contributors:</p>
<ul>
<li class="">Large recordings stream instead of loading into memory. The editor and exporter used to run out of RAM on long captures, which made the app unusable for exactly the recordings people care most about (<a href="https://github.com/getopenscreen/openscreen/pull/74" target="_blank" rel="noopener noreferrer" class="">@rainyflash</a>).</li>
<li class="">A software H.264 fallback for Windows machines whose hardware encoder is missing or locked, which is a large share of corporate laptops (<a href="https://github.com/getopenscreen/openscreen/pull/73" target="_blank" rel="noopener noreferrer" class="">@My-Denia</a>).</li>
<li class="">The webcam recorder now starts after native macOS capture does, so the first seconds of camera footage stop vanishing (<a href="https://github.com/getopenscreen/openscreen/pull/85" target="_blank" rel="noopener noreferrer" class="">@josiahcoad</a>).</li>
<li class="">A fix for the cursor drifting out of place after a crop (<a href="https://github.com/getopenscreen/openscreen/pull/65" target="_blank" rel="noopener noreferrer" class="">@SakuraiSatoru</a>).</li>
<li class="">A notes window that capture ignores, so you can keep your script beside the recording without it showing up in the video (<a href="https://github.com/getopenscreen/openscreen/pull/43" target="_blank" rel="noopener noreferrer" class="">@Itzadetunji</a>).</li>
<li class="">Playback speed up to 100x, for finding the one moment you want in an hour of footage (<a href="https://github.com/getopenscreen/openscreen/pull/80" target="_blank" rel="noopener noreferrer" class="">@rainyflash</a>).</li>
<li class="">The Full Camera timeline effect. Press a key and the webcam PiP grows to fullscreen for a stretch, then eases back (<a href="https://github.com/getopenscreen/openscreen/pull/66" target="_blank" rel="noopener noreferrer" class="">@rodrvc</a>).</li>
<li class="">A custom gradient editor for backgrounds (<a href="https://github.com/getopenscreen/openscreen/pull/81" target="_blank" rel="noopener noreferrer" class="">@psychosomat</a>).</li>
</ul>
<p>The platform work in that release was mine. Preview recovery from WebGL context loss on Linux and Wayland. Vulkan off on Wayland so PipeWire capture can import DMA-BUF frames. webm duration patching rewritten so hour-long recordings stop killing the editor on load.</p>
<p>Full Camera and speed regions are covered in the <a class="" href="https://getopenscreen.com/docs/editing-timeline/">timeline docs</a>, and the <a class="" href="https://getopenscreen.com/download/">download page</a> has the current build.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-this-matters-more-than-the-feature-list">Why this matters more than the feature list<a href="https://getopenscreen.com/blog/2026/07/19/eight-first-time-contributors/#why-this-matters-more-than-the-feature-list" class="hash-link" aria-label="Direct link to Why this matters more than the feature list" title="Direct link to Why this matters more than the feature list" translate="no">​</a></h2>
<p>An archived repo with 39k stars has a lot of people sitting on fixes they wrote for themselves and never upstreamed, because there was nobody to merge them. Reopening the repo released about a month of accumulated work in two weeks, from people who had already done it.</p>
<p>That is the argument for continuing an archived project rather than starting a new one. The users are already there and some of them are already contributors.</p>
<p>Next: v1.8.0, where an AI layer and a whole new rendering engine shipped under one version number.</p>]]></content:encoded>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[Picking up OpenScreen]]></title>
            <link>https://getopenscreen.com/blog/2026/06/15/picking-up-openscreen/</link>
            <guid>https://getopenscreen.com/blog/2026/06/15/picking-up-openscreen/</guid>
            <pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The original repo was archived after v1.5.0. I forked it, kept the name and the MIT license, and moved it to a new home.]]></description>
            <content:encoded><![CDATA[<p>The last commit on <a href="https://github.com/siddharthvaddem/openscreen" target="_blank" rel="noopener noreferrer" class="">siddharthvaddem/openscreen</a> landed on June 6, 2026. It bumped the Nix package to v1.5.0. Then the repo went read-only, like the README had been warning it would for a while. 39k stars, and v1.5.0 as the final release.</p>
<p>I picked it up on June 15, with <a href="https://github.com/siddharthvaddem/openscreen#readme" target="_blank" rel="noopener noreferrer" class="">the original author's approval</a>. Same name, same MIT license, new URL. This post starts a journal of what happens next.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-it-lives-now">Where it lives now<a href="https://getopenscreen.com/blog/2026/06/15/picking-up-openscreen/#where-it-lives-now" class="hash-link" aria-label="Direct link to Where it lives now" title="Direct link to Where it lives now" translate="no">​</a></h2>
<p><a href="https://github.com/getopenscreen/openscreen" target="_blank" rel="noopener noreferrer" class="">github.com/getopenscreen/openscreen</a>. It started as a personal fork and moved under the <code>getopenscreen</code> org in the first week. It stays there. Installers are on the <a class="" href="https://getopenscreen.com/download/">download page</a>, and the <a class="" href="https://getopenscreen.com/docs/intro/">docs</a> cover installing, recording, editing and export.</p>
<p>The archived original is still online and still read-only. Every commit of it is in this repo's history.</p>
<p>I tagged v1.5.0 on day one with no code changes at all. Same code, same installer, same version number. It only exists to prove the release pipeline works on my infrastructure before anything real ships through it. v1.6.0 is the first release with new work in it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-im-committing-to">What I'm committing to<a href="https://getopenscreen.com/blog/2026/06/15/picking-up-openscreen/#what-im-committing-to" class="hash-link" aria-label="Direct link to What I'm committing to" title="Direct link to What I'm committing to" translate="no">​</a></h2>
<p>Forking a popular archived project is a good way to quietly turn it into something else. So, written down where you can hold me to it:</p>
<ul>
<li class="">Free forever, MIT. No paid tier, no premium features, no usage caps. Nothing is gated on who you are.</li>
<li class="">Stability before features. The recorder has to work on macOS, Windows and Linux. Bugs from real users go first.</li>
<li class="">It's not production-grade, and I'll keep saying so. Expect rough edges and breaking changes, including to the project format.</li>
</ul>
<p>The <a href="https://github.com/getopenscreen/openscreen/blob/main/ROADMAP.md" target="_blank" rel="noopener noreferrer" class="">roadmap</a> is public: record, edit, export, plus an optional AI editing layer that's off by default and never required. There's a <a href="https://getopenscreen.com/discord/" target="_blank" rel="noopener noreferrer" class="">Discord</a> with a roadmap channel if you want to argue about any of it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="it-already-had-contributors">It already had contributors<a href="https://getopenscreen.com/blog/2026/06/15/picking-up-openscreen/#it-already-had-contributors" class="hash-link" aria-label="Direct link to It already had contributors" title="Direct link to It already had contributors" translate="no">​</a></h2>
<p>Four days in, before I'd shipped anything, someone I'd never met opened <a href="https://github.com/getopenscreen/openscreen/pull/4" target="_blank" rel="noopener noreferrer" class="">a fix for exports stalling</a> when trim regions leave long decoder gaps. Real bug, correct diagnosis, regression test included.</p>
<p>That's roughly what the job turned out to be. Very little of it is features. Mostly it's release candidates that mean something, CI that fails loudly, and diagnostics for the parts that break on other people's machines. Native capture on Windows and macOS is as finicky as its reputation.</p>
<p>I'll write up what ships and what breaks here. Next: v1.6.0 and v1.7.0.</p>]]></content:encoded>
            <category>announcement</category>
        </item>
    </channel>
</rss>