Installation Guide
Prerequisites
- Jellyfin Server 10.8.x or 10.9.x
- Docker and Docker Compose (recommended)
- Port 3000 available for the session server
- Admin access to Jellyfin
Quick Start (Docker)
The easiest way to run OpenWatchParty is with Docker Compose.
1. Clone the Repository
git clone https://github.com/mhbxyz/OpenWatchParty.git
cd OpenWatchParty
2. Start Services
make up
This starts:
- Jellyfin on
http://localhost:8096 - Session server on
http://localhost:3000
3. Enable the Client Script
- Log in to Jellyfin as an administrator
- Go to Dashboard > General
- Scroll to Custom HTML (Branding section)
- Add this line to the “Custom HTML body” field:
<script src="/web/plugins/openwatchparty/plugin.js"></script> - Click Save
- Hard refresh your browser (Ctrl+F5)
4. Configure the Plugin (Optional)
- Go to Dashboard > Plugins > OpenWatchParty
- Set a JWT Secret (min 32 characters) for authentication
- Click Save
Manual Installation
Session Server
Option A: Pre-built Image (Recommended)
Use the official image from GitHub Container Registry:
# Latest stable release
docker run -d \
--name owp-session \
-p 3000:3000 \
-e ALLOWED_ORIGINS="http://localhost:8096" \
ghcr.io/mhbxyz/openwatchparty-session-server:latest
# Or use a specific version
docker run -d \
--name owp-session \
-p 3000:3000 \
ghcr.io/mhbxyz/openwatchparty-session-server:v0.1.0
# Or use the beta (latest from main branch)
docker run -d \
--name owp-session \
-p 3000:3000 \
ghcr.io/mhbxyz/openwatchparty-session-server:beta
Option B: Build from Source (Docker)
# Build the image
docker build -t openwatchparty-session-server ./server
# Run the container
docker run -d \
--name owp-session \
-p 3000:3000 \
-e ALLOWED_ORIGINS="http://localhost:8096" \
openwatchparty-session-server
Option C: Build from Source (Native)
Requirements:
- Rust 1.83+
cd server
cargo build --release
./target/release/session-server
Jellyfin Plugin
Option A: Via Jellyfin Plugin Repository (Recommended)
Install directly from Jellyfin’s plugin interface:
- Go to Dashboard > Plugins > Repositories
- Click Add and enter:
https://mhbxyz.github.io/OpenWatchParty/jellyfin-plugin-repo/manifest.json - Go to Catalog tab
- Find OpenWatchParty and click Install
- Restart Jellyfin
- Enable the client script (see Quick Start step 3)
This method provides automatic update notifications when new versions are released.
Option B: Manual Download
-
Download the Plugin
Get the latest release from the releases page:
OpenWatchParty-vX.Y.Z.zip
-
Install to Jellyfin
Extract the zip to your Jellyfin plugins directory:
# Linux (Docker) unzip OpenWatchParty-v0.1.0.zip -d /tmp/owp docker cp /tmp/owp/. jellyfin:/config/plugins/OpenWatchParty/ # Linux (native) sudo unzip OpenWatchParty-v0.1.0.zip -d /var/lib/jellyfin/plugins/OpenWatchParty/ # Windows # Extract to: C:\ProgramData\Jellyfin\Server\plugins\OpenWatchParty\ -
Restart Jellyfin
# Docker docker restart jellyfin # Systemd sudo systemctl restart jellyfin -
Enable the Client Script
Follow step 3 from the Quick Start section above.
Verification
Check Session Server
# Check if server is running
curl http://localhost:3000/health
# Expected response: 200 OK with "OK"
Check Plugin
- Go to Dashboard > Plugins
- “OpenWatchParty” should appear in the plugin list
- Check the logs for startup messages:
[OpenWatchParty] JWT authentication is enabled.or
[OpenWatchParty] JwtSecret is not configured. Authentication is DISABLED.
Test the UI
- Open any video in Jellyfin
- Look for the Watch Party button (group icon) in the top header
- Click to open the panel
Environment Variables
Session Server
| Variable | Default | Description |
|---|---|---|
PORT |
3000 |
Server port |
HOST |
0.0.0.0 |
Bind address |
ALLOWED_ORIGINS |
* |
CORS allowed origins (comma-separated) |
JWT_SECRET |
(none) | JWT secret for authentication |
LOG_LEVEL |
info |
Logging level |
Example
docker run -d \
-p 3000:3000 \
-e ALLOWED_ORIGINS="https://jellyfin.example.com" \
-e JWT_SECRET="your-32-character-secret-key-here" \
-e LOG_LEVEL="debug" \
ghcr.io/mhbxyz/openwatchparty-session-server:latest
Firewall Configuration
Ensure these ports are accessible:
| Port | Service | Direction |
|---|---|---|
| 8096 | Jellyfin HTTP | Inbound |
| 8920 | Jellyfin HTTPS | Inbound (if using SSL) |
| 3000 | Session Server | Inbound |
UFW (Ubuntu)
sudo ufw allow 8096/tcp
sudo ufw allow 3000/tcp
firewalld (Fedora/CentOS)
sudo firewall-cmd --permanent --add-port=8096/tcp
sudo firewall-cmd --permanent --add-port=3000/tcp
sudo firewall-cmd --reload
Troubleshooting Installation
Plugin not appearing
- Ensure the DLL is in the correct plugins directory
- Check file permissions
- Restart Jellyfin completely
Script not loading
- Verify the Custom HTML entry is exactly correct
- Check browser console for errors (F12)
- Try a hard refresh (Ctrl+F5)
Cannot connect to session server
- Verify the server is running:
docker ps - Check firewall rules
- Verify the WebSocket URL in client
For more troubleshooting, see Troubleshooting Guide.
Next Steps
- Configuration - Configure options
- Security - Set up authentication
- Deployment - Production deployment