Web Player¶
Every proxy you configure can be watched straight from the browser. The web
player lives at /player on the dashboard port, shares the dashboard's
session and design system, and is the fastest way to answer "is this a tunlx
problem or a client problem?" — if a stream plays here, tunlx is serving it
correctly.

Opening the player¶
There are three equivalent ways in:
- Play on a proxy card. Every card — standard, composite, or Xtream service — has a Play action that opens the player for that proxy.
- The Open player menu in the navbar. The header's Open player button lists all proxies grouped by type, with a live Streaming / Ready badge and the stream currently playing on each. Pick one to jump straight in. With more than eight proxies the menu opens on a Filter proxies field: type part of a name, press Down to move into the matches or Enter to open the first one, and Esc to clear the text (a second press closes the menu). On a phone the field stays put at the top of the list but is not focused for you, so the keyboard does not cover the proxies.
- A direct URL.
/player?proxy=<name>deep-links to a proxy; add&type=live,&type=vod, or&type=seriesto land on a content type. Opening/playerwithout a proxy, or with one that no longer exists, goes back to the dashboard and says why.
The player uses your dashboard session — viewers who should not see the admin UI should be given Xtream service credentials and a real IPTV client instead.
Viewer logins¶
A standard proxy whose Xtream username and password are saved in its settings opens straight into the catalog, and so does a composite proxy that has a login of its own, or none. For everything else the player asks once for a login: the one your IPTV provider gave you, for a standard proxy with none saved; or, for an Xtream service (your own panel with its own user accounts) or a composite proxy built from one, one of the viewer logins you created for it. A rejected login is asked for again instead of being kept.
tunlx keeps the login you type, and the page does not: a standard proxy's goes
into its settings, encrypted like the other passwords in config.json, and a
service's stays in your dashboard session, so you type it again after you sign
out of tunlx. The page signs in with a placeholder, so the password is in no
address it requests. The browser remembers only the name that signed in, to
offer it next time, and forgets it when you sign out. Signing in to a
composite proxy only checks the login: it never changes the composite's own.

Browsing content¶
- Live TV / Movies / Series tabs switch the content type.
- The Channel Browser sidebar stacks Categories, Streams, and (for series) Episodes as accordions, each with its own search box. The last category you browsed is restored after a reload or proxy switch.
- The address follows what you open. Choosing a category or a content type
is a step in the browser's history, so Back returns to the previous
category instead of leaving the player; playing a channel updates the
address without adding a step. It names the proxy, the content type, the
category (
cat, andsrcfor the source of a composite proxy's category) and the channel (stream), so a reload reopens all of them, and the address can be sent to someone else: they sign in first if they have to, and come back to it. A category in the address wins over the last one you browsed. - On phones the sidebar becomes a full-screen sheet behind the Browse Channels button, so the video keeps the whole width. While it is open it is a named dialog and the page behind it cannot be reached (Esc closes it).
Playback controls¶
The now-playing bar above the video shows the channel logo, title, and EPG now/next information, plus:
| Control | What it does |
|---|---|
| Previous / Next channel (episode) | Steps through the current category, or, for a series, through its episodes season by season. Keyboard: Page Up / Page Down. |
| Refresh stream | Re-opens the current stream. |
| Picture-in-Picture | Pops the video into a floating window. |
| Copy stream URL | Copies the direct stream URL (honors publicBaseURL). |
| Open in new tab | Opens the raw stream URL, e.g. to hand to another app. |
| Quality | Appears when an HLS stream advertises multiple variants; pick a fixed level or stay on Auto. |
| Buffer | Picks how much media the player holds ahead of the playhead: Auto (engine defaults), Low latency, Balanced, Stable, or Maximum. Deeper buffers ride out jittery connections at the cost of a higher live delay. The choice persists in the browser and re-applies the moment you pick it. |
Keyboard shortcuts¶
Press ? (or the keyboard button in the toolbar) for this list in the player. A key that belongs to the control you are on is left to it: Space presses a button or a link you reached with the keyboard, and the arrow keys stay inside an open menu.
| Key | What it does |
|---|---|
| Space | Play or pause (on a button reached with the keyboard, it presses the button). |
| M | Mute or unmute. |
| F | Full screen. |
| / | Search the list that is open. |
| Up / Down | Move through the channel or episode list. |
| Page Up / Page Down | Previous or next channel or episode. |
| Esc | Close a menu or the channel browser. |
HLS, MPEG-TS, MP4, and Matroska streams all play in the browser through the
bundled playback engines — no plugins. The Buffer presets apply to the HLS
and MPEG-TS engines; native playback manages its own buffering. For
buffering on the server side of the proxy, see the per-proxy
streamBufferKB setting in Configuration.
Series¶
Choosing a series lists its seasons, and a season lists its episodes with their number, plot and length when the provider sends them (hover an episode for the series' genre and rating too). A series with one season opens straight on its episodes. When an episode ends, the next one is offered and starts by itself after five seconds unless you press Stay. A series that cannot be loaded says so, with the reason and Try again; that is different from a series that has no episodes.
When a stream will not play¶
A stream that fails says why, over the video, with Retry and Copy stream URL (Copy URL and Open in new tab stay available, so the address can be tried in VLC):
| Message | What it means |
|---|---|
| This browser can't decode H.264 | The browser has no H.264 decoder. Live TV is nearly always H.264. Chromium builds without proprietary codecs (common on Linux distributions) cannot play it; Chrome, Edge, Firefox and Safari can. |
| The provider no longer has this stream (HTTP 404) | The channel was removed or renumbered. Pick another, or reload the catalog. |
| The provider refused this stream (HTTP 403) | The subscription may have expired, or the provider blocks the server's address. |
| This account has reached its maximum number of connections (HTTP 429) | Close the stream on another device or tab, then Retry. |
| The provider did not answer properly (HTTP 5xx) | The provider is down or overloaded. |
Live streams reconnect up to three times (1, 2 and 4 seconds apart) after a dropped connection, a timeout, a 5xx or a 429. A 404 or a 403 is not retried, and neither is anything that is not live. A request for categories or channels that fails shows Could not load… with Try again, not an empty list.
EPG timeline¶
For live content, Timeline swaps the video for a scrollable programme guide rendered from the proxy's XMLTV data, and Refresh EPG pulls fresh data on demand. The timeline is a desktop feature; on phones the player keeps the now/next summary in the toolbar instead.
Switching proxies — and getting back¶
The player header mirrors the dashboard header:
- A Dashboard button returns to the admin UI (the logo does too).
- The Proxy selector switches to any other proxy — grouped into composite proxies, standard proxies, and Xtream services just like the dashboard's Open player menu — keeping your content type.
- Theme toggle, debug console, and logout round it out.
The debug console (bug icon) streams player internals — stream URLs tried,
EPG fetches, playback errors — and is the first place to look when a stream
refuses to start. It stays on, and shown, across reloads until you switch it
off, and the login inside a stream address is masked (/live/***/***/1001.ts),
so its Copy button is safe to paste into a bug report.
Related¶
- Dashboard Tour — where the player sits in the UI
- Xtream Services — the viewer accounts the player asks for
- Stream Health Tests — batch-probe catalogs instead of spot-checking by hand
- Configuration —
publicBaseURLcontrols the URLs the player hands out