Repository navigation
Releases: debridmediamanager/rex
Release list
rex 2026.11.02.1227-nightly
Docker (Linux amd64 and arm64): docker pull ghcr.io/debridmediamanager/rex:2026.11.02.1227-nightly, also tagged nightly
- ci: run the source playlists suite's music half where FFmpeg is, skipping it in the black-box step that has none
- test: a claimed start, handed its owner's track settings by a stub plex.tv, peaks near an unclaimed one's memory
- perf: a stream id no row holds and a source's delete ask no longer read the whole library into one request
- perf: the passes outside a request -- the blank-tile retry, season repair, the analysis worker's start and automatic collections -- let each row go once read
- perf: the owner's track settings are compared a row at a time, so a claimed start no longer holds the library
- docs: artwork takes effect on the next push, changed or not
- fix: a track pushed again unchanged still brings its source's artist and album pictures
- docs: the artwork registration field and when a track's display pictures are applied
- fix: a displayed artist or album takes a later pushed picture, and an agent-named artist its source's when it registered artwork: source
- feat: a source may register artwork: source, kept with its registration and answered by the sources API
- test: ask the Live TV perf grid for tomorrow, whole at any hour, not today's last rows
- docs: the Live TV shared-user recorder writes no token
- fix: answer a shared user's Live TV by the share's allowTuners, as plexav does
- test: record what plexav answers a shared user's Live TV with and without the share's Live TV
- perf: deleted keys a number spells are kept as numbers
- perf: a row only the state file holds takes an 8-byte slot, not a 72-byte Null
- perf: a start leaves the save cache of every field but items in the file until a save needs it
- perf: a hot row's releases live in its buffer, the row's _sid kept once
- perf: a hot row's fields are one packed buffer, not a Value each
- perf: passes read a row's fields as a borrowed Field, not a &Value
- docs: favourite channels are kept on plex.tv, and the device's favorite stays false
- test: a favourite channel Plex Web keeps on plex.tv finds rex's channel by its number, as plexav's
- docs: the stream levels perf suite
- fix: find a stream's row by its id's own numbering before reading every row, so Plexamp's levels request no longer stalls rex
- docs: the feed's ids.artist_mbid for a track
- feat: a track whose album nothing names goes under Plex's artist for its pushed ids.artist_mbid
- test: rex-direct off check accepts no announce when a container network leaves no LAN address
- fix: a track pushed again with its size or another file updates its Part, not counted unchanged
- docs: the feed's playlists field and its suite
- ci: run the source playlists suite with the feed suites
- feat: a source puts its files in the owner's playlists by title and position, as its collections are applied
- test: one counting allocator for the crate's memory tests
- perf: read the spelling vocabulary back on the first misspelt search and let it go after 30 idle minutes
- perf: hold each key of the state save cache once, 114 to 57 bytes a key
- perf: hold no upload bytes once the state file has them, read them back by key
- perf: cap glibc's malloc arenas at two unless MALLOC_ARENA_MAX is set
- perf: count the memory a cached row holds against REX_ROW_CACHE_MB, not three times its text
- docs: README's music and Live TV line leaves the details to Limits
- docs: name the apps tested for Live TV, Plexamp's missing radio, and where blur answers are kept
- docs: README names music and Live TV from addons among what you get
- fix: announce no LAN address and send no lanIp from a container network, told by the default route's veth
- fix: keep artwork blur answers in the state database from the first start, before it is saved
- docs: artwork blur answers are kept in rex.db
- fix: keep artwork blur answers in the state database, so a database catalog stays one file
- test: lanIp follows --announce-url's LAN address
- feat: send --announce-url's LAN address as lanIp so a bridged Docker or VPN rex gets a reachable LAN name
- docs: rex-direct's LAN name gives app.plex.tv HTTPS at home without a port forward
- feat: serve and announce the rex-direct provider's LAN name
- feat: send rex's RFC 1918 LAN address to the rex-direct provider as lanIp
- docs: music and Live TV from sources in the limits and capabilities, and REX_ARTWORK_ANALYSIS
- docs: what rex-fun's two-part Monk S01E01 showed, and a stacked Media's bitrate and per-Part picks measured
- fix: Now Playing names the Part a conversion plays
- fix: a Media of several Parts takes its last Part's bitrate and a row lists complete versions first
- fix: a converted run holds its last frame to the title's duration so every listed segment is made
- docs: a snapshot's part is its chunk, an item's part its place in the episode
- test: the parts zurg's contract sends of one episode are one Media of one row
- test: a part its source pushes as unplaced leaves the Media
- fix: allParts carries a track pick to the Media's other Parts by stream index
- feat: an episode a source sends in parts is one Media of several Parts
- build: put rex at the top of release archives, keeping the old path as a link
- fix: find rex folder from a binary at its top as well as rust/target/release
- docs: record plexav's part reads per audio format
- fix: answer track part reads as plexav does: .m4a audio/mp4, .wav audio/wav, Last-Modified from updatedAt
- test: record plexav's part reads for every audio format it holds
- fix: make each release of an album its own album row, as plexav lists them
- test: record what plexav lists for two releases of one album
- feat: let a source register trash false so what it removes is deleted
- feat: take back a placement when the source pushes a file as unplaced
- docs: README and setup step 1 point at the Docker image
- ci: nightly notes and the Discord post name the Docker image, posted once it is pushed
- fix: keep UltraBlurColors off history rows and the same on nested rows, as plexav answers them
- fix: What's On's playlist hubs answer the provider's empty container, as plexav does
- feat: thumbBlurHash, artBlurHash and UltraBlurColors worked out from the artwork, as plexav answers them
- test: record plexav's BlurHash and UltraBlur answers for rex's own synthetic covers
- fix: a guide episode is a premiere unless pushed previously_shown, a show skips its seasons and a Media lasts its programme's duration, as plexav lists them
- feat: Live TV section listings, ordered, filtered and paged as plexav measured on guides written for it
- fix: a track's decision leaves its lyrics stream out, as plexav's
- feat: Live TV search categories, provider pages, the DVR device, completing beats and a kept guide, as plexav answers
- docs: music conversion, lyrics, loudness, bitrate and declared music libraries, as measured on plexav
- feat: a source declares a music library for a directory, as it declares show and movie libraries
- test: a track its source moves on its album keeps its plays
- feat: a track's loudness a source pushes shows, levels and ramps as plexav's analysed tracks
- test: record plexav's Live TV pages no client asks and one tune without a Plex Pass
- feat: a track's sidecar lyrics a source pushes are its lyrics stream, served as plexav serves an .lrc or .txt
- feat: convert a track for a client that turns direct play off, as plexav converts it
- test: a FLAC track's bitrate counts its audio frames, as plexav's
- fix: a track's bitrate is plexav's: the stream's own, a FLAC's audio frames over its length, none for Opus
- fix: follow the photo transcoder naming itself, as plexav draws Plexamp's header art
- fix: a playlist edit takes Plexamp's includeFields beside the summary, as plexav answers it
- fix: the live channel source serves the address it names with --host
- fix: a Live TV tune names its activity and answers PMS's headers, as Plex Web requires
- fix: title only a track's stream without a language part, never a film's untagged audio
- perf: read only played tracks for a music library's shelves
- fix: trash and purge a track's album and artist with it, as an episode's season and show
- fix: ask for a new track sent by its probe digest alone instead of holding it
- feat: Live TV, a DVR of the live channels sources push with a guide
- test: record plexav's Live TV answers to Plex Web and Plex for Android
- feat: a music source probe to try rex's music library by hand
- feat: music libraries from tracks a source pushes, answered as plexav's PMS answers its clients
- feat: find a track's album at Plex's agent by its MusicBrainz release id
- feat: describe an audio file's Media as a real PMS describes a track
rex 2026.11.01.0040-nightly
- docs: myapp in the delete example; zurg's rex keys are in rex with zurg, step 4
- docs: source-neutral example catalog, probe rule and source order
- docs: neutral subtitle example and run.sh source note
- docs: neutral feed examples and source-generic step 6 checks
- docs: describe sources generically, naming zurg only as an example
- chore: name no source in rex's no-source-yet log line
- docs: rex and its Docker image are public now
- docs: gatekeeper grants access to zurg's sponsor build, it does not host it
- docs: README says where zurg's sponsor build comes from
- feat: rex's browser landing page and manager page link the guides and the rex-support forum
- ci: a tag publishes the build a passed run made of its commit instead of building and testing it again
- docs: TorBox's erth and hare CDNs block Plex Web under part-mode redirect
- docs: rex shows the Plex apps a normal server, without calling itself a Plex server
- docs: README tagline matches the site and links the other DMM sites
- chore: release 0.4.0
- docs: README says rex is free for personal use, with the promo video that says so
- chore: license rex under PolyForm Noncommercial 1.0.0
- docs: a short README that introduces rex with its video, screenshots, guides and addons
- docs: keep the download commands in setup.md
- feat: rex orange on the manager page and the nightly announcement, which no longer says sponsors only
rex 2026.10.31.0827-nightly
- no changes
rex 2026.10.31.0759-nightly
- docs: show the rex manager page
- fix: keep test_plextv's Plex Web cache off os.getuid on Windows
- docs: third-pass fixes, every claim checked against the code
- docs: zurg from 2026.10.27 is safe to point at rex as its Plex
- docs: deletes reach the source, restore, move and remove rex
- feat: /web says how to claim rex and where to watch when no web app is installed
- test: a Plex Web bundle that moved or changed fails the gate check instead of skipping it
- docs: second-pass fixes to README and setup
- docs: public-release accuracy pass on README, setup and the feed API
- feat: first-run help and log lines say what to do next
- fix: redact a claim code in the request log as an X-Plex-Token is
- test: fetch Plex Web's remote gate at test time instead of checking its code in
- docs: fix second-pass findings in the macOS and Windows steps
- docs: stop rex on Windows with Stop-Process, as Stop-ScheduledTask leaves rex.exe running
- docs: cover macOS and Windows beside Linux in every guide step
- fix: answer the watch import as JSON to curl's Accept
- docs: bring your watch history from another Plex server
- feat: import an account's watch state from its old Plex server
rex 0.4.0
rex 0.4.0: an HTTPS address of its own, Plex's own metadata, and every account its own
Start rex with no flags. It makes rex.db, names itself after the machine and announces its LAN address. Claim it on a fresh free Plex account, share it with yours and point a source at it. Forward port 32400 and rex-direct gives it an HTTPS address of its own, so app.plex.tv and the apps away from home reach it with no relay and no certificate to manage.
Upgrading from 0.3.0:
- Update zurg first, to a nightly from 2026.10.27 or newer.
- rex no longer reads TMDB_KEY, REX_METADATA_URL, REX_ANIME_LISTS, REX_IMDB_EPISODES or PLEX_TOKEN. Titles are named by Plex's own metadata agent from the ids your source sends, so you can remove them.
- --zurg-mount is gone and rex will not start with it. Drop it; --mount is the new name if you need one.
- rex serves no Plex app until it is claimed. If yours never was, claim it through plex.tv/claim.
- Once claimed, rex-direct registers a name for your public IP with DMM and announces it. Set REX_DIRECT_URL=off to keep it off.
- rex.db carries over as it is: libraries, watch state, ratings, edits, playlists and collections. Back it up first with sqlite3 rex.db ".backup rex.db.bak".
New in this release:
- Every Plex account you share rex with gets its own watch state, ratings, playlists and history, and sees only the libraries its share allows
- Bring your watch history over from your old Plex server with one request
- Video conversion finds jellyfin-ffmpeg on its own and uses the GPU, HDR and Dolby Vision tonemapping included. A converted 1080p film starts in about 2 seconds on a small Intel GPU
- Search Subtitles uses Plex's provider, and rex checks the subtitle you pick against the file and fixes its timing. Image subtitles are burned into a conversion
- Downloads for offline viewing, movie editions, the server Dashboard and, with FFmpeg, intro and credits skipping, all with a free claiming account
- A zurg folder can have libraries of its own (rex_shows and rex_movies), and Add Library lists your sources' folders
- Fix Match goes through Plex's matcher, and what you fix is reported back to the source
- Addons can name and dress what they bring, play live channels and put titles in collections. rex-stremio brings your Stremio addons' catalogs
- Kometa collections, pinned collections and Manage Recommendations work
- Starting takes a quarter of the memory it did (2 GB to 435 MB on a 42,000-row library), and a big library opens in under half a second
rex's feed answers only this machine, your home network and Tailscale. A proxy or tunnel on the rex machine must block /rex/.
rex is now free for personal use under the PolyForm Noncommercial license. Commercial use is not allowed.
Full setup: https://notes.debridmediamanager.com/rex/with-zurg/
rex 2026.10.30.0040-nightly
- docs: Windows needs a firewall rule for rex and curl.exe for the claim
- docs: record a collection's Visible on and Manage Recommendations as an online 1.43.5 answers them
- feat: keep Manage Recommendations per library and serve a collection pinned to Recommended and Home
rex 2026.10.28.0040-nightly
- docs: record a subtitle track dense from its start and a live DASH restart behind the clock
- fix: restart a live DASH run at the segment its MPD's clock has reached, not where it stopped
- fix: start a burned text subtitle's first run after 8 s however dense its opening, and log why a segment timed out
- docs: record long GOPs in recorded files over a DASH remux
- fix: convert a DASH remux's video from where a copied chunk's own sidx shows it overrunning its slot
- docs: record the missing audio at open and long GOPs over live DASH
- fix: convert a live DASH remux's video once its keyframes fall behind the template
- fix: stand silence in for a live source's missing audio rather than converting its copies
- docs: record live sources that change under their probe
- fix: start a live run again from the live edge when its source stops, saying why
- fix: convert a stream whose copy fails on every path, as a live codec can change under its probe
- fix: map a live source's streams by kind, as its indexes can move under its probe
- docs: record the device-side subtitle burn and its timings on zen
- test: a burned PGS subtitle runs on the full device path where the device overlays
- test: expect the device path for a burned HDR subtitle only where the device decodes 10-bit HEVC
- test: delete test_native_transcode's scratch directory however it ends
- fix: burn an image subtitle on the device where it overlays with alpha there
- fix: deinterlace interlaced sources when converting, and never copy interlaced H.264 to Chromium
- docs: record FFmpeg's DASH reader window, the late scan type and plexscratch's yadif
- fix: take a playlist's re-probe when only its scan type changed
- test: delete test_http_mkv's and the Shaka probe's scratch directories however they end
- fix: start a live DASH clock a window back so FFmpeg's reader stops re-reading segment 0
rex 2026.10.27.0718-nightly
- docs: record live DASH start-up, the silent-source hang-up and why live AAC is still converted
- test: run test_http_mkv on Windows, finding FFmpeg by its command line through CIM
- fix: end a Matroska stream's FFmpeg when its client hangs up while the source sends nothing
- fix: serve a DASH segment once its own file is done, and cut live DASH in 4 s
- docs: record Plex Desktop's Matroska stream, live DASH and the every-profile guard
- fix: answer a live source's DASH with a dynamic MPD
- feat: convert for Plex Desktop's protocol=http as one chunked Matroska stream
rex 2026.10.26.0956-nightly
- test: start suite port ranges at 10000 and let a range hold the smoke's fixed port
- feat: a source reads what people Fix Matched or merged at GET /rex/feed/{source}/matches
- fix: Fix Match of a show onto one the library holds merges the shows instead of deleting its episodes
- docs: credit wason92 for one collection shelf per collection
- feat: a member of several collections shows a shelf for each, oldest first
- feat: a source puts its titles in collections with collections on feed items
- feat: own media flag matching rules and describe Plex Web code in prose
- feat: replace Plex's English settings help text and agent bundle prose with rex's own
- feat: replace Plex's translations and attribution text with rex's own
- fix: serve rex's own favicon and stand-in images instead of Plex's artwork
- ci: read the dmm pull host from a secret
- docs: what --part-mode redirect-only refuses and what each app shows for it
- feat: --part-mode redirect-only refuses what it cannot send to a source's link and converts nothing
- docs: which apps download straight from the source under --part-mode redirect
- feat: --part-mode redirect sends a client's byte read to the link its source redirects to
rex 2026.10.25.0040-nightly
- test: check releases placed alike in the retry suite, so every suite's port range still fits
- fix: name an unmatched episode held as several releases placed alike, on the retry and on a push
- feat: take feed items by probe digest and ask for changed ones whole
- fix: a playlist's new probe with another stream layout replaces the row's streams
- fix: read an HLS source whose segments' extensions do not match their format on FFmpeg 7.1+
- feat: play live sources (no duration) as live HLS, keeping no resume point or watch state
- docs: link the notes rex guides at their new URLs
- ci: run the state restore suites, test_perf_memory among them
- perf: restore a start's rows as they are read and give their memory back, 1.99 GB to 435 MB peak
- docs: titles pushed before the claim are named when it lands
- fix: name what a source placed before the claim once rex is claimed, its shows included
- docs: second pass: cut rex setup internals, Plex's own setting labels, manager without build
- feat: a managed server with no catalog seeds its own on first start, no build step
- test: save the older start's state before stopping it, which Windows kills unsaved
- docs: drop asks rex does not need: mount, size, --catalog, LAN --announce-url, umask, legacy notes
- docs: never ask users for what rex does not need
- feat: announce rex's own LAN address and default --catalog to rex.db, so setups pass no flags
- feat: take an item's size from its ffprobe output when the source sends none
- fix: create rex.db and its sidecars owner-only, so no setup needs a umask
- docs: record the announces plex.tv keeps no connection from
- fix: refuse an --announce-url that plex.tv would list no connection for
- docs: one simplest setup: the service runs rex directly, Docker keeps ./config, no unshipped rex-direct-api link
- docs: old library names follow the build that made rex.db, not a date
- docs: zurg 2026.10.22 and rex 2026.10.23 carry folder libraries
- docs: name no third-party tool in rex code and tests