Jellyfin episode sync between servers.
  • C# 75.1%
  • HTML 16.9%
  • CSS 6.7%
  • Shell 1.1%
  • Dockerfile 0.1%
Find a file
Paldren 653dde738b
Some checks failed
docker / image (push) Failing after 1s
Fix Unraid orphan prune: drop unused jellysync:0.5.0.N pins
build.sh was grepping 0.4.0.N so every 0.5 pin stayed as an orphan.
prune-images.sh removes unused 0.5.0.N tags and keeps :latest / running.
2026-09-20 05:45:26 +00:00
.forgejo/workflows 0.5.0.153: :latest tracks 0.5 2026-09-18 10:31:01 +00:00
docs 0.5.0.153: :latest tracks 0.5 2026-09-18 10:31:01 +00:00
src 0.5.0.152: Library HUD series/episode percent 2026-09-17 21:15:32 +00:00
templates 0.5.0.153: :latest tracks 0.5 2026-09-18 10:31:01 +00:00
tests/JellySync.Tests 0.5.0.152: Library HUD series/episode percent 2026-09-17 21:15:32 +00:00
unraid Fix Unraid orphan prune: drop unused jellysync:0.5.0.N pins 2026-09-20 05:45:26 +00:00
.dockerignore JellySync 0.2.0.35 beta 2026-08-31 01:22:05 +00:00
.gitattributes JellySync 0.3.0.36 beta 2026-08-31 01:22:21 +00:00
.gitignore JellySync 0.2.0.35 beta 2026-08-31 01:22:05 +00:00
ca_profile.xml docs+xml: 0.5 supports Jellyfin 10.x and 12.x 2026-09-08 10:33:33 +00:00
clean-build.ps1 JellySync 0.2.0.35 beta 2026-08-31 01:22:05 +00:00
Directory.Build.props 0.4.0.79: CA install/upgrade/remove + blue Kohakutou hover 2026-09-07 05:23:02 +00:00
Directory.Build.targets 0.5.0.153: :latest tracks 0.5 2026-09-18 10:31:01 +00:00
docker-compose.yml 0.5.0.92: Jellyfin 12.0 supported (new 0.5 line) 2026-09-08 05:21:44 +00:00
docker-entrypoint.sh 0.4.0.79: CA install/upgrade/remove + blue Kohakutou hover 2026-09-07 05:23:02 +00:00
Dockerfile 0.4.0.79: CA install/upgrade/remove + blue Kohakutou hover 2026-09-07 05:23:02 +00:00
global.json JellySync 0.2.0.35 beta 2026-08-31 01:22:05 +00:00
JellySync.sln JellySync 0.3.0.38 beta: Daily/Weekly download periods and Activity tables 2026-08-31 13:31:26 +00:00
README.md 0.5.0.130: Option A dest modes 664/775 for SMB users 2026-09-11 22:36:22 +00:00
SETUP-UNRAID.md 0.5.0.130: Option A dest modes 664/775 for SMB users 2026-09-11 22:36:22 +00:00
TESTING.md docs+xml: 0.5 supports Jellyfin 10.x and 12.x 2026-09-08 10:33:33 +00:00

JellySync

One-way TV series and movie sync from remote Jellyfin servers into a local Unraid 7.x library.

C# / ASP.NET Core 8. Product version 0.5.0.BuildNumber beta (unreleased). BuildNumber is absolute (does not reset at 0.5). Line 0.1 TypeScript (retired). 0.2 C#. 0.3 Tdarr + mobile. 0.4 movies. 0.5 Jellyfin 10.x and 12.x. No Jellyfin plugin. WebUI port 8585. Canonical git: forge.wolfhound.dev/Paldren/JellySyncdocs ship with the code.

Host Unraid 7.x Docker only
WebUI http://YOUR-UNRAID-IP:8585/
Jellyfin 10.x and 12.x supported (0.5 target 12.0.0). Auto-detect or pick the line in Settings. 13+ warns; proceed at your own risk
Plugin None — stock Jellyfin REST
Identity Remote series = Series Item.Id; remote movie = Movie Item.Id; remote episode = Episode Item.Id. Independent of local filename
Naming Subscribe picks a base folder under /media plus named templates (series + Movie Folder / Movie Name). {tvdbid} / {tmdbid} fill from remote Jellyfin, then Sonarr/Radarr
Replace Ignore / newer (DateCreated) / quality (local HDR/SDR pref, then resolution)
Look *arr-style dark WebUI; page canvas light jelly #221A26; chrome #141414, cards #1a1a1a
Version 0.5.0.N-beta — bump JellySyncBuild in Directory.Build.targets or docker build --build-arg BUILD_NUMBER=N. System page and footer show it.
Role Inside the container Unraid host default
Appdata (catalog, secrets) /config /mnt/user/appdata/JellySync
Media library /media the same share local Jellyfin uses
Download temp /tmp/jellysync /mnt/user/multimedia/Temp

Open JellySync.sln in Visual Studio 2022 (or use the .NET 8 SDK). Every public type in JellySync.Core has XML documentation (GenerateDocumentationFile; missing comments on Core are CS1591).

Project Role
JellySync.Core Identity (Item.Id), naming (series + movies), quality, replace, enqueue, demo catalog, simulated transport
JellySync.Web *arr-style Blazor Server UI + download worker
JellySync.App Production host (empty store — Unraid image)
JellySync.Demo Startup project. Seeds Cabin NAS (10.11.11), Lab 12 (12.0.0, supported), WolfhoundNAS (Firefly, download revoked)
JellySync.Tests xUnit

Documentation (in this repo)

Document Contents
SETUP-UNRAID.md Install, run, update, and troubleshoot the Unraid Docker container
docs/INSTRUCTIONS.md How to use the WebUI (Library poll, Subscribe, Series Scan/Sync, movie Get)
docs/DEMO.md Install, run, and use JellySync.Demo in Visual Studio / dotnet
TESTING.md Sign-off tests (dotnet test + Unraid container)
docs/GIT-UNRAID.md Forgejo tags, Unraid Add Container / Upgrade (latest-0.5 / latest-0.4 / latest-0.3), image push, Git-hosted icon
docs/Jellyfin_Series_Sync_SRS_v0.5.0.md 0.5.0 Jellyfin 10.x / 12.x (this line)
docs/Jellyfin_Series_Sync_SRS_v0.4.0.md 0.4.0 movie requirements (frozen)
docs/Jellyfin_Series_Sync_SRS_v0.3.0.md 0.3.0 Tdarr + mobile (frozen)
docs/Jellyfin_Series_Sync_SRS_v1.8.md 0.2.x requirements. v1.7 is history.
docs/README.md Documentation map
unraid/ Community Apps template + Docker icon

Unraid in one page

Install (other Unraid users): Community Apps → JellySync 0.5, or Docker → Add Container with Repository forge.wolfhound.dev/paldren/jellysync:latest-0.5. No git clone, no docker build. Details: SETUP-UNRAID.md. Frozen 0.4 stays on :latest-0.4.

Upgrade (you, after publishing the image): push release/0.5 → Forgejo Actions → docker green → Unraid Force update (Repository :latest-0.5). Icon: https://forge.wolfhound.dev/Paldren/JellySync/raw/tag/latest-0.5/unraid/JellySync.png. Package must be public. CA submit: ca.unraid.net/submit. Runner: docs/GIT-UNRAID.md.

You do not need Visual Studio on the server. First install: clone this repository to /mnt/user/appdata/jellysync-src (must contain Dockerfile and JellySync.sln):

cd /mnt/user/appdata
git clone --branch release/0.5 --depth 1 \
  https://forge.wolfhound.dev/Paldren/JellySync.git jellysync-src

Terminal — full path when Unraid Repository is the forge tag (git + build + push + pull + run):

cd /mnt/user/appdata/jellysync-src
bash unraid/release.sh 93

Compile only (jellysync:local; Force update will still pull the old registry image):

cd /mnt/user/appdata/jellysync-src
bash unraid/build.sh 93

Unraid → Docker tab should list JellySync. If you add it by hand instead of build.sh:

Type Name Container Host
Port WebUI 8585 8585
Path Appdata /config /mnt/user/appdata/JellySync
Path Media /media your library share (same as local Jellyfin)
Variable PUID 99
Variable PGID 100
Variable UMASK 002
Variable TZ America/New_York
Variable WEB_USERNAME / WEB_PASSWORD blank = no login

Apply. Open http://YOUR-UNRAID-IP:8585/. Follow First boot in SETUP-UNRAID.md, then docs/INSTRUCTIONS.md, then tick TESTING.md.

A fresh Unraid container starts empty. Demo remotes exist only in Visual Studio (docs/DEMO.md).

Never point Jellyfin / Sonarr / Bazarr at http://localhost:… from this container.


Visual Studio Demo

  1. Open JellySync.sln.
  2. Right-click JellySync.DemoSet as Startup Project.
  3. F5 (or Ctrl+F5).
  4. Browser: http://localhost:8585/

Cabin NAS is 10.11.11 and Lab 12 is 12.0.0 — both supported on 0.5 (no version banner).

dotnet test
dotnet run --project src\JellySync.Demo

Do not copy bin/obj from Linux. If F5 throws DirectoryNotFoundException for wwwroot, run .\clean-build.ps1 then Rebuild. Details: docs/DEMO.md.

What to click

  1. Library → Poll server, then Series → Scan / Sync — Sync paints Scan first, then the worker queues. Expanse specials (S00) first; S01E06 blocked. Season fill bars update as files finish. Activity badge = queue.
  2. Series — collapsed series → seasons (fill bar) → episodes; Had / Available (e.g. 1/7); Collapse All. Firefly / WolfhoundNAS is red until you Acknowledge the download-permission notice; Sync then re-raises it.
  3. Library → Sync on Andor — preview uses Andor (2022) and Season 01. Absolute keeps Season 01.
  4. Settings — tabs General / Servers / Templates / Connect. Jellyfin version Auto / 10.x / 12.x on local and each remote. Library poll cadence + series interval on each remote.
  5. Notifications — per-row Acknowledge + Clear, Acknowledge all, Clear acknowledged.

Conventions (defaults)

Piece Template Example
Series Folder {ny} Firefly (2005)
Season Folder {'Season '+s00} Season 01
Seasonal file {n} - {s00e00} - {t} {[vf, vc, ac]} Firefly - S01E01 - Serenity [480p, x264, AC3]
Absolute file {n} - {absolute} - {t} {[vf, vc, ac]} One Piece - 1045 - Title [1080p, HEVC, AAC] (still in Season 01)
Specials folder Season 00 (default), Season 0, or Specials Season 0 still uses S00Exx

Environment variables

Variable Default Meaning
PUID / PGID 99 / 100 File owner (Unraid nobody:users). Match Jellyfin so it can read new files
UMASK 002 Dest files 664 / new dirs 775 (SMB users). Do not use 022.
TZ America/New_York Download windows use this timezone
WEB_USERNAME / WEB_PASSWORD empty Both blank → no WebUI login
CONFIG_KEY generated Encrypts /config/state.json
CONFIG_DIR /config Catalog, secrets, partials
MEDIA_ROOT /media All save paths must stay under this
PORT / ASPNETCORE_URLS 8585 Container listen address

What is in this folder

Path Role
JellySync.sln Visual Studio solution
src/ Core, Web, App, Demo
tests/ xUnit
docs/ Instructions, Demo walkthrough, SRS (+ watermarked Word)
SETUP-UNRAID.md Unraid install
TESTING.md Sign-off tests
Dockerfile Unraid image (dotnet publish of JellySync.App)
docker-entrypoint.sh PUID/PGID, CONFIG_KEY, listen 8585
docker-compose.yml Compose / Unraid 7 plugin
unraid/ Template XML + Docker icon