crapify
Deep-fry your images, and other crimes against pixels.
crapify is the evil twin of mogrify. Same CLI ergonomics as ImageMagick's batch image-transform tool, opposite goal: take a perfectly fine image and make it look like total dogshit. The crapification is pluggable — each transform is a named crapifier you can stack, parameterize, and chain into a pipeline.
What it does
The flagship crapifier is deep-fry, which reproduces the mid-2010s "this meme has been forwarded so many times it's become a hot mess" aesthetic. The recipe:
- Re-save the image as a low-quality JPEG several times in a row, so the compression damage compounds with every round-trip.
- Push saturation and contrast past where a sane image editor would let you go.
- Sharpen edges hard so the blocky JPEG patches grow visible halos around everything.
- Sprinkle grainy speckle on top so even the smooth areas look gritty.
Five preset doneness levels ship out of the box — raw, pan-seared, chicken-fried, deep-fried (the default), forwarded-by-your-dad — each one bundling all seven knobs (quality, passes, saturation, contrast, brightness, sharpen-radius, noise) into a single named ramp. Pass --preset <slug> to pick one; pass individual knobs to override.
Other crapifiers are sketched (xerox-machine simulation, format-rotting through pointless conversions, aspect-ratio mangling), but v0.1.0 ships deep-fry only.
Try it
# Default ("deep-fried") preset:
crapify deep-fry in.png out.png
# Maximum doneness:
crapify deep-fry --preset forwarded-by-your-dad in.png out.png
# Preset + targeted override:
crapify deep-fry --preset deep-fried --saturation 2.0 in.jpg out.png
# Raw knobs, no preset:
crapify deep-fry --quality 32 --passes 5 in.png out.png
Doneness presets
crapify deep-fry --help ends with this preset table. Each row is a complete recipe — pick a doneness level and you get all seven knobs at once. Override individual knobs alongside --preset to mix-and-match.
PRESETS (via --preset <slug>):
raw "Raw" q=95, 1 pass. Barely touched.
pan-seared "Pan seared" q=78, 1 pass. Light crunch.
chicken-fried "Chicken fried" q=60, 2 passes. Visible JPEG mess.
deep-fried "Deep fried" q=50, 3 passes. The canonical look (also the default).
forwarded-by-your-dad "Forwarded by your dad" q=32, 5 passes. Maximum doneness.
Full per-knob docs with units and value ranges:
crapify --help # top-level: pipeline grammar + registered stages
crapify deep-fry --help # per-stage: every knob + the preset table
Pipeline grammar
Stages are composed in a single command, separated by +. The last two positional arguments are always input and output:
crapify <stage> [args] + <stage> [args] ... <input> <output>
Each crapifier between +s gets its own argument parser, so flag names don't collide across stages. v0.1.0 only ships deep-fry, but the runner already handles multi-stage pipelines for when the next crapifier lands. Reproducible-randomness (a global --seed) is deferred to a later release; for now, deep-fry's grain pattern is fresh per invocation.
Install
cargo install crapify
Or grab a pre-built binary from the latest release (Linux x86_64, macOS Apple Silicon, Windows x86_64).
Or build from source:
git clone https://github.com/bojanrajkovic/crapify.git
cd crapify
cargo build --release
./target/release/crapify --help
Requires Rust 1.95 or later; the pinned toolchain lives in mise.toml.
Why does this exist?
The deep-fried-meme aesthetic was a defining visual of mid-2010s internet culture, and there's no good CLI tool for reproducing it. ImageMagick can do it in four lines of shell, but the bit is having a dedicated, lovingly-named binary. A small Rust CLI is also a fine shape for hands-on time with the image and imageproc crates. And if anyone needs a practical excuse: thumbnailers, OCR, and vision models all have to survive degraded inputs in the wild, and crapify is a convenient fuzz/torture input generator. Mostly, though, it's funny, which is enough.
License
WTFPL. See LICENSE.