| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| README.md | 2026-10-07 | 8.8 kB | |
| Release v0.32.0 source code.tar.gz | 2026-10-07 | 4.3 MB | |
| Release v0.32.0 source code.zip | 2026-10-07 | 4.9 MB | |
| Totals: 3 Items | 9.2 MB | 18 | |
✨ New Features
Optional Reverse Proxy Header Authentication
- Admins can enable Settings → System → Reverse Proxy Auth to exchange a configured identity header (such as
X-Forwarded-User,X-Auth-Request-User, orCf-Access-Authenticated-User-Email) for standard JWT tokens. (Closes [#1644]) - Thanks @benjitobz: - Stays disabled until
DISPATCHARR_TRUSTED_PROXIESexplicitly names the proxy - The proxy must strip client-supplied identity headers before forwarding
Radio Channels in M3U and XC Output
- Radio streams and channels are preserved end-to-end through refresh, create-from-stream, auto-sync, M3U, and XC. (Closes [#1683]) - Thanks @dillardblom:
- Streams pick up radio status from the M3U
radioattribute or XCstream_type: radio_streams - M3U emits
radio="true"and XCget_live_streamsreturnsstream_type: radio_streamsfrom the effective value - Channel editor and batch editor expose a Radio control; auto-synced channels can keep a manual override across refreshes
- Upgrading: streams pick up the flag on the next account refresh, and auto-synced channels follow after that. Manually created channels stay TV until you mark them — select them in the channels table and set Radio to Yes in the batch editor (or use the Radio switch on a single channel)
Catch-up on XC M3U Playlists
- XC M3U playlists advertise catch-up for players that read EXTINF tags. - Thanks @dillardblom:
- Catch-up channels that already report archive in
get_live_streamsget playlist tags (days capped at the EPG lookback ceiling; the user catch-up setting still applies) - Non-direct playlists use
catchup="default"with a{utc}catchup-source on/streaming/timeshift.php(epoch seconds and{duration:60}), so wall-clock placeholders match Dispatcharr's timeshift endpoints;utc=is accepted as an alias forstart= - Admin
direct=trueprovider playlists keepcatchup="xc"when the resolved URL is XC/live/form - Plain
/output/m3ustays untagged (those stream URLs cannot be rewritten for catch-up) - When catch-up is allowed, XC
/live/M3U headers also advertisecatchup-timezone="UTC"(same zone asplayer_apiserver_info.timezone)
Richer Live Stream Events for Connect
- Live-proxy stream events identify which stream stalled or failed over, so webhooks, scripts, and plugins can track unstable providers without scraping logs. (Closes [#1564]) - Thanks @lukezbihlyj:
channel_buffering,channel_failover,channel_reconnect,channel_error, andstream_switchcarry the activestream_id- Switches also carry
previous_stream_id, a switch reason, and previous stream name/provider when known channel_bufferingis a Connect subscription event; a buffering timeout that cannot switch emits a singlechannel_errorper stalled stream
🔄 Changes & Improvements
Default Stream Profiles
- The locked default stream profile is renamed FFmpeg (command stays
ffmpeg) and its parameters are updated for more resilient live remuxing: - Maps every input stream (
-map 0) so extra audio, subtitle, and data tracks are kept instead of dropped - Copies codecs as-is; streams ffmpeg cannot remux are written as private data instead of failing to start the stream
- Adds
-fflags +genpts+discardcorruptand repeats MPEG-TS PAT/PMT headers so clients recover more cleanly on corrupt or discontinuous input - Probe size and analyze duration stay at ffmpeg defaults
- The locked Streamlink profile is renamed the same way and muxes to MPEG-TS when ffmpeg is used, matching the channel buffer. (Closes [#237])
- Locked stream and output profiles can no longer be edited through the API (name, command, parameters, active state, or lock); the user-agent on a locked stream profile can still be updated
- Seeded output profiles that remux audio now copy subtitle PIDs instead of failing to open on channels that carry subtitles. (Fixes [#1502]) - Thanks @v8eta
DVR Playback While Recording & recording_end Timing
- In-progress DVR recordings are served as HLS event playlists, so players that treat an untyped live playlist as a short sliding window can seek across the whole recording while it is still being written. - Thanks @aethewulf11-ops
recording_endnow fires after post-processing (not when capture stops), withoutcome(success/failed/cancelled), file fields, and scheduled times. (Fixes [#1681]) - Thanks @v8eta:- Crash-recovery finalize and in-progress cancel emit it too
- Branch on
outcome/failure_reason(the oldinterruptedboolean is gone)
Profiles Tables, Playlists & Logging
- Stream and output profile tables list locked defaults first, then sort by name
- M3U generation and channel list responses do less work, so large playlists and channel lists load more efficiently
- Container boot and runtime logs are much quieter (Postgres probes, routine proxy/Redis/plugin startup, and similar noise). - Thanks @nagelm
- Fresh-install AIO migrate no longer tries the Redis settings cache before Redis is up; the entrypoint sets
DISPATCHARR_SKIP_REDIS_CACHE=1so settings reads go straight to Postgres and boot stays free of connection-refused warnings
🐛 Bug Fixes
Channels Table & Catch-up Flags
- Fixed channels table sort, search, filter, and renumbering ignoring override values, so rows with pinned numbers/names/groups/EPG no longer looked out of order. (Fixes [#1630])
- Fixed bulk create channels from streams leaving catch-up flags unset until the next account refresh. (Fixes [#1542])
Live Proxy, VOD Sessions & Connection Limits
- Fixed stopping a channel leaving orphaned child processes from multi-process stream profiles (for example a wrapper with ffmpeg/vlc children). (Fixes [#1718])
- Fixed a VOD response closed before the body starts leaving its profile slot reserved. (Fixes [#1728])
- Fixed FFmpeg-based VOD clients (and Emby/Jellyfin via libmpv) minting a new session on every probe and seek, which could return HTTP 503 on single-stream profiles. (Fixes [#1472])
- Fixed concurrent tunes stealing a live channel owner lock before metadata was written, which could stall or return HTTP 503. (Fixes [#1753])
- Fixed Server Group connection counters leaking when concurrent streams stop or profiles switch, which could eventually return HTTP 503. (Fixes [#1725]) - Thanks @sh-k-l
- Fixed web preview of Redirect channels colliding with the live Proxy worker or failing when viewers have different allowed M3U profiles. - Thanks @c-riccio
Catch-up Playback
- Fixed catch-up fast-forward with
Range: bytes=0-restarting at the original position instead of the requested time (affects clients such as Kodi with inputstream.ffmpegdirect). - Thanks @amwalters - Fixed catch-up scrub offsets leaving the cached CDN file incorrectly, so seeks and timestamp restarts stay aligned with the open archive
M3U / XC Refresh & Output
- Fixed M3U/XC refreshes marking streams stale (and potentially deleting auto-created channels) when a write batch failed. (Fixes [#1715]) - Thanks @JonathanAlbarran
- Fixed XC
get_live_categoriesreturning an empty list for Standard Users who still received live streams under a Channel Profile. (Fixes [#1765])
TV Guide, URLs, Redis & Docker
- Fixed the TV Guide marking time-only custom dummy events as ended before kickoff. (Fixes [#1722])
- Fixed absolute URLs baking in the container listen port (for example
:9191) when Docker remaps80:9191andHosthas no port. (Fixes [#1654]) - Fixed Redis TLS via discrete
REDIS_SSL*env vars failing with the bounded connection pool. (Fixes [#1709]) - Fixed
REDIS_URLbeing ignored when set (including unix sockets). (Fixes [#1427]) - Thanks @Holbormon - Fixed System → Logs being hidden when Persist Logs to File was on but a live collector process check failed (common on modular installs)
- Fixed modular log
config/ownership so the Logs page no longer warns that nothing is running when files are being written - Fixed PostgreSQL failing to start when only the data directory's owner was wrong. (Fixes [#1453]) - Thanks @JonathanAlbarran
- Fixed deleting a locked stream or output profile raising an unhandled API error instead of a clear 400