01Why I built it
A media server fills a disk faster than you'd think. Blu-ray remuxes land at 20–40 GB each; a few seasons of anything and you're shopping for another drive. Most of that size is codec, not quality — the same film in HEVC or AV1 looks the same on a TV at a quarter of the size. What I wanted was something I could point at my libraries once and forget: walk them on a schedule, re-encode what's worth re-encoding, and never hand me back a file that's worse than the one it started with.
Tools like Tdarr and Unmanic can do this, but they were heavier than I wanted, and I don't like giving a black box the only copy of a file. So I wrote Codecsmith: one Go binary in one container, a dashboard, and a deliberately short list of things it refuses to do. It's not a general-purpose transcoder — no preset picker, no resolution ladder, no format-conversion menu. It has one job and it does it carefully.
Typical results on a home library, at the default profile: a 20–35 GB 1080p remux lands at 3–6 GB; a 50–70 GB 4K HEVC file at 10–20 GB; anything already AV1 is left alone. You choose the picture quality and the file size follows.
02How it's built (for the curious)
The decisions that matter:
Constant quality, not target bitrate. The encoder spends bits where the picture needs them and saves them where it doesn't, so a dark drama and a bright action film both come out looking right at different sizes. The same quality number maps across every backend, so you don't relearn it when you change hardware.
Whatever hardware you have. On boot it runs a real test encode against each backend and uses the first that works — NVIDIA NVENC, Intel QSV, AMD/Intel VAAPI, Apple VideoToolbox, or plain CPU (libx265 / SVT-AV1). The same config runs unchanged on a spare laptop or a GPU box.
It fits your stack. Sonarr and Radarr can push a file the moment it's imported via webhook; otherwise every library is walked on a schedule. Run it as a single SQLite container, or point several worker containers at Postgres and they'll claim jobs with SKIP LOCKED and wake instantly on LISTEN/NOTIFY. There's a full HTTP API and a dashboard that shows every file as it's found, encoded, and replaced — with speed, ETA, and how much space each one gave back.
The short list of things it won't do. Never grows a file (a same-size-or-larger result is discarded). Never truncates (a short output is rejected and the source kept). Never burns in subtitles — soft tracks only. Never drops an audio track it can't identify. Never changes resolution or frame rate. Never re-encodes Dolby Vision (the enhancement layer would tone-map wrong). Never touches a hard-linked file (those are usually someone's seeding copy). Never touches music, books, or photos. The swap is atomic, with a backup held until the new file is in place — and if you'd rather see before you trust it, there's a dry-run mode and a trash folder that holds replaced originals for a retention window instead of deleting them.
Written in Go. Single binary, ffmpeg bundled in the container, MIT licensed. Runs on whatever you already have.
03Get it
04More from the workshop
AI test-strip scanner for hot tubs and pools.
RV GPS that avoids low bridges. Truck-grade routing.
Privacy-first budgeting. Never touches your bank.
In-game boss cheat sheets for Midnight raids, dungeons & delves.
Full Auction House replacement.
Behavior-based LFG applicant scoring for M+.