halfsize

halfsize / Offline

Compress a video without uploading it

Every “free online video compressor” is a server that receives your file. For a passport scan, an unreleased product demo, or a recording of a child, that is a bad trade for saving five minutes. halfsize runs FFmpeg on your own machine: nothing is uploaded, there is no account, and there is no quota.

$ npx halfsize private-demo.mp4 --to 20mb

  halfsize 0.1.8
  private-demo.mp4
  136 MB  60s  1920x1080  30.00 fps  h264

  target     20.0 MB
  plan       H.264  1280x720  2.46 Mbps  audio 128 kbps  2-pass
  scale      1920x1080 → 1280x720
  output     private-demo.20mb.mp4

  measuring quality                                        done in 8s

  136 MB  →  19.45 MB   7.0x smaller   2.7% under target
  VMAF 88.3   SSIM 0.971   slight softening

  Nothing left this machine.

What “offline” actually means here

StepOnline compressorhalfsize
Your fileuploaded to a serverstays on disk
Accountoften requirednone
Quota2–3 files per day, then payunlimited
Watermarkon the free tiernever
Quality report“high quality” badgemeasured VMAF and SSIM
Works without internetnoyes, after install
CostsubscriptionMIT, free

The one thing that does touch the network is the first npx halfsize: npm downloads the package, and the package fetches a static FFmpeg binary for your platform. After that, encoding is local. You can confirm it yourself by disconnecting the network and running the same command again.

Prefer a UI? The app is local too

The web interface is served from 127.0.0.1 by the same process. It is not a hosted site — the page and the video never leave your computer.

$ npx halfsize --web
halfsize web UI on http://127.0.0.1:4174
halfsize local web app compressing a video to a target size with a VMAF quality report

Drag a file in, pick a target, get the size and the quality score. All local.

Why not just run FFmpeg by hand?

You can, and halfsize is a thin layer over it. The hard part is the arithmetic: for a target size you need a bitrate budget after audio and container overhead, and you need to decide whether dropping to 720p looks better than keeping 1080p at half the bitrate. Then you have to check whether the result actually fits and how much quality it cost. That is the part the tool automates.

$ npx halfsize video.mp4 --to 20mb --dry-run
plan  H.264  1280x720  2.46 Mbps  audio 128 kbps  2-pass  → ~19.4 MB

Measured quality, not marketing

60-second 1080p30 source at 18 Mbps, encoded locally on a laptop:

TargetOutputResolutionVMAFVerdict
20 MB19.45 MB1280×72088.3slight softening
16 MB15.59 MB960×54084.8slight softening
10 MB9.77 MB960×54082.9slight softening
5 MB4.93 MB640×36072.0visible loss

Privacy is not the same as magic. A 10-minute video squeezed into 20 MB has 0.25 Mbps and will look soft no matter which tool does it. If quality matters, cut the clip first, then compress.

Where people use it

FAQ

Does it phone home?

No analytics, no telemetry, no update check. The source is on GitHub; you can read it or run it behind a firewall.

Does it need Node.js?

Yes, Node.js 18 or newer. FFmpeg itself is bundled, so you do not need to install or configure it.

Which platforms?

Windows 10/11, macOS and Linux. The same command works on all three.

Can I use it in a script or CI?

Yes. --json prints a machine-readable result and --dry-run prints the plan without encoding.

Is the web UI a cloud service?

No. npx halfsize --web starts a server on 127.0.0.1 that only your machine can reach.

Related guides