Ads
YouTube, JW Player and Video.js add a class to the player during ads; the extension polls for it every 400 ms. If you're in an ad, the other video waits. When both are done, both resume.
One of you creates a room and shares the code; the other joins with it. The video starts and pauses at the same moment on both sides. It works on any page with a video; it isn't tied to one service.
Waiting for the other side…
The extension generates an 8-character code, like k7mq2xw4. The letters l and o and the digits 0 and 1 are left out because they get confused.
The other person picks “Join a room” and types it in. A wrong code doesn't open an empty room; it says “No such room”.
Press the purple button over the video. After a 3-second countdown both sides start at the same moment, from the same second.
Every second each side reports its position. For a gap between 50 ms and 1 second, the side that's behind speeds up by 2 to 5 percent; you can't hear it.
Beyond 1 second it seeks. If one side buffers for more than 700 ms, the other pauses too; they resume together.
21:04:17.002 heartbeat drift=0.312 age=38
21:04:17.004 nudge-started drift=0.312 rate=1.031
21:04:18.001 heartbeat drift=0.281 age=41
21:04:19.003 heartbeat drift=0.250 age=39
21:04:20.998 nudge-rate drift=0.187 rate=1.020
21:04:30.412 nudge-ended
YouTube, JW Player and Video.js add a class to the player during ads; the extension polls for it every 400 ms. If you're in an ad, the other video waits. When both are done, both resume.
With the panel closed and the video in fullscreen, an incoming message shows at the bottom right of the video for 6 seconds. With the panel closed you also get a Chrome notification.
It hooks the page's video element, not a service. It finds players hidden inside shadow DOM too. If the host is on another page, the panel offers “Open the video”; sync waits until you're on the same page.