Nostalgex Blog

How to Run the Nostalgex Web Tuner in a Docker Container (Tuner 1.0.1: Sleep Timer, Playback Info and Connect with Emby)

The Nostalgex web tuner running from a Docker container in a desktop browser, with the SCREAM horror channels in the guide

How to run the Nostalgex web tuner in a Docker container

The Nostalgex web tuner ships as a Docker container: docker run -d --name nostalgex -p 8080:8080 --restart unless-stopped ghcr.io/chadmueller/nostalgex:latest, then open http://YOUR-SERVER-IP:8080. It's the same free tuner as nostalgex.app, with 130+ channels, served over plain http on your network, so it can reach Jellyfin or Emby servers that don't have https. Tuner 1.0.1 adds a sleep timer, playback info, a Connect with Emby button, eight SCREAM channels, and MYSTERY BOX TV, CRINGE TV and A24.

The number one thing Jellyfin and Emby folks asked me for was "can I just run it myself?" Yes. Now you can, and it takes about as long as microwaving popcorn.

Who is the Docker container for?

The web tuner at nostalgex.app is served over https. Browsers block an https page from talking to a plain http:// address, and there's no setting that turns that off. Plex gets past it because it hands out real certificates for local addresses. Jellyfin and Emby usually don't, so a server at http://192.168.1.50:8096 is out of reach from the hosted tuner.

Run the tuner as a Docker container on your own network and it's plain http too. Same network, same protocol, no block.

You probably don't need it if:

  • You use Plex and watch on Apple TV. Get the free App Store app and you're done.
  • You use Plex in a browser. The hosted tuner already works.
  • Your Jellyfin or Emby server already has https with a valid certificate.

Moving from Plex? Here's what happens to your channel guide.

What's left is the case it's built for: Jellyfin or Emby on plain http at home, and you want channels in a browser. Or you just like running things yourself. I get it.

What do I need?

  • A machine that stays on and runs Docker: a NAS, a mini PC, a Raspberry Pi 4 or 5 on a 64 bit OS, a spare Mac. If it already runs your media server, run it there.
  • The same network as your media server.
  • amd64 or arm64. There's no armv7 build.
  • One free port. 8080 by default.

How do I install it?

One command:

docker run -d --name nostalgex -p 8080:8080 --restart unless-stopped ghcr.io/chadmueller/nostalgex:latest

Then open http://YOUR-SERVER-IP:8080 in a browser on your network, using whatever address that machine answers on. Connect Plex, Jellyfin or Emby the same way you would on nostalgex.app.

Port 8080 already taken? Use -p 8099:8080 and open port 8099 instead.

Prefer Compose? Drop this next to your other compose files and run docker compose up -d:

services:
  nostalgex:
    image: ghcr.io/chadmueller/nostalgex:latest
    container_name: nostalgex
    ports:
      - "8080:8080"
    environment:
      NOSTALGEX_ENRICHMENT: "on"
    read_only: true
    tmpfs:
      - /tmp
    restart: unless-stopped

There's a fuller version at docker/compose.yaml in the repo, which also sets no-new-privileges.

The image is nginx serving static files on port 8080. No database, nothing to sign up for, and nothing gets installed on your media server. It runs as a non root user and is happy with a read only root filesystem as long as /tmp is writable.

How do I update to tuner 1.0.1?

docker compose pull && docker compose up -d

Or docker pull ghcr.io/chadmueller/nostalgex:latest and recreate the container. The image tags are 1.0.1, 1.0 and latest, so you can pin a version if you'd rather not move with latest.

What's new in tuner 1.0.1?

All of this is on nostalgex.app too, since it's the same tuner. Here's the full release.

A sleep timer

SLEEP in the side menu next to the guide: 15 MIN, 30 MIN or 1 HR, with the time left right on the button. When it hits zero it asks "Still watching?" for 20 seconds, then stops the picture and goes back to the guide. Pick a channel to start again. On a small screen it's under MENU.

I added this because I fell asleep to the same slasher three nights running.

The SLEEP button in the Nostalgex web tuner side menu counting down the time left, with the 15 MIN sleep timer running

Playback information

INFO in the side menu, or press I. It shows what's playing and how: Direct Play or a server stream, the picture size, the codecs, and why it fell back if it did. It's also under Settings > PLAYBACK. If you ever send me a "this won't play" report, a look at this panel saves us both a lot of guessing.

The playback information panel in the Nostalgex web tuner showing Direct Play and the video and audio codecs

Connect with Emby

Emby has its own button now. Connect with Emby on the sign in page, with your Emby username and password. Before this, Emby went through the Jellyfin option and the library never loaded. If you signed in that way, you're switched over on the next load without signing in again.

In the Docker container, a plain http:// Emby address works. On nostalgex.app it has to be https.

SCREAM goes from 4 channels to 8

SLASHER, HORROR COMEDY, FOUND FOOTAGE and WORLD HORROR join SCREAM KIDS, FRIGHT NIGHT, SCREAM ADULTS and NOSTALGEX HORROR, on channels 137 to 144. Thanks to @tydude001 for the channel ideas. Switch SCREAM on in Settings and its channels build from the horror movies you own. It also stays on in any month now, so if you're a Halloween in July person, I see you.

Three more channels

MYSTERY BOX TV (84), CRINGE TV (55) and A24 (118), any month.

One heads up for all the new ones: a channel with too few titles in your library stays hidden until you have enough for it. If you're light on found footage, that one waits for you.

Two separate switches

Show Now Playing and Mark Watched are separate switches in Settings now, instead of one Report Playback switch. They start off, and if you had Report Playback on, both stay on. Thanks to @w6trp.

What leaves my network?

The point of running it yourself is knowing where things go, so here's the whole list:

  • Your media server. Sign in and playback go straight from your browser to your server.
  • plex.tv. Plex only, for the code sign in and finding your server, like every Plex app.
  • The shared metadata cache and the nostalgex.app relay. On by default, because some channels (TEEN MOVIES, TRUE CRIME, CULT CLASSICS and others) need keywords, studios or ratings to fill. Only TMDB and IMDb ids leave the browser. No titles, no server address, no credentials. Set NOSTALGEX_ENRICHMENT: "off" to turn it off.

There are no analytics in the image. With enrichment off and Jellyfin or Emby, your browser talks to the container and your server and nothing else.

Why can't the tuner reach my server behind a reverse proxy?

This is the one that catches people. If you put the tuner behind https, say https://nostalgex.mydomain.com, but your Jellyfin is still plain http, the browser blocks Jellyfin again. Serve both the same way. Both on plain http inside your network is the simple setup, and it's the one this is built for.

More troubleshooting is in the Docker container guide and on the support page.

FAQ

What is the Nostalgex Docker image called?

ghcr.io/chadmueller/nostalgex. Tags are latest, 1.0 and 1.0.1.

What port does the Nostalgex container use?

8080 inside the container. Map any free port on the left side of -p, like -p 8099:8080.

Does the Docker container work with plain http Jellyfin and Emby?

Yes. That's the main reason it exists. The container serves the tuner over plain http on your network, so it can reach plain http servers that nostalgex.app can't.

Do Plex users need the container?

Usually not. The hosted web tuner and the Apple TV app both reach Plex as is.

Is the Docker container free?

Yes. It's free and open source (MIT), no account, and the whole thing is in the GitHub repo if you'd rather build it yourself.

Try Nostalgex tonight

Nostalgex turns your own Plex, Jellyfin or Emby library into live channels with a retro TV guide. It's free and open source.

Download on Apple TV

Setup guides: Nostalgex for Plex, Nostalgex for Jellyfin, Nostalgex for Emby.

Join the Discord