Documentation

Streaming in five minutes

Xtream is one static binary. There is no runtime to install, no database to provision and no cluster to configure. If you can SSH into a Linux box, you can run it.

Requirements

  • A Linux serveramd64 or arm64, with systemd. A 1 vCPU / 1 GB instance comfortably handles one publisher and 50+ viewers.
  • Root accessThe installer writes a binary, a config directory and a systemd unit.
  • OBS Studio 30 or newerWHIP output is built in from version 30. Earlier versions won't work.
  • A licence keyXtream refuses to install or start without one.
Open TCP 8282 in your firewall. If you enable the embedded TURN server, open UDP 3478 too.

Install

Run this on the server, replacing the key with your own. You'll find it on your license keys page.

$curl -fsSL https://stream.dxform.ph/install.sh | sudo sh -s -- --key=XT-XXXX-XXXX-XXXX-XXXX

The installer:

  1. Validates your key against the licence service.
  2. Downloads the build matching your architecture and verifies its SHA-256.
  3. Installs to /usr/local/bin/xtream and creates a locked-down xtream system user.
  4. Writes /etc/xtream/xtream.env with generated dashboard and TURN credentials.
  5. Activates the machine and stores the signed licence file.
  6. Registers and starts a systemd service.
Nothing is downloaded before your licence checks out — the binary is not publicly available.

Configure OBS

In OBS, open Settings → Stream and choose WHIP as the service.

ServiceWHIP
Serverhttp://YOUR_SERVER_IP:8282/whip/live
Bearer Tokenleave empty

Then under Settings → Output (Advanced mode), these settings matter for latency:

Encoderx264, or a hardware encoder with B-frames disabled
Rate ControlCBR
Keyframe Interval1 second
Profilebaseline
Tunezerolatency
Audio EncoderOpus
The keyframe interval is the one people get wrong. At the default of 2 seconds a viewer joining mid-stream stares at a blank player until the next keyframe. Set it to 1.

live in the server URL is the stream key. Any value works — use different ones to run several streams from a single server.

Watch the stream

Open the player in a browser. It shows a waiting state until OBS connects, then starts playing on its own — no button to press.

Playerhttp://YOUR_SERVER_IP:8282/?stream=live
Operations dashboardhttp://YOUR_SERVER_IP:8282/dashboard.html

Dashboard credentials were generated during install. Find them in /etc/xtream/xtream.env.

Configuration

Everything lives in /etc/xtream/xtream.env. Restart the service after editing it.

PORTHTTP port. Default 8282.
HOSTBind address. Default 0.0.0.0.
STUN_URLSTUN server for NAT traversal.
TURN_ENABLEDSet true if viewers sit behind restrictive NATs.
TURN_PUBLIC_IPRequired when TURN is enabled — your server's public IP.
DASHBOARD_USER / DASHBOARD_PASSCredentials for the operations dashboard.
$sudo systemctl restart xtream

How licensing works

Xtream activates against our licence service at install and on every start. Once running it checks in every 15 minutes.

  • One key, one machine. The key binds to a fingerprint derived from your machine ID and network interface.
  • Outages don't stop your stream. Each activation returns a signed 24-hour entitlement token. If our service is unreachable, your server keeps running for a full day on that token.
  • Moving hardware is self-serve. Release the key from your dashboard, then install on the new machine. Once every 30 days per key.
  • Uninstalling frees the seat. Running the installer with --uninstall releases the key automatically.
$xtream license status

Operations

Follow the logs
$journalctl -u xtream -f
Restart
$sudo systemctl restart xtream
Check the licence
$xtream license status
Free the key for another machine
$xtream license deactivate
Upgrade to the current build
$curl -fsSL https://stream.dxform.ph/install.sh | sudo sh -s -- --key=YOUR_KEY
Remove completely
$sudo sh install.sh --uninstall

Troubleshooting

The service won't start

Almost always the licence. Run xtream license status and check journalctl -u xtream -n 40. If the key is bound to an old machine, release it from your Servers page.

OBS connects but the player stays blank

Check the stream key matches on both sides, and set your OBS keyframe interval to 1 second. The operations dashboard shows whether packets are arriving.

Viewers on corporate networks can't connect

Their firewall is blocking UDP. Enable the embedded TURN server: set TURN_ENABLED=true and TURN_PUBLIC_IP in your env file, open UDP 3478, and restart.

Latency is higher than expected

Disable B-frames in your encoder, use CBR, and set tune to zerolatency. B-frames alone can add several hundred milliseconds.

“This key is already activated on another machine”

Expected if you reinstalled without uninstalling first. Release the key from your Servers page, then run the installer again.

Still stuck?

Email us with the output of xtream license status and the last 40 lines of journalctl -u xtream, and we'll work it out with you.

Get a licence key