A FULLY synchronized non-coder friendly HTML5 video player originally for Minecraft's WebDisplays mod using Node.js and Socket.IO. This project allows all players to view the same video in perfect sync including play, pause, and seek actions and more across connected clients.
Frequently Asked Questions: FAQ
these are auto-installed with console.ps1/run.bat so you don't have it install it yourself
- Node.js installed on your machine (v20.6.0+ required for config to work)
- Docker installed on your machine if you're using Docker Compose Method
- Follow of the Hosting Methods
- Media files placed in the
/media/folder (supports MP3, MP4, .MKV, .AVI, .MOV, .WMV, .WEBM, .PNG, .JPG, .WEBP, embeds and more)
- Frame-perfect sync — play, pause, seek, and speed changes are broadcast to all viewers instantly
- Both-Side Local Synchronized Stream (BSL-S²) — if a viewer has the same file locally, they play it from their own disk in sync instead of streaming from the server
- Multi-room server mode — run multiple independent watch party rooms simultaneously with a shared landing page
- Playlist with sequential autoplay and automatic video preloading for smooth transitions
- In-browser FFmpeg tools — remux, re-encode, extract audio and subtitle tracks, and generate thumbnails without touching the CLI (no wasm ran on server)
- Dynamic audio and subtitle track switching — supports
.ass(via jassub or wsr) and.vttmid-playback - Admin fingerprint lock — ties admin access to the first browser that connects, preventing unauthorized panel access
- Join behaviors — choose whether new viewers sync to the current position or restart from the beginning
- Client remembering — display names persist across reconnections
- Configurable volume ceiling — let viewers boost volume well beyond 100%
- Toggleable chat with server-side sanitization
- HTTP/HTTPS support with self-signed cert generation scripts and Tailscale certificate auto-detection
- Security hardened — CSRF protection, rate limiting, HTTP security headers via Helmet, and a honeypot on the FFmpeg auth endpoint
- Responsive admin panel with a dedicated mobile layout and glassmorphism UI
- Broad media support — MP4, MKV, AVI, MOV, WMV, WEBM, MP3, images, and embedded streams (YouTube, Twitch, Vimeo, SoundCloud, Dailymotion)
| Zone | Action | Sync Behavior |
|---|---|---|
| Left Edge (≤ 87px) | ⏪ Rewind 5 seconds | ✅ Synced |
| Right Edge (≥ screen width − 87px) | ⏩ Skip forward 5 seconds | ✅ Synced |
| Center (±75px from center) | ✅ Synced | |
| Between Left Edge and Center | 🔉 Decrease volume (5%) | ❌ Local only |
| Between Center and Right Edge | 🔊 Increase volume (5%) | ❌ Local only |
There are also 2 chat commands called /fullscreen and /rename, they work as the name implies
Of course use Left Click if you're not in minecraft while using this
-
Playlist creation and management
-
Remote play/pause/skip/seek controls to eliminate desync
-
Main video selection with custom start time
-
File browser for media management
-
FFmpeg generated thumbnail for video from the first third of the video
-
Tab to use various ffmpeg tools
Note
All users will see the same video with the same attributes except for volume, which is controlled individually per client.
By default, the console.ps1 script will automatically:
- Check if a Windows Firewall rule exists for your configured
PORT(default 3000). - If missing, it will restart the script as Administrator to add the rule.
To disable this behavior (e.g., if you manage firewall rules manually), add the following to your config.env:
SYNC_SKIP_FIREWALL_CHECK=true/media/ # Folder containing media files
/memory/ # Folder containing fingerprints, logs, etc.
/res/ # Folder containing the app’s runtime files, server, web pages, dependencies, and launch/helper scripts.
/cert/ # Folder containing the SSL generation scripts for HTTPS, the generated SSLs are also stored there.
/res/lib/ # Folder containing the modular Node.js backend components (config, security, memory, etc.)
server.js # Node.js backend entrypoint
index.html # Client video player interface
admin.html # Admin control panel
landing.html # Page to join rooms, exclusive to server mode
package.json # Node.js dependencies, scripts and other metadata
launcher.vbs # Small script that re-opens the server in Terminal if opened in CMD
console.ps1 # Script that verifies dependencies, initializes settings, and keeps the server running with error recovery.
run.bat # Windows startup script
start.sh # Linux startup script
config.env # Configuration file, this is plain text (port, settings, etc.)
legacylauncher.bat # Old startup script that is not updated but reliable, written in batch
postinstall.js # Fixes, bundling and whatnot after npm install
generate-ssl.bat/sh # Generates ssl for https usage, may give not trusted warn since this is self signed
subtitles.js # wsr code
Edit config.env to customize:
SYNC_PORT=3000 # Server port (1024-49151)
SYNC_VOLUME_STEP=5 # Volume adjustment percentage
SYNC_SKIP_SECONDS=5 # Skip duration in seconds
SYNC_JOIN_MODE=sync # Decides what happens when a new user joins the watch party
SYNC_USE_HTTPS=true # Whether you want to use HTTPS or not, but you also need cert and key files
SYNC_BSL_MODE=any # Changing requirements of BSL-S² to if all clients should have file or not
SYNC_VIDEO_AUTOPLAY=false # Auto-play videos when loaded
SYNC_ADMIN_FINGERPRINT_LOCK=false # Generates a fingerprint from first machine to access /admin to not let others reach it
SYNC_BSL_ADVANCED_MATCH=true # Whether or not BSL-S² should use Advanced match to check if 2 given videos are the same
SYNC_BSL_MATCH_THRESHOLD=1 # How many criterias should advanced match check
SYNC_SKIP_INTRO_SECONDS=87 # How many seconds the "Skip Intro" button jumps forward
SYNC_CLIENT_CONTROLS_DISABLED=false# If controls of clients should be disabled
SYNC_CLIENT_SYNC_DISABLED=false # If clients should keep control of their own video but should not send those controls to server
SYNC_CHAT_ENABLED=true # Yeah
SYNC_DATA_HYDRATION=true # When enabled, the server injects initial data into admin.html to save a round-trip
SYNC_MAX_VOLUME=400 # How much should clients be able to crank the volume up to
SYNC_SUBTITLE_RENDERER=jassub # Which subtitle renderer should be used to render .ass subtitles
SYNC_FFMPEG_DISABLE_BAN=false # When tools password is typed incorrectly, honeypots until next refresh instead of banning
SYNC_FFMPEG_DISABLE_CONSEQUENCES=false # Whether honeypotting and banning an admin should happen after a failed login
SYNC_FFMPEG_TOOLS_PASSWORD= # The password to ffmpeg tools tab, is encrypted with SHA-256 onto RAM
SYNC_PLAYER_KEY= # Encryption key, is optional and disabled by default
SYNC_SUBTITLE_FIT=bottom # Stretch = Canvas fills screen/Bottom = Same video aspect ratio but pinned to bottom
SYNC_SHOW_SSL_TIP=false # Whether or not to show a tip that says there are SSL generation scripts in /cert
SYNC_SKIP_FIREWALL_CHECK=false # See firewall warning aboveShort name: AGPL-3.0-or-later
URL: gnu.org/licenses/agpl-3.0.html
This project is licensed under AGPLv3:
- Free to use and modify
- Must credit the original creator (Lakunake)
- Must share any changes with the same license if distributed or hosted publicly
See LICENSE for more details.
See Documents Folder for Privacy Policy and Terms of Service
Created by Lakunake Built using Node.js and many node modules
Contact: johnwebdisplay@gmail.com (Obviously not my real name)
