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:
- A trilingual UI (English · Español · 中文), and — when the interface is not Chinese — on-the-fly machine translation of subtitles, titles, chapters, and danmaku.
- Search built for a TV: trending searches, autocomplete suggestions, and history.
- In-video comments in a vertical rail beside the video, including threaded replies, so a conversation can be read without leaving playback.
- Live streams with quality switching, a control bar, and a chat rail modelled on YouTube's TV app — with the noisier parts (gift and entrance messages) off by default.
- Playback speed control, which took a detour through the platform: media-source pipelines refuse to change rate on this hardware, but the native pipeline honours it over the system bus, with audio intact.
- Watch history with resume, a progress bar on every thumbnail, and a DLNA cast receiver so a phone can throw a video to the TV.
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
- The platform decides more than the framework. webOS isolates the microphone from third-party apps, geo-restricts the CDN, and freezes old partition APIs — real features live and die on those constraints, not on React.
- A tight verification loop pays for itself. A full regression on a real TV, run before every release, has caught UX regressions a unit test never would.
- Documenting install and release steps clearly enough for non-expert TV users is its own feature.