Show HN: VidStudio, a browser based video editor that doesn't upload your files

5 hours ago (vidstudio.app)

Hi HN, I built VidStudio, a privacy focused video editor that runs in the browser. I tried to keep it as frictionless as possible, so there are no accounts and no uploads. Everything is persisted on your machine.

Some of the features: multi-track timeline, frame accurate seek, MP4 export, audio, video, image, and text tracks, and a WebGL backed canvas where available. It also works on mobile.

Under the hood, WebCodecs handles frame decode for timeline playback and scrubbing, which is what makes seeking responsive since decode runs on the hardware decoder when the browser supports it. FFmpeg compiled to WebAssembly handles final encode, format conversion, and anything WebCodecs does not cover. Rendering goes through Pixi.js on a WebGL canvas, with a software fallback when WebGL is not available. Projects live in IndexedDB and the heavy work runs in Web Workers so the UI stays responsive during exports.

Happy to answer technical questions about the tradeoffs involved in keeping the whole pipeline client-side. Any feedback welcome.

Link: https://vidstudio.app/video-editor

> FFmpeg compiled to WebAssembly handles final encode

FFmpeg's license is the LGPL 2.1. VidStudio looks like closed source software, I couldn't see any indication that it's free software. You're distributing this software to run in the client's browser. I'm not a lawyer but I think you're in breach of the terms of the LGPL.

https://www.ffmpeg.org/legal.html

  • Closed source is fine, but there are a few other things that are required of LGPL, some of which are

    - Provide links to the source of the version of ffmpeg you used in your code

    - User should be able to replace the ffmpeg libs with his own compatible builds if you're using dynamically linked libs. For statically linked libs, you need to provide the tools to re-link against a compatible build.

    I went through an LGPL review recently so some of this is fresh in my memory, but please correct me if I'm wrong.

    • I knew about the soft copyleft (the source code requirements) but didn't know there was the requirement to have libs be replaceable. Now I want to know how useful that would be in reverse engineering closed systems (particularly nintendos, since I've always had an interest in the homebrew scene there)

      2 replies →

  • Thank you for pointing this out, to be completely honest, I did not consider licensing because the website started as a collection of tools I built to run locally and get into video/audio codecs then I realised it is already a decent collection of tools that other people might want to use too. But I will be making the needed changes to comply fully tonight. At least I comply with this: `Do not misspell FFmpeg (two capitals F and lowercase "mpeg")` I realised I have some more reading to do regarding GPL vs LGPL because of the wasm project.

    • You should look into how other companies and tools that use FFMPEG handle this situation.

      I wonder if you can keep your application itself closed source, but make an open-source adapter that handles the interaction with FFMPEG.

      I'm not super familiar with open source licensing, and IANAL, so make sure to do your own research :)

      As an example, I believe Audacity required me to install ffmpeg manually myself, and add it to my path. This is slightly different since Audacity itself is also open source. But could be helpful to reference.

      2 replies →

    • Any reason not to just open source it? Personally I'd love to hack on it :-) IANAL, but IMHO AGPL would be a good fit here as it complies with LGPL and also ensures nobody besides you (the copyright holder) can stand it up for profit without contributing back).

      13 replies →

  • It should be possible to comply with LGPL without publishing the source code of the whole application. Either by running the application and ffmpeg in different isolates (wasm processes), or by offering a way to merge (link) the wasm code of the closed-source application with a user compiled FFmpeg wasm build.

    Different isolates might even be enough to satisfy GPL, similar to how you can invoke FFmpeg as a command line tool from a closed application. Though that feels like legally shaky ground.

  • LGPL permits that.

    However, some popular codecs use GPL, which, if enabled, would require to distribute the rest of the code under it as well.

    • LGPL permits you to distribute binaries, but you can't distribute the software as an opaque binary blob with no reasonable way to modify it. What even is the equivalent of a shared library that a user can replace when software runs in the browser?

      Anyway, OP doesn't do most of the things FFmpeg lists under their "License Compliance Checklist".

      4 replies →

I worked on something similar for a relative who wanted to know if I could build something like this for them using Claude, and sure enough you can, I wound up having to ditch ffmpeg wasm edition because of a lot of slowness, and when with ffmepg on the backend. Curious how this performs vs ffmpeg on the backend. I'm genuinely surprised there's not 100% browser native solution to this.

Let me just say the performance is absolutely incredible, and the persistence is so transparent. I actually was given access to an in-browser video editor that chokes pretty quickly so I'm impressed. The tracks didn't seem to work well for me. I'm on Firefox on Windows and couldn't drag and drop tracks to change the order, there doesn't seem to be any layer transformation tools (position, rotation, scale) that I could find to counteract it not handling footage of different aspect ratios (I.E. portrait and landscape).

  • Thank you for the encouragement. Regarding the track manipulation I have not fully cracked it yet so you can't move clips between tracks yet and track reordering didn't cross my mind but will look into it. Regarding transforms once you manage to get a clip in the track you should be able to click on it and then get on the right hand side of the program monitor you should see a transforms panel with a limited selection of options, at least what I could sort of understand how to program together with LLMs ofc ahahaha.

I love no accounts and no cloud a lot!

Wondering if it support subtitle and transcript? It would be helpful for non-native speaker use case.

Also, can you talk more about the use case difference between VidStudio vs. Finalcut/Imovie/Premiere? I am quite interested. Thanks

Wild that apps used to be completely local, no accounts, no uploads, and we're back to that as a value prop.

  • Agreed but I guess at the same time those who spend money to develop software need to find ways to monetise I just wish they were not so predatory. Everything is a subscription now siphoning money out of users on a monthly basis.

Wild that privacy became a feature and not the default. Building in this space too and the no uploads needed angle is surprisingly hard to communicate to users who've been trained to expect everything to live in the cloud.

  • Yes and yet perfectly logical when the most successful business models are about selling private data.

How does it compare to https://omniclip.app/, https://tooscut.app, or https://clipjs.mohy.dev/ ?

I've built a similar video editor and have been considering pure client side implementation vs transcoding into a known format beforehand, went with transcoding for wider format support and easier video playback implementation.

I'm interested in how you handle demuxing different container formats any which ones are supported?

I get "Audio decode failed: your browser cannot decode the audio in "41b1aee9-ac65-43f6-b020-e8fed77c3c72_webm.bin". Try re-encoding the file with AAC audio." for a WEBM with no audio.

h264/aac MP4 works, is that demuxed with mp4box.js? I noticed seeking (clicking or scrubbing on timeline) initializes a new VideoDecoder and destroys the previous one for every new frame, leading to abysmal performance as you lose decoder state and a lot of decoding work has to be repeated. Plus the decoder reinitialization time. Is that because the demuxing logic doesn't give precise access to encoded frames? iirc mp4box.js didn't support that last time I checked.

Sorry for the significantly unrelated comment:

Does anyone know if there is any limitation to create a "https-local://" or something like that, which guarantee that things are only downloaded, and never uploaded?

Curious how you're handling the MP4 export entirely client-side — are you using FFmpeg compiled to WebAssembly, or something custom built around the WebCodecs API?

  • So FFmpeg is part of the website in general but it is not used in the editor itself. I did built on top of the Video Codec APIs and ofc a muxer library like mp4box.js

Interesting approach—privacy-friendly editing without uploads is compelling. Curious how you handle performance and large files purely in-browser, and what trade-offs there are vs server-based editors.

You probably already know this, but I could not import 10-bit video on Windows which I think would be fairly common among the target audience.

ffmpeg supports decoding 10-bit video.

  • Thank you for flagging this, indeed you are right. I do have a long list of problems to go through. The editor mostly relies on the browser Audio/Video codecs which I learned after trying FFmpeg out. They have wide support but also a bunch of limitations. Actively working on it, thank you for the feedback. It is the first time I take such a deep dive to all of these.

I've seen dozens of these posted to HN. Surprisingly, there is a lack of browser based video editors for media libraries, which means I have to load the video over the network using WebDAV or Samba, edit it locally, and then upload it back. It's a niche use case, but the people who manage their own photos and video storage are generally tech savvy, so it's surprising that no such tools exist.