Inspiration

Live sports on TV is surprisingly difficult to navigate.

The problem is not necessarily a lack of content. It is that live content is fragmented across channels, services, competitions and start times. A viewer can know that they want to watch football, but still have to work out what is actually on, where it is being shown, and which channel to open.

I wanted to build something that treated the TV experience differently.

Instead of starting with a grid of channels and asking the viewer to search through them, Nivora TV starts with the question:

What is worth watching right now?

That led to the idea of building an intelligent live-sports layer for Fire TV: something that can understand live events, connect them to available channels and sources, and get the viewer from discovery to playback as quickly as possible.

What I Built

Nivora TV is a Fire TV live-TV and sports discovery experience designed around the remote control.

The underlying application supports IPTV sources, favourites, recently watched content and persistent source configuration. HLS playback has been tested on the physical device. The playback layer also includes DASH detection and routing, but successful DASH video output has not been conclusively verified on the physical device. XMLTV/EPG support remains experimental: end-to-end operation on the TV has not been verified, and a known download issue is documented in the README.

On top of that foundation, the product is being shaped around a sports-first experience:

  • What's Worth Watching?
  • Live Now
  • Starting Soon
  • sports and competition discovery
  • team and event-focused navigation
  • finding the relevant channel or source
  • immediate playback

The goal is to make the content, rather than the channel list, the starting point.

Nivora is designed as a software and discovery layer. It does not provide or bypass content rights; it works with authorised or user-provided sources.

How I Built It

Nivora TV is built for Vega OS and runs on an ARMv7 Fire TV device.

The application uses a React Native-based architecture with separate layers for navigation, IPTV providers, playlist and EPG parsing, state management, favourites, playback and persistence.

A major focus was making the application work reliably with real-world television data rather than only with small mocked datasets.

For playback, Nivora supports both HLS and DASH and uses an abstraction layer so that playback capabilities can be selected without coupling the rest of the application directly to the media implementation.

I also built the application around Fire TV's D-pad interaction model. Focus movement, scrolling, Back behaviour and screen transitions are treated as first-class parts of the product rather than as desktop or mobile UI patterns transplanted onto a television.

The Challenges

The biggest challenges were not visual. They were platform reliability and performance.

Early in development, Nivora would sometimes terminate before React rendered anything. There were no useful application logs because the failure was happening during startup. Through controlled experiments, I isolated startup-time native-module and persistence issues and changed the architecture so those native dependencies were initialised safely and lazily.

Another challenge appeared when I tested a real IPTV playlist containing more than 2,000 channels. The application could parse the data successfully, but rendering the complete dataset at once made the Fire TV experience unresponsive.

That led to a dedicated virtualisation effort. Instead of rendering thousands of channel elements simultaneously, the application now renders only the small portion of the list that is actually visible. This made the large playlist usable on the physical device.

I also found a platform-specific Back-button behaviour that was easy to miss. Nivora could stop playback correctly but would then be exited by Vega because the application had not explicitly claimed the Back event. I traced that behaviour into the platform's BackHandler implementation and added explicit navigation handling so that Back during playback or from a non-Home screen behaves like a normal TV application, while Back from Home still exits through the platform's default behaviour.

Real-device testing helped me distinguish implemented playback functionality from behaviour that had been conclusively verified. I demonstrated sample-video playback and Pause, Resume and Back navigation on the physical Fire TV. HLS playback has been tested on-device, while DASH detection and routing are present in the code but successful DASH video output has not been conclusively verified. This reinforced the importance of distinguishing a supported code path from a fully validated device experience.

What I Learned

The most important lesson was that developing for a TV is fundamentally different from developing for a phone or web browser.

Performance has to be measured from the remote user's perspective. A key press can reach the application in milliseconds while the visible interface still feels slow because of rendering, layout or focus movement. A technically functional application can therefore still feel broken.

I also learned the value of controlled experiments.

Rather than changing several things at once, I kept known-good builds, isolated individual variables, validated changes on the physical Fire TV and preserved working baselines. That made it possible to distinguish genuine platform issues from application bugs.

The project also changed how I think about the product itself. A live-TV application does not become interesting simply because it can play a stream. The real opportunity is reducing the effort between deciding what you want to watch and actually watching it.

What's Next

The next stage of Nivora is to turn the reliable playback and live-TV foundation into a genuinely sports-first experience.

The long-term vision is for Nivora to become the intelligence layer between the viewer and live content:

What's happening → What's worth watching → Where can I watch it → Play → Back → Next event.

The technical foundation is now strong enough to build that experience on top of a real Fire TV device rather than treating the project as a prototype running only in a development environment.

Demo and Source Version

The demo was recorded on 22 October 2026 on a physical Fire TV Stick running Vega OS with local Build 29 installed. The demo-polish-b25 branch, at commit 6cf2609, contains the source corresponding to the visible interface and behaviour in the video, but it is not byte-identical to the filmed Build 29 package. Build 29 also contained local development changes not included in that branch. The default sports-mvp branch provides the earlier Build 24 tested baseline and an installable release. Further details are documented in the repository README.

The demo uses Big Buck Bunny, an animated sample film, rather than a live sports broadcast. Fixture data is unofficial, broadcaster availability is unconfirmed, and suggested channels are unverified.

Built With

Share this project:

Updates

Submission history