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.