Skip to content

Web Viewer

Austin Nunn edited this page Nov 14, 2026 · 4 revisions

Web Viewer

This lets other people watch your channels in a web browser, each with their own login. You pick which channels each person gets. The kids can have the cartoon channels and nothing else.

It runs as a second small container next to the server. It shows the player and nothing more: no dashboard, no settings, nothing anyone can change.

How it works

graph TD
  people[People with a web browser]
  proxy[Your reverse proxy, with HTTPS]
  viewer[Web viewer container, port 5005]
  server[Station Wrapper 43, port 5004]
  people --> proxy --> viewer --> server
Loading
  • A viewer logs in to the web viewer. It asks the server for the channel list, the guide and the video, and passes them on.
  • A viewer only ever talks to the web viewer. They can't reach the server through it.
  • The web viewer has no videos and no settings of its own. It shares one folder with the server: the list of viewers.

If you only want it inside your own home, you don't need the reverse proxy. Skip to step 1.

Before you start

  • A working server (Server Setup) on the image from 13 November 2026 or later. If yours is older, download the compose file again and run docker compose pull.
  • A desktop web browser to watch in: Chrome, Firefox or Edge. Safari on an iPhone or iPad can't play the video.

1. Switch it on

Add one line to .env, next to the compose file, and start again:

cd ~/fieldstation42
echo 'VIEWER=1' >> .env
docker compose up -d

A second container starts, called station-wrapper-43-viewer. Nothing is downloaded: it uses the image you already have.

To check, open the dashboard (http://192.168.1.20:5004), go to Settings, then the Players tab. The Web viewer box says its container is running.

Using your own compose file (like docker-compose.sample.yml)? The sample has a viewer: block near the bottom with a # in front of every line. Take the # marks off, change the folder to your config folder's viewers folder, and run docker compose up -d.

2. Add your viewers

  1. In the dashboard, open Settings, then the Viewers tab.
  2. Type a name and a password (8 characters or more).
  3. Leave Every channel ticked, or untick it and tick the channels this person may watch.
  4. Press Add them.

Do this for each person. To change someone's channels or password later, press Edit beside their name. Remove takes them off.

  • A new password logs that person out everywhere.
  • A channel you take away stops playing for them within a few seconds.

3. Watch

Open http://192.168.1.20:5005 in a browser and log in. You get the same player as the dashboard's Watch page: channel up and down, a guide, captions and picture quality. A login lasts 30 days. Log out is next to the controls.

Keys: the up and down arrows change the channel, left and right change the volume. M mutes, C turns captions on, F goes full screen. You can also type a number in the Channel # box and press Go.

When you change channel, a bar shows for a few seconds with the channel's number and name, the time, and what is on until when. It is the same bar the TV apps show.

Full screen fills the window with the picture, with the controls along the bottom so you can still change channel. In most browsers it takes over the whole screen. Press Esc or the button again to go back.

The controls hide by themselves. After four seconds without the mouse they fade away, and so does the pointer. Move the mouse and they come back. The keys keep working while they are hidden.

Picture quality is the list next to the volume. On a slow connection, pick a lower one: Low and Medium send a smaller picture (854x480), Extra Medium and Full send the full size. In a small player they can look the same. Press Stats to see what is really playing, in the corner of the picture:

855×480 · 1.1 Mbps arriving · Low: 1000k video

That is the picture size, how fast the video is arriving, and the quality you picked. Press Stats again to hide it.

Day to day

  • Stop all logins for a while: Settings → Players → Web viewer → Switch off. It works right away and nothing restarts. The viewer tells everyone it is switched off. Switch on brings it back.
  • See who is watching: Settings → Status. Each viewer who is watching has a row under Players, with their channel. The Web viewer line above it shows how long the viewer has been running and how many viewers you have set up.

Putting it on the internet

Read this part before you open anything to the outside.

Give outsiders the web viewer's port (5005) and nothing else. Ports 5004 and 4242 must stay inside your network. Port 5004 plays every channel to anyone who reaches it, with no login, because Emby, Jellyfin and the TV apps can't log in. Port 4242 has no login at all.

Put a reverse proxy with HTTPS in front. The web viewer speaks plain HTTP. Without HTTPS, passwords cross the internet where anyone can read them. With Caddy, the whole setup is:

tv.example.com {
    reverse_proxy 192.168.1.20:5005 {
        flush_interval -1
    }
}

Tell the web viewer where your proxy is. Add its address to .env and start again:

echo 'VIEWER_TRUSTED_PROXIES=192.168.1.10' >> .env
docker compose up -d

Here's why. After five wrong passwords in five minutes from one address, that address has to wait. Behind a proxy, every visitor looks like the proxy. So without this line, one person guessing wrong locks everybody out. With it, the web viewer believes the proxy about who is really calling.

Use long passwords. The login is the only lock on this door.

Settings

These go in .env. You only need the first one.

Setting What it does
VIEWER=1 Starts the web viewer. Take the line out and run docker compose up -d to stop it.
VIEWER_PORT=5005 The port it answers on.
VIEWER_TRUSTED_PROXIES= Your reverse proxy's address. More than one: separate with commas. A whole network works too, like 192.168.1.0/24.
VIEWER_MAX_STREAMS=3 How many streams one viewer can have open at once.

Good to know

  • Viewers share the server's limits. Each different channel being watched needs an encoder, and a lower picture quality picked in the player needs one too. The server allows 4 at once. To change that, go to Settings → General → Advanced → Channels encoded at once. Each one uses about one CPU core, less if a graphics card does the encoding.
  • It is locked down on purpose. The container can't write to its own disk, runs with no special rights, and sees none of your videos or settings. It drops a connection that says nothing for 30 seconds.
  • Where the viewers are kept: the viewers folder inside your config folder (data/config/viewers). It holds names and scrambled passwords, never a password you could read. Delete viewers.json in it to remove every viewer at once. Backups pick it up with everything else.
  • The server and the web viewer must be the same version. They use the same image, so docker compose pull && docker compose up -d updates both.

Problems

The Web viewer box says its container is not running. Check that .env has VIEWER=1, then run docker compose up -d. If your compose file is older than 13 November 2026 it has no viewer service: download it again (Server Setup).

"The web viewer is switched off." Someone pressed Switch off. Go to Settings → Players → Web viewer → Switch on.

Nobody can log in after a few wrong passwords. The web viewer thinks every visitor is your proxy. Set VIEWER_TRUSTED_PROXIES (above). Or wait five minutes.

"Too many streams are open for you." That viewer has more than three streams going, maybe on several devices. Close one, or raise VIEWER_MAX_STREAMS.

A channel won't start: "All tuners in use." Too many different channels are being watched at once. Raise Channels encoded at once (see Good to know).

The picture never starts on an iPhone or iPad. Safari there can't play this kind of video. Use a computer.

To see what the web viewer itself says:

docker logs station-wrapper-43-viewer

Clone this wiki locally