Skip to content
Swiftly Music Blog Discord GitHub
  1. Swiftly Player
  2. Blog

Watch Jellyfin across devices: resume, handoff and SyncPlay

How Jellyfin stores playback position on the server, which clients offer remote control or casting, and how SyncPlay and Quick Connect work.

By Swiftly Player10 min read

Disclosure: we build Swiftly Player, one of the clients in this article. We point out where other apps do better.

TL;DR

Jellyfin saves where you stopped on the server, per user, not in the app. Any app signed in as the same user on the same server can continue from there, as long as the video is at least 300 seconds long and between 5 and 90 percent played. SyncPlay, remote control and Quick Connect are separate features, and support differs from app to app.

How Jellyfin stores playback position

While a Jellyfin app plays something, it keeps the server informed. It reports when playback starts, sends progress updates while it runs, and reports when it stops. The Jellyfin API specification calls these endpoints /Sessions/Playing, /Sessions/Playing/Progress and /Sessions/Playing/Stopped. The server saves the position as PlaybackPositionTicks in the user data of that item. The position belongs to the user account, not to the device.

The "Continue Watching" row comes from that data (/UserItems/Resume in the same specification). So a film you pause in the web browser can show up with a progress bar on your TV a minute later. Both apps only need to be signed in as the same user on the same server.

The resume thresholds

Three server settings decide whether a position is saved at all. You find them in the web dashboard under Playback, in the Resume section (jellyfin/jellyfin issue #13289). The labels come from the jellyfin-web English strings, and the defaults from ServerConfiguration.cs.

SettingDefaultWhat it does
Minimum resume percentage5Below this, no position is saved.
Maximum resume percentage90Stopped after this point, the item is marked as played and the position resets.
Minimum resume duration300 secondsShorter videos never get a resume position.

With the default settings, a 4-minute clip never appears in "Continue Watching". If you stop a film during the end credits, it is usually marked as watched. The issue linked above also shows a bug with the maximum set to 100 percent. Finished films then stayed in "Continue Watching". The issue is marked as fixed.

Where it goes wrong

Resume only works as well as the reports the app sends. Some apps play from a local cache, stop sending progress, or never report a stop. The server then keeps an old position. One example is from 2023. Users on the Firecore forum reported that Infuse stopped sending progress updates to Jellyfin after about nine minutes of playback. According to the thread, a later Infuse update fixed it. If resume positions look wrong, open the server log or your reverse proxy log. Look for calls to /Sessions/Playing/Progress. When they stop, you know which side stopped talking.

With a media server as the source, Infuse says it syncs watched history and the playback position of unfinished items with the server. iCloud Sync is not used in that case.

Handoff, remote control and casting

"Continuing on another device" can mean three different things in Jellyfin.

  1. Resume from the server position. You stop on device A, open the same item on device B and resume. This works in every app that reports progress correctly.
  2. Remote control. Device A tells device B what to play and then controls it. The server passes the commands on (/Sessions/{sessionId}/Playing and /Sessions/{sessionId}/Playing/{command} in the API specification). Only sessions that announce SupportsRemoteControl can be controlled. In the web client this is called "Play On" and "Remote Control".
  3. Casting to Google Cast devices. The Cast device needs a receiver app. When you cast from the Jellyfin Android app or the web client, Jellyfin's own Cast receiver is used by default.
An Apple TV screen in Swiftly Player offering to continue an episode that is playing on another device
Resume on this Device in Swiftly Player on Apple TV Screenshot: Swiftly Player

This is what each app documents at the time of writing.

ClientRemote control / cast targetGoogle CastSyncPlaySource
Jellyfin WebControls other sessions ("Play On")YesYesjellyfin-web strings, jellyfin-chromecast, 10.6.0 release
Jellyfin for AndroidWeb client wrapperYes, in the non-libre buildVia the web clientjellyfin-android README, Android Authority
Jellyfin for Android TVNot documentedNot documentedNot in the official app; request still openissue #538
Jellyfin MPV ShimIs a cast target, controllable from the Jellyfin mobile apps and web clientNoYes, with limitsjellyfin-mpv-shim README
Swiftfin (iOS, tvOS)Not documentedNot documentedNo; request still openissue #688
FindroidNot documentedPlannedPlannedFindroid README
StreamyfinNot documented; shows active server sessionsYesNot listedStreamyfin README
InfuseNot documentedNot documentedNot documentedFirecore support
Swiftly PlayerResume on this device (see below)NoNothis blog

"Not documented" means the README or support page does not mention it. The feature may still exist. For the official Android TV app, there is an unofficial preview fork with SyncPlay from September 2026. It is not part of the official release.

Multiple users and multiple servers

Give every person their own user account on the server. The Jellyfin user management docs describe how:

  1. Open the Dashboard.
  2. Go to Users.
  3. Click the + button and create the user.

Each user has four tabs: Profile, Library Access, Parental Control and Password. The Profile tab has the option "Allow remote connections to this Jellyfin Server". Watched status, resume positions and ratings are stored per user. If everyone signs in as themselves, nobody overwrites anyone else's "Continue Watching" row.

Apps differ in how easy they make this.

  • Swiftfin shows servers and users in one sign-in view since pull request #1045 (merged May 2024). It keeps several saved users, lets you switch between them, and has settings per user. Each user can get a PIN or device authentication. An open issue still asks for a faster way to switch.
  • Swiftly Player keeps several servers and several accounts signed in at the same time.

The READMEs of the other apps in the table do not describe multiple accounts, so they are left out here.

Swiftly Player on iPhone listing several Jellyfin accounts on different servers
Several accounts side by side in Swiftly Player Screenshot: Swiftly Player

SyncPlay

SyncPlay lets several people watch the same thing at the same time on different devices. It is built into Jellyfin and was the main new feature of Jellyfin 10.6.0. One person creates a group and the others join. Play, pause and seeking then apply to everyone in the group. According to the release notes, a group has no user limit, and the same user can join from several apps.

Requirements

  • Everyone connects to the same Jellyfin server. For people outside your home, the server must be reachable from the internet, for example through a reverse proxy or a VPN (Android Authority).
  • Each user needs SyncPlay access. The user setting "SyncPlay access" has three options: "Allow user to create and join groups", "Allow user to join groups" and "Disabled for this user" (jellyfin-web strings). New users can create and join groups by default (UserPolicy.cs).
  • Everyone uses an app that supports SyncPlay.

Setting it up in the web client

  1. On one device, open the SyncPlay menu and choose "New group".
  2. On every other device, open the SyncPlay menu and choose "Join group".
  3. Start playback.

To stop taking part, choose "Leave group".

The SyncPlay settings in the web client include "Sync Correction" with two methods. SpeedToSync plays slightly faster to catch up. SkipToSync jumps to the expected position. If playback stutters a lot, the help text recommends turning sync correction off.

Limits

According to Android Authority, SyncPlay works in apps built on the web client, including the Android and iOS apps. It does not work in the official Android TV app, and transcoding can cause sync problems. Jellyfin MPV Shim supports SyncPlay. Its README notes one catch. If you join a group while casting to MPV Shim, the media plays but SyncPlay is not active at first. Swiftfin, Findroid and Swiftly Player do not support SyncPlay at the time of writing. So if you need SyncPlay on an Apple TV or Android TV today, none of these native TV apps has it.

Quick Connect

Quick Connect signs you in on a device without typing a password there. The Jellyfin Quick Connect documentation describes these steps.

  1. On the new device, choose Quick Connect on the sign-in screen. Some apps only show it after you choose manual login. The device now shows a 6-character code.
  2. On a device that is already signed in, open Settings > Quick Connect.
  3. Enter the code and confirm.
  4. The new device is now signed in as that user.
Quick Connect in three steps: the new device shows a code, a signed-in device enters it, the new device signs in
Quick Connect in three steps

Quick Connect is on by default. To turn it off, go to Dashboard > General and clear "Enable Quick Connect on this server". In the server source, the code is 6 digits and a request expires after 10 minutes.

Not every app can do both halves. According to the documentation, these apps can sign in and also approve other devices: Jellyfin Web, Jellyfin Android, Jellyfin Media Player, Jellyfin Mobile (iOS), Jellyfin WebOS, Jellyfin Xbox and Swiftfin (iOS), among others. Jellyfin Android TV, Jellyfin Roku, JellyCon and Swiftfin (tvOS) can sign in but cannot approve. Jellyfin Kodi, Jellyfin MPV Shim and Jellyfin Vue support neither. Swiftly Player, which is not in the official list, can sign in with a code on all its platforms and approve other devices from iPhone, iPad, Mac, Windows and Linux.

FAQ

Why does an episode not show up in "Continue Watching"?

Check the resume thresholds first. With default settings, videos under 300 seconds get no position. Nothing under 5 percent played is saved. Anything stopped after 90 percent is marked as played. If that is not the cause, check whether the app sent progress reports to /Sessions/Playing/Progress.

Do two people on one account share resume positions?

Yes. Positions are stored per user, not per device. If two people watch different things on one account, they overwrite each other's positions and watched status. Separate user accounts fix that.

Can I use SyncPlay with friends outside my network?

Yes, if they can reach your server and have a user account with SyncPlay access. Jellyfin has no built-in remote access service like Plex has. You set up remote access yourself, for example with a reverse proxy or a VPN.

Does Quick Connect work if the server has it disabled?

No. The option in Dashboard > General turns it off for the whole server. Apps can check the current state at /QuickConnect/Enabled in the API.

Is Swiftly Player available on Android TV?

Yes, in a closed Google Play test for Android and Android TV. You can join through swiftlyplayer.com/android; there is no public listing yet. The released version is available for iPhone, iPad, Apple TV and Mac through the App Store, and for Windows and Linux through GitHub releases.

Summary

Positions and watched status live on the server and belong to the user account. Any app that reports progress properly can continue from them. The Jellyfin web client and the apps built on it have the best support for remote control and Google Cast. Jellyfin MPV Shim works as a cast target, and Streamyfin supports Google Cast. SyncPlay needs access per user and an app that supports it. At the time of writing, that rules out the official Android TV app, Swiftfin, Findroid and Swiftly Player. Swiftly Player resumes from the server, has its own "Resume on this device" button, keeps several accounts signed in and supports Quick Connect.

Related articles

All articles