I built a thing: OpenHearth
I got tired of my living room TV experience being owned by someone else, so I built OpenHearth — a self-hosted streaming hub that turns a spare computer into a clean, open-source set-top box.
The short version: OpenHearth is a Roku/Fire TV-style home screen that you run yourself, in Docker, with no ads, no telemetry, and no phone-home. It does three things: launches commercial streaming services (Netflix, YouTube, Disney+, and so on) in a full-screen kiosk the way a real TV box would; plays your local or self-hosted media with on-the-fly transcoding via ffmpeg; and optionally decorates your library with artwork and metadata from TMDB.
A cheap mini-PC or an old laptop wired to your TV, running Chromium in kiosk mode, becomes a perfectly usable set-top box. Arrow keys or a D-pad remote navigates everything.
What it does
The home screen is organized into rows — one for streaming services, one for your local movies, one for your TV library, whatever you want. Service tiles are fully declarative YAML, so adding or removing a service is just dropping a file. The bundled catalog covers the usual suspects: Netflix, YouTube, Disney+, Max, Prime Video, Hulu, Apple TV+, Paramount+, Peacock, Spotify, Sling, and YouTube TV.
Local media is scanned from whatever folder you mount into the container. Browser-playable files stream directly; anything else gets transcoded on the fly. GPU acceleration (VAAPI, NVENC, QSV) is opt-in, but CPU transcoding works out of the box and is the guaranteed path.
The whole thing runs in a single Docker container, and all configuration lives in editable YAML under ./config. Edits are hot-reloaded — you don’t restart anything after a change — and a bad edit never crashes the UI; the server keeps the last-good config and surfaces a non-fatal banner.
A few caveats worth knowing upfront
OpenHearth launches Netflix and friends in their own web players — it never touches or decrypts their streams. So ads inside ad-tier services still appear, and DRM rules still apply. The “ad-free” promise is about OpenHearth itself and your own local media.
Resolution from DRM services also depends on your browser’s Widevine level, which is a property of the machine, not something OpenHearth can change. A generic Chromium build often only gets L3, which some services cap at 720p.
The kiosk setup
The intended experience is Chromium launched with --kiosk --app=http://localhost:8080, auto-starting on boot. The Home and Back keys are intercepted by OpenHearth before any streaming service can swallow them, so you always have a reliable way back to the home screen — no getting trapped inside a player. The repo includes step-by-step guides for both Linux and Windows.
If you want to try it, the README walks through the full setup. Grab the docker-compose.yml, point the /media volume at your library, and run docker compose up. There’s something on screen in a couple of minutes.