Snappier Server
IPTV recording server with EPG (Electronic Programme Guide), PVR (automatic recording rules), and scheduled downloads. Pairs with the Snappier IPTV app or the built-in web dashboard.
Quick Start 3 steps
- 1 Download and install the app
- 2 Run it and copy the API token from the Preferences window
- 3 Open
http://YOUR-IP:8000/dashboardor connect via the Snappier IPTV app
Setup Details
More detail on each step of the setup process.
1 Install
Grab the desktop app (GUI with system tray icon — recommended for most users) or the CLI binary (for servers without a display). The desktop app bundles FFmpeg (the video processing engine) on macOS/Windows. On Linux, install FFmpeg separately.
2 Launch & Configure
Run the app. It starts a server on port 8000 and generates an API token (a password for connecting). Find the token in the Preferences window (desktop app) or in the console output (CLI).
3 Connect
In the Snappier IPTV app, go to Settings → Snappier Server and enter your server's IP address, port 8000, and the API token. Or open http://YOUR-IP:8000/dashboard in a browser. Do not include http:// in the app — just the IP and port.
How it works: Snappier Server runs in the background and processes recording/download requests. Once a job starts, the client app can be closed — the server works independently. Each active recording or download consumes one IPTV connection. In-progress recordings can be watched from the server without using an additional connection.
Desktop App
System-tray app with Preferences GUI, EPG configuration, and bundled FFmpeg (macOS/Windows).
Windows
macOS
- Extract the
.ziparchive and run snappierServer.exe.ℹ SmartScreen: Windows may show a "Windows protected your PC" warning because the app is new and not registered with Microsoft. This is normal and safe. Click "More info" then "Run anyway". - The tray icon appears in the bottom-right taskbar. Click it to open Preferences and copy your API token.
- Optional: enable EPG in Preferences and add your EPG source URL.
- Connect via the Snappier IPTV app (Settings → Snappier Server) or open
http://YOUR-IP:8000/dashboard. Find your IP: open Command Prompt and typeipconfig— look for "IPv4 Address" (usually starts with 192.168).
- Open the
.dmgand drag snappierServer to Applications. - Launch from Launchpad or Finder.
ℹ Gatekeeper: Try to open the app first, then go to System Settings → Privacy & Security → "Open Anyway" (macOS 13+) or System Preferences → Security & Privacy (macOS 12).
- The menu bar icon appears top-right. Click it to open Preferences and copy your API token.
- Optional: enable EPG and add your EPG source URL in Preferences.
- Connect via the app or
http://YOUR-IP:8000/dashboard. Find your IP: open Terminal and typeipconfig getifaddr en0, or go to System Settings → Network to see your IP address.
Prerequisites
# FFmpeg is required
sudo apt update && sudo apt install ffmpeg # Debian/Ubuntu
sudo dnf install ffmpeg # Fedora/RHEL
sudo pacman -S ffmpeg # Arch
dunst, xfce4-notifyd, etc.).
- Make executable and run:
chmod +x snappierServer-*.AppImage ./snappierServer-*.AppImage - Click the tray icon to open Preferences. Copy your API token.
- Optional: enable EPG and add your EPG source URL.
- Connect via the app or
http://YOUR-IP:8000/dashboard. Find your IP withhostname -I.
Command-Line Binary
Standalone executable with Node.js bundled in — no dependencies to install. For headless servers, Docker, and automated deployments.
Windows
macOS
Run in a Docker container for headless deployments.
HA add-on with stable/beta channels. amd64 + aarch64.
Prerequisites
# Install FFmpeg
brew install ffmpeg # macOS (Homebrew)
sudo apt install ffmpeg # Debian/Ubuntu
sudo dnf install ffmpeg # Fedora/RHEL
sudo pacman -S ffmpeg # Arch
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Run
chmod +x snappier-server-cli-*
./snappier-server-cli-*
# Server starts on http://localhost:8000
systemd Service (Linux)
Replace YOUR_USERNAME and paths below. WorkingDirectory determines where config and recordings are stored by default.
sudo tee /etc/systemd/system/snappier-server.service << 'EOF'
[Unit]
Description=Snappier Server
After=network.target
[Service]
Type=simple
User=YOUR_USERNAME
WorkingDirectory=/opt/snappier
ExecStart=/opt/snappier/snappier-server-cli
EnvironmentFile=-/etc/snappier/env
Restart=on-failure
RestartSec=5
StartLimitBurst=5
StartLimitIntervalSec=60
StandardOutput=journal
StandardError=journal
# Hardening
NoNewPrivileges=true
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
# Optional: create env file for configuration
sudo mkdir -p /etc/snappier
sudo tee /etc/snappier/env << 'EOF'
PORT=8000
ENABLE_EPG=true
# EPG_URL=http://provider.com/epg.xml
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now snappier-server
sudo systemctl status snappier-server
Environment Variables & CLI Arguments
PORT— Listening port (default:8000)HOST— Bind address (default:0.0.0.0)ENABLE_REMUX— Convert.tsto.mkvafter recording (default:false)RECORDINGS_FOLDER— Live TV recording output path (default:~/SnappierServer/Recordings)MOVIES_FOLDER— Movie download output path (default:~/SnappierServer/Movies)SERIES_FOLDER— TV series download output path (default:~/SnappierServer/TVSeries)PVR_FOLDER— PVR data path (default:~/SnappierServer/PVR)HLS_FOLDER— HLS transcoding temp directory (default:~/SnappierServer/hls)EPG_FOLDER— EPG cache data path (default:~/SnappierServer/epg)LOGS_FOLDER— Log file directory (default:~/SnappierServer/logs/)DOWNLOAD_SPEED_LIMIT_MBS— Max curl download speed in MB/s (default:0= unlimited)MAX_CURL_RETRIES— Max retry attempts for curl downloads (default:5)USE_CURL_TO_DOWNLOAD— Force curl for all downloads instead of FFmpeg (default:false)ENABLE_EPG— Enable EPG support (default:false)EPG_URL— Single EPG XML URL (deprecated — useEPG_URLSinstead). If both are set,EPG_URLStakes precedenceEPG_URLS— Multiple EPG sources as JSON array (takes precedence overEPG_URL)EPG_REFRESH_INTERVAL— Refresh interval in hours (default:24)LOG_ROTATE_DAYS— Log rotation interval in days (default:3)LOG_ROTATE_SIZE_MB— Max log file size before rotation in MB (default:10)KEEP_ALIVE_TIMEOUT— HTTP keep-alive timeout in ms (default:65000)HEADERS_TIMEOUT— HTTP headers timeout in ms (default:66000)HLS_USE_HW— Enable hardware acceleration for HLS transcoding (default:false). Uses platform-specific encoders: VideoToolbox on macOS, VAAPI/NVENC on LinuxHLS_VIDEO_ENCODER— Override the video encoder for HLS (e.g.h264_videotoolbox,h264_vaapi,h264_nvenc). If unset, useslibx264or the hardware encoder whenHLS_USE_HWis enabled
Setting Variables
# macOS / Linux
export PORT=9000
export ENABLE_REMUX=true
export ENABLE_EPG=true
export EPG_URL="http://example.com/epg.xml"
./snappier-server-cli
# Windows (PowerShell)
$env:PORT = "9000"
$env:ENABLE_REMUX = "true"
.\snappier-server-cli.exe
# Windows (cmd)
set PORT=9000
set ENABLE_REMUX=true
snappier-server-cli.exe
To persist, add to ~/.bashrc, ~/.zshrc, or the systemd service file.
All arguments override environment variables. Run --help for the full list.
./snappier-server-cli --help
Server
--port 8080 # Override listening port
--host 127.0.0.1 # Bind address (default: 0.0.0.0)
--enable-remux # Convert .ts to .mkv after recording
--speed-limit 50 # Download speed limit in MB/s
Config & Data Paths
--config /etc/snappier/config.json # Custom config file (default: ~/SnappierServer/config.json)
--pvr-folder /mnt/data/pvr
--epg-folder /mnt/data/epg
--logs-folder /var/log/snappier
--recordings ~/Recordings
--movies ~/Movies
--series ~/TVShows
Logging
--log-rotate-days 7 # Rotate every N days (default: 3)
--log-rotate-size 20M # Rotate at N MB (default: 10)
EPG
# Single source
--enable-epg --epg-url "http://example.com/epg.xml" --epg-interval 12
# Multiple sources (JSON)
--enable-epg --epg-urls '[
{"url":"http://primary.com/epg.xml","name":"Primary","priority":1,"enabled":true},
{"url":"http://backup.com/epg.xml","name":"Backup","priority":2,"enabled":true}
]'
Full Example
./snappier-server-cli \
--config /path/to/config.json \
--port 8080 \
--enable-epg \
--epg-url "http://provider.com/epg.xml" \
--epg-interval 24 \
--enable-remux \
--recordings ~/Recordings \
--movies ~/Movies \
--series ~/TVShows \
--logs-folder /var/log/snappier \
--log-rotate-days 7 \
--log-rotate-size 20M \
--epg-folder /mnt/data/epg \
--pvr-folder /mnt/data/pvr
API Token
A unique API token is generated on first launch. Find it in the Preferences window (desktop app), console output (CLI), or Dashboard Settings. All endpoints (except the dashboard and streaming paths) require this token.
# Header (recommended)
curl -H "X-API-Token: YOUR_TOKEN" http://localhost:8000/config
# Query parameter
curl http://localhost:8000/config?token=YOUR_TOKEN
To regenerate the token, use the Dashboard Settings or POST /auth/regenerate.
Setup Guides & Reference
http://YOUR-SERVER-IP:8000/dashboard
Features
- System Overview: CPU, memory, disk usage
- Active Jobs: Real-time progress for downloads and recordings, with cancellation
- Scheduled Recordings: View and manage upcoming jobs
- Recording History: Browse completed recordings
- TV Guide (EPG Grid): Interactive programme listings, channel browsing, recording scheduling, live playback
- Settings: EPG sources, PVR rules, download paths, remuxing
TV Guide Setup
- Dashboard → Settings → EPG Sources → add/edit a source
- Check "Use for TV Guide (Xtream Codes)" — credentials auto-detected from Xtream URLs
- Save. The server fetches channel and category data.
- Click TV Guide in the sidebar to open the interactive grid.
EPG (Electronic Programme Guide) provides programme listings for scheduling recordings and browsing the TV guide. Your IPTV provider supplies the EPG URL — look for "XMLTV URL", "EPG URL", or "TV Guide URL" in your provider's welcome email, customer portal, or app setup instructions. If you can't find it, contact your provider.
EPG URL Format
If your provider uses Xtream Codes (a common IPTV management system), construct the EPG URL from your provider's server details (not your Snappier Server):
http://your-provider-server:port/xmltv.php?username=USERNAME&password=PASSWORD
GUI Setup
- Tray icon → Preferences → EPG section
- Enable EPG, paste your URL, name the source, set priority (1 = highest)
- Set refresh interval (24h recommended), Save
CLI Setup
# Single source
./snappier-server-cli --enable-epg \
--epg-url "http://iptv.example.com:8080/xmltv.php?username=user&password=pass"
# Multiple sources
./snappier-server-cli --enable-epg --epg-urls '[
{"url":"http://primary.com/epg.xml","name":"Primary","priority":1,"enabled":true},
{"url":"http://backup.com/epg.xml","name":"Backup","priority":2,"enabled":true}
]'
Verify
curl -H "X-API-Token: YOUR_TOKEN" http://localhost:8000/epg/status # Source info & update times
curl -H "X-API-Token: YOUR_TOKEN" http://localhost:8000/epg/channels # Detected channels
curl -H "X-API-Token: YOUR_TOKEN" -X POST http://localhost:8000/epg/refresh # Force refresh
Troubleshooting
- No data: Verify URL returns XML in a browser. Check EPG is enabled. Wait for initial download.
- Stale data:
POST /epg/refreshor reduce refresh interval. - URL not working: Verify credentials. Try standard Xtream format. Contact your provider.
PVR (Personal Video Recorder) creates rules that automatically schedule recordings when matching programmes appear in your EPG data. Like a DVR — set it once and the server records every matching episode.
Requirements
- EPG must be enabled and working
- Server should be running 24/7 for automatic scheduling
Rule Types
- Series: Records all future matching episodes continuously. Best for TV series and daily shows.
- One-time: Records only the next match, then auto-disables. Best for special events or one-off recordings.
How to Create Rules
- Snappier IPTV app: Long-press any programme in the EPG grid for recording options. Manage rules in the Server section.
- Web Dashboard: Open Settings → PVR Rules to create and manage rules.
How It Works
The server scans EPG data for matching programmes after each EPG refresh, on startup (2-second delay), or when you trigger a manual scan. Matched programmes are automatically scheduled for recording. You can exclude specific episodes you don't want.
Data Storage
PVR data is stored in the PVR_FOLDER (default: ~/SnappierServer/PVR/):
pvr_rules.json— Recording rulespvr_exclusions.json— Excluded episodes- Recordings saved as
.ts(or.mkvwith remuxing enabled)
The server auto-detects SSL certificates on startup and switches to HTTPS. The port stays the same (default 8000) — only the protocol changes. No certs = standard HTTP.
Certificate Paths (checked in order)
./certs/(project directory, recommended for CLI)- User data directory:
- Windows:
%APPDATA%\snappierServer-electron\certs\ - macOS:
~/Library/Application Support/snappierServer-electron/certs/ - Linux:
~/.config/snappierServer-electron/certs/
- Windows:
Required: privkey.pem and fullchain.pem
Let's Encrypt
sudo certbot certonly --standalone -d yourdomain.com
mkdir -p ./certs
sudo cp /etc/letsencrypt/live/yourdomain.com/privkey.pem ./certs/
sudo cp /etc/letsencrypt/live/yourdomain.com/fullchain.pem ./certs/
sudo chown $USER:$USER ./certs/*.pem
Reverse Proxy (Caddy)
# Caddyfile
yourdomain.com {
reverse_proxy localhost:8000
}
caddy run
Caddy handles certificates, renewal, and HTTP-to-HTTPS redirect automatically.
Self-Signed (dev only)
mkdir -p ./certs
openssl req -x509 -newkey rsa:4096 \
-keyout ./certs/privkey.pem \
-out ./certs/fullchain.pem \
-days 365 -nodes -subj "/CN=localhost"
Verify
# Check server logs:
# HTTPS: "SSL certificates found in ./certs - starting HTTPS server"
# HTTP: "No SSL certificates found - starting HTTP server"
Certificate Reload
Certificates are read on startup only. After updating or renewing certificates, restart the server for changes to take effect.
App Connection
Enable the HTTPS/SSL toggle in Snappier IPTV settings. For self-signed certs, visit https://SERVER-IP:8000 in mobile Safari/Chrome first to accept the certificate.
- Config location: Desktop app stores config in the OS user-data directory (
%APPDATA%/~/Library/Application Support//~/.config/). CLI defaults to~/SnappierServer/config.json. - CLI binary: The CLI is a standalone executable with Node.js bundled in. No runtime dependencies — just download and run.
- FFmpeg: Bundled on macOS/Windows (desktop app). Install separately on Linux and for all CLI installs.
- Recording format:
.ts(MPEG Transport Stream). Enable remuxing to convert to.mkvfor better compatibility with media players like Plex and VLC. - Default storage:
~/SnappierServer/(recordings, movies, series, PVR data). Override with env vars or CLI args. - Port conflicts: If port
8000is already in use, the server will fail to start with anEADDRINUSEerror. Change the port withPORT=9000or--port 9000. - Firewall: Allow traffic on the configured port for cross-device access.
- VPN: The server and client must be able to reach each other over the network (same LAN, or routable via VPN).
Updating
Replace the binary or app with the new version. Your configuration, API token, and recordings are stored separately in ~/SnappierServer/ (CLI) or your OS user-data directory (desktop app) and persist across updates.
Uninstalling
- Windows: Delete the extracted folder. Remove
%APPDATA%\snappierServer-electronif you want to clear config. - macOS: Drag the app from Applications to Trash. Remove
~/Library/Application Support/snappierServer-electronfor config. - Linux: Delete the AppImage or CLI binary. Remove
~/.config/snappierServer-electron(desktop) or~/SnappierServer(CLI) for config and data.
Desktop App vs CLI
Both share the same recording/download engine. The desktop app adds a Preferences UI, system tray with start/stop controls, a log viewer window, folder browser dialogs, and automatic port hot-reload when config changes. The CLI reads config once at startup.
Find Your IP
# Windows
ipconfig # Look for "IPv4 Address"
# macOS
ipconfig getifaddr en0 # Or check System Settings > Network
# Linux
hostname -I # Or: ip a
- hls.js — JavaScript HLS client using Media Source Extensions. Apache License 2.0. See THIRD_PARTY_LICENSES.txt.