Skip to content

Releases

JellyFreedom 0.8.2

Choose a tag to compare

@github-actions github-actions released this 02 Nov 09:00
c3e07f5

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 bash

Verify downloads against SHA256SUMS:

sha256sum -c SHA256SUMS --ignore-missing

Artifacts are signed with build provenance — verify with:

gh attestation verify jellyfreedom-0.8.2-linux-amd64.tar.gz --repo MoonTheRipper/JellyFreedom

Nightly 0.8.2+nightly.20261102.c3e07f5

Pre-release

Choose a tag to compare

@github-actions github-actions released this 02 Nov 08:57
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 nightly

Already 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

Pre-release

Choose a tag to compare

@github-actions github-actions released this 01 Nov 18:28
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 nightly

Already 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

Pre-release

Choose a tag to compare

@github-actions github-actions released this 01 Nov 19:57
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 nightly

Already 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

Choose a tag to compare

@github-actions github-actions released this 31 Oct 14:25
3099dfc

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/webdev serves 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 bash

Verify downloads against SHA256SUMS:

sha256sum -c SHA256SUMS --ignore-missing

Artifacts are signed with build provenance — verify with:

gh attestation verify jellyfreedom-0.8.1-linux-amd64.tar.gz --repo MoonTheRipper/JellyFreedom

JellyFreedom 0.8.0

Choose a tag to compare

@github-actions github-actions released this 31 Oct 00:31
6617dd5

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-Token header and identified its login call with X-Emby-Authorization. Jellyfin 12
    stops reading both — EnableLegacyAuthorization defaults to false, 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 .strm files 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 .strm rather 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.

  • jellyfreedom doctor called 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 --update would 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=1 installs an older release on purpose; JELLYFREEDOM_FORCE=1,
    which repair uses, 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 webhook sets 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 .strm URLs — 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 EnableLegacyAuthorization back 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 webhook once 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 bash

Verify downloads against SHA256SUMS:

sha256sum -c SHA256SUMS --ignore-missing

Artifacts are signed with build provenance — verify with:

gh attestation verify jellyfreedom-0.8.0-linux-amd64.tar.gz --repo MoonTheRipper/JellyFreedom

Nightly 0.8.0+nightly.20261031.d4df8e6

Pre-release

Choose a tag to compare

@github-actions github-actions released this 31 Oct 00:59
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 nightly

Already 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

Pre-release

Choose a tag to compare

@github-actions github-actions released this 31 Oct 14:15
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 nightly

Already 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

Pre-release

Choose a tag to compare

@github-actions github-actions released this 31 Oct 00:21
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 nightly

Already 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

Pre-release

Choose a tag to compare

@github-actions github-actions released this 31 Oct 14:21
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 nightly

Already 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)