# Coplay: one playback clock for two browsers

> Coplay is a browser extension that pairs two browsers with PeerJS and WebRTC so two people watching the same web video can pause, seek and restart in lockstep. It handles a niche problem cleanly, but it depends on a public signaling service and a fixed site list.

**Justineo/coplay** — Synchronizing video play between two peers.

- Repository: https://github.com/Justineo/coplay
- Stars: 764 · Forks: 109
- Language: JavaScript
- License: MIT
- Published: 2026-10-21 · Updated: 2026-10-21 · Language: en
- Canonical page: https://hysenlabs.com/projects/justineo-coplay

## Two browsers on the same page, driven by one person

Coplay exists for a narrow situation: two people watching the same web video who want the two players to behave as one. The README describes the goal in a single line, "Synchronizing video play between two peers." In practice, when two browsers are playing the same web video, Coplay connects them with WebRTC using PeerJS and lets users control two video players synchronously. The person hosting the call can press pause and the other browser pauses with them.

This is not a video streaming product and not a screen sharing tool. It does not move the video between machines, it does not store anything, and it does not need an account. The video already loads independently in each browser from the site itself. What Coplay adds is a control channel between the two players and, over HTTPS, a peer to peer video call so the two watchers can talk while watching.

The audience is therefore people who already share a viewing experience online, such as two friends watching the same clip or a course. If you want to stream to someone rather than let them open the same page, Coplay is the wrong shape of tool, since the remote side still needs the site and a supported player.

## PeerJS negotiates, WebRTC carries the call

The connection has two distinct parts. PeerJS provides the signaling layer that lets the two browsers find each other, and WebRTC supplies the media path for the video chat. The extension's own documentation is explicit about the division, and the FAQ section gives the clearest symptom of it: YouTube runs over HTTPS, but PeerJS, the service Coplay relies on, makes some HTTP requests, and browsers block those under their security policies.

Peer identity is the user facing part of this. Coplay displays a peer ID, one user reads it out, the other enters it, and the connection forms. Nothing about that exchange is serverless, because a signaling request has to reach a service before the browsers can talk directly to each other. The repository lists topics of browser-extension, peerjs, video and webrtc, which matches that layering, and the top level of the project holds a src directory, a dist directory, an extensions directory and an assets directory, the usual shape for an extension that is built into bundles and then wrapped for each browser.

Because signaling depends on a reachable PeerJS service, the extension treats the server address as a setting rather than a constant. That choice is what makes the HTTPS problem fixable without changing browsers.

## Seven buttons on the control bar, including video chat

The control bar is the whole interface. The README lists the buttons on the control bar as connect, play, pause, sync, restart, fullscreen and video chat. Connect brings up the peer ID exchange, play and pause drive the transport, sync appears to be the catch up action after one side drifts, restart returns both players to the beginning, fullscreen is local, and video chat opens the peer to peer call.

The split between local and shared actions matters more than the button count. Fullscreen only affects the browser you are looking at, while play, pause, restart and sync affect the other participant as well. Once the connection is up, the documentation says both users can perform pause, resume, seek, restart and sync actions, so neither side is a pure viewer. Seek and resume are named here even though the button list shows only play and pause, which suggests that seeking is also driven from the bar rather than through a separate panel.

The video chat button is the odd one out, because it is not synchronization at all. It is a media call layered on top of the synchronized playback, and it carries a hardware caveat that the documentation flags plainly.

## Installing from the two extension stores

Coplay ships as a browser extension, so installation happens in the browser rather than from a package registry. There is no build step for a user to run, and the extension does not need to be compiled from source to be useful. The Chrome path is the Chrome Web Store listing, and the Firefox path is the Firefox Add-ons listing.

The first use follows a simple sequence. Both browsers visit the same video page, each activates Coplay, and one user enters the other user's peer ID to connect. After the connection is established, both users can perform pause, resume, seek, restart and sync actions. Nothing in the flow asks for an account, an email address or a payment method, so the setup cost for a viewer is the time it takes to open two pages and read a peer ID across.

For maintainers, the source tree is plain JavaScript. The package manifest lists version 0.6.0 under the name coplay, with a gulp based toolchain in devDependencies: gulp, gulp-rename, gulp-replace, gulp-svgo and gulp-uglify, plus datauri for inlining assets. The repository root also holds a Gulpfile.js and a CHANGELOG.md, so a local build is a gulp invocation rather than a bespoke script. The declared license is MIT.

## The peer ID that will not show up on an HTTPS page

This is Coplay's sharpest edge. The FAQ entry asks why the peer ID does not show up on YouTube, and the answer is not a Coplay bug in the ordinary sense. YouTube uses HTTPS, while PeerJS makes some HTTP requests, and browsers block those requests under their security policies. The symptom is a missing peer ID, which a first time user will often misread as a broken extension.

There are two documented ways out. First, enable the default HTTPS server in the options, which routes the PeerJS service over HTTPS so that no insecure request is attempted on a secure page. Second, set up a custom PeerJS server with HTTPS support and point the extension at it. The options list supports both: an option to enable the default HTTPS server, an option to specify a custom PeerJS server, and a Key field for an additional auth key on that custom server if one is required.

The trade-off is real. The default HTTPS service is the zero configuration path, and it also means the connection metadata passes through a service the project does not host. A custom server removes the third party from the signaling path but moves the operational burden to whoever runs it, including keeping it on HTTPS and handling the auth key.

## Video chat without acoustic echo cancellation

The video chat feature has a limitation the documentation states rather than hides. It works on HTTPS sites, since that is where browsers allow the WebRTC media path to behave normally. The warning that follows is that you might need to put your headphones on while video chatting, because Coplay has no AEC (acoustic echo cancellation) support.

The practical effect is that two people on speakers will hear their own voice returned from the other end, which turns a shared viewing session into a feedback loop. The README even marks the AEC line as a request for help, so this reads as a known gap rather than a settled limitation. Since there is no code path in the extension for echo suppression, the workaround is physical: headphones on both sides.

That is worth weighing against the fact that chat is a secondary feature layered on synchronization. If two people are going to talk over a video anyway, using a separate call application avoids the echo problem entirely. The cost of Coplay's approach is that the call and the playback share one peer connection path and one extension button set.

## Two independent streams, not one shared picture

It is worth being precise about what Coplay synchronizes. Both browsers load the video from the site on their own, so there are two independent playback pipelines. Coplay coordinates their timing rather than relaying pixels between them. This is a different architecture from screen sharing, where one machine captures its display and sends that captured stream to the other participant, which then has no second copy of the media and no separate player to nudge.

The difference shows up in what each approach can do. Because Coplay controls two real players, both sides keep the site's own player interface, and actions such as fullscreen, restart and sync apply to a genuine player rather than to a mirrored screen. The cost is that the remote side must already have the page open on a supported site and must be able to reach the site itself, plus the signaling service. A shared picture has no such requirement, but it also cannot hand the remote viewer a native player.

For Coplay, the practical constraint is the supported site list. The README names Youku, Sohu TV, Tencent Video, Tudou, iQiyi, YouTube, AcFun, bilibili, LETV and Vimeo. A site outside that list is outside the extension's working set, and the Auto-activate option only fires when Coplay detects supported video players on applicable sites.

## Commits in 2026 with no release since 2016

The maintenance picture needs two different dates read together. The last push was on 2026-10-15, so the repository is not archived and work is landing on the default branch as of that date. The recent release list, however, stops at version 0.0.4 from 2016-07-06, with v0.0.1 from 2014-12-25 before it. The package manifest meanwhile sits at version 0.6.0, so the version in the build file has moved well past the last published release.

Read that combination carefully rather than calling the project either abandoned or briskly released. Commits are recent, but no tagged release has shipped since 2016, and the README does not document a release process, a changelog cadence or a version policy. The CHANGELOG.md file at the repository root is the only artifact that might track this, and its contents are not visible here.

For an evaluator, the practical question is where an installation comes from. The documented install path is the Chrome Web Store and Firefox Add-ons listings, which means users get whatever the store build contains, not a package published from the version number in the manifest. The README also does not document rollback, so a bad extension update in either store is not something the project describes a way out of.

## Conclusion

Coplay suits a narrow case: two people already watching the same page on a supported site who want one person to drive playback for both. It is a poor fit for cross-site or DRM-protected streaming, for any site outside the listed ten, and for anyone unwilling to depend on the default PeerJS service. Before installing, check that your site is one of the ten named, decide whether the default HTTPS PeerJS service is acceptable or whether you need a custom server, and confirm both sides can exchange peer IDs under the browser's mixed content rules.

## FAQ

### What does the Coplay browser extension actually do?

It connects two browsers that are playing the same web video over WebRTC using PeerJS, then lets both users run pause, resume, seek, restart and sync actions on the two players. On HTTPS sites it also adds a peer to peer video chat.

### Why does Coplay not show a peer ID on YouTube?

YouTube uses HTTPS while PeerJS makes some HTTP requests, and browsers block those under their security policies. The documented fixes are enabling the default HTTPS server in the options or pointing Coplay at a custom PeerJS server with HTTPS support.

### Which sites does Coplay support, and can it be activated automatically?

The README names Youku, Sohu TV, Tencent Video, Tudou, iQiyi, YouTube, AcFun, bilibili, LETV and Vimeo. The Auto-activate option makes the extension activate itself when it detects supported video players on applicable sites.

### Does Coplay's video chat have any known quality problems?

Yes, there is no AEC (acoustic echo cancellation) support, so the documentation advises putting on headphones while video chatting. The README marks that limitation as a point where help is needed.

### How do I install Coplay, and is there a build step for users?

Users install it from the Chrome Web Store or Firefox Add-ons listing, with no build step. Developers working from source use the gulp toolchain listed in the package manifest, which names gulp, gulp-rename, gulp-replace, gulp-svgo, gulp-uglify and datauri.

## Sources

- [Issues](https://github.com/Justineo/coplay/issues)
- [Justineo/coplay on GitHub](https://github.com/Justineo/coplay)
- [License: MIT](https://github.com/Justineo/coplay/blob/master/LICENSE)
- [README](https://github.com/Justineo/coplay/blob/master/README.md)
- [Releases](https://github.com/Justineo/coplay/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/justineo-coplay
