<?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>Forem: gvmaplicaciones</title>
    <description>The latest articles on Forem by gvmaplicaciones (@gvmaplicaciones).</description>
    <link>https://forem.com/gvmaplicaciones</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%2F3855942%2Fa72fb0e3-1796-4587-8f3a-9ed98f13e6d8.png</url>
      <title>Forem: gvmaplicaciones</title>
      <link>https://forem.com/gvmaplicaciones</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/gvmaplicaciones"/>
    <language>en</language>
    <item>
      <title>How I built a browser-based video editor with FFmpeg.wasm (no backend, no server costs)</title>
      <dc:creator>gvmaplicaciones</dc:creator>
      <pubDate>Wed, 01 Apr 2026 15:38:17 +0000</pubDate>
      <link>https://forem.com/gvmaplicaciones/how-i-built-a-browser-based-video-editor-with-ffmpegwasm-no-backend-no-server-costs-57d</link>
      <guid>https://forem.com/gvmaplicaciones/how-i-built-a-browser-based-video-editor-with-ffmpegwasm-no-backend-no-server-costs-57d</guid>
      <description>&lt;p&gt;I got tired of opening CapCut every time I needed to quickly join 2-3 clips. Too many menus, too many features I'll never use. So I built my own.&lt;br&gt;
&lt;strong&gt;&lt;a href="https://www.2minclip.com" rel="noopener noreferrer"&gt;2minclip.com&lt;/a&gt;&lt;/strong&gt; — a free online video editor that runs entirely in the browser. No install, no signup, no watermark.&lt;br&gt;
Here's how I built it and what I learned.&lt;/p&gt;

&lt;h2&gt;
  
  
  The core idea
&lt;/h2&gt;

&lt;p&gt;The concept is simple: ilovepdf but for video. You open the browser, upload your clips, edit, export. That's it. No account, no server processing, no storage costs.&lt;br&gt;
The key technical decision was using &lt;strong&gt;FFmpeg.wasm&lt;/strong&gt; — a WebAssembly port of FFmpeg that runs entirely in the browser. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero server costs (users process video on their own device)&lt;/li&gt;
&lt;li&gt;Complete privacy (videos never leave the user's device)&lt;/li&gt;
&lt;li&gt;No backend to maintain
## Tech stack&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React + Vite&lt;/strong&gt; — fast dev experience, easy deployment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FFmpeg.wasm&lt;/strong&gt; — video processing in the browser&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS&lt;/strong&gt; — styling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;dnd-kit&lt;/strong&gt; — drag and drop for the timeline&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;i18next&lt;/strong&gt; — ES/EN internationalization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel&lt;/strong&gt; — deployment (free tier covers everything)
Total infrastructure cost: ~12€/year for the domain. That's it.
## The biggest challenge: audio streams
The hardest bug I ran into was this FFmpeg error: Stream specifier ':a' matches no streams
It happened when a clip had no audio track. FFmpeg was trying to extract [0:a] from a silent video and failing. The fix was to detect whether each clip has audio before building the filtergraph, and generate silence (aevalsrc=0) for clips without audio.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Upload multiple clips at once (MP4, MOV, WebM)&lt;/li&gt;
&lt;li&gt;Choose canvas: 9:16 / 16:9 / 1:1&lt;/li&gt;
&lt;li&gt;Trim with playhead + split button&lt;/li&gt;
&lt;li&gt;Reorder by dragging&lt;/li&gt;
&lt;li&gt;Adjust speed (0.5x, 1x, 2x)&lt;/li&gt;
&lt;li&gt;Flip and rotate clips&lt;/li&gt;
&lt;li&gt;Add audio tracks with volume control and fade out&lt;/li&gt;
&lt;li&gt;Add text with fonts and colors&lt;/li&gt;
&lt;li&gt;Overlay images and videos&lt;/li&gt;
&lt;li&gt;Export to MP4 H.264 — no watermark, no limits&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lessons learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;FFmpeg.wasm is powerful but slow on mobile.&lt;/strong&gt; For clips under 60 seconds it works fine. For longer videos on low-end devices it can struggle.&lt;br&gt;
&lt;strong&gt;The canvas-first approach is better UX.&lt;/strong&gt; Choosing the output format before editing eliminates confusion and produces predictable results.&lt;br&gt;
&lt;strong&gt;SEO matters from day one.&lt;/strong&gt; Since this is a tool people search for when they need it, organic search is the main acquisition channel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://2minclip.com" rel="noopener noreferrer"&gt;2minclip.com&lt;/a&gt;&lt;/strong&gt; — free, no account, works on mobile and desktop.&lt;br&gt;
Would love feedback — especially if you've worked with FFmpeg.wasm and have tips on improving export performance on mobile.&lt;/p&gt;

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