v1.5.1

Fixed

  • People stop "leaving" the room while they're sitting right there: if a friend was still getting their video ready, or their player got busy for a moment, junto could decide they'd left and announce it to everyone. They were fine the whole time, and you'd see them "leave" and rejoin over and over. Presence is now tracked separately from the player, so a friend counts as present as long as they're actually connected. Their messages also show their name again instead of a string of letters and numbers.
  • If the host disappears, the party keeps going: when the person sharing the file quit partway through, anyone watching from a live stream got no warning and nobody took over, so playback just stopped at the edge of what had downloaded. Now the room notices, says so, and a friend who already has the whole file steps in as the new host.
  • Pause and seek stick: hitting pause could occasionally undo itself a second later if your player happened to be slow right then. Whether it worked was basically a coin flip, decided by something you can't see. Now it lands.
  • Removing someone actually removes them: a kicked friend could walk back into the room by doing nothing in particular, still counted in the "waiting for everyone" tally so the movie couldn't start, and kept taking your upload. Kicking now covers all of it.
  • Everyone shares while they're still loading: people waiting for their own buffer to fill now help feed everyone else, instead of the whole room pulling from the host at once during the busiest stretch.
  • You can see what changed without leaving fullscreen: when someone switches the audio or subtitle track, changes speed, or jumps to another file, it now shows up on the video itself, not only in the terminal. No more wondering why the movie is suddenly in German.
  • Smaller things: /unignore is listed with the other commands now (it always worked, it was just a well-kept secret), the host limits how many transfers it runs at once, the direct-or-relayed label reflects what's really happening, and junto no longer crashes at startup if you wrote a custom relay address in a slightly unusual way.

v1.5.0

Changed

  • Playback starts a little sooner: when you connect to a friend, junto used to map out every possible route to them before sending a single byte. Now it goes with the first route that works and keeps looking in the background, so the movie gets going faster. Friends on older versions still connect the old way, so a mixed room is fine.

Security

  • Picked up the latest upstream security fixes: the automatic scan that runs on every release flagged a couple of known issues in the open-source libraries junto is built on, so this release moves to their patched versions. Nothing changes in how junto works, it's just current.

v1.4.0

Added

  • Whoever's about to freeze gets served first: when the host is feeding several friends at once, it now pays attention to who's running low on buffer instead of splitting its upload evenly. A friend who's comfortably ahead eases off for a moment so the one on the edge of stalling gets the bytes first. Since the whole room pauses whenever any one person stalls, keeping the shakiest connection fed means fewer pauses for everybody. It only matters when a few people are streaming at once, and it never starves anyone.
  • A proper live interface in your terminal: on a real terminal, junto now draws a clean, redrawn screen instead of plain scrolling text. A little banner up top, a room panel with your code and join link, and a live party panel showing everyone who's in, where they are in the movie, and how far their download has gotten, each with a small dot for ready, buffering, or falling behind. Chat and notices scroll below, and your own name stands out so you can find yourself at a glance. It turns on by itself when you're on a terminal; piping junto's output into a script or log stays plain text, and you can force plain output any time.
  • Friends now stream from each other, not just the host: until now, every streaming joiner pulled the file from the host alone, so the host's upload speed set the pace for the whole room. Joiners now also fetch from anyone who has the bytes: friends mid-download, friends who brought the file along, or someone whose download already finished. Adding more people no longer means a slower stream, it means more sources.
  • Every piece of video is verified the moment it arrives: junto used to check a file's fingerprint only after the whole download finished, which could be an hour into the movie, and even then it could only warn you. Now every small chunk is checked against the host's announced fingerprint (BLAKE3) before it's played or written to disk, whichever friend it came from. A corrupt or misbehaving source is caught on the first bad chunk and dropped, and your playback never sees those bytes.
  • A room can finish the movie without the host: if the host vanishes mid-download, the remaining watchers keep fetching what the room collectively has from each other, and a friend whose own download already finished can take over as host so late joiners still get in. Previously the room could only recover if someone had brought the complete file with them.

Changed

  • Bigger swarms share more evenly: when lots of friends are pulling spare parts of the file from each other, they now spread out across different parts instead of everyone reaching for the same one, so a big group shares the load better.
  • Old and new versions still watch together: rooms made by an older junto work exactly as they always have, and someone on an older version joining a new room streams the way they always did. Nobody gets locked out of movie night over a version bump.

v1.3.1

Fixed

  • macOS stops blocking junto on first launch: junto's releases aren't Apple-notarized yet, so Gatekeeper used to refuse to open a freshly downloaded binary at all ("Apple could not verify 'junto' is free of malware"). Now both the one-line installer and the Homebrew cask clear that flag for you automatically, right after the checksum has confirmed the download is genuine. A .pkg or manual download still needs the one-time xattr -d com.apple.quarantine step, documented in the README.
  • The install one-liner works when you paste it verbatim: the command was shown as curl junto.watch/install | sh, which quietly used http and choked on the redirect to https (it printed "Redirecting..." into your shell). It's now curl -fsSL https://junto.watch/install | sh.

v1.3.0

Added

  • Disk-space preflight at join: joining a streaming room now warns right away if the playlist is bigger than the free space in your download folder, instead of finding out via a failed write hours into a transfer. It's a heads-up, not a hard stop, the same as the existing warning for local-file joiners whose copy doesn't match the room.
  • Smarter streaming cushion, plus slow-connection and host-capacity warnings: for mp4/mov files, junto now works out the file's real bitrate and sizes the "ready to play" cushion to match it, so a high-bitrate remux gets a real buffer instead of the same small fixed cushion as everything else. On top of that, junto can now warn you upfront if your connection looks too slow for the file, instead of you finding out via stuttering, and warn a host if their upload can't keep every streaming friend fed. Other file types are unaffected.

Changed

  • Homebrew now installs via cask: brew install swayam-mishra/tap/junto is now brew install --cask swayam-mishra/tap/junto (Homebrew is deprecating the old formula path upstream). brew upgrade still works the same either way; if you installed with the old command, reinstall with the new one.

Fixed

  • The one-line installer works on Linux and non-Homebrew Mac again: curl junto.watch/install | sh was building the wrong download link for every platform except Homebrew macOS, so the install failed outright for most people. That's fixed, along with several more edge cases: a download cut short mid-script can no longer run a partial install, a GitHub rate limit now shows a clear message instead of a confusing one, a missing /usr/local/bin on a fresh machine gets created instead of failing the install, and the double-click macOS installer's mpv step no longer silently fails when it can't run as root.
  • Stuck drift correction: the small, automatic speed nudge junto uses to smooth over tiny sync drift could occasionally get stuck on one person, leaving them playing up to 3% too fast indefinitely while everyone else kept chasing them to catch up. Nudges now always clear themselves after a short window.
  • A brief hiccup no longer resets everyone to the start: if junto briefly failed to read the playback position right after a pause, seek, or track switch, it could broadcast "we're at 0:00" to the whole room by mistake, snapping every friend back to the beginning. That broadcast is now skipped when the read fails, so a passing glitch stays local instead of resetting the party.
  • Streaming no longer stalls at a fixed point in every file: the part of junto deciding how far ahead to download wasn't actually keeping up with where you'd gotten to in playback, so downloading could stop too early and force a stall, once per file and again after every seek. It now tracks your real position continuously, so downloading keeps pace with watching.
  • Fixed a seek that could get lost mid-download: jumping to a new spot in the timeline while a large chunk was already downloading could occasionally get ignored, leaving playback stuck until that unrelated chunk finished on its own. Seeks are now applied the moment they happen.
  • Telemetry now actually sends: the anonymous opt-in usage ping was supposed to fire on create/join, but a timing bug meant it almost always got cut off before it left your machine. Essentially no pings were arriving; they do now.
  • Fixed a gap in the streaming readiness check: a streaming joiner's buffer cushion was correctly tracked internally, but the "I'm ready" signal sent to the host didn't wait for it, so the host could start the room before a joiner had actually buffered enough, causing exactly the stall the readiness check exists to prevent. The signal now only fires once the cushion is really there.
  • Fixed a playlist jump that could freeze the whole session: skipping ahead to a later file while an earlier one was still downloading could leave junto waiting forever on a file nobody needed anymore, hanging the room with no error. junto now finishes that earlier download as a priority instead of getting stuck.
  • junto update/junto uninstall now recognize a Homebrew-cask install: they previously only recognized Homebrew's old formula path, so a cask install (see the Homebrew change above) could have been mistaken for a standalone binary and had a Homebrew-managed file replaced or deleted directly instead of leaving it to brew. Both install paths are now recognized correctly.
  • Fixed a kicked peer being able to retaliate: a peer who was kicked couldn't affect chat or playback anymore, but could still kick other people in turn, letting a removed troublemaker kick their way through the rest of the room. Kicks from an already-kicked peer are now ignored too.
  • A relay outage, or a friend reconnecting after a brief network blip, no longer risks freezing the room or causing repeat hard seeks: a sustained relay outage could stall every sync action for several seconds at a time, and a peer who dropped and rejoined could lose track of their clock sync, causing them to be hard-seeked over and over. Both are fixed.
  • The built-in relay fallback no longer quietly stops working partway through a session: its temporary access credentials were fetched once and never refreshed, so a slow start could disable it for the whole session, and long sessions could end up using expired credentials. Credentials are now fetched fresh whenever they're actually needed.
  • A brief, ordinary connection flap between two friends no longer forces a full reconnect: junto used to treat a momentary hiccup, the kind that normally clears itself in about a second, exactly like a real failure, tearing down and rebuilding the whole connection. It now waits a beat to see if it clears up on its own first.
  • Fixed a seek near the start of a large file downloading the rest of it all at once: instead of fetching a reasonable amount ahead of where you jumped to, it could pull the entire remainder of the file in one uninterruptible burst.
  • Fixed two similarly-named files (like a movie and its extended cut) confusing subtitle matching: a subtitle file meant for one could attach to both, aborting the room with a confusing duplicate-file error.
  • A dropped host could strand a joiner permanently: when the host disappeared and a friend promoted themselves to replace them, that announcement went out exactly once; a joiner who missed it could wait on the dead host forever with no way to recover. The announcement now repeats until it's clearly been received.
  • A handful of smaller fixes from a full code review: junto no longer spins at 100% CPU in a rare case, junto doctor now shows each check's result as it finishes instead of waiting for all of them, junto create checks that mpv is installed before spending time downloading a URL, fetching a video's info from a slow or unresponsive site no longer hangs indefinitely, a joiner whose download fails outright no longer gets stuck showing as "not ready" for the rest of the session, and a few config file mistakes (an inline comment, an escaped quote, a repeated setting) that used to silently produce the wrong value are now reported as clear errors.

Security

  • A stuck or misbehaving peer could no longer freeze the whole room indefinitely: the buffering pause that waits for a slow download to catch up had no time limit, so one peer, stuck or deliberately holding the room hostage, could block everyone else forever with no way out but a manual /kick. The room now automatically carries on without that peer after 20 seconds (the host can also skip the wait immediately with Enter), and the peer left behind resyncs automatically once their own buffering clears, instead of quietly drifting behind for the rest of the session.
  • A clock-skewed or malicious peer could freeze the room's controls: junto decides whose play/pause/seek "wins" partly by timestamp, so a friend with a badly set system clock, or someone deliberately gaming it, could end up silently overriding everyone else's controls for as long as the skew lasted. Timestamps are now checked against realistic clock drift and rejected if they're implausible.
  • Fixed a config bug that could silently ignore your telemetry opt-out: a typo anywhere else in your config file could previously undo an explicit telemetry = false, and only the exact word "false" actually turned it off (off, 0, and similar were silently ignored). A broken config file is now caught immediately, and only true/false are accepted for the telemetry setting.
  • junto update no longer silently skips its own safety check: checksum verification only ran if the release's checksum file was present, reachable, and matched the download exactly. If any of that failed, for example a flaky network, junto used to install the update anyway with no warning. Any verification failure now stops the update instead of quietly letting it through.
  • A captured relay message could be replayed: junto's relays never encrypt the room tag, only the message contents, so anyone watching a relay could previously capture a signed message (like a kick, or a connection request) and resend it later to disrupt a room, without ever knowing the room's actual secret. Messages that are too old, or that arrive out of order from the same sender, are now rejected.

v1.2.0

Added

  • Graceful host migration: if the host quits or drops offline mid-session, the watch party keeps going. A friend who already has the files is picked as the new host automatically (everyone works out the same choice on their own, with no extra round-trip), the playlist is re-announced so late joiners still connect, and anyone who was streaming redirects their download to the new host. Every byte stays verified across the handover.
  • Stale host detection: if the host closes mpv or loses its connection, you no longer stare at a frozen window. junto says "host appears to have left, waiting..." after a missed heartbeat and escalates to a clearer "gone for X minutes, use /quit" message after a longer gap, both in the terminal and inside mpv. The notice clears itself if a replacement host takes over.
  • Smarter readiness gate: a streaming joiner now waits until a real cushion of video is buffered before it reports "ready", so when the host presses play everyone actually plays instead of one person stalling on the first frame.
  • File-match check: joining with your own local copy now warns you up front if it doesn't match the room (a different file count, a name that doesn't line up, or a different size, "likely a different cut"), heading off a confusing silent desync. Name and size are checked instantly, with no full re-hash on join.
  • One-command install: curl junto.watch/install | sh works out your platform, downloads the binary (checksum-verified), and installs mpv for you. On macOS it uses the Homebrew tap when you already have it. There's a double-click macOS .pkg on the releases page too. No more "install Homebrew first, then untar a binary, then go find mpv."
  • Audio track sync: the active audio track now mirrors across the room, just like the subtitle track. On a file with several audio tracks (anime dubs, multi-language releases), one person flipping to the English dub flips it for everyone, so nobody is left alone in the original language.
  • Built-in relay fallback: when a direct connection can't punch through a strict router, junto now retries through a built-in relay automatically, with no flags and no setup. Most of the connections that used to fail now just work. -turn still lets you bring your own relay, and junto doctor shows the built-in relay's status.
  • Anonymous usage ping (opt-out): a single anonymous ping on create or join reports the event, version, OS and architecture, outcome, relay latency, and (for streaming joiners) how long the first frame took and whether the transfer finished. No personal data, no room secret, no file names. The first run shows exactly what's sent, and you can switch it off with --no-telemetry or telemetry = false in your config.
  • -debug flag: add -debug to create or join to write a structured log of relay health, connection negotiation, downloads, and sync decisions to ~/.cache/junto. Off by default, so normal runs stay quiet. Invaluable when something misbehaves.

Changed

  • Smooth drift correction: when a peer drifts slightly out of sync, junto now eases it back by briefly nudging playback speed up to 3% instead of a visible jump, and saves a hard seek for larger gaps. The nudge is local-only, so each peer corrects its own drift without dragging the room's speed around. Routine corrections are now invisible.
  • Guided failure and preflight: junto now checks for mpv before connecting, so a missing player fails instantly with install steps instead of after a ten-second wait. Connection, relay, and NAT errors now point you at junto doctor, the old "NAT traversal failed" jargon is gone, and doctor ends with a one-line verdict (safe to stream, or not just yet).
  • In-player notices: chat, join/leave events, buffering, pause/resume/seek, kicks, relay reconnects, and the "press Enter to start" prompt now show as overlays inside the mpv window where you're actually looking, not only in the terminal. The start prompt stays pinned while the room waits. Notices are handled separately from playback so a slow mpv connection can't stall the room.
  • Buffer-free playback: the room now pauses only when mpv actually runs out of data, not as a precaution. This lets junto keep a large playback buffer and still start instantly, fixing the case where minutes of video are cached but playback is still frozen. The download also now follows the playhead and adjusts to your connection speed instead of always racing from the start of the file.
  • Sharper sync: junto now measures the real clock difference between you and each friend on join, then accounts for it when correcting drift. With that accounted for, the threshold for triggering a sync correction tightened from 1 second to half a second. Noisy measurements are ignored so a bad sample can't make sync worse.
  • Faster relay routing: play, pause, and seek now go through the fastest reachable relay, measured each session. Relays that fail repeatedly get a short cooldown and then rejoin the rotation. junto doctor now shows each relay's round-trip time.

Security

  • Peer text is sanitized: nicknames, chat messages, and shared file names that come from other peers are stripped of control characters before they're shown, so a malicious peer can't hijack your terminal or forge fake output lines (in the terminal or in mpv). Those fields are length-capped too.
  • Shareable debug logs: the -debug log never records file names, absolute paths, the room secret, or relay credentials, so you can attach it to a bug report without leaking anything private. It logs playlist indices and sizes instead of names.
  • Tougher against bad input: a misbehaving peer can't flood the room with a giant playlist, a stalled connection now gives up instead of hanging forever, and the parts of junto that talk to the network (the local streaming server, already reachable only from your own machine, and the URL downloader) were tightened further. We also fixed a rare timing bug that could trip up a transfer, and every release is now automatically scanned for known security issues.

v1.1.0

Heads up: v1.1.0 changed how file transfers work, so everyone in a room needs to be on the same version. Update with junto update or brew upgrade before your next watch party.

Added

  • Watch from a URL: pass a YouTube link (or any site yt-dlp supports) to junto create instead of a local file. junto downloads it, caches it in ~/.cache/junto, and shares it to friends just like a regular file. Needs yt-dlp and ffmpeg installed. junto doctor now checks for both.
  • junto update: update to the latest release with one command. The binary swaps itself out; Homebrew and go install builds are pointed at the right upgrade command instead.
  • junto uninstall: cleanly remove junto. Add -purge to also wipe your settings and cache.
  • Config file: save your nickname, relays, mpv path, and connection settings in ~/.config/junto/config.toml so you don't retype them every session. Flags still override everything.
  • Automatic subtitle sharing: if you have a subtitle file next to your video, junto shares it automatically. Everyone gets the same subtitles loaded and in sync, no separate step needed.
  • Resumable downloads: quitting mid-session keeps your progress. Rejoining picks up where the download left off instead of starting over.
  • /ignore <nick>: stop a peer's chat and playback commands from affecting your session. /unignore undoes it.
  • /kick <nick>: ask a peer to leave; the rest of the room auto-ignores them. junto can't force anyone off a public relay, so a misbehaving client can decline. That's documented.
  • /sync: force a resync to the room's current state if something feels off, without quitting and rejoining.
  • Richer /peers: see each person's playback position, how far they've drifted, their download progress, and whether they're buffering or ignored.

Changed

  • Much faster file transfers: transfers now stay on a single connection for the whole session instead of rebuilding every 4 MiB. This fixes frequent stalls on HD and 4K files, and seeking no longer causes a reconnect pause.
  • More reliable mp4 and mov startup: junto now fetches the right part of the file first, so long films and 4K recordings start up reliably instead of sometimes stalling.
  • Faster playback start when joining: streaming joiners see video sooner after running junto join.

v1.0.0

Synchronized playback

  • Synced controls: play, pause, seek, speed, subtitle track and delay, and playlist position all mirror to everyone in the room within about a second. No single person is in charge, so there's no single point of failure.
  • Readiness gate: the host sees who's loaded and ready ("2/3 ready") and starts the room for everyone with one keypress. Late joiners skip straight to wherever the room is.
  • Buffering together: if someone seeks past what they've downloaded, the whole room pauses until everyone has caught up, then starts together.

File transfer and streaming

  • Direct peer-to-peer transfer: your files go straight from host to friends. No third party ever touches them, and each transfer is verified.
  • Streaming playback: friends start watching within seconds while the file downloads in the background. You don't wait for the whole thing.
  • Resumable transfers: a dropped connection picks up from the last byte instead of restarting.
  • TURN relay: if a direct connection fails due to strict router settings, you can route through a relay with -turn. junto tells you exactly what to do when it can't connect directly.
  • Live progress bar: shows download percent, speed, and time remaining, pinned at the bottom so chat stays readable above it.

Rooms and privacy

  • Room codes: a room is a secret you share as a jun1... code. junto create copies a ready-to-paste join command to your clipboard.
  • Encrypted sync messages: all coordination (play, pause, seek) is encrypted before it leaves your machine. The relays passing messages between friends can read none of it. Dropped relays reconnect silently.

Commands

  • junto create and junto join: the two commands you need. In-session chat with colored names, /pause, /play, /seek, /speed, /peers, /quit. Errors are plain English, not stack traces.
  • junto doctor: checks everything before you invite anyone, mpv, your internet connection, NAT, and disk space, and prints a fix for whatever fails.
  • junto version: prints your version, commit, and build date.
  • Binaries for macOS and Linux: brew install swayam-mishra/tap/junto installs mpv too. Linux builds for amd64 and arm64 on every release.