Verify video stays on this device
LocalVideoGif turns a short MP4, WebM, or MOV into a GIF in the browser. This page is the check you can run yourself: which network calls are normal, and which calls would mean the media file left the tab. The converter is on the home page. The short policy is the privacy policy. The copyright rules are the terms.
What you are proving
You are proving that Video→GIF does not upload the video. You are not proving that nothing on your computer can see the bytes. A browser extension, malware, or a recorder you installed can still read a tab. This site does not receive the file, and it does not claim to block other software on the device. Files never leave this device through this page.
Steps in DevTools
- Open the converter. Use a short clip you are allowed to test with (under 15 seconds), not a sensitive recording, the first time you learn the panel.
- Open DevTools → Network. In Chrome that panel is documented as the Network panel. In Firefox it is the Network Monitor. Enable “Preserve log” so a reload does not wipe the list.
- Reload the page once and let the first requests finish. You should see same-origin GETs for the document,
/assets/styles.css,/assets/limits.js,/assets/vendor/ffmpeg/ffmpeg.js(and related worker scripts under that folder),/assets/tool.js, and the favicon. - Drop the video file. Wait until the preview or an error appears. Sort or scan the new rows. There should be no request whose body is that file, and no POST or PUT of the media to this host or any other host.
- Press convert. The first run may GET a pinned
ffmpeg-core.wasmfrom jsDelivr (Cloudflare Pages rejects files over 25 MiB, so the ~30 MiB wasm is not shipped in_site). Open that response: it is a WebAssembly binary — library code. It does not contain your clip, and the request body is empty. Same-origin GETs under/assets/vendor/ffmpeg/are also encoder scripts, not your video. - Download the GIF. The link is a
blob:URL created in the tab. The browser is not fetching those bytes from our server.
Expected requests
- Page assets. HTML, CSS,
limits.js,tool.js, self-hosted ffmpeg UMD/worker scripts, and the icon — all GET, all from this site, when the page loads. - Pinned wasm, only if you convert. A GET of
https://cdn.jsdelivr.net/npm/@ffmpeg/core@0.12.10/dist/umd/ffmpeg-core.wasm(version pinned in vendor NOTICE). That file is the ffmpeg.wasm core binary. It is not your video. CSPconnect-srcallows that host for this fetch. After download, the tool wraps it in a blob URL so encoding still runs in the tab. - Analytics beacon, maybe. The privacy policy describes Cloudflare Web Analytics. If that product is enabled for the zone, a request to
cloudflareinsights.comcan show up. It is a page-view beacon. It is not an upload of the file you dropped. The HTML we ship does not include an advertising script.
Requests that should not appear
- A POST, PUT, or PATCH that carries the MP4, WebM, MOV, or GIF.
- A call to a third-party convert, “AI GIF”, or cloud encode API after you drop the file.
- A fetch of YouTube, a playlist, or any other remote media URL. The tool has no address field and does not download streams.
- A script load from an ad host. Response headers for this site set
script-srcto'self', plusblob:andwasm-unsafe-evalfor the encode work in the tab. That policy does not list an ad network.
Why the file can stay in the tab
The drop area is a file input. The File API lets the page read a file the user chose. It does not give the page a path it can upload on its own later. Bytes are written into ffmpeg.wasm memory and encoded to GIF on this device. The download button points at an object URL from URL.createObjectURL. When you close the tab, that buffer goes with it. We have no project library to reopen.
v1 refuses inputs longer than 15 seconds or about 100 MB. FPS is 5–15 and width is 320 / 480 / 640. Phones often run out of memory. Those errors are local. They are not uploads. This product is not LocalVideoZip (compress).
Where to go next
- Convert a short clip to GIF
- Video to GIF with no upload
- GIF size, FPS, and width
- Why a local GIF maker
- Copyright notes
- About · Privacy · Terms · Contact
Questions about this wording, email contact@localvideogif.pages.dev. Do not attach the video. We cannot accept the file, and we do not want a private clip in a mailbox.
Sources
- Chrome DevTools — Network panel: developer.chrome.com/docs/devtools/network
- Firefox — Network Monitor: firefox-source-docs.mozilla.org/…/network_monitor
- MDN — Using files from web applications: developer.mozilla.org/…/Using_files_from_web_applications
- MDN —
URL.createObjectURL: developer.mozilla.org/…/createObjectURL_static - MDN —
Blob: developer.mozilla.org/…/Blob - ffmpeg.wasm. JS under
/assets/vendor/ffmpeg/is served from this site; the pinned wasm URL is documented in vendor NOTICE: github.com/ffmpegwasm/ffmpeg.wasm
FAQ
How do I prove this GIF maker does not upload my video?
Open DevTools → Network, drop a local short clip, and convert. You should see same-origin page assets and, on first convert, a GET of the pinned ffmpeg-core.wasm from jsDelivr plus same-origin vendor scripts. You should not see a POST or PUT of the media. Downloads use a blob URL created in the tab.
Is the jsDelivr wasm request an upload of my clip?
No. It is a GET of the pinned @ffmpeg/core@0.12.10 wasm binary. The response is encoder library code. Your samples are not in that request. Encoding then runs in the tab after the binary is wrapped in a blob URL.
What is a blob download?
After convert, the GIF link points at a blob: URL made with URL.createObjectURL on a Blob built in the page. The browser saves those bytes from memory. It does not download them from our server.
Which network requests are a problem?
A problem is any request that sends the video or GIF file, calls a third-party encode API, or fetches a remote media address. Static assets, self-hosted ffmpeg scripts, the pinned wasm GET, and an optional Cloudflare Web Analytics beacon are not the video upload.
Why is wasm not fully self-hosted?
Cloudflare Pages rejects individual files over 25 MiB. The core wasm is about 30 MiB, so v1 fetches the pinned jsDelivr copy and documents the SHA-256 in vendor NOTICE. The JS glue stays same-origin under /assets/vendor/ffmpeg/.
Can the page fetch a YouTube or stream URL?
No. There is no URL field and no stream ripper. You can only choose a file already on the device, and the terms require that you have the rights to convert it. This is not LocalVideoZip.