When I started Yonto Player on 15 September 2026, I did not pick a stack from a comparison table. I picked it from a list of things the…

When I started Yonto Player on 15 September 2026, I did not pick a stack from a comparison table. I picked it from a list of things the app had to do, and each piece of the stack is the answer to one of them. This post goes through those choices in the order they came: what each one solved on day one, what I looked at instead, and what it costs me now. It is the reasoning, not a ranking of tools.

Most of them would be the wrong answer for a different app. Kotlin and Compose for TV: the first day The app is for Android TV, so the first choice was nearly made for me. Kotlin is Android's own language, and Compose is its UI toolkit. For television there is a Compose library of its own, tv-material, with the focus and the card components a remote needs.

The first working version already had tv-material and media3 in its build file, the same day the repository started. What Compose gave me on a TV is not prettier code. It is that focus is state you can reason about. A television has no pointer, so every screen is really a small focus graph: where the cursor is, where Up goes, and where it lands when you press Back. Compose lets me write that down in the same place as the screen.

The cost is that focus is also where most TV bugs live. I keep a page of rules for it in the repo, such as having every screen ask for focus on its primary element, and retrying a focus request across frames when the item it targets is not attached yet. That is the price of a toolkit that gives you the control: you have to use it carefully. media3 first: the player the device already trusts Playback on Android TV is a hardware question.

Which codecs does this box decode, in hardware, at which size, with which HDR? media3 and ExoPlayer sit on top of the device's own decoders, so what the hardware can decode, it decodes. They also read HLS and DASH, which is how a media server hands over a converted stream. So media3 is the player a file starts in, and everything else is for what it cannot read.

Source disclosure

This is a source-linked briefing. Read the original report from Dev Community .