RoboDodd

Couchside: A Fast, Self-Hosted Media Server with Live TV and DVR

Couchside is a free, open-source media server for movies, shows and live TV: one small program with a built-in DVR, your own channels and no cloud account.

Couchside: your movies, shows and live TV, on your own server, above a screenshot of the home page
self-hosted 5 min read

I’ve used Plex for years. It has always been my go-to for movies, shows and the HDHomeRun tuner in the closet, and there is a lot about it I still like. But it isn’t local only anymore, and its focus has drifted toward things that have nothing to do with the media on my own drives. Jellyfin is a great project and I’d recommend it to anyone, but there were things about Plex I missed when I tried it.

What I actually wanted was short list:

  • Something lightweight and fast that would run on my little k3s cluster without eating a node.
  • Live TV and recording out of the box, not as an add-on.
  • Fake channels made from my own library, so there is always something on.
  • Local only. No account, no cloud, no ads.

So I rolled my own. It’s called Couchside, it’s free and open source, and it lives at couchside.app.

Couchside's home page with the newest title's backdrop, library counts and a Continue Watching row
Home: the newest title, library counts and where everyone left off

What it does

Couchside is a single small program with its database built in. Install it, point it at the folder with your movies and shows, and it finds every title, looks it up on TMDB and fetches the posters, backdrops, cast and plots. Then you watch in a browser, on your phone, or on the TV.

It runs on a NAS, a Raspberry Pi, a Windows PC or a Kubernetes cluster, and it idles at next to nothing.

A look around

Your library, with its artwork

Browse movies and shows as poster grids, filter by genre, year or rating, or just look at what you haven’t watched yet. If a title is matched wrong, fix it from its page.

The Movies library as a grid of posters
The movie library. The titles are invented and the artwork is generated, so no real posters appear in the screenshots
A movie's page with its poster, rating, genres, a Resume button, the plot and the file behind it
A title's page: resume where you stopped, add to My List, mark watched, or fix the match

It plays what you have

If your browser or TV can play the file as it is, Couchside sends it straight through. If not, it converts it on the fly, using the graphics card when there is one, and tone maps HDR for screens that can’t show it. Subtitles, audio tracks and quality settings are a click away.

The full-screen player paused partway through a film, with the progress bar and controls along the bottom
The player, paused 45 minutes into a film

Live TV, recording, and channels of your own

With an HDHomeRun on the network you get a guide, series recordings and commercial skipping, and recordings land in your library like anything else. If you are starting from scratch, my attic antenna and HDHomeRun guide covers the hardware side; only the server at the end changes.

The part I’m most pleased with is the fake channels. Pick some of your own movies or shows and Couchside turns them into a channel that is always playing: a movie night channel, a show on repeat, a kids’ channel. Flip through the guide and something is on, with no ads, from files you already have.

The live TV guide with ten channels made from the library, laid out on a timeline
The guide. Every channel here is playing from the library

On your phone

The web app fits a phone, with the same library, Continue Watching and My List.

The whole household

Everyone gets a profile with their own progress, lists and rating limits, so the kids see what’s theirs and nobody loses their place in a show.

The Who's watching? screen with three profiles: Alex, Sam and Kids
Who's watching?

Running it

If you use Docker, this is all it takes:

docker run -d --name couchside -p 8080:8080 \
  -v couchside-data:/data -v couchside-cache:/cache \
  -v /path/to/media:/media \
  ghcr.io/timothydodd/couchside:latest

Open http://localhost:8080 and add a library. There is also a Windows installer, plain downloads for Linux and macOS, and a Helm chart for Kubernetes (it took over from the Plex on k3s setup I wrote about a while back). The install guide walks through each one, including live TV setup.

Roku and LG apps are on the way

A media server really gets used from the couch, so there are two TV apps in the works:

  • A Roku channel, going through Roku’s review for the Channel Store.
  • An LG webOS app for 2020 and newer LG TVs, being submitted to the LG Content Store.

They are for watching: pick a profile, browse, resume, play. Managing the server stays in the web app. I’ll put the store links on the Couchside project page as soon as they are live.

Open for community help

Couchside is one person’s spare-time project, and this is the point where more eyes would help most:

  • Try it and tell me what breaks, especially on hardware I don’t have: different graphics cards, NAS boxes, Raspberry Pis, unusual video files. The bug form on GitHub asks for a diagnostics zip (Settings > System > Advanced > Diagnostics), which makes most problems quick to track down.
  • Ideas. Open an issue and we can talk it through. The one rule is that Couchside stays local: no telemetry and no cloud service of its own.
  • Code. The server is Go and the web app is React. Small, focused pull requests get in fastest; CONTRIBUTING.md has the details.
  • TV testers. If you have a Roku or an LG TV and want to try the apps before they reach the stores, say so on the issues page.

Everything is MIT licensed at github.com/timothydodd/couchside, downloads are on the releases page, and the website is couchside.app.

Couchside doesn’t provide or find any content; use it only with media you have the right to play. This product uses the TMDB API but is not endorsed or certified by TMDB. Roku, LG, webOS, HDHomeRun, Plex, Jellyfin and other product names are trademarks of their owners; Couchside isn’t affiliated with any of them.