<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Drábek Jan</title>
    <description>The latest articles on DEV Community by Drábek Jan (@drabekj).</description>
    <link>https://dev.to/drabekj</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3984796%2Fa7aad277-28d7-41c2-8d8c-1959cac75837.png</url>
      <title>DEV Community: Drábek Jan</title>
      <link>https://dev.to/drabekj</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/drabekj"/>
    <language>en</language>
    <item>
      <title>I built a screen recorder with no backend - and 3 browser bugs nearly beat me</title>
      <dc:creator>Drábek Jan</dc:creator>
      <pubDate>Mon, 15 Jun 2026 06:09:52 +0000</pubDate>
      <link>https://dev.to/drabekj/i-built-a-screen-recorder-with-no-backend-and-3-browser-bugs-nearly-beat-me-bki</link>
      <guid>https://dev.to/drabekj/i-built-a-screen-recorder-with-no-backend-and-3-browser-bugs-nearly-beat-me-bki</guid>
      <description>&lt;p&gt;A while back I needed to send a teammate a 30-second screen recording. Every tool wanted me to install an app or create an account first. For half a minute of video. So I built the thing I actually wanted: open a tab, hit record, get an MP4. No install, no signup, nothing uploaded unless you choose to share. It's &lt;a href="https://yorecord.com/" rel="noopener noreferrer"&gt;YoRecord&lt;/a&gt;, and it runs entirely in the browser.&lt;/p&gt;

&lt;p&gt;Capture is the easy part - getDisplayMedia() for the screen, getUserMedia() for webcam+mic, MediaRecorder to encode. The hard part is everything after "stop."&lt;/p&gt;

&lt;p&gt;The hard part: a real, edited MP4, client-side - trimming, a draggable webcam overlay, AI subtitles, then a clean MP4 - normally a server job. I used ffmpeg.wasm + WebCodecs so nothing leaves the device.&lt;/p&gt;

&lt;p&gt;Bug #1 - export dies when the tab is backgrounded (main-thread captureStream+MediaRecorder gets throttled). Fix: encode in a Web Worker with WebCodecs.&lt;/p&gt;

&lt;p&gt;Bug #2 - the webcam froze for ~1s in exports. captureStream(30) is change-driven, not clock-driven: a static screen drops to ~1fps, freezing the moving webcam. Fix: a fixed 30fps loop holding the latest frames.&lt;/p&gt;

&lt;p&gt;Bug #3 - audio drifted ~100ms late (WebAudio mixing latency). Fix: measure and compensate (and never use adelay).&lt;/p&gt;

&lt;p&gt;...plus an honest "what I didn't do in the browser" section (subtitles use a cloud Whisper API; Chrome/Edge/Firefox desktop only; small free-tier watermark), and a closing &lt;a href="https://yorecord.com/" rel="noopener noreferrer"&gt;yorecord.com&lt;/a&gt; try-it link.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>webassembly</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
