Requirements
The Kotlin, Compose, JDK, Android and ffmpeg versions are read from the build that produced this page, so they match the code.
| Kotlin | 2.4.20 |
| Compose Multiplatform, for the Compose modules | 1.12.2 |
| JDK | 17 or later |
Platforms
Section titled “Platforms”| Platform | Minimum | Export and preview run on |
|---|---|---|
| Android | API 24 | Media3 Transformer and media3-exoplayer |
| iOS | 16 | AVFoundation, VideoToolbox and AVPlayer |
| macOS | 12 | AVFoundation, VideoToolbox and AVPlayer |
| Desktop (JVM) | ffmpeg 8.0 | The ffmpeg and ffprobe on the machine |
| Browser | WebCodecs VideoDecoder, and VideoEncoder to export |
WebCodecs, drawn to a canvas |
Browsers
Section titled “Browsers”filmstrip is tested on Chrome. Edge, Firefox and Safari have WebCodecs too, but filmstrip isn’t tested on them. They may work.
A preview needs VideoDecoder to draw and AudioDecoder to play sound, and an export needs VideoEncoder as well.
Firefox for Android has neither video half, per caniuse as checked on 2026-11-06. See
what the reader sees there.
ffmpeg
Section titled “ffmpeg”The JVM backend links no ffmpeg and bundles none. It runs ffmpeg and ffprobe as separate programs, found
through FfmpegConfig, then the FILMSTRIP_FFMPEG and FILMSTRIP_FFPROBE environment variables, then PATH. An
older build is reported as FilmstripError.ToolchainMissing when you plan or export, never as a crash. A snapshot
with no release number, like N-121284-g4c9e0eb, is held to the libavformat version it prints instead, 62 or
later for ffmpeg 8. One that prints neither is refused the same way, since nothing says it’s new enough.
The build also needs the noise bitstream filter, which a trimmed copy uses to stop its video on the last frame it
keeps. Every build configured with ffmpeg’s defaults carries it. One built without it is refused with
ToolchainMissing too, naming the filter.