
Gapless - a visual gapless media player Composable for Android
Most "gapless playback" discussions focus on audio: music apps, podcast players, seamless track transitions.
Even the Wikipedia article for gapless playback is entirely about audio content.
But there’s a whole category of Android apps where gapless matters just as much, and there’s very little reusable infrastructure for it: continuous visual playback.
This is mostly needed in digital signage and kiosks.
These systems cycle through videos, images, and web content continuously, and any black frame or flicker between assets immediately reads as a broken system.
So I built Gapless, a self-contained Jetpack Compose Composable for seamless visual playlist playback.
The key idea is that you don’t really manage playback anymore. You manage the asset list.
Everything else is handled by the player: preloading, scheduling, rendering, transitions.
Updating the asset list is also safe by design. If the currently playing asset still exists in the new list, playback continues uninterrupted while the rest of the playlist updates around it.
That shifts the mental model away from a media player state machine toward a reactive timeline of content.
What it handles internally:
- preloading the next asset before the current one ends
- dual render slots for seamless swap
- video (ExoPlayer), images (Coil 3), WebView in one playlist
- scheduling per asset (date ranges, weekdays, time windows including overnight ranges)
- hot-swappable playlists with continuity guarantees
- rotation (0/90/180/270) without affecting layout bounds
- shuffle with no immediate repeats
A lot of digital signage systems exist, but most are proprietary and tightly coupled to vendor ecosystems. Meanwhile there are tens of millions of TVs and professional displays used for signage, and a large chunk of them are Android-based, often on fairly constrained hardware.
I’m keeping this open source and evolving it based on real-world signage use cases. The focus is reliability and smooth playback.
Repo: https://github.com/514sid/gapless
Maven Central:
implementation("io.github.514sid:gapless:0.0.13")
If anyone ends up testing it in a real setup, feedback and issues on GitHub would be really helpful, especially for edge cases in kiosk and signage deployments.