Smart TV

Building bili-webos for the living room

bili-webos started from a simple requirement: Bilibili should feel natural on an LG webOS TV, not like a desktop website squeezed into a ten-foot interface.

The project is a React application for webOS Homebrew. It runs entirely on the TV — the web app talks to a small on-device JS service that proxies Bilibili's API and media, so there is no external server or always-on PC. Everything is driven by the remote, with a focus-navigation system written from scratch.

Remote-first changes the product

A TV app cannot assume precise pointer control or a keyboard. The most important interactions need to be visible, reachable, and predictable from directional navigation. That affects screen density, focus states, loading behavior, and how much text belongs on a single surface.

My bias is to keep the main playback path short: choose content, confirm quality, start playback, and make the overlay controls easy to recover without hunting. A lot of the effort that never shows up in a screenshot went into the Magic Remote — the pointer and the scroll wheel behave nothing like a mouse, and getting "one notch = one row" to feel right took several rounds with real users.

Playback is the hard center

Video apps are mostly judged by what happens after the user presses play. DASH streams up to 4K/8K with HDR and Dolby Vision, quality fallback, a frame-accurate danmaku layer, chapters and scrub-preview thumbnails, and TV hardware limits all meet in that moment.

The implementation goal is not to copy a mobile app. It is to respect the living room context: less friction, clear focus, and playback that survives imperfect network and device conditions.

Where it is now

Since the first release the app has grown well past "it plays videos." By v1.5.1 it includes:

It is listed in the webOS Homebrew Channel (as BiliTV) with auto-updates, and quietly serves a steady base of daily active televisions. Most of the roadmap has come straight from GitHub issues — the sharpest bug reports turned into the features I am proudest of.

How those numbers are measured without any analytics is its own story.

What I keep learning