Back to work

2026

SimpleClips

A desktop app that records your screen, trims and crops the clip, sizes it exactly, and compresses it to web weight. I built it to stop juggling Giphy, Adobe Media Encoder, and hand-written ffmpeg. Local only, nothing leaves your machine.

DesktopVideoTooling

Why I built it

I make a lot of short clips for this site and for work. The old routine was a mess. Record in one tool. Switch to Giphy to make a GIF. Switch to Adobe Media Encoder to transcode. Drop into Claude to write the ffmpeg command when none of those did the thing I needed. Crop somewhere else. Compress somewhere else again.

So I built one app that does all of it. Get footage in, frame and trim it, set the size and quality, export the format you need. That is the whole flow.

SimpleClips, start to export.

What it does

SimpleClips turns a screen recording or an existing video into a short, right-sized clip, without sending anything off the machine.

  • Records your screen. Full display or a region you drag a box around. The box shows the true pixel size even on a scaled HiDPI monitor, fades to a thin click-through outline while recording, and never shows up in the capture.
  • Takes almost any video. MP4, MOV, GIF, WebM, MKV, AVI, and more. One file, several, or a whole folder. The original is never touched.
  • Crops and trims by eye. Drag the corners to frame, drag the timeline handles for in and out, and playback loops inside the trim so you can check your points.
  • Sizes it exactly. Scale by percent or type an exact width or height and the other side follows. You can only scale down, never invent pixels.
  • One quality slider. Optimized to High fidelity. It changes compression only, never resolution. What you set is what you get.
  • Shows the size before you export. A live estimate, plus a "harder estimate" that encodes a real sample at your settings and measures it.

Local only, by design

Nothing leaves your computer. Capture, encoding, and even captions all run locally. Captions use whisper.cpp on-device, so subtitles work with no internet. ffmpeg and whisper ship inside the app, so there is nothing to install and nothing to set up.

It exports to MP4, GIF, WebM, a web bundle, or a long list of other formats, with auto-numbered names so it never overwrites your files. Drop in a batch and "Export & Next" walks the whole queue.

There are two builds of the same product: the original macOS app and a Windows rebuild. Separate codebases, same behavior wherever the platform allows it.

How it's put together

Three command-line tools ride inside the app: ffmpeg does the encoding, ffprobe reads what a file actually is, and whisper.cpp writes captions on-device. Nothing is installed and nothing phones home.

When you drop a file in, ffprobe reads its real size, length, and frame rate. The preview then plays it one of two ways. MP4, MOV, and M4V decode natively in the player. Anything else, like WebM, MKV, AVI, or GIF, gets transcoded into a fast throwaway H.264 proxy with the Mac's hardware encoder, purely so it scrubs smoothly. Your original file is never the thing being edited or exported, only the thing being read.

The brain of the app is one function, plan(). It takes the format and the quality slider and turns them into the exact ffmpeg arguments: which codec, what CRF, the filtergraph for crop and scale, the audio bitrate. H.264 formats map to libx264, WebM to VP9 and Opus, GIF to a two-pass palette. Those arguments are handed to ffmpeg as a plain list, never glued into a shell string, so a weird filename can never break or hijack the command.

The size estimate runs on that same plan(). The instant number is pure math, pixels times frame rate times seconds times a bits-per-pixel figure pulled from the quality curve, with no encoding at all. When you want a real answer, the harder estimate actually encodes a few seconds of the clip at your exact export settings and scales that up, so the figure is measured, not guessed. It stays locked on that measurement until you change something that would change the size.

🎬 SimpleClips · the pipeline · three bundled command-line tools, every step on your own machine

  1. 1

    Get footage in

    Record the screen, or drop in almost any video. The original is never the thing being edited — only the thing being read.

    Screen recording (region / fullscreen)Drag-and-drop a file, batch, or folderMP4 · MOV · GIF · WebM · MKV · AVI · …
    howffprobe reads the real dimensions, length, and frame rate first. The preview then plays it one of two ways: MP4 / MOV / M4V decode natively in the player; everything else (WebM, MKV, AVI, GIF…) is transcoded into a throwaway VideoToolbox H.264 proxy (a temp scpreview_*.mp4) purely so it scrubs smoothly.
  2. 2

    Frame & trim — by eye

    Drag the crop corners to frame (outside dims), drag the timeline handles for in/out. Playback loops inside the trim so you can check your points.

    draggable crop overlaytimeline trim handleslive readout: time · length · resolution · size
  3. 3

    Size & quality

    Scale by percent or type an exact W×H — the other side follows. One quality slider trades size for detail. Downscale only, compression only.

    resolution slider + exact px fieldsOptimized → High fidelityfps slider (≤ source rate)

the brain

plan() — turns your settings into the exact ffmpeg command

One function maps the format + quality slider to real encoder knobs: a codec, a CRF, the crop/scale filtergraph, an audio bitrate. The same plan() feeds the estimate and the export, so the number you preview is the file you get.

H.264 family → libx264, CRF 14→30WebM → VP9 + Opus, CRF 18→40GIF → 2-pass palettegen / paletteusescale w/ lanczos only on downscale
howEvery call goes to ffmpeg as an argument array, never a shell string— a weird filename can't break or hijack the command. No network, no install.
estimate · two tiers

Live: instant math — pixels × fps × seconds × bits-per-pixel (read off the quality curve), no encoding at all. Harder estimate: actually encodes a real ~4s sample at your exact export settings and scales it up, so the figure is measured, not guessed. It stays locked on that number until a size-affecting setting changes.

bundled engine · offline
ffmpeg — encodeffprobe — inspectwhisper.cpp — captions on-device
  1. 4

    Export what you need

    One click produces the exact format. Names auto-increment so a file is never overwritten, and a batch walks itself with “Export & Next.”

    MP4 · GIF · WebM · web bundleMOV · M4V · MKV · AVI · WMV · …auto-numbered (clip, clip_1, …)
    howffmpeg runs with -progress pipe:1; the app parses the streamed out_time= to drive a determinate bar + ETA. Cancel terminates the process and deletes the partial file.

Local only: capture, encoding, and captions all run on your computer — nothing leaves it, by design. Two builds, one spec: the original macOS app (Swift / SwiftUI, ScreenCaptureKit) and a Windows rebuild (Electron), separate codebases doing the same thing the same way.

Role and stack

Designed and built by me, iteratively, and now I use it all the time. I made it compatible for Windows so a friend could use it too, and added the subtitles feature for my girlfriend, whose primary language is Vietnamese.

Every GIF and WebM on this website was either captured with it or compressed with it to make the site more performant. That is the real proof: the site you are looking at runs on it.

Results

50% lighter

less for visitors to download across the whole site, just from compressing the clips with it.

Under 800 KB

per preview, regularly, so I can progressively load and autoplay them without the page ever feeling heavy.

Stack: a cross-platform desktop app bundling ffmpeg for encoding and whisper.cpp for offline captions, with separate macOS (Swift / SwiftUI) and Windows (Electron) builds.