This chrome extension allows multi-user sync streaming video in a fast, simple and stable way.
[![Chrome web store users][chrome-image]][chrome-url]
Sync Sofa is a full stack web extension support a easy-to-use and stable way to synchronize streaming playback for multiple users. It can improve the experience when users from different locations want to share a video/movie remotely. Currently, the feartures include:
Add to Chrome buttonAdd extensionsync_sofa.[version].crx, [version] is the number of the latest version chrome://extensions/ in your ChromeDeveloper mode (in the top right corner)sync_sofa.[version].crx into the chrome://extensions/ pageAdd extensionNotices: If the extension is disabled by Chrome, try Install from chrome web store or Install from unpackaged folder.
This extension is not listed in the Chrome Web Store and may have been added without your knowledge.
.zip file you downloadedchrome://extensions/ in your ChromeDeveloper mode (in the top right corner)Load unpacked (in the top left corner)[download_path]/[unzip folder]/client/chrome_extensionselectGet button😊 This part is optional, we have already set default options for you, if you are not interested, please skip to next part.
There are two ways to visit options page.
Sync Sofa extension, choose Options.Sync Sofa extension, choose Setting icon in popup page.Your webpage should be like this:

⚠️ Before use, please make sure the version number of two clients are consistent.
⚠️ If you want to play local .mp4 file, please enable Allow access to file URLs in extension details page, for example, chrome://extensions/?id=djhbgkadejdmihbngglpnogjookpadjl in Chrome.
⚠️ If there are multiple versions of extensions in your browser, please enable one and disable others.
You two don't have to open the same webpage, you play the video via local .mp4 file and your partner watch it one some video websites, is ok as long as you both watch the same video actually (source providers are different).
In this doc, for example, User A will watch the video on Bilibili and User B will do it on Youtube. Here is the webpage:

If there are any ads before the video, watch them before the next step.
Click the Sync Sofa extension and then click REQUEST NEW CODE button.

If nothing goes wrong you will receive a message like Room created and room code copied to clipboard, and the room code has been copied to your clipboard, send it to your partner.
Your partner receives the room code, click the Sync Sofa extension, paste it in the input area and click START button.


Now you can play the video, your operations will be synced to your partner. Enjoy yourselves!
If you and your partner play video via VLC media player, Sync Sofa can also synchronize your operations.
First we need to enable controlling VLC via our browser, here is the official documentation:
Open VLC media player
Tools → Preferences (select "All" radio-button) → Interface → Main interfaces, check "Web"

Tools → Preferences (select "All" radio-button) → Interface → Main interfaces → Lua, set Lua HTTP - Password

Save and reopen VLC media playerYour webpage should be like this:

Open http://127.0.0.1:8080/, click the Sync Sofa extension and then click REQUEST NEW CODE button.
If nothing goes wrong you will receive a message like Room created and room code copied to clipboard, and the room code has been copied to your clipboard, send it to your partner.
Your partner receives the room code, click the Sync Sofa extension, paste it in the input area and click START button.
Now you can play the video, your operations will be synced to your partner. Enjoy yourselves!
Notice:
⚠️ Keep your browser open and http://127.0.0.1:8080/ itself.
After your video is finished, please click STOP button on Sync Sofa extension manually or just close http://127.0.0.1:8080/.
Notices:
⚠️ Before hosting, make sure your server can communicate securely with HTTPS and link to an domain name. All deploy script are based on Let's Encrypt certificates, you can customize with your own SSL certificate providers.
1. Get binary executable file
If you want to alter the source code and build yourself, make sure you have golang environment in your server, then run script below to get and build binary file:
shell=
go get github.com/LouisYLWang/Sync-Sofa/server
cd $GOPATH/src/github.com/LouisYLWang/Sync-Sofa/server
go install
cd $GOPATH/bin
If you want to only deploy the binary file:
server binary file for linux serverconfig.json file to the same directory of binary file2. In the directory of binary file, adjust config file base on your need:
Config file variables:
addr: port of serverrunmode:tlsdir: TLS certificate paths tlskey: TLS certificate privatekey path tlscert: TLS certification pathfeedbackservice: an add-on for feedback notificationsmtpserverhost: feedback mail server hostsmtpserverport: feedback mail server port feedbackemailaddr: feedback mail sender address (without @your-mail.host)feedbackemailpswd: feedback mail sender password recipients: a list of feedback receivers mail address (with @your-mail.host)Notices: addr, runmode are mandatory, tlskey, tlscert are required for TLS connection
example config file:
```json=
{
"addr": ":443",
"runmode": "prod",
"tlsdir": {
"tlskey": "/etc/letsencrypt/live/your.host.url/privkey.pem",
"tlscert": "/etc/letsencrypt/live/your.host.url/fullchain.pem"
},
"feedbackservice":{
"smtpserverhost": "smtp.gmail.com",
"smtpserverport": "578",
"feedbackemailaddr": "sender_mail_name",
"feedbackemailpswd": "password",
"recipients":[
"receiver1_mail_name@mail.host",
"receiver2_mail_name@mail.host"
]
}
}
**3. Run `./server` to delopy the server, deployment is successful if you see:**
found config file, read parameters from config file... server is listening at {your_port_number}...
### With Docker
Make sure docker service is runing on your server, make change to the script blow and run:
```sh
docker pull louisylwang/watchtogether
docker run -d \
-p {your docker internal port}:{your external port} \
-v /etc/letsencrypt:/etc/letsencrypt:ro \ #if you use letsencrypt
-e ADDR=:{your port} \
-e TLSKEY={your tlskey name} \
-e TLSCERT={your tlscert name} \
-e SMTPSERVERHOST= {feedback mail server host} \
-e SMTPSERVERPORT= {feedback mail server port} \
-e FEEDBACKEMAILADDR= {feedback mail sender address} \
-e FEEDBACKEMAILPSWD= {feedback mail sender password} \
-e RUNMODE={"prod"/"dev"} \
-e RECIPIENTS= {a string with all targeted email address, separate by ",". exp: "rec1@mail.addr, rec2@mail.addr"}
--name {your docker image name} louisylwang/watchtogether
--restart=always
Improve stability
Test for a new logic to avoid infinite echo back (each party repeat the last operation of other party) : introduce a queue as a buffer of operation and if the operations is beyond frequency threshold, the client will automatically to halt and cool down for sometime.
Add support for edge browser (beta)
Now user will get notification when they successfully connected to each other Improve stability, better sync performance Change the notification UI using sweetalert
improve stability & UX logic Added support of following websites: - iqiyi - youku - weiyun - tencent video
Fixed the support of duonao live; Removed the support of 91mjw (temporarily); Refined documentation, will add more detail in next verison;
Add support of play process bar control sync Fixed the issue that when syncing playing time, there is the possibility to crash the extension
Add support of 2 parties
$ claude mcp add Sync-Sofa \
-- python -m otcore.mcp_server <graph>