Dawloom

Ombar, Elviepr TV

Elviepr TV

Elviepr TV needed an Android TV and Fire TV app that streams a Vimeo-hosted video on loop, all day, every day. The first version was React Native: it played for about eight hours before dying, recovery code stretched runs to a day and a half at best, and fifteen days of tweaking never broke that ceiling. We rebuilt it natively in Kotlin, and the problem disappeared.

Client websiteFound us on Fiverr

What it does

  • Plays a Vimeo-hosted video on loop, around the clock, on Fire TV and Android TV
  • Pairs a device to its content with a playlist ID on first launch
  • Swaps content remotely: change one field in the backend and every paired TV updates within seconds
  • Recovers from network drops, stream errors, and stalls without anyone touching a remote
  • Relaunches itself after power cycles and reboots
  • Runs muted and screen-awake, tuned for continuous display rather than interactive viewing

What we built

A rewrite born from a hard limit

The first build used React Native with Expo and the TV fork, tuned with every recommended Fire TV setting. It played for roughly eight hours. Recovery code that rebuilt the player on errors stretched runs to about 36 hours, never past it. After more than two weeks of tweaking, we rewrote the app natively in Kotlin with Jetpack Compose for TV, and it has run continuously since.

A player that assumes things will fail

Media3 ExoPlayer wrapped in a resilience layer: a ten-second heartbeat that detects stalls within thirty seconds, exponential-backoff recovery for stream errors, and a network callback that retries the moment connectivity returns.

Defenses against long-uptime decay

Vimeo signed URLs expire, so the app refreshes them every three hours without interrupting playback. Every six hours the player is fully torn down and rebuilt to head off hardware decoder leaks on TV sticks, with a mutex keeping the two loops from racing each other.

Watchdogs beyond the app

A foreground service with a wake lock keeps the process alive, a boot receiver relaunches the app after power cycles, and a periodic system watchdog brings it back to the foreground if anything else ever takes over the screen.

Remote content control

The video assignment lives in Firestore. One persistent listener streams changes to every paired TV, so swapping what plays is a single field edit, not an app update.

The stack

KotlinJetpack Compose for TVAndroid TV / Fire TVFirebase FirestoreVimeo API

The engineering story

Want something like this?

Describe your operation. We reply with an honest read on what it would take.

Search the whole site