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

Jellyfin offline downloads: which clients can do it (2026)

The server setting that gates downloads, original file vs. transcoded downloads, and which Jellyfin clients actually support offline playback.

By Swiftly Player8 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 gates downloading per user with a permission called "Allow media downloads" (EnableContentDownloading on the server), on the Profile tab of that user's settings, under a "Download & Sync" section. It defaults to on.
  • The server's own download endpoint, GET /Items/{itemId}/Download, serves only the original file — there is no server-side option to request a transcoded or resized download instead.
  • Whether a client can download at all, and how, is entirely up to that client. Some send the original file straight to the device; at least one converts a stream to a file during download instead.
  • Findroid, Streamyfin, Fladder and Swiftly Player support offline downloads today. Swiftfin does not yet, though it is an old, actively tracked feature request. Jellyfin Web has never supported it.
  • Infuse can download from a Jellyfin server for offline playback on iOS and macOS, per Firecore's own documentation on downloading from network sources, though its support material does not spell out Jellyfin by name the way it does for the sync side of things.

The server-side switch

Every Jellyfin user account carries a permission for this specifically. The Jellyfin user management documentation places it on the Profile tab, in a subsection titled "Download & Sync," described as: "These allow a user to download media. Syncing and Transcoding are currently not available."

The label a server admin actually sees comes from the jellyfin-web source strings: OptionAllowContentDownload, "Allow media downloads," with the help text "Users can download media and store it on their devices. This is not the same as a sync feature. Book libraries require this enabled to function properly." On the server, this maps to a plain boolean on the user's policy, EnableContentDownloading, and the server's own model sets it to true by default for new users — downloading is opt-out, not opt-in, unless an admin changes it per account.

The same docs page also lists a second, related toggle, OptionAllowSyncTranscoding ("Allow media downloading and syncing that requires transcoding"), but is explicit that it currently does nothing: "This option is currently not available." Read together with the permission above, the server distinguishes between "download the file" and "convert while downloading," and only supports the first one natively.

Original file, or a converted one?

That distinction matters because it decides what actually lands on your device. The Jellyfin API specification defines exactly one download endpoint, GET /Items/{itemId}/Download, and its only parameter is the item's ID — no container, bitrate, or quality option. It returns the original media file, gated by the same EnableContentDownloading permission described above (a user without it gets a 403, not a file).

So a client that calls this endpoint gets a byte-for-byte copy of what is stored on the server — the same file Direct Play would have sent for streaming, just kept on disk instead of played immediately. If a client instead offers to shrink a download or re-encode it to save space, that conversion is happening in the client (or in a companion server plugin it ships), not through this endpoint, because the endpoint itself has no such option.

One client illustrates the alternative approach directly. Streamyfin's own README describes its download feature as experimental and explains it plainly: "Downloading works by using FFmpeg to convert an HLS stream into a video file on your device. This lets you download and watch any content that you can stream. The conversion is handled in real time by Jellyfin on the server during the download," alongside a companion server plugin to "Configure download method and search provider." That is a genuinely different mechanism from a plain original-file download, and it means the result can differ from what plain Direct Play would have sent.

Which clients actually support it

ClientDownloads for offline useNotesSource
FindroidYesListed under Features as "Offline playback / downloads"Findroid README
StreamyfinYes, experimentalConverts an HLS stream to a file via server-side FFmpeg, not a plain original-file copyStreamyfin README
FladderYesREADME lists "Direct, Transcode and Offline playback" and "Sync items for all platforms"Fladder README
SwiftfinNot yetLocal downloads is a long-open feature request; earlier download-related stub code was removed as out of dateIssue #57, PR #2286
InfuseYes, on iOS and macOSFirecore documents downloading "from any network source" for offline playback, restricted to iOS/macOS; Jellyfin is a supported source, and users report downloading from it in Firecore's own community forumDownloading Files, community thread
Jellyfin WebNoA maintainer confirmed the web client's Download link is "a nice side effect," not a feature built for offline viewing, and pointed to a separate, unimplemented feature request for real offline syncIssue #765
Swiftly PlayerYes, on iPhone, iPad and MacDownloads the same media source the player would use, so quality follows whichever version you pick when a title has more than one; downloaded files play through the same VLC player, including MKV; not available in the Apple TV, Windows, Linux or Android versionsthis blog

Swiftfin deserves a closer look because "not yet" undersells how long this has been in progress. The tracking issue, #57, has been open since June 2021, and more recent sub-issues break the work into pieces — a download manager and metadata storage, download options, the download UI in the item view, and edge-case handling — all still open at the time of writing. A pull request that removed earlier placeholder download code, #2286, noted that the old stub code was "bare bones and out of date," which reads as a project reset on this feature rather than an abandonment of it.

Jellyfin Web is the clearest "no" in the table, and it comes from the project itself rather than from outside guessing. On issue #765, a maintainer wrote: "The current Download entry in the menus isn't really made for offline viewing per se, although it's a nice side effect of it. I don't expect we'll be adding a way to download an entire show or season with the current system," and pointed toward a separate, unimplemented feature request on Jellyfin's own feedback board for real offline sync.

Storage and sync limits, where they exist

The server itself does not impose a storage quota on downloads — the only server-side control is the yes/no permission described above. Anything beyond that is a client's own choice:

  • Fladder advertises syncing "for all platforms" and keeping "progress in sync," per its README, without a stated storage cap.
  • Streamyfin's conversion step happens through a companion plugin that configures the "download method," but its README does not spell out a specific resolution or size limit.
  • Swiftly Player keeps roughly 1 GB of free space in reserve on the device rather than filling the disk completely, downloads one title at a time, and only ever suggests removing downloads that are both fully downloaded and already watched — it does not silently delete anything you have not seen yet. None of this is a Jellyfin server feature; it is local bookkeeping specific to the app.

If you need a hard guarantee about disk usage across a household, none of these clients document one, so the practical limit is still "how much free space is on the device."

FAQ

Why can't I download anything even though my client supports it?

Check the "Allow media downloads" permission on your user account first. It defaults to on, but a server admin can turn it off per user, and the server's own download endpoint returns a 403 rather than a file when it is disabled.

Does a downloaded file look the same as what I'd see while streaming?

It depends on the client. One that calls the server's plain download endpoint gets the exact original file. A client that converts a stream during download, like Streamyfin, can produce a different result, since that conversion runs through FFmpeg rather than a byte-for-byte copy.

Can I download an entire show or season at once?

That is client-specific and not something the Jellyfin server enforces either way. Jellyfin Web's maintainers have explicitly said they don't plan to add that to the current web download system, per the discussion on issue #765 referenced above.

Will Swiftfin get downloads eventually?

It is an open, actively tracked feature request with real, ongoing work split across several sub-issues, but it is not shipped as of this writing. Anyone who wants downloads on Swiftfin today does not have them yet.

Is there a Jellyfin-wide storage limit for downloads?

No. The server only gates whether downloading is allowed at all, not how much space it may use. Any storage management, like reserving free space or clearing out watched titles, is something individual clients choose to do on their own.

Summary

Jellyfin's own contribution to offline viewing is small and permission-based: a per-user switch, and a download endpoint that hands over the original file with nothing else. Everything past that — whether a client supports downloads at all, whether it copies the original or converts it, and how it manages space on the device — is up to the client. Findroid, Fladder and Swiftly Player copy the original file for offline playback; Streamyfin instead converts a stream through server-side FFmpeg; Infuse can pull files from Jellyfin for offline use on iOS and macOS; Swiftfin has the feature planned but not shipped; and Jellyfin Web, by its own maintainers' account, was never built for this in the first place.

Related articles

All articles