Repository navigation
Releases
JellyFreedom 0.8.2
Fixed
- "Expired" episodes and movies stayed expired, and most of the library was never
re-checked. The background check that decides whether a title can still be found only
gets through a few dozen titles per run, and every run started again from the top. On a
library of about 1,600 titles that meant the same first 40 were re-checked every half hour
and the rest never were: an episode marked expired in June still said so in November, and
Needs attention kept naming it. Each run now continues where the last one stopped, so the
whole library is cycled through. The check also no longer counts as an "update" for the
Library's Recently updated sort. - The Library could open with no movies on it. The status filter added in 0.8.1 was
remembered between visits and applied silently: with every movie ready, "Needs attention"
hid the whole Movies section while "All" stayed highlighted and the heading still said
"114 movies". A remembered TV tab did the same. The Library now always opens showing
everything, and nothing can narrow the page without saying so (below). - Signing in or out now refreshes the library at once. A visitor who signed in on the
Library page kept the anonymous view ("Nothing here yet") until the next refresh a minute
later, and signing out left the whole library on screen. - Opening the Library no longer flashes "Nothing here yet" before the library has loaded.
Changed
- A simpler Library toolbar: find, All / TV / Movies, sort. The status filter and the
"Needs attention first" sort are gone — the Needs attention strip is the one place problems
are surfaced, expired or still-resolving movies included, and it follows the find box.
Whenever the page is narrowed, a line under the toolbar says what is narrowing it, with the
counts ("TV shows matching “bat” · 1 of 51 shows") and a Show everything button.
Section counts read "3 of 114" while narrowed, and a section the find box has emptied says
"No movies match" instead of disappearing. Only the sort is remembered; it defaults to
Recently updated, and the background refresh never reorders what is on screen — the order
changes only when you touch the controls or open the page. - "Mine" is a toggle beside the tabs, and only appears when it can do something: you are
signed in and someone else's requests are in the library too. On a single-user box it is
not shown.
Install
curl -fsSL https://github.com/MoonTheRipper/JellyFreedom/releases/latest/download/get.sh | sudo bashVerify downloads against SHA256SUMS:
sha256sum -c SHA256SUMS --ignore-missingArtifacts are signed with build provenance — verify with:
gh attestation verify jellyfreedom-0.8.2-linux-amd64.tar.gz --repo MoonTheRipper/JellyFreedomNightly 0.8.2+nightly.20261102.c3e07f5
Built from main at c3e07f5.
This is a nightly. It is whatever is on main right now: newer than the
latest stable release, less proven, and carrying no promise that the next one
upgrades cleanly. It is a prerelease, so it will never be served to anyone on
the stable channel.
curl -fsSL https://github.com/MoonTheRipper/JellyFreedom/releases/latest/download/get.sh | sudo bash -s -- --channel nightlyAlready installed? sudo jellyfreedom channel nightly && sudo jellyfreedom --update
Back to stable: sudo jellyfreedom channel stable — note that a nightly can be
newer than stable, in which case the next update will not move you back until
stable catches up.
Recent changes
- Release 0.8.2 (#64)
Nightly 0.8.1+nightly.20261101.88a0355
Built from main at 88a0355.
This is a nightly. It is whatever is on main right now: newer than the
latest stable release, less proven, and carrying no promise that the next one
upgrades cleanly. It is a prerelease, so it will never be served to anyone on
the stable channel.
curl -fsSL https://github.com/MoonTheRipper/JellyFreedom/releases/latest/download/get.sh | sudo bash -s -- --channel nightlyAlready installed? sudo jellyfreedom channel nightly && sudo jellyfreedom --update
Back to stable: sudo jellyfreedom channel stable — note that a nightly can be
newer than stable, in which case the next update will not move you back until
stable catches up.
Recent changes
- Library: movies hidden by a remembered filter; simpler filtering (#62)
Nightly 0.8.1+nightly.20261101.3c8dd54
Built from main at 3c8dd54.
This is a nightly. It is whatever is on main right now: newer than the
latest stable release, less proven, and carrying no promise that the next one
upgrades cleanly. It is a prerelease, so it will never be served to anyone on
the stable channel.
curl -fsSL https://github.com/MoonTheRipper/JellyFreedom/releases/latest/download/get.sh | sudo bash -s -- --channel nightlyAlready installed? sudo jellyfreedom channel nightly && sudo jellyfreedom --update
Back to stable: sudo jellyfreedom channel stable — note that a nightly can be
newer than stable, in which case the next update will not move you back until
stable catches up.
Recent changes
- Health check: continue where the last run stopped instead of from the top (#63)
JellyFreedom 0.8.1
Changed
- Search is in the header, so it is on screen from every page and at any scroll depth.
Typing from Library, Queue or Calendar opens the results on Home, and Back returns you to
where you were./still focuses it. - The Library page is organised instead of endless. TV shows and movies are separate
sections, each with its count and paged (10 shows, 24 posters at a time). A toolbar adds a
title filter, a status filter (Needs attention / Ready) and a sort (Needs attention first,
Recently updated, Title, Year); the sort and status are remembered. The Needs attention
strip shows eight titles with "Show all" for the rest. - The Queue is paged and folds what is finished. Each status group (Failed, In
Progress, Completed, Cancelled) shows ten titles at a time. Completed and Cancelled start
folded to their heading and count; click a heading to open or fold it, and the choice is
remembered. Searching the queue unfolds everything. On a phone the filters collapse into
swipeable rows instead of filling half the screen. - Cleaner movie posters in the Library. The Replace / Remove buttons under every poster
are gone; those actions are in the title popup. Posters are badged only when it matters:
Expired, Resolving, or which library when you have more than one. - An expired movie's popup now explains it and offers Remove, alongside requesting it
again. Previously only a ready movie had that panel. - A calmer look. Neutral charcoal greys replace the blue-violet tint, the purple-to-cyan
gradient is kept for the logo only, and the glows behind buttons, tabs, cards and status
dots are gone. Buttons use one indigo accent; every text colour still meets WCAG AA.
Fixed
- The title popup had no way back. Opening a recommendation inside the popup now shows a
Back arrow that returns to the previous title, at the point you had scrolled to. The
browser's Back button and a phone's back gesture do the same. - Closing a popup threw away your search. Closing a title opened from search results now
returns to the same results at the same scroll position, instead of the home page. - The popup's recommendation rows could not be scrolled with a mouse. A mouse wheel now
scrolls them sideways, and rows with more titles than fit get arrow buttons. - Closing a popup animated a long scroll down the page. The page now returns to where you
were instantly. - Clicking an empty part of the popup no longer draws a focus ring around the whole popup.
Added
go run ./cmd/webdevserves the web UI from a working tree while sending every API call
to a running JellyFreedom, so UI changes can be checked against real data without a
rebuild. Development only; not part of a release.
Install
curl -fsSL https://github.com/MoonTheRipper/JellyFreedom/releases/latest/download/get.sh | sudo bashVerify downloads against SHA256SUMS:
sha256sum -c SHA256SUMS --ignore-missingArtifacts are signed with build provenance — verify with:
gh attestation verify jellyfreedom-0.8.1-linux-amd64.tar.gz --repo MoonTheRipper/JellyFreedomJellyFreedom 0.8.0
JellyFreedom now works with Jellyfin 12. Every install made since Jellyfin 12.0 shipped on
2026-09-08 got Jellyfin 12, and on 0.7.6 Jellyfin refused every request it made; upgrading an
existing Jellyfin to 12 did the same. Tested against Jellyfin 10.11.11 and 12.4, and across an
in-place upgrade from one to the other.
Fixed
-
Jellyfin 12 refused JellyFreedom's API key. JellyFreedom sent the key in the legacy
X-Emby-Tokenheader and identified its login call withX-Emby-Authorization. Jellyfin 12
stops reading both —EnableLegacyAuthorizationdefaults tofalse, and an upgrade from
10.11 switches it off — so every call went out unauthenticated: the connection test reported
the key was rejected, library scans did nothing, sessions and user lists came back empty,
accounts imported from Jellyfin could not log in, and.strmfiles were written but never
picked up. Fixed by Marco Trevisan (#47), reported in #46.Every Jellyfin request now carries
Authorization: MediaBrowser Client="JellyFreedom", Device="Orchestrator", DeviceId="jellyfreedom-orchestrator", Version="1.0", Token="…", which
Jellyfin 10.11 accepts too. The login call identifies the client the same way but sends no
token, since there is no key yet. The old headers are no longer sent at all. -
Stopping playback never freed the torrent. The PlaybackStop webhook had three faults, on
every Jellyfin version, and each step gave up without a word in the log:- it looked the item up with
/Items/{id}, which Jellyfin 10.11 and 12 answer with 400 for
an API key with no user; - had that answered, it read the URL inside the
.strmrather than the.strm's path, so
it could never match a library entry; - its "is anyone else still watching?" check compared the webhook's dashed item id with
Jellyfin's undashed ones, so it never matched either, and on any error it answered "no".
The torrent is now dropped when the last viewer stops, and kept while anyone else is
watching, whenever Jellyfin cannot be asked, and while another episode shares it. Each step
that keeps a torrent says why in the log. TorrServer's idle timeout was freeing these
torrents all along, which is why nobody noticed. - it looked the item up with
-
jellyfreedom doctorcalled Jellyfin healthy while it refused every request. It only
checked the one endpoint that needs no key. It now shows Jellyfin's version, checks that
Jellyfin accepts the orchestrator's key, and reports a Jellyfin that is still starting — or
migrating its database after an upgrade — as starting rather than down. -
jellyfreedom --updatewould install an older release. It only checked whether the
downloaded version was different, so a box on a newer build than the latest release — a
nightly, or one built from source — was taken back to that release. It now orders versions
the way the dashboard does, and refuses anything older or anything it cannot place. A nightly
ranks above the release it was built after, so switching from nightly back to stable waits
until stable catches up, as the nightly release notes always said it would.
JELLYFREEDOM_ALLOW_DOWNGRADE=1installs an older release on purpose;JELLYFREEDOM_FORCE=1,
whichrepairuses, still only reinstalls the same version. -
The VPN watchdog could restart TorrServer under a transcode. It defers restarts while
someone is watching, and asked only Jellyfin's sessions. A transcode Jellyfin has lost track
of, after its client disconnected or across a Jellyfin restart, keeps reading the stream with
no session behind it, so it looked like nobody was watching. The orchestrator now counts the
streams it is proxying as well, torrent and web source alike.
Added
sudo jellyfreedom webhooksets up Jellyfin's Webhook plugin for you: the Playback Stop
event on movies and episodes, the payload template and the shared secret. It reads the result
back to confirm Jellyfin kept it, and leaves your other webhooks alone. The dashboard's webhook
card now shows the template too, which it had left out although every call fails without it.tests/jellyfin/test_jellyfin_compat.sh, for contributors: runs the Jellyfin client and the
webhook path against throwaway Jellyfin servers of any version, as an ordinary user, and
measures which Jellyfin tasks open the.strmURLs — the requests that, on a real install,
each resolve a torrent through the VPN. On 10.11.11 and 12.4 only playback does.
Upgrading
- On Jellyfin 12, if you turned
EnableLegacyAuthorizationback on to keep 0.7.6 working,
turn it off again after updating. - The webhook needs a payload template, which the setup instructions never mentioned; without
one, Jellyfin sends a body the orchestrator rejects. If you set the webhook up by hand, run
sudo jellyfreedom webhookonce after updating: it fixes your destination and leaves your
other webhooks alone. See first-run.md §8.
Install
curl -fsSL https://github.com/MoonTheRipper/JellyFreedom/releases/latest/download/get.sh | sudo bashVerify downloads against SHA256SUMS:
sha256sum -c SHA256SUMS --ignore-missingArtifacts are signed with build provenance — verify with:
gh attestation verify jellyfreedom-0.8.0-linux-amd64.tar.gz --repo MoonTheRipper/JellyFreedomNightly 0.8.0+nightly.20261031.d4df8e6
Built from main at d4df8e6.
This is a nightly. It is whatever is on main right now: newer than the
latest stable release, less proven, and carrying no promise that the next one
upgrades cleanly. It is a prerelease, so it will never be served to anyone on
the stable channel.
curl -fsSL https://github.com/MoonTheRipper/JellyFreedom/releases/latest/download/get.sh | sudo bash -s -- --channel nightlyAlready installed? sudo jellyfreedom channel nightly && sudo jellyfreedom --update
Back to stable: sudo jellyfreedom channel stable — note that a nightly can be
newer than stable, in which case the next update will not move you back until
stable catches up.
Recent changes
- Keep the release procedure out of the published repo (#55)
Nightly 0.8.0+nightly.20261031.ab84332
Built from main at ab84332.
This is a nightly. It is whatever is on main right now: newer than the
latest stable release, less proven, and carrying no promise that the next one
upgrades cleanly. It is a prerelease, so it will never be served to anyone on
the stable channel.
curl -fsSL https://github.com/MoonTheRipper/JellyFreedom/releases/latest/download/get.sh | sudo bash -s -- --channel nightlyAlready installed? sudo jellyfreedom channel nightly && sudo jellyfreedom --update
Back to stable: sudo jellyfreedom channel stable — note that a nightly can be
newer than stable, in which case the next update will not move you back until
stable catches up.
Recent changes
- Web UI quality pass: popup Back, header search, paged Library and Queue (#58)
Nightly 0.8.0+nightly.20261031.6617dd5
Built from main at 6617dd5.
This is a nightly. It is whatever is on main right now: newer than the
latest stable release, less proven, and carrying no promise that the next one
upgrades cleanly. It is a prerelease, so it will never be served to anyone on
the stable channel.
curl -fsSL https://github.com/MoonTheRipper/JellyFreedom/releases/latest/download/get.sh | sudo bash -s -- --channel nightlyAlready installed? sudo jellyfreedom channel nightly && sudo jellyfreedom --update
Back to stable: sudo jellyfreedom channel stable — note that a nightly can be
newer than stable, in which case the next update will not move you back until
stable catches up.
Recent changes
- Release 0.8.0 (#53)
Nightly 0.8.1+nightly.20261031.3099dfc
Built from main at 3099dfc.
This is a nightly. It is whatever is on main right now: newer than the
latest stable release, less proven, and carrying no promise that the next one
upgrades cleanly. It is a prerelease, so it will never be served to anyone on
the stable channel.
curl -fsSL https://github.com/MoonTheRipper/JellyFreedom/releases/latest/download/get.sh | sudo bash -s -- --channel nightlyAlready installed? sudo jellyfreedom channel nightly && sudo jellyfreedom --update
Back to stable: sudo jellyfreedom channel stable — note that a nightly can be
newer than stable, in which case the next update will not move you back until
stable catches up.
Recent changes
- Release 0.8.1 (#59)