How I built a browser-based video editor with FFmpeg.wasm (no backend, no server costs)
<p>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.<br> <strong><a href="https://www.2minclip.com" rel="noopener noreferrer">2minclip.com</a></strong> — a free online video editor that runs entirely in the browser. No install, no signup, no watermark.<br> Here's how I built it and what I learned.</p> <h2> The core idea </h2> <p>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.<br> The key technical decision was using <strong>FFmpeg.wasm</strong> — a WebAssembly port of FFmpeg that runs entirely in the browser. This means:</p> <ul> <li>Zero server costs (users process video on their
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. 2minclip.com — a free online video editor that runs entirely in the browser. No install, no signup, no watermark. Here's how I built it and what I learned.
The core idea
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. The key technical decision was using FFmpeg.wasm — a WebAssembly port of FFmpeg that runs entirely in the browser. This means:
-
Zero server costs (users process video on their own device)
-
Complete privacy (videos never leave the user's device)
-
No backend to maintain
Tech stack
-
React + Vite — fast dev experience, easy deployment
-
FFmpeg.wasm — video processing in the browser
-
Tailwind CSS — styling
-
dnd-kit — drag and drop for the timeline
-
i18next — ES/EN internationalization
-
Vercel — 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.
What it does
-
Upload multiple clips at once (MP4, MOV, WebM)
-
Choose canvas: 9:16 / 16:9 / 1:1
-
Trim with playhead + split button
-
Reorder by dragging
-
Adjust speed (0.5x, 1x, 2x)
-
Flip and rotate clips
-
Add audio tracks with volume control and fade out
-
Add text with fonts and colors
-
Overlay images and videos
-
Export to MP4 H.264 — no watermark, no limits
Lessons learned
FFmpeg.wasm is powerful but slow on mobile. For clips under 60 seconds it works fine. For longer videos on low-end devices it can struggle. The canvas-first approach is better UX. Choosing the output format before editing eliminates confusion and produces predictable results. SEO matters from day one. Since this is a tool people search for when they need it, organic search is the main acquisition channel.
Try it
2minclip.com — free, no account, works on mobile and desktop. Would love feedback — especially if you've worked with FFmpeg.wasm and have tips on improving export performance on mobile.
Sign in to highlight and annotate this article

Conversation starters
Daily AI Digest
Get the top 5 AI stories delivered to your inbox every morning.
More about
featureacquisitionnational
Migrating a Webpack-Era Federated Module to Vite Without Breaking the Host Contract
A practical guide to migrating a federated remote to Vite, based on lessons from a real migration. I was tasked with updating a legacy React application that did not support Module Federation. That integration was added first so the app could run as a remote inside a larger host application. Later, the remote needed to migrate from Create React App (CRA) to Vite. By that point, the host already depended on the remote's loading behavior. The tricky part was not replacing CRA with Vite. It was preserving the runtime contract while only the remote changed bundlers. If you own a CRA or webpack-era remote that still has to load cleanly inside an existing host, this post covers the cleanup work beforehand, the core CRA-to-Vite swap, the federation-specific deployment fixes, and a local dev harne
Knowledge Map
Connected Articles — Knowledge Graph
This article is connected to other articles through shared AI topics and tags.
More in Products
Microsoft s MAI-Transcribe-1 runs 2.5x faster than its predecessor at $0.36 per audio hour
MAI-Transcribe-1 converts speech to text quickly and accurately in 25 languages, even with background noise. Microsoft is already using the model in its own products. The article Microsoft s MAI-Transcribe-1 runs 2.5x faster than its predecessor at $0.36 per audio hour appeared first on The Decoder .

Sakana AI launches "Ultra Deep Research" to automate weeks of strategy work
Sakana AI has unveiled "Sakana Marlin," an AI assistant for business customers that researches autonomously for up to eight hours and delivers finished analyses. The tool is designed to compress weeks of strategy work into hours and is currently in beta testing. The article Sakana AI launches "Ultra Deep Research" to automate weeks of strategy work appeared first on The Decoder .

Even Microsoft knows Copilot shouldn't be trusted with anything important
Terms admit it is for entertainment only and may get things wrong A recent surge of interest in Microsoft's Terms of Use for Copilot is a reminder that AI helpers are really just a bit of fun.…



Discussion
Sign in to join the discussion
No comments yet — be the first to share your thoughts!