DocumentationAPI v1
Guide · Configuration

Compression

What each setting does, and the two that can surprise you.

Images

Encoded inside the request, so the URL you receive is final. There is no placeholder state for an image and nothing to poll.

Setting What it does
Format WebP by default. AVIF is smaller and slower to encode. Passthrough stores the source untouched
Quality 1 to 100, ignored by PNG because PNG is lossless
Max width / height A bounding box. Nothing is ever enlarged: a small avatar stays small
Strip metadata Removes EXIF, including GPS coordinates
Thumbnail A small WebP for the library grid. Never what a delivered URL points at

Two things worth knowing before you save a profile.

JPEG has no transparency. Converting a transparent PNG to JPEG puts it on a solid background, which is how a phone avatar becomes a dark square. The playground warns when the selected format would do this.

A profile can make a file bigger. Flat images, interface screenshots and logos compress better as PNG than as WebP at any quality. When that happens the encoder falls back to PNG and keeps whichever output is smaller, so compression never costs you quota. It still re-encodes rather than storing your bytes, because re-encoding is what makes an arbitrary upload safe to serve.

Server assets are the exception: they never go through a profile, and their images are stored byte for byte. See Server assets.

Video

Queued rather than synchronous. The URL works immediately and serves your file while a job re-encodes it and replaces the bytes at the same address.

Setting What it does
Codec H.264 is universally playable. VP9 is roughly four times the encode cost, AV1 about ten
CRF Lower is better quality and a bigger file. 26 is a good default for game capture
Preset How hard the encoder works for the same CRF. veryfast is the sensible floor
Max height 1080 by default. A 720p source is left alone rather than upscaled
Max frame rate Applied only when the source is genuinely faster

The container cannot change. An mp4 stays an mp4. The output replaces the input at a URL that is already written into a game server database, and handing a client a WebM where it fetched an .mp4 breaks it. A file whose container cannot hold the profile's codec (a WebM under the H.264 profile, say) is stored as it arrived rather than failed.

Every clip gets a still, whatever the profile. The first frame that is not black in its first three seconds becomes a 480 px thumbnail for grids and a 1280 px poster for players, both WebP, counted in your previews. A sound gets its waveform instead. Neither is a setting: they are made for every upload, transcoded or not, as soon as it is stored.

A transcode never enlarges. A short clip can re-encode larger than it arrived; when that happens the original is kept.

Audio

Setting What it does
Codec Opus at 96 kbps mono is transparent for speech and about a third of the MP3 a phone sends
Bitrate 96k is plenty for voice. Raise it only for music
Channels Mono by default. A voice note has no stereo information to preserve
Normalise Single pass EBU R128. Player microphones vary enormously and a phone has no volume slider

When nothing is re-encoded

Video and audio transcoding is gated per organisation, and it also needs ffmpeg on the instance. When either is missing the file is still stored and still served, simply as it arrived. GET /api/v1/status reports transcoding_available so you can check rather than guess.

The playground

Drop an image and move the sliders. It shows the real encoder output, the byte count before and after, and how long the encode took. The source is held for one hour and never counts against your quota, because it is not media.