JSync

Watch Together. Stay in Sync. Anywhere.

Protocol v774 Open Source Cross-Platform

Download JSync

Requires Java 17 or higher

🖥️

JSync Server

Host watch parties. Manage rooms, sync, and chat.

Download Server

~3.6 MB • JAR File

👤

JSync Client

Connect & watch with friends. Controls VLC/MPV.

Download Client

~4.0 MB • JAR File

System Requirements

  • • Java 17+ (OpenJDK or Oracle)
  • • VLC Media Player or MPV
  • • Windows, macOS, or Linux

Features

🎬

Perfect Sync

Global Playback Clock ensures frame-perfect synchronization.

🌍

Global-Friendly

Lenient thresholds work across continents worldwide.

🎮

VLC & MPV

Works with popular media players via Lua/IPC.

💬

Built-in Chat

Colored usernames for easy conversation tracking.

🌙

Dark Theme

Beautiful Dracula theme, easy on the eyes.

🔒

Room System

Multiple rooms with ready-check system.

🛡️

Admin Controls

Kick, ban, user info, server chat.

🔧

No Port Forward

Works with ngrok or playit.gg.

Screenshots

JSync Client

JSync Client

Dark theme with colored usernames and activity chat

JSync Server

JSync Server

Admin panel with user management and room overview

Installation

1. Install Java 17+

Download from Adoptium or Oracle

Verify: java -version

2. Install VLC

Download from videolan.org

3. Run JSync

java -jar jsync-server.jar
java -jar jsync-client.jar

Usage Guide

🖥️ Hosting a Watch Party

  1. 1. Run java -jar jsync-server.jar
  2. 2. Click "Start Server" (default port: 1389)
  3. 3. Share your IP with friends
  4. 4. Monitor users from admin panel

External Access (No Port Forwarding)

ngrok tcp 1389

👤 Joining a Watch Party

  1. 1. Run java -jar jsync-client.jar
  2. 2. Enter server address, port, username, room name
  3. 3. Click "Connect" - VLC will auto-start
  4. 4. Open the same video file as friends
  5. 5. Click "Ready" when ready to watch
  6. 6. When all ready - playback syncs automatically!

🎮 Playback Controls

⏯️

Play/Pause

Syncs to all users

⏪⏩

Seek ±10s

Jump synced

Ready

Toggle ready state

Synchronization

Designed for worldwide watch parties

Drift Action Description
0-5 sec✅ NoneIn sync
5-10 sec📝 LogDebug only
10-30 sec⚠️ WarnUser notified
30+ sec🔧 ResyncForce seek

Protocol Specification

JSP (JSync Protocol) v774

Packet Structure

┌────────────────┬──────────────────┬─────────────────┐
│ Length (VarInt) │ Packet ID (VarInt) │ Payload (bytes) │
└────────────────┴──────────────────┴─────────────────┘

Connection States

0 HANDSHAKE
1 STATUS
2 LOBBY
3 WATCH

Client → Server Packets

ID Name Payload
0x00Handshakeversion, username, room, state
0x01SetFilefilename, duration, size
0x02SetReadyready (bool)
0x10StateChangeplay_state (0/1)
0x11Seekposition_ms
0x13PositionReportposition_ms

Server → Client Packets

ID Name Payload
0x00LobbyUpdateuser_count, [user_data...]
0x02Notificationmessage
0x03StartWatchexecute_at
0x10SyncCommandstate, pos, execute_at, speed

For Developers

Project Structure

jsync/
├── jsync-server/
│   └── src/main/java/com/jsync/
│       ├── server/          # Server logic
│       │   ├── JSyncServer.java
│       │   ├── ClientHandler.java
│       │   ├── Room.java
│       │   └── SyncSettings.java
│       └── protocol/        # Protocol impl
│
├── jsync-client/
│   └── src/main/java/com/jsync/
│       ├── client/          # Client GUI
│       └── player/          # VLC/MPV integration
│           ├── VlcPlayer.java
│           └── MpvPlayer.java
│
└── lua/
    └── jsync.lua            # VLC Lua interface

Build from Source

cd jsync-server && gradle shadowJar
cd jsync-client && gradle shadowJar