Turn a Jellyfin movie or TV season into a real DVD.
JellyDisk pulls media and metadata from Jellyfin, converts the video to DVD-compatible MPEG-2, builds interactive menus, and writes an ISO. It can also make the printable case wrap, booklet, and disc labels.
Use the desktop app for the full visual workflow. The CLI and Docker image are available for servers and automation.
- DVD-Video ISOs with episode, cast, subtitle, trailer, and trivia menus
- Multi-disc sets when a season does not fit on one DVD
- Multi-season projects that keep each season in its own disc set
- Printable case wraps, episode booklets, and disc labels
- DVD-5 or DVD-9 output in NTSC or PAL
The live preview lets you inspect the package artwork, rotate the open case, switch between discs and seasons, and try the DVD menu before starting a build.
Tip
Want to explore the menu without authoring a disc? See the JellyDisk Web Interface.
![]() |
![]() |
![]() |
![]() |
Sample files: episode booklet · disc label · case wrap
JellyDisk requires Python 3.12 or newer.
git clone https://github.com/DrewThomasson/JellyDisk.git
cd JellyDisk
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txtIt also needs FFmpeg and dvdauthor:
Ubuntu or Debian
sudo apt install ffmpeg dvdauthor dvd+rw-tools wodim yt-dlpmacOS with Homebrew
brew install ffmpeg dvdauthor yt-dlpWindows
Install FFmpeg and a Windows build of dvdauthor. yt-dlp is optional and is only used for remote trailers.
Subtitle rendering requires an FFmpeg build with libass. The standard
Homebrew and Debian/Ubuntu packages include it.
Start JellyDisk with the virtual environment active:
python -m jellydisc.mainThen:
- Connect to Jellyfin. Enable Remember login securely if you want JellyDisk to use Keychain, Windows Credential Manager, or your Linux secret service.
- Browse or search the library and choose one or more seasons.
- Check the package and menu in Live Preview.
- Choose ISO or physical-disc output and start the build.
JellyDisk keeps downloaded artwork and transcoded files in assets/ and
staging/. Finished files are written to output/.
Run the guided terminal workflow:
python -m jellydisc.main --headlessOr provide everything in one command:
python -m jellydisc.main --headless \
--server "https://jellyfin.example.com" \
--username "User" \
--password "Password" \
--show "Smiling Friends" \
--season "Season 1"Passing a password as an argument may expose it in shell history. For repeated local use, save it in the system credential vault:
python -m jellydisc.main --headless --save-login \
--server "https://jellyfin.example.com" \
--username "User" \
--show "Smiling Friends" \
--season "Season 1"
python -m jellydisc.main --headless --use-saved-login \
--show "Smiling Friends" --season "Season 1"Remove the saved login with --forget-login. Run
python -m jellydisc.main --help for all authoring and burning options.
Disc utilities:
python -m jellydisc.main --list-drives
python -m jellydisc.main --erase --drive "/dev/rdisk4"Docker is useful for headless ISO creation because FFmpeg and dvdauthor are already included:
docker compose run --rm jellydiscYou can supply credentials through the shell or a local .env file:
JELLYFIN_URL=https://jellyfin.example.com
JELLYFIN_USER=your_username
JELLYFIN_PASS=your_passwordThen run a non-interactive build:
docker compose run --rm jellydisc \
--show "Smiling Friends" --season "Season 2"Linux can expose an optical drive to the container by adding it under
devices in docker-compose.yml. Docker Desktop on macOS and Windows does not
support optical-drive passthrough; create the ISO in Docker and burn it from
the host.
The PDFs are generated at 300 DPI for standard DVD packaging:
| File | Size |
|---|---|
| Case wrap | 273 × 183 mm, including a 14 mm spine |
| Episode booklet | 120 × 180 mm |
| Disc label | 118 × 118 mm |
Print at Actual Size or 100%. Disable “Fit to Page,” “Scale to Fit,” and similar options or the artwork will not fit the case.
JellyDisk is licensed under the Apache License 2.0.




