Installation
Add the dependency
Section titled “Add the dependency”Snapshots live in the Maven Central snapshot repository, so add it next to mavenCentral() in
settings.gradle.kts.
dependencyResolutionManagement { repositories { mavenCentral() maven("https://central.sonatype.com/repository/maven-snapshots/") }}Then add filmstrip to the version catalog and to commonMain.
[versions]filmstrip = "0.1.0-SNAPSHOT"
[libraries]filmstrip = { module = "dev.jordond.filmstrip:filmstrip", version.ref = "filmstrip" }filmstrip-compose = { module = "dev.jordond.filmstrip:filmstrip-compose", version.ref = "filmstrip" }filmstrip-compose-ui = { module = "dev.jordond.filmstrip:filmstrip-compose-ui", version.ref = "filmstrip" }filmstrip-effects-filters = { module = "dev.jordond.filmstrip:filmstrip-effects-filters", version.ref = "filmstrip" }kotlin { sourceSets { commonMain.dependencies { implementation(libs.filmstrip) } }}filmstrip is the bundle. It brings core, the effect catalogue, the player and the right export backend for each
target. Call allBackends() once in setup and every target is ready.
Per platform
Section titled “Per platform”The Android backend runs on Media3 Transformer and previews through media3-exoplayer. filmstrip’s minSdk is 24. The application context comes from App Startup, so there’s nothing else to wire up unless your app turns App Startup off.
iOS 16 or later, and macOS 12 or later for the macOS target. Export runs on AVFoundation and VideoToolbox, and the player on AVPlayer. Link the Kotlin framework the way you already do, filmstrip adds no CocoaPods or Swift packages.
The JVM backend runs the ffmpeg and ffprobe already on the machine, version 8.0 or later.
filmstrip ships neither. Install them with your package manager, such as brew install ffmpeg or
apt install ffmpeg, and filmstrip finds them on PATH.
The browser backend runs on WebCodecs for both wasmJs and js. It’s tested on Chrome.
Modules
Section titled “Modules”Pick single artifacts instead of the bundle when you want less on the classpath.
| Artifact | What’s in it |
|---|---|
filmstrip |
The bundle: core, effects, player, and the right backend for each target, plus allBackends() to register them. Not Compose. |
filmstrip-core |
Model, MediaSource/MediaSink, probe(), ThumbnailSource, the VideoPlayer API and PlayerEngine SPI, and the effect SPI. No runtime, no effect catalogue. |
filmstrip-effects |
The built-in effect catalogue. GL effects on Android, Core Image on Apple, ffmpeg filter graphs on the JVM, and WebGL2 passes in the browser. |
filmstrip-effects-filters |
Opt-in filters like VHS, on every target. Not in the bundle, so add it and call filters() on the builder. |
filmstrip-transform |
The export planner, shared by every backend. Add a backend artifact alongside it to actually export. |
filmstrip-transform-media3 |
The Media3 backend, Android. |
filmstrip-transform-avfoundation |
The AVFoundation backend, iOS and macOS. |
filmstrip-transform-webcodecs |
The WebCodecs backend, browser. |
filmstrip-transform-ffmpeg |
The ffmpeg backend, JVM. Runs an ffmpeg and ffprobe already on the machine. |
filmstrip-player |
Preview playback over each target’s backend. |
filmstrip-compose |
Compose Multiplatform bindings: player state, the frame strip’s cache, and bare surfaces. |
filmstrip-compose-ui |
The drawn timeline: scrolling strip, ruler, playhead, trim handles, scrub gestures. Foundation only, no Material. |
filmstrip-test |
Test fixtures and the frame-similarity harness. |
filmstrip-io-filekit |
FileKit bindings: a picked PlatformFile as a source or sink, and an export result back as one. |
filmstrip-io-filekit-compose |
FileKit dialog launchers that hand back a MediaSource, ImageSource or MediaSink. |
filmstrip-io-okio |
Okio bindings: Path, BufferedSource and ByteString as sources, Path as a sink. |
filmstrip-io-kotlinx |
kotlinx-io bindings: Path and Source as sources, Path as a sink. |