Skip to content

Installation

Snapshots live in the Maven Central snapshot repository, so add it next to mavenCentral() in settings.gradle.kts.

settings.gradle.kts
dependencyResolutionManagement {
repositories {
mavenCentral()
maven("https://central.sonatype.com/repository/maven-snapshots/")
}
}

Then add filmstrip to the version catalog and to commonMain.

gradle/libs.versions.toml
[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" }
build.gradle.kts
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.

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.

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.