squish

Email-creative render service. Composites a source image/animation onto a chrome overlay and emits an animated WebP/GIF or a static JPEG/WebP/PNG. Static formats run through libvips in-process (~20–70 ms p50); animated formats use ffmpeg + parallel cwebp (~210 ms p50 at native 970×550).

API: POST /render with multipart/form-data. See /healthz for liveness, /demo?format=… for a GET-renderable example using a bundled sample creative, and /?creativeId=… (HOM-80 POC) to render a real creative end-to-end via the satori chrome service.

HOM-80 — satori-driven creative

creativeId 14627409

squish → satori.int.revcontent.dev → composite

Animated satori demos

WebP q=70 sw=480

squish → satori + sample-source.mp4 · format=webp quality=70 scaleWidth=480

WebP q=70 sw=970 (native canvas)

squish → satori + sample-source.mp4 · format=webp quality=70 scaleWidth=970

WebP q=60 sw=480

squish → satori + sample-source.mp4 · format=webp quality=60 scaleWidth=480

WebP q=40 sw=480 (smallest)

squish → satori + sample-source.mp4 · format=webp quality=40 scaleWidth=480

Static demos (single-frame composite, h264 source frame 0)

JPEG q=70 sw=480

format=jpeg quality=70 scaleWidth=480

JPEG q=70 sw=970

format=jpeg quality=70 scaleWidth=970

WebP static q=70 sw=480

format=webp-static quality=70 scaleWidth=480

WebP static q=70 sw=970

format=webp-static quality=70 scaleWidth=970

Static-image source demos (JPG input + chrome overlay → static out)

Same end output as the row above, but the source is a bundled still JPG (no video decode). Faster wall-time because there's no h264 demux/decode pipeline to spin up.

JPEG q=70 sw=480 (img src)

source=static format=jpeg sw=480

JPEG q=70 sw=970 (img src)

source=static format=jpeg sw=970

WebP static q=70 sw=480 (img src)

source=static format=webp-static sw=480

WebP static q=70 sw=970 (img src)

source=static format=webp-static sw=970